find: Add spawn helper function - sbase - suckless unix tools | |
git clone git://git.suckless.org/sbase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit c331811c91d9141a1b6c5273115517185d39df60 | |
parent 7d60e2cabbe07495ee74f3d5e705f1e3470148eb | |
Author: Michael Forney <[email protected]> | |
Date: Fri, 10 Sep 2021 22:43:54 -0700 | |
find: Add spawn helper function | |
Diffstat: | |
M find.c | 70 +++++++++++++----------------… | |
1 file changed, 30 insertions(+), 40 deletions(-) | |
--- | |
diff --git a/find.c b/find.c | |
@@ -110,6 +110,9 @@ struct findhist { | |
ino_t ino; | |
}; | |
+/* Utility */ | |
+static int spawn(char *argv[]); | |
+ | |
/* Primaries */ | |
static int pri_name (struct arg *arg); | |
static int pri_path (struct arg *arg); | |
@@ -224,6 +227,29 @@ static struct { | |
} gflags; | |
/* | |
+ * Utility | |
+ */ | |
+static int | |
+spawn(char *argv[]) | |
+{ | |
+ pid_t pid; | |
+ int status; | |
+ | |
+ switch((pid = fork())) { | |
+ case -1: | |
+ eprintf("fork:"); | |
+ case 0: | |
+ execvp(*argv, argv); | |
+ weprintf("exec %s failed:", *argv); | |
+ _exit(1); | |
+ } | |
+ | |
+ /* FIXME: proper course of action for waitpid() on EINTR? */ | |
+ waitpid(pid, &status, 0); | |
+ return status; | |
+} | |
+ | |
+/* | |
* Primaries | |
*/ | |
static int | |
@@ -352,7 +378,6 @@ pri_exec(struct arg *arg) | |
{ | |
int status; | |
size_t len; | |
- pid_t pid; | |
char **sp, ***brace; | |
struct execarg *e = arg->extra.p; | |
@@ -363,15 +388,7 @@ pri_exec(struct arg *arg) | |
if (len + e->u.p.arglen + e->u.p.filelen + envlen > argmax) { | |
e->argv[e->u.p.next] = NULL; | |
- switch((pid = fork())) { | |
- case -1: | |
- eprintf("fork:"); | |
- case 0: | |
- execvp(*e->argv, e->argv); | |
- weprintf("exec %s failed:", *e->argv); | |
- _exit(1); | |
- } | |
- waitpid(pid, &status, 0); | |
+ status = spawn(e->argv); | |
gflags.ret = gflags.ret || status; | |
for (sp = e->argv + e->u.p.first; *sp; sp++) | |
@@ -394,16 +411,7 @@ pri_exec(struct arg *arg) | |
for (brace = e->u.s.braces; *brace; brace++) | |
**brace = arg->path; | |
- switch((pid = fork())) { | |
- case -1: | |
- eprintf("fork:"); | |
- case 0: | |
- execvp(*e->argv, e->argv); | |
- weprintf("exec %s failed:", *e->argv); | |
- _exit(1); | |
- } | |
- /* FIXME: proper course of action for all waitpid() on EINTR? … | |
- waitpid(pid, &status, 0); | |
+ status = spawn(e->argv); | |
return !!status; | |
} | |
} | |
@@ -412,7 +420,6 @@ static int | |
pri_ok(struct arg *arg) | |
{ | |
int status, reply; | |
- pid_t pid; | |
char ***brace, c; | |
struct okarg *o = arg->extra.p; | |
@@ -435,15 +442,7 @@ pri_ok(struct arg *arg) | |
for (brace = o->braces; *brace; brace++) | |
**brace = arg->path; | |
- switch((pid = fork())) { | |
- case -1: | |
- eprintf("fork:"); | |
- case 0: | |
- execvp(*o->argv, o->argv); | |
- weprintf("exec %s failed:", *o->argv); | |
- _exit(1); | |
- } | |
- waitpid(pid, &status, 0); | |
+ status = spawn(o->argv); | |
return !!status; | |
} | |
@@ -687,7 +686,6 @@ static void | |
free_exec_arg(union extra extra) | |
{ | |
int status; | |
- pid_t pid; | |
char **arg; | |
struct execarg *e = extra.p; | |
@@ -698,15 +696,7 @@ free_exec_arg(union extra extra) | |
/* if we have files, do the last exec */ | |
if (e->u.p.first != e->u.p.next) { | |
- switch((pid = fork())) { | |
- case -1: | |
- eprintf("fork:"); | |
- case 0: | |
- execvp(*e->argv, e->argv); | |
- weprintf("exec %s failed:", *e->argv); | |
- _exit(1); | |
- } | |
- waitpid(pid, &status, 0); | |
+ status = spawn(e->argv); | |
gflags.ret = gflags.ret || status; | |
} | |
for (arg = e->argv + e->u.p.first; *arg; arg++) |