X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=inittab.c;h=55554b944d74f36068afe03f7ab64140da8564dc;hp=f8f0218f219b01023de4270483cf09eda134a3e8;hb=3db4e6d21ef85c3fbf1d7e0ae36bd1f039fec255;hpb=9cb7be1a3267744ad64b2422e2be4eeb1763d1d2 diff --git a/inittab.c b/inittab.c index f8f0218..55554b9 100644 --- a/inittab.c +++ b/inittab.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE #include #include #include @@ -30,6 +31,10 @@ #include "procd.h" #include "rcS.h" +#ifndef O_PATH +#define O_PATH 010000000 +#endif + #define TAG_ID 0 #define TAG_RUNLVL 1 #define TAG_ACTION 2 @@ -65,56 +70,41 @@ static char *ask = "/sbin/askfirst"; static LIST_HEAD(actions); -static int dev_open(const char *dev) +static int dev_exist(const char *dev) { - int fd = -1; - - if (dev) { - if (chdir("/dev")) - ERROR("failed to change dir to /dev\n"); - fd = open(dev, O_RDWR); - if (chdir("/")) - ERROR("failed to change dir to /\n"); - } + int dfd, fd; - return fd; -} + dfd = open("/dev", O_PATH|O_DIRECTORY); -static int dev_exist(const char *dev) -{ - int res; + if (dfd < 0) + return 0; + + fd = openat(dfd, dev, O_RDONLY); + close(dfd); - res = dev_open(dev); - if (res != -1) - close(res); + if (fd < 0) + return 0; - return (res != -1); + close(fd); + return 1; } static void fork_worker(struct init_action *a) { - int fd; pid_t p; a->proc.pid = fork(); if (!a->proc.pid) { p = setsid(); - fd = dev_open(a->id); - if (fd != -1) - { - dup2(fd, STDIN_FILENO); - dup2(fd, STDOUT_FILENO); - dup2(fd, STDERR_FILENO); - if (fd > STDERR_FILENO) - close(fd); - } + if (patch_stdio(a->id)) + ERROR("Failed to setup i/o redirection\n"); ioctl(STDIN_FILENO, TIOCSCTTY, 1); tcsetpgrp(STDIN_FILENO, p); execvp(a->argv[0], a->argv); - ERROR("Failed to execute %s\n", a->argv[0]); + ERROR("Failed to execute %s: %m\n", a->argv[0]); exit(-1); } @@ -238,6 +228,14 @@ static struct init_handler handlers[] = { .name = "respawn", .cb = rcrespawn, .multi = 1, + }, { + .name = "askconsolelate", + .cb = askconsole, + .multi = 1, + }, { + .name = "respawnlate", + .cb = rcrespawn, + .multi = 1, } }; @@ -280,14 +278,13 @@ void procd_inittab(void) char *line; if (!fp) { - ERROR("Failed to open %s\n", tab); + ERROR("Failed to open %s: %m\n", tab); return; } regcomp(&pat_inittab, "([a-zA-Z0-9]*):([a-zA-Z0-9]*):([a-zA-Z0-9]*):(.*)", REG_EXTENDED); line = malloc(LINE_LEN); - a = malloc(sizeof(struct init_action)); - memset(a, 0, sizeof(struct init_action)); + a = calloc(1, sizeof(struct init_action)); while (fgets(line, LINE_LEN, fp)) { char *tags[TAG_PROCESS + 1]; @@ -305,7 +302,7 @@ void procd_inittab(void) if (regexec(&pat_inittab, line, 5, matches, 0)) continue; - DEBUG(4, "Parsing inittab - %s", line); + DEBUG(4, "Parsing inittab - %s\n", line); for (i = TAG_ID; i <= TAG_PROCESS; i++) { line[matches[i].rm_eo] = '\0'; @@ -324,8 +321,7 @@ void procd_inittab(void) if (add_action(a, tags[TAG_ACTION])) continue; line = malloc(LINE_LEN); - a = malloc(sizeof(struct init_action)); - memset(a, 0, sizeof(struct init_action)); + a = calloc(1, sizeof(struct init_action)); } fclose(fp);