From: Michel Stam Date: Mon, 13 Oct 2014 14:14:34 +0000 (+0200) Subject: Use one generic routine to access /proc/cmdline X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=79872ea6ca5867631c1ec5405721af12bea818b2;p=oweals%2Fprocd.git Use one generic routine to access /proc/cmdline Signed-off-by: Michel Stam --- diff --git a/CMakeLists.txt b/CMakeLists.txt index dc7ecd6..a8a7517 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,8 @@ INSTALL(TARGETS procd ) -ADD_EXECUTABLE(init initd/init.c initd/early.c initd/preinit.c initd/mkdev.c watchdog.c) +ADD_EXECUTABLE(init initd/init.c initd/early.c initd/preinit.c initd/mkdev.c watchdog.c + utils/utils.c) TARGET_LINK_LIBRARIES(init ${LIBS}) INSTALL(TARGETS init RUNTIME DESTINATION sbin diff --git a/initd/init.c b/initd/init.c index 153b3c2..d8490f8 100644 --- a/initd/init.c +++ b/initd/init.c @@ -20,6 +20,7 @@ #include #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include +#include "../utils/utils.h" #include "init.h" #include "../watchdog.h" @@ -53,24 +55,16 @@ static struct sigaction sa_shutdown = { static void cmdline(void) { - char line[1024]; - int r, fd = open("/proc/cmdline", O_RDONLY); - regex_t pat_cmdline; - regmatch_t matches[2]; - - if (fd < 0) - return; - - r = read(fd, line, sizeof(line) - 1); - line[r] = '\0'; - close(fd); - - regcomp(&pat_cmdline, "init_debug=([0-9]+)", REG_EXTENDED); - if (!regexec(&pat_cmdline, line, 2, matches, 0)) { - line[matches[1].rm_eo] = '\0'; - debug = atoi(&line[matches[1].rm_so]); + char line[20]; + char* res; + long r; + + res = get_cmdline_val("init_debug", line, sizeof(line)); + if (res != NULL) { + r = strtol(line, NULL, 10); + if ((r != LONG_MIN) && (r != LONG_MAX)) + debug = (int) r; } - regfree(&pat_cmdline); } int diff --git a/inittab.c b/inittab.c index c8540b1..2d9a1e0 100644 --- a/inittab.c +++ b/inittab.c @@ -25,6 +25,7 @@ #include #include +#include "utils/utils.h" #include "procd.h" #include "rcS.h" @@ -135,30 +136,20 @@ static void askfirst(struct init_action *a) static void askconsole(struct init_action *a) { struct stat s; - char line[256], *tty; - int i, r, fd = open("/proc/cmdline", O_RDONLY); - regex_t pat_cmdline; - regmatch_t matches[2]; - - if (fd < 0) - return; - - r = read(fd, line, sizeof(line) - 1); - line[r] = '\0'; - close(fd); - - regcomp(&pat_cmdline, "console=([a-zA-Z0-9]*)", REG_EXTENDED); - if (regexec(&pat_cmdline, line, 2, matches, 0)) - goto err_out; - line[matches[1].rm_eo] = '\0'; - tty = &line[matches[1].rm_so]; + char line[256], *tty, *split; + int i; + tty = get_cmdline_val("console", line, sizeof(line)); + split=strchr(tty, ','); + if (split != NULL) + split = '\0'; + chdir("/dev"); i = stat(tty, &s); chdir("/"); if (i) { DEBUG(4, "skipping %s\n", tty); - goto err_out; + return; } console = strdup(tty); @@ -171,9 +162,6 @@ static void askconsole(struct init_action *a) a->proc.cb = child_exit; fork_worker(a); - -err_out: - regfree(&pat_cmdline); } static void rcrespawn(struct init_action *a) diff --git a/utils/utils.c b/utils/utils.c index 59d02f1..5e67310 100644 --- a/utils/utils.c +++ b/utils/utils.c @@ -15,6 +15,12 @@ #include #include #include "utils.h" +#include +#include +#include +#include +#include +#include void __blobmsg_list_init(struct blobmsg_list *list, int offset, int len, blobmsg_list_cmp cmp) @@ -120,3 +126,39 @@ blobmsg_list_equal(struct blobmsg_list *l1, struct blobmsg_list *l2) return true; } + +char* get_cmdline_val(const char* name, char* out, int len) +{ + char pattern[COMMAND_LINE_SIZE + 1]; + char line[COMMAND_LINE_SIZE + 1]; + char *res = NULL, *tty; + int r, fd; + regex_t pat_cmdline; + regmatch_t matches[2]; + + fd = open("/proc/cmdline", O_RDONLY); + if (fd < 0) + return NULL; + + r = read(fd, line, COMMAND_LINE_SIZE); + if ( r <= 0 ) { + close(fd); + return NULL; + } + line[r] = '\0'; + close(fd); + + sprintf( pattern, "%s=([^ \n]*)", name); + regcomp(&pat_cmdline, pattern, REG_EXTENDED); + if (!regexec(&pat_cmdline, line, 2, matches, 0)) { + line[matches[1].rm_eo] = '\0'; + tty = (line + matches[1].rm_so); + strncpy(out, tty, len); + tty[len-1] = '\0'; + res = out; + } + + regfree(&pat_cmdline); + + return res; +} diff --git a/utils/utils.h b/utils/utils.h index 37fa216..c2c1cb4 100644 --- a/utils/utils.h +++ b/utils/utils.h @@ -49,5 +49,6 @@ int blobmsg_list_fill(struct blobmsg_list *list, void *data, int len, bool array void blobmsg_list_free(struct blobmsg_list *list); bool blobmsg_list_equal(struct blobmsg_list *l1, struct blobmsg_list *l2); void blobmsg_list_move(struct blobmsg_list *list, struct blobmsg_list *src); +char* get_cmdline_val(const char* name, char* out, int len); #endif