From 6abeec74301d8406ebbbd653b9fe9a0e234c09bf Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Sun, 21 Jun 2009 12:20:53 +0100 Subject: [PATCH] Use rc_getline instead of assuming a fixed kernel cmdline length. This is now requires as COMMAND_LINE_SIZE isn't exposed by kernel headers anymore. Fixes #177. --- src/librc/librc.h | 2 -- src/librc/rc.h.in | 4 ++++ src/librc/rc.map | 1 + src/rc/rc.c | 21 ++++++++------------- src/test/rc.funcs.list | 2 ++ 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/librc/librc.h b/src/librc/librc.h index 311793f8..fc87bb10 100644 --- a/src/librc/librc.h +++ b/src/librc/librc.h @@ -72,8 +72,6 @@ #define librc_hidden_proto(x) hidden_proto(x) #define librc_hidden_def(x) hidden_def(x) -ssize_t rc_getline(char **, size_t *, FILE *); - librc_hidden_proto(rc_config_list) librc_hidden_proto(rc_config_load) librc_hidden_proto(rc_config_value) diff --git a/src/librc/rc.h.in b/src/librc/rc.h.in index 89ebfedd..373f1d1e 100644 --- a/src/librc/rc.h.in +++ b/src/librc/rc.h.in @@ -517,5 +517,9 @@ typedef LIST_HEAD(rc_pidlist, rc_pid) RC_PIDLIST; * @return NULL terminated list of pids */ RC_PIDLIST *rc_find_pids(const char *, const char *const *, uid_t, pid_t); +/* getline is a handy glibc function that not all libcs have, so + * we have our own */ +ssize_t rc_getline(char **, size_t *, FILE *); + __END_DECLS #endif diff --git a/src/librc/rc.map b/src/librc/rc.map index 7cfbfabc..3f1e7e70 100644 --- a/src/librc/rc.map +++ b/src/librc/rc.map @@ -12,6 +12,7 @@ global: rc_deptree_update_needed; rc_environ_fd; rc_find_pids; + rc_getline; rc_newer_than; rc_older_than; rc_runlevel_exists; diff --git a/src/rc/rc.c b/src/rc/rc.c index 915dc181..3d8628e8 100644 --- a/src/rc/rc.c +++ b/src/rc/rc.c @@ -43,10 +43,6 @@ const char rc_copyright[] = "Copyright (c) 2007-2008 Roy Marples"; #include #include -#ifdef __linux__ -# include /* for COMMAND_LINE_SIZE */ -#endif - #include #include #include @@ -177,10 +173,8 @@ static char * proc_getent(const char *ent) { FILE *fp; - char proc[COMMAND_LINE_SIZE]; - char *p; - char *value = NULL; - int i; + char *proc, *p, *value = NULL; + size_t i; if (!exists("/proc/cmdline")) return NULL; @@ -190,11 +184,11 @@ proc_getent(const char *ent) return NULL; } - memset(proc, 0, sizeof(proc)); - p = fgets(proc, sizeof(proc), fp); - if (p == NULL) - eerror("fgets: %s", strerror(errno)); - else if (*proc && (p = strstr(proc, ent))) { + proc = NULL; + i = 0; + if (rc_getline(&proc, &i, fp) == -1 || proc == NULL) + eerror("rc_getline: %s", strerror(errno)); + if (*proc && (p = strstr(proc, ent))) { i = p - proc; if (i == '\0' || proc[i - 1] == ' ') { p += strlen(ent); @@ -205,6 +199,7 @@ proc_getent(const char *ent) } else errno = ENOENT; fclose(fp); + free(proc); return value; } diff --git a/src/test/rc.funcs.list b/src/test/rc.funcs.list index 409ede0d..b67c0d8f 100644 --- a/src/test/rc.funcs.list +++ b/src/test/rc.funcs.list @@ -20,6 +20,8 @@ rc_deptree_update_needed rc_deptree_update_needed@@RC_1.0 rc_find_pids rc_find_pids@@RC_1.0 +rc_getline +rc_getline@@RC_1.0 rc_newer_than rc_newer_than@@RC_1.0 rc_older_than