aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--initd/main.c25
-rw-r--r--initd/mksock.c15
-rw-r--r--initd/runlst.c32
3 files changed, 20 insertions, 52 deletions
diff --git a/initd/main.c b/initd/main.c
index 2be2045..192a49a 100644
--- a/initd/main.c
+++ b/initd/main.c
@@ -38,17 +38,14 @@ static void handle_exited(service_t *svc)
{
switch (svc->type) {
case SVC_RESPAWN:
- if (target == TGT_REBOOT || target == TGT_SHUTDOWN) {
- delsvc(svc);
+ if (target == TGT_REBOOT || target == TGT_SHUTDOWN)
break;
- }
if (svc->rspwn_limit > 0) {
svc->rspwn_limit -= 1;
if (svc->rspwn_limit == 0) {
print_status(svc->desc, STATUS_FAIL, false);
- delsvc(svc);
break;
}
}
@@ -56,20 +53,18 @@ static void handle_exited(service_t *svc)
svc->pid = runlst(svc->exec, svc->ctty);
if (svc->pid == -1) {
print_status(svc->desc, STATUS_FAIL, false);
- delsvc(svc);
+ break;
}
svclist_add(svc);
- break;
+ return;
case SVC_ONCE:
print_status(svc->desc,
svc->status == EXIT_SUCCESS ?
STATUS_OK : STATUS_FAIL, false);
- /* fall-through */
- default:
- delsvc(svc);
break;
}
+ delsvc(svc);
}
static void handle_signal(int sigfd)
@@ -86,11 +81,7 @@ static void handle_signal(int sigfd)
switch (info.ssi_signo) {
case SIGCHLD:
- for (;;) {
- pid = waitpid(-1, &status, WNOHANG);
- if (pid <= 0)
- break;
-
+ while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
status = WIFEXITED(status) ? WEXITSTATUS(status) :
EXIT_FAILURE;
@@ -132,9 +123,6 @@ static void start_runlevel(int level)
true);
delsvc(svc);
} else {
- if (svc->type == SVC_RESPAWN)
- print_status(svc->desc, STATUS_STARTED, false);
-
svc->pid = runlst(svc->exec, svc->ctty);
if (svc->pid == -1) {
print_status(svc->desc, STATUS_FAIL, false);
@@ -142,6 +130,9 @@ static void start_runlevel(int level)
continue;
}
+ if (svc->type == SVC_RESPAWN)
+ print_status(svc->desc, STATUS_STARTED, false);
+
svclist_add(svc);
}
}
diff --git a/initd/mksock.c b/initd/mksock.c
index 6a9cab0..0ec6b68 100644
--- a/initd/mksock.c
+++ b/initd/mksock.c
@@ -30,25 +30,14 @@
int mksock(void)
{
struct sockaddr_un un;
- int fd, flags;
+ int fd;
- fd = socket(AF_UNIX, SOCK_STREAM, 0);
+ fd = socket(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0);
if (fd < 0) {
perror("socket");
return -1;
}
- flags = fcntl(fd, F_GETFD);
- if (flags == -1) {
- perror("socket F_GETFD");
- goto fail;
- }
-
- if (fcntl(fd, F_SETFD, flags | O_CLOEXEC)) {
- perror("socket F_SETFD");
- goto fail;
- }
-
memset(&un, 0, sizeof(un));
un.sun_family = AF_UNIX;
diff --git a/initd/runlst.c b/initd/runlst.c
index 49b7def..7840aff 100644
--- a/initd/runlst.c
+++ b/initd/runlst.c
@@ -16,26 +16,15 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <sys/wait.h>
-#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
-#include <string.h>
#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
#include <fcntl.h>
#include "init.h"
extern char **environ;
-static NORETURN void split_and_exec(exec_t *cmd)
-{
- execve(cmd->argv[0], cmd->argv, environ);
- perror(cmd->argv[0]);
- exit(EXIT_FAILURE);
-}
-
static int child_setup(const char *ctty)
{
sigset_t mask;
@@ -77,7 +66,9 @@ int runlst_wait(exec_t *list, const char *ctty)
if (pid == 0) {
if (child_setup(ctty))
exit(EXIT_FAILURE);
- split_and_exec(list);
+ execve(list->argv[0], list->argv, environ);
+ perror(list->argv[0]);
+ exit(EXIT_FAILURE);
}
if (pid == -1) {
@@ -101,21 +92,18 @@ int runlst_wait(exec_t *list, const char *ctty)
pid_t runlst(exec_t *list, const char *ctty)
{
- int status;
- pid_t pid;
-
- pid = fork();
+ pid_t pid = fork();
if (pid == 0) {
if (child_setup(ctty))
exit(EXIT_FAILURE);
- if (list->next != NULL) {
- status = runlst_wait(list, NULL);
- exit(status);
- } else {
- split_and_exec(list);
- }
+ if (list->next != NULL)
+ exit(runlst_wait(list, NULL));
+
+ execve(list->argv[0], list->argv, environ);
+ perror(list->argv[0]);
+ exit(EXIT_FAILURE);
}
if (pid == -1)