diff options
author | sin <sin@2f30.org> | 2019-08-22 15:09:29 +0100 |
---|---|---|
committer | sin <sin@2f30.org> | 2019-08-22 17:21:29 +0100 |
commit | 58edea240e40eeb006923f012a6bb792fb8ef8a7 (patch) | |
tree | 8c3a04522acecc24a2cba5dc66af97389f678b9e | |
parent | 784551aa55ff996e103443d1bbe65684fd4d7463 (diff) | |
download | noice-58edea240e40eeb006923f012a6bb792fb8ef8a7.tar.gz |
Fix spawn*() so it can report errors to the caller
If nopen is not in PATH, noice will briefly print a warning about it
so the user knows.
Also, add NOPENCMD define in noiceconf.def.h to specify the default
plumber program.
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | noice.c | 6 | ||||
-rw-r--r-- | noiceconf.def.h | 2 | ||||
-rw-r--r-- | nopen.c | 5 | ||||
-rw-r--r-- | spawn.c | 11 | ||||
-rw-r--r-- | util.h | 4 |
6 files changed, 19 insertions, 10 deletions
@@ -0,0 +1 @@ +- Support overriding plumber via environment variable @@ -650,8 +650,12 @@ nochange: goto begin; case S_IFREG: exitcurses(); - spawnlp(path, "nopen", "nopen", newpath, (void *)0); + r = spawnlp(path, NOPENCMD, NOPENCMD, newpath, (void *)0); initcurses(); + if (r == -1) { + printmsg("failed to execute " NOPENCMD); + goto nochange; + } continue; default: printmsg("Unsupported file"); diff --git a/noiceconf.def.h b/noiceconf.def.h index 4a3513c..d86fd9c 100644 --- a/noiceconf.def.h +++ b/noiceconf.def.h @@ -3,6 +3,8 @@ #define CURSR " > " #define EMPTY " " +#define NOPENCMD "nopen" + int dirorder = 0; /* Set to 1 to sort by directory first */ int mtimeorder = 0; /* Set to 1 to sort by time modified */ int icaseorder = 0; /* Set to 1 to sort by ignoring case */ @@ -21,7 +21,7 @@ struct assoc { #include "nopenconf.h" void -spawnassoc(struct assoc *assoc, char *arg) +run(struct assoc *assoc, char *arg) { char *argv[NR_ARGS]; int i; @@ -46,7 +46,6 @@ openwith(char *file) if (regexec(&assocs[i].regcomp, file, 0, NULL, 0) == 0) return &assocs[i]; } - return NULL; } @@ -88,7 +87,7 @@ main(int argc, char *argv[]) if ((assoc = openwith(argv[0])) == NULL) continue; - spawnassoc(assoc, argv[0]); + run(assoc, argv[0]); } return 0; } @@ -9,7 +9,7 @@ #include "util.h" -void +int spawnvp(char *dir, char *file, char *argv[]) { pid_t pid; @@ -18,7 +18,7 @@ spawnvp(char *dir, char *file, char *argv[]) pid = fork(); switch (pid) { case -1: - err(1, "fork"); + return -1; case 0: if (dir != NULL) chdir(dir); @@ -27,10 +27,13 @@ spawnvp(char *dir, char *file, char *argv[]) default: while (waitpid(pid, &status, 0) == -1 && errno == EINTR) ; + if (WIFEXITED(status) && WEXITSTATUS(status) != 0) + return -1; } + return 0; } -void +int spawnlp(char *dir, char *file, char *argv0, ...) { char *argv[NR_ARGS]; @@ -43,5 +46,5 @@ spawnlp(char *dir, char *file, char *argv0, ...) ; argv[argc] = NULL; va_end(ap); - spawnvp(dir, file, argv); + return spawnvp(dir, file, argv); } @@ -24,5 +24,5 @@ size_t strlcat(char *, const char *, size_t); #undef strlcpy size_t strlcpy(char *, const char *, size_t); int strverscmp(const char *, const char *); -void spawnvp(char *, char *, char *[]); -void spawnlp(char *, char *, char *, ...); +int spawnvp(char *, char *, char *[]); +int spawnlp(char *, char *, char *, ...); |