summaryrefslogtreecommitdiffstats
path: root/piper.c
diff options
context:
space:
mode:
authorMarius Halden <marius.h@lden.org>2015-10-29 01:05:30 +0100
committerMarius Halden <marius.h@lden.org>2015-10-29 01:05:30 +0100
commit0003b01dbcfbf68119127a2899f3277cd676f2c3 (patch)
tree1f5f19aa5fd594259bf09de66801501c3cd17027 /piper.c
parent9be0faf753d559164949c6bf4545028960f4c8cc (diff)
downloadpiper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.gz
piper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.bz2
piper-0003b01dbcfbf68119127a2899f3277cd676f2c3.tar.xz
Update some of the logic
Diffstat (limited to 'piper.c')
-rw-r--r--piper.c58
1 files changed, 42 insertions, 16 deletions
diff --git a/piper.c b/piper.c
index cc176e4..aa18ab9 100644
--- a/piper.c
+++ b/piper.c
@@ -40,6 +40,9 @@ reap_all()
if (procs[i].pid != -1)
kill(procs[i].pid, SIGKILL);
}
+
+ while (wait(NULL) != -1 || errno == EINTR)
+ ;
}
void
@@ -170,6 +173,18 @@ signal_procs()
sendsignal = 0;
}
+/*int
+check_pid_running(pid_t pid)
+{
+ if (pid == -1)
+ return 0;
+
+ if (kill(pid, 0) == -1)
+ return 0;
+ else
+ return 1;
+}*/
+
void
handle_nonfatal(int sig, siginfo_t *siginfo, void *ucontext)
{
@@ -183,14 +198,9 @@ handle_fatal(int sig, siginfo_t *siginfo, void *ucontext)
sendsignal = sig;
}
-int
-main(int argc, char **argv)
+void
+setup_signals()
{
- if (argc < 2) {
- fprintf(stderr, "Usage: piper <cmd1> <cmd2>\n");
- return 1;
- }
-
struct sigaction act;
memset(&act, 0, sizeof(act));
@@ -209,6 +219,27 @@ main(int argc, char **argv)
err(1, "sigaction");
if (sigaction(SIGUSR2, &act, NULL) == -1)
err(1, "sigaction");
+}
+
+void
+start_missing_procs()
+{
+ int i;
+ for (i = 0; i < NUM_PROCS; i++) {
+ if (procs[i].pid == -1)
+ run_cmd(&procs[i]);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ if (argc < 2) {
+ fprintf(stderr, "Usage: piper <cmd1> <cmd2>\n");
+ return 1;
+ }
+
+ setup_signals();
procs[0].cmd = strdup(argv[1]);
if (procs[0].cmd == NULL)
@@ -234,17 +265,15 @@ main(int argc, char **argv)
procs[0]._stderr = fds[1];
procs[1]._stdin = fds[0];
- run_cmd(&procs[0]);
- run_cmd(&procs[1]);
-
- while (have_child()) {
- int status;
+ while (!terminate) {
pid_t pid;
+ start_missing_procs();
+
if (sendsignal != 0)
signal_procs();
- pid = wait(&status);
+ pid = wait(NULL);
if (pid == -1) {
if (errno == EINTR)
continue;
@@ -256,9 +285,6 @@ main(int argc, char **argv)
if (p == NULL)
continue; // XXX: Log something here?
p->pid = -1;
-
- if (!terminate)
- run_cmd(p);
}
return 0;