mirror of
https://github.com/pygos/init.git
synced 2024-05-19 20:26:14 +02:00
cleanup runsvc: merge codepaths for execution, remove cleanup code
Simply execute the last entry in the list directly instead of forking and remove the cleanup code. If the list is empty, we return success. If the list only has one entry, we directly execute that. No need to make a distinction between single entry vs list anymore. If the list is an actual list, we run it as before but execute the last one directly. Typically, the last one is something like a daemon preceeded by setup code. The daemon ends up directly underneath init, without a dummy waiting runsvc stuck in the process list. If we always do an exec, there is no point in doing cleanup. All our mapped memory is evicted anyway. Same if we exit appruptly because of an error. Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
This commit is contained in:
parent
4f1b393cee
commit
390175c406
|
@ -1,12 +1,15 @@
|
||||||
/* SPDX-License-Identifier: ISC */
|
/* SPDX-License-Identifier: ISC */
|
||||||
#include "runsvc.h"
|
#include "runsvc.h"
|
||||||
|
|
||||||
static int runlst_wait(exec_t *list)
|
static int run_sequentially(exec_t *list)
|
||||||
{
|
{
|
||||||
pid_t ret, pid;
|
pid_t ret, pid;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
for (; list != NULL; list = list->next) {
|
for (; list != NULL; list = list->next) {
|
||||||
|
if (list->next == NULL)
|
||||||
|
argv_exec(list);
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
|
|
||||||
if (pid == 0)
|
if (pid == 0)
|
||||||
|
@ -35,46 +38,35 @@ static int runlst_wait(exec_t *list)
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int dirfd, ret = EXIT_FAILURE;
|
|
||||||
service_t *svc = NULL;
|
service_t *svc = NULL;
|
||||||
|
int dirfd;
|
||||||
|
|
||||||
if (argc != 3) {
|
if (argc != 3) {
|
||||||
fputs("usage: runsvc <directory> <filename>\n", stderr);
|
fputs("usage: runsvc <directory> <filename>\n", stderr);
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getppid() != 1) {
|
if (getppid() != 1) {
|
||||||
fputs("must be run by init!\n", stderr);
|
fputs("must be run by init!\n", stderr);
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
dirfd = open(argv[1], O_RDONLY | O_DIRECTORY);
|
dirfd = open(argv[1], O_RDONLY | O_DIRECTORY);
|
||||||
if (dirfd < 0) {
|
if (dirfd < 0) {
|
||||||
perror(argv[1]);
|
perror(argv[1]);
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
svc = rdsvc(dirfd, argv[2], RDSVC_NO_FNAME | RDSVC_NO_DEPS);
|
svc = rdsvc(dirfd, argv[2], RDSVC_NO_FNAME | RDSVC_NO_DEPS);
|
||||||
close(dirfd);
|
close(dirfd);
|
||||||
if (svc == NULL)
|
if (svc == NULL)
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
if (svc->exec == NULL) {
|
|
||||||
ret = EXIT_SUCCESS;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (initenv())
|
if (initenv())
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
if (setup_tty(svc->ctty, (svc->flags & SVC_FLAG_TRUNCATE_OUT) != 0))
|
if (setup_tty(svc->ctty, (svc->flags & SVC_FLAG_TRUNCATE_OUT) != 0))
|
||||||
goto out;
|
return EXIT_FAILURE;
|
||||||
|
|
||||||
if (svc->exec->next == NULL)
|
return run_sequentially(svc->exec);
|
||||||
argv_exec(svc->exec);
|
|
||||||
|
|
||||||
ret = runlst_wait(svc->exec);
|
|
||||||
out:
|
|
||||||
delsvc(svc);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue