diff options
Diffstat (limited to 'src/librc')
-rw-r--r-- | src/librc/librc-misc.c | 48 | ||||
-rw-r--r-- | src/librc/librc.h | 1 | ||||
-rw-r--r-- | src/librc/rc.h.in | 7 | ||||
-rw-r--r-- | src/librc/rc.map | 1 |
4 files changed, 57 insertions, 0 deletions
diff --git a/src/librc/librc-misc.c b/src/librc/librc-misc.c index 97fa54c8..cebc9e8c 100644 --- a/src/librc/librc-misc.c +++ b/src/librc/librc-misc.c @@ -29,6 +29,7 @@ */ #include "librc.h" +#include "einfo.h" bool rc_yesno(const char *value) @@ -127,6 +128,53 @@ rc_getline(char **line, size_t *len, FILE *fp) } librc_hidden_def(rc_getline) +#ifdef __linux__ +char * +rc_proc_getent(const char *ent) +{ + FILE *fp; + char *proc, *p, *value = NULL; + size_t i, len; + + if (!exists("/proc/cmdline")) + return NULL; + + if (!(fp = fopen("/proc/cmdline", "r"))) { + eerror("failed to open `/proc/cmdline': %s", strerror(errno)); + return NULL; + } + + proc = NULL; + i = 0; + if (rc_getline(&proc, &i, fp) == -1 || proc == NULL) + eerror("rc_getline: %s", strerror(errno)); + + if (proc != NULL) { + len = strlen(ent); + + while ((p = strsep(&proc, " "))) { + if (strncmp(ent, p, len) == 0 && (p[len] == '\0' || p[len] == ' ' || p[len] == '=')) { + p += len; + + if (*p == '=') + p++; + + value = xstrdup(p); + } + } + } + + if (!value) + errno = ENOENT; + + fclose(fp); + free(proc); + + return value; +} +librc_hidden_def(rc_proc_getent) +#endif + RC_STRINGLIST * rc_config_list(const char *file) { diff --git a/src/librc/librc.h b/src/librc/librc.h index 876c0472..54c9a1ac 100644 --- a/src/librc/librc.h +++ b/src/librc/librc.h @@ -87,6 +87,7 @@ librc_hidden_proto(rc_find_pids) librc_hidden_proto(rc_getfile) librc_hidden_proto(rc_getline) librc_hidden_proto(rc_newer_than) +librc_hidden_proto(rc_proc_getent) librc_hidden_proto(rc_older_than) librc_hidden_proto(rc_runlevel_exists) librc_hidden_proto(rc_runlevel_get) diff --git a/src/librc/rc.h.in b/src/librc/rc.h.in index 350f518e..31b21f16 100644 --- a/src/librc/rc.h.in +++ b/src/librc/rc.h.in @@ -361,6 +361,13 @@ bool rc_newer_than(const char *, const char *, time_t *, char *); * @return true if source is older than target, otherwise false */ bool rc_older_than(const char *, const char *, time_t *, char *); +#ifdef __linux__ +/*! Read variables/values from /proc/cmdline + * @param value + * @return pointer to the value, otherwise NULL */ +char *rc_proc_getent(const char *); +#endif + /*! Update the cached dependency tree if it's older than any init script, * its configuration file or an external configuration file the init script * has specified. diff --git a/src/librc/rc.map b/src/librc/rc.map index 0f45cdfe..2aa58dea 100644 --- a/src/librc/rc.map +++ b/src/librc/rc.map @@ -18,6 +18,7 @@ global: rc_getline; rc_newer_than; rc_older_than; + rc_proc_getent; rc_runlevel_exists; rc_runlevel_get; rc_runlevel_list; |