From: Karel Zak Date: Thu, 8 Nov 2012 10:52:23 +0000 (+0100) Subject: libmount: add private mnt_get_kernel_cmdline_option() X-Git-Tag: v2.23-rc1~557 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f308ec19a71327b5601915ce6f8064eefe6ee0d5;p=thirdparty%2Futil-linux.git libmount: add private mnt_get_kernel_cmdline_option() Signed-off-by: Karel Zak --- diff --git a/include/pathnames.h b/include/pathnames.h index 58bba519a3..a7f33fed59 100644 --- a/include/pathnames.h +++ b/include/pathnames.h @@ -152,5 +152,8 @@ /* wdctl path */ #define _PATH_WATCHDOG_DEV "/dev/watchdog" +/* kernel command line */ +#define _PATH_PROC_CMDLINE "/proc/cmdline" + #endif /* PATHNAMES_H */ diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h index bbaa2c6c4d..f28935d0d0 100644 --- a/libmount/src/mountP.h +++ b/libmount/src/mountP.h @@ -147,6 +147,8 @@ extern const char *mnt_get_utab_path(void); extern int mnt_get_filesystems(char ***filesystems, const char *pattern); extern void mnt_free_filesystems(char **filesystems); +extern char *mnt_get_kernel_cmdline_option(const char *name); + /* tab.c */ extern int mnt_table_set_parser_fltrcb( struct libmnt_table *tb, int (*cb)(struct libmnt_fs *, void *), diff --git a/libmount/src/utils.c b/libmount/src/utils.c index 0cfefb3474..624633dd85 100644 --- a/libmount/src/utils.c +++ b/libmount/src/utils.c @@ -881,6 +881,78 @@ char *mnt_get_fs_root(const char *path, const char *mnt) return res; } +/* + * Search for @name kernel command parametr. + * + * Returns newly allocated string with parameter argument if the @name is + * specified as "name=" or returns pointer to @name or returns NULL if not + * found. + * + * For example cmdline: "aaa bbb=BBB ccc" + * + * @name is "aaa" --returns--> "aaa" (pointer to @name) + * @name is "bbb=" --returns--> "BBB" (allocated) + * @name is "foo" --returns--> NULL + */ +char *mnt_get_kernel_cmdline_option(const char *name) +{ + FILE *f; + size_t len; + int val = 0; + char *p, *res = NULL; + char buf[BUFSIZ]; /* see kernel include/asm-generic/setup.h: COMMAND_LINE_SIZE */ + const char *path = _PATH_PROC_CMDLINE; + + assert(name); + assert(*name); + +#ifdef TEST_PROGRAM + path = safe_getenv("LIBMOUNT_KERNEL_CMDLINE"); + if (!path) + path = _PATH_PROC_CMDLINE; +#endif + f = fopen(path, "r"); + if (!f) + return NULL; + + p = fgets(buf, sizeof(buf), f); + fclose(f); + + if (!p || !*p || *p == '\n') + return NULL; + + len = strlen(buf); + *(buf + len - 1) = '\0'; /* remove last '\n' */ + + len = strlen(name); + if (len && *(name + len - 1) == '=') + val = 1; + + while (p && *p) { + if (p != buf) + p++; + if (!(p = strstr(p, name))) + break; /* not found the option */ + if (p != buf && !isblank(*(p - 1))) + continue; /* no space before the option */ + if (!val && *(p + len) != '\0' && !isblank(*(p + len))) + continue; /* no space behind the option */ + if (val) { + char *v = p + len; + + while (*p && !isblank(*p)) /* jump to the end of the argument */ + p++; + *p = '\0'; + res = strdup(v); + break; + } else + res = (char *) name; /* option without '=' */ + break; + } + + return res; +} + #ifdef TEST_PROGRAM int test_match_fstype(struct libmnt_test *ts, int argc, char *argv[]) { @@ -974,6 +1046,24 @@ int test_chdir(struct libmnt_test *ts, int argc, char *argv[]) return rc; } +int test_kernel_cmdline(struct libmnt_test *ts, int argc, char *argv[]) +{ + char *name = argv[1]; + char *res; + + res = mnt_get_kernel_cmdline_option(name); + if (!res) + printf("'%s' not found\n", name); + else if (res == name) + printf("'%s' found\n", name); + else { + printf("'%s' found, argument: '%s'\n", name, res); + free(res); + } + + return 0; +} + int main(int argc, char *argv[]) { @@ -986,6 +1076,7 @@ int main(int argc, char *argv[]) { "--mountpoint", test_mountpoint, "" }, { "--fs-root", test_fsroot, "" }, { "--cd-parent", test_chdir, "" }, + { "--kernel-cmdline",test_kernel_cmdline, "