noice

small file browser
git clone git://git.2f30.org/noice.git
Log | Files | Refs | README | LICENSE

commit 58edea240e40eeb006923f012a6bb792fb8ef8a7
parent 784551aa55ff996e103443d1bbe65684fd4d7463
Author: sin <sin@2f30.org>
Date:   Thu, 22 Aug 2019 15:09:29 +0100

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.

Diffstat:
ATODO | 1+
Mnoice.c | 6+++++-
Mnoiceconf.def.h | 2++
Mnopen.c | 5++---
Mspawn.c | 11+++++++----
Mutil.h | 4++--
6 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/TODO b/TODO @@ -0,0 +1 @@ +- Support overriding plumber via environment variable diff --git a/noice.c b/noice.c @@ -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 @@ -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 */ diff --git a/nopen.c b/nopen.c @@ -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; } diff --git a/spawn.c b/spawn.c @@ -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); } diff --git a/util.h b/util.h @@ -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 *, ...);