diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2026-06-16 17:29:24 +0530 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2026-06-16 17:29:24 +0530 |
| commit | 4f7e89065e41fd487e411d35b5caeac2a10af10e (patch) | |
| tree | edb15b513de9f2c4bbd13926951adc47af43d8b4 /tools/bootconfig/main.c | |
| parent | 8b308f96484e37d92d2fc6b72b091f60496c000e (diff) | |
| parent | 4135542de6c42bc366a651d0b2d82ea72ac199fc (diff) | |
| download | linux-next-4f7e89065e41fd487e411d35b5caeac2a10af10e.tar.gz linux-next-4f7e89065e41fd487e411d35b5caeac2a10af10e.zip | |
Merge tag 'bootconfig-v7.2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull bootconfig updates from Masami Hiramatsu:
- bootconfig: move xbc_snprint_cmdline() to lib/bootconfig.c
Move the xbc_snprint_cmdline() function and its buffer from
main.c to the shared lib/bootconfig.c parser library so it
can be reused by userspace tools.
- render kernel.* subtree as cmdline string with -C
Add a new -C option to print the kernel.* subtree as a flat
command-line string at build time, allowing early parameter
injection without runtime parsing.
* tag 'bootconfig-v7.2' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace:
tools/bootconfig: render kernel.* subtree as cmdline string with -C
bootconfig: move xbc_snprint_cmdline() to lib/bootconfig.c
Diffstat (limited to 'tools/bootconfig/main.c')
| -rw-r--r-- | tools/bootconfig/main.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/tools/bootconfig/main.c b/tools/bootconfig/main.c index ddabde20585f..7dc9fff9b637 100644 --- a/tools/bootconfig/main.c +++ b/tools/bootconfig/main.c @@ -286,7 +286,41 @@ static int init_xbc_with_error(char *buf, int len) return ret; } -static int show_xbc(const char *path, bool list) +static int show_xbc_kernel_cmdline(void) +{ + struct xbc_node *root; + char *buf = NULL; + int len, ret; + + root = xbc_find_node("kernel"); + if (!root) + return 0; /* no kernel.* keys: emit empty output */ + + len = xbc_snprint_cmdline(NULL, 0, root); + if (len < 0) { + pr_err("Failed to size cmdline output: %d\n", len); + return len; + } + if (len == 0) + return 0; + + buf = malloc(len + 1); + if (!buf) + return -ENOMEM; + + ret = xbc_snprint_cmdline(buf, len + 1, root); + if (ret < 0) { + pr_err("Failed to render cmdline output: %d\n", ret); + free(buf); + return ret; + } + + fputs(buf, stdout); + free(buf); + return 0; +} + +static int show_xbc(const char *path, bool list, bool render_cmdline) { int ret, fd; char *buf = NULL; @@ -322,11 +356,14 @@ static int show_xbc(const char *path, bool list) if (init_xbc_with_error(buf, ret) < 0) goto out; } - if (list) + if (render_cmdline) + ret = show_xbc_kernel_cmdline(); + else if (list) xbc_show_list(); else xbc_show_compact_tree(); - ret = 0; + if (ret > 0) + ret = 0; out: free(buf); @@ -488,7 +525,10 @@ static int usage(void) " Options:\n" " -a <config>: Apply boot config to initrd\n" " -d : Delete boot config file from initrd\n" - " -l : list boot config in initrd or file\n\n" + " -l : list boot config in initrd or file\n" + " -C : render the kernel.* subtree as a flat cmdline\n" + " string (suitable for embedding in a kernel image)\n" + " and print it to stdout\n\n" " If no option is given, show the bootconfig in the given file.\n"); return -1; } @@ -497,10 +537,11 @@ int main(int argc, char **argv) { char *path = NULL; char *apply = NULL; + bool render_cmdline = false; bool delete = false, list = false; int opt; - while ((opt = getopt(argc, argv, "hda:l")) != -1) { + while ((opt = getopt(argc, argv, "hda:lC")) != -1) { switch (opt) { case 'd': delete = true; @@ -511,14 +552,17 @@ int main(int argc, char **argv) case 'l': list = true; break; + case 'C': + render_cmdline = true; + break; case 'h': default: return usage(); } } - if ((apply && delete) || (delete && list) || (apply && list)) { - pr_err("Error: You can give one of -a, -d or -l at once.\n"); + if ((!!apply + !!delete + !!list + !!render_cmdline) > 1) { + pr_err("Error: You can give one of -a, -d, -l or -C at once.\n"); return usage(); } @@ -534,5 +578,5 @@ int main(int argc, char **argv) else if (delete) return delete_xbc(path); - return show_xbc(path, list); + return show_xbc(path, list, render_cmdline); } |
