summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Stam <m.stam@fugro.nl>2014-10-13 16:14:34 +0200
committerJohn Crispin <blogic@openwrt.org>2014-10-12 13:24:11 +0200
commit79872ea6ca5867631c1ec5405721af12bea818b2 (patch)
tree86fd9034e2940b00405cda98aca084fac6e3a4d5
parentf45672d80bf2fec4ccb7363de1da6adb9e3f4421 (diff)
downloadunitd-79872ea6ca5867631c1ec5405721af12bea818b2.tar
unitd-79872ea6ca5867631c1ec5405721af12bea818b2.zip
Use one generic routine to access /proc/cmdline
Signed-off-by: Michel Stam <m.stam@fugro.nl>
-rw-r--r--CMakeLists.txt3
-rw-r--r--initd/init.c28
-rw-r--r--inittab.c30
-rw-r--r--utils/utils.c42
-rw-r--r--utils/utils.h1
5 files changed, 65 insertions, 39 deletions
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 <libubox/uloop.h>
#include <libubus.h>
+#include <limits.h>
#include <stdlib.h>
#include <fcntl.h>
#include <getopt.h>
@@ -28,6 +29,7 @@
#include <unistd.h>
#include <stdio.h>
+#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 <libubox/utils.h>
#include <libubox/list.h>
+#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 <libubox/avl.h>
#include <libubox/avl-cmp.h>
#include "utils.h"
+#include <asm-generic/setup.h>
+#include <regex.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
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