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:
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 *, ...);