aboutsummaryrefslogtreecommitdiff
path: root/cmd/runsvc
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/runsvc')
-rw-r--r--cmd/runsvc/runsvc.c32
1 files changed, 12 insertions, 20 deletions
diff --git a/cmd/runsvc/runsvc.c b/cmd/runsvc/runsvc.c
index fdece64..794aa29 100644
--- a/cmd/runsvc/runsvc.c
+++ b/cmd/runsvc/runsvc.c
@@ -1,12 +1,15 @@
/* SPDX-License-Identifier: ISC */
#include "runsvc.h"
-static int runlst_wait(exec_t *list)
+static int run_sequentially(exec_t *list)
{
pid_t ret, pid;
int status;
for (; list != NULL; list = list->next) {
+ if (list->next == NULL)
+ argv_exec(list);
+
pid = fork();
if (pid == 0)
@@ -35,46 +38,35 @@ static int runlst_wait(exec_t *list)
int main(int argc, char **argv)
{
- int dirfd, ret = EXIT_FAILURE;
service_t *svc = NULL;
+ int dirfd;
if (argc != 3) {
fputs("usage: runsvc <directory> <filename>\n", stderr);
- goto out;
+ return EXIT_FAILURE;
}
if (getppid() != 1) {
fputs("must be run by init!\n", stderr);
- goto out;
+ return EXIT_FAILURE;
}
dirfd = open(argv[1], O_RDONLY | O_DIRECTORY);
if (dirfd < 0) {
perror(argv[1]);
- goto out;
+ return EXIT_FAILURE;
}
svc = rdsvc(dirfd, argv[2], RDSVC_NO_FNAME | RDSVC_NO_DEPS);
close(dirfd);
if (svc == NULL)
- goto out;
-
- if (svc->exec == NULL) {
- ret = EXIT_SUCCESS;
- goto out;
- }
+ return EXIT_FAILURE;
if (initenv())
- goto out;
+ return EXIT_FAILURE;
if (setup_tty(svc->ctty, (svc->flags & SVC_FLAG_TRUNCATE_OUT) != 0))
- goto out;
-
- if (svc->exec->next == NULL)
- argv_exec(svc->exec);
+ return EXIT_FAILURE;
- ret = runlst_wait(svc->exec);
-out:
- delsvc(svc);
- return ret;
+ return run_sequentially(svc->exec);
}