aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsin <sin@2f30.org>2019-08-22 15:09:29 +0100
committersin <sin@2f30.org>2019-08-22 17:21:29 +0100
commit58edea240e40eeb006923f012a6bb792fb8ef8a7 (patch)
tree8c3a04522acecc24a2cba5dc66af97389f678b9e
parent784551aa55ff996e103443d1bbe65684fd4d7463 (diff)
downloadnoice-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--TODO1
-rw-r--r--noice.c6
-rw-r--r--noiceconf.def.h2
-rw-r--r--nopen.c5
-rw-r--r--spawn.c11
-rw-r--r--util.h4
6 files changed, 19 insertions, 10 deletions
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..cb08dca
--- /dev/null
+++ b/TODO
@@ -0,0 +1 @@
+- Support overriding plumber via environment variable
diff --git a/noice.c b/noice.c
index b73f1ea..1b60370 100644
--- 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
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 */
diff --git a/nopen.c b/nopen.c
index b4c9180..93bbd71 100644
--- 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
index 01b78cb..98fd5e2 100644
--- 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
index 0ccdb50..01da706 100644
--- 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 *, ...);
Un proyecto texto-plano.xyz