diff options
author | Michael Forney <mforney@mforney.org> | 2019-04-06 13:35:23 -0700 |
---|---|---|
committer | Michael Forney <mforney@mforney.org> | 2019-04-07 00:22:49 -0700 |
commit | 18c5bbf727faf6fb30a8809b6f7900a59c07897f (patch) | |
tree | 47a9d872d606c047510a28c4c3d237cfd2710d92 | |
parent | 6397cd8abe96c0b915d03ec564e35f0d3fba3714 (diff) | |
download | cproc-18c5bbf727faf6fb30a8809b6f7900a59c07897f.tar.xz |
driver: Use argv[0] to determine cc-qbe path if /proc/self/exe is not available
-rw-r--r-- | driver.c | 16 |
1 files changed, 10 insertions, 6 deletions
@@ -305,16 +305,20 @@ nextarg(char ***argv) } static char * -compilecommand(void) +compilecommand(char *arg) { char self[PATH_MAX], *cmd; - ssize_t n; + size_t n; n = readlink("/proc/self/exe", self, sizeof(self) - 5); - if (n < 0) - fatal("readlink /proc/self/exe:"); - if (n == sizeof(self) - 5) + if (n == -1) { + n = strlen(arg); + if (n > sizeof(self) - 5) + fatal("argv[0] is too large"); + memcpy(self, arg, n); + } else if (n == sizeof(self) - 5) { fatal("target of /proc/self/exe is too large"); + } strcpy(self + n, "-qbe"); if (access(self, X_OK) < 0) return NULL; @@ -338,7 +342,7 @@ main(int argc, char *argv[]) arrayaddbuf(&phases[CODEGEN].cmd, codegencmd, sizeof(codegencmd)); arrayaddbuf(&phases[ASSEMBLE].cmd, assemblecmd, sizeof(assemblecmd)); arrayaddbuf(&phases[LINK].cmd, linkcmd, sizeof(linkcmd)); - arg = compilecommand(); + arg = compilecommand(argv[0]); if (arg) *(char **)phases[COMPILE].cmd.val = arg; |