summaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
Diffstat (limited to 'libmount/src')
-rw-r--r--libmount/src/mountP.h2
-rw-r--r--libmount/src/utils.c91
2 files changed, 93 insertions, 0 deletions
diff --git a/libmount/src/mountP.h b/libmount/src/mountP.h
index bbaa2c6c4..f28935d0d 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 0cfefb347..624633dd8 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, "<path>" },
{ "--fs-root", test_fsroot, "<path>" },
{ "--cd-parent", test_chdir, "<path>" },
+ { "--kernel-cmdline",test_kernel_cmdline, "<option> | <option>=" },
{ NULL }
};