X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fprocd.git;a=blobdiff_plain;f=initd%2Fpreinit.c;h=729978ea2f2af790653baaee5ae788f05a88a177;hp=eeadbeb3ae8cc36691e216926e101d5a00ccf615;hb=4004b68fe57dd72197b8a00b0756cc7f978ad88a;hpb=916f95cb58604038695347ee41a430d8ca1f0556 diff --git a/initd/preinit.c b/initd/preinit.c index eeadbeb..729978e 100644 --- a/initd/preinit.c +++ b/initd/preinit.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -31,11 +32,29 @@ static struct uloop_process preinit_proc; static struct uloop_process plugd_proc; static void +check_dbglvl(void) +{ + FILE *fp = fopen("/tmp/debug_level", "r"); + int lvl = 0; + + if (!fp) + return; + if (fscanf(fp, "%d", &lvl) == EOF) + ERROR("failed to read debug level\n"); + fclose(fp); + unlink("/tmp/debug_level"); + + if (lvl > 0 && lvl < 5) + debug = lvl; +} + +static void spawn_procd(struct uloop_process *proc, int ret) { char *wdt_fd = watchdog_fd(); - char *argv[] = { "/sbin/procd", NULL }; + char *argv[] = { "/sbin/procd", NULL}; struct stat s; + char dbg[2]; if (plugd_proc.pid > 0) kill(plugd_proc.pid, SIGKILL); @@ -46,9 +65,16 @@ spawn_procd(struct uloop_process *proc, int ret) unsetenv("INITRAMFS"); unsetenv("PREINIT"); + unlink("/tmp/.preinit"); DEBUG(2, "Exec to real procd now\n"); if (wdt_fd) setenv("WDTFD", wdt_fd, 1); + check_dbglvl(); + if (debug > 0) { + snprintf(dbg, 2, "%d", debug); + setenv("DBGLVL", dbg, 1); + } + execvp(argv[0], argv); } @@ -63,6 +89,7 @@ preinit(void) { char *init[] = { "/bin/sh", "/etc/preinit", NULL }; char *plug[] = { "/sbin/procd", "-h", "/etc/hotplug-preinit.json", NULL }; + int fd; LOG("- preinit -\n"); @@ -81,6 +108,13 @@ preinit(void) setenv("PREINIT", "1", 1); + fd = creat("/tmp/.preinit", 0600); + + if (fd < 0) + ERROR("Failed to create sentinel file\n"); + else + close(fd); + preinit_proc.cb = spawn_procd; preinit_proc.pid = fork(); if (!preinit_proc.pid) {