It is useful to be able to specify kernel version when generating
initramfs and similar for a kernel version that might not be the running
one.

bloatcheck on x86_64:

function                                             old     new   delta
packed_usage                                       26193   26218     +25
modinfo_main                                         391     414     +23
.rodata                                            80296   80298      +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 50/0)               Total: 50
bytes
   text    data     bss     dec     hex filename
   834606   14124    2008  850738   cfb32 busybox_old
   834657   14124    2008  850789   cfb65 busybox_unstripped

Signed-off-by: Natanael Copa <[email protected]>
---
 modutils/modinfo.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/modutils/modinfo.c b/modutils/modinfo.c
index 0a86c3296..53bc02880 100644
--- a/modutils/modinfo.c
+++ b/modutils/modinfo.c
@@ -38,17 +38,18 @@ static const char *const shortcuts[] ALIGN_PTR = {
 
 enum {
        OPT_0 = (1 << 0), /* \0 as separator */
-       OPT_F = (1 << 1), /* field name */
+       OPT_k = (1 << 1), /* kernel version */
+       OPT_F = (1 << 2), /* field name */
        /* first bits are for -nadlp options, the rest are for
         * fields not selectable with "shortcut" options
         */
-       OPT_n = (1 << 2),
-       OPT_TAGS = ((1 << ARRAY_SIZE(shortcuts)) - 1) << 2,
+       OPT_n = (1 << 3),
+       OPT_TAGS = ((1 << ARRAY_SIZE(shortcuts)) - 1) << 3,
 };
 
 static void display(const char *data, const char *pattern)
 {
-       int flag = option_mask32 >> 1; /* shift out -0 bit */
+       int flag = option_mask32 >> 2; /* shift out -0 and -k bits */
        if (flag & (flag-1)) {
                /* more than one field to show: print "FIELD:" pfx */
                int n = printf("%s:", pattern);
@@ -82,7 +83,8 @@ static void modinfo(const char *path, const char *version,
                }
        }
 
-       for (j = 1; (1<<j) & (OPT_TAGS|OPT_F); j++) {
+       /* skip initial -0 and -k option bits */
+       for (j = 2; (1<<j) & (OPT_TAGS|OPT_F); j++) {
                const char *pattern;
 
                if (!((1<<j) & tags))
@@ -90,7 +92,7 @@ static void modinfo(const char *path, const char *version,
 
                pattern = field;
                if ((1<<j) & OPT_TAGS)
-                       pattern = shortcuts[j-2];
+                       pattern = shortcuts[j-3];
 
                if (strcmp(pattern, shortcuts[0]) == 0) {
                        /* "-n" or "-F filename" */
@@ -123,7 +125,7 @@ static void modinfo(const char *path, const char *version,
 }
 
 //usage:#define modinfo_trivial_usage
-//usage:       "[-adlpn0] [-F keyword] MODULE"
+//usage:       "[-adlpn0] [-F keyword] [-k kernel] MODULE"
 //usage:#define modinfo_full_usage "\n\n"
 //usage:       "       -a              Shortcut for '-F author'"
 //usage:     "\n       -d              Shortcut for '-F description'"
@@ -131,6 +133,7 @@ static void modinfo(const char *path, const char *version,
 //usage:     "\n       -p              Shortcut for '-F parm'"
 ////usage:     "\n     -n              Shortcut for '-F filename'"
 //usage:     "\n       -F keyword      Keyword to look for"
+//usage:     "\n       -k kernel       kernel version"
 //usage:     "\n       -0              NUL terminated output"
 //usage:#define modinfo_example_usage
 //usage:       "$ modinfo -F vermagic loop\n"
@@ -139,6 +142,7 @@ int modinfo_main(int argc, char **argv) 
MAIN_EXTERNALLY_VISIBLE;
 int modinfo_main(int argc UNUSED_PARAM, char **argv)
 {
        const char *field;
+       const char *kernel;
        char name[MODULE_NAME_LEN];
        struct utsname uts;
        parser_t *parser;
@@ -147,15 +151,17 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv)
        unsigned i;
 
        field = NULL;
-       opts = getopt32(argv, "^" "0F:nadlp" "\0" "-1"/*minimum one arg*/, 
&field);
+       uname(&uts);
+       kernel = uts.release;
+       opts = getopt32(argv, "^" "0k:F:nadlp" "\0" "-1"/*minimum one arg*/, 
&kernel, &field);
        /* If no field selected, show all */
        if (!(opts & (OPT_TAGS|OPT_F)))
                option_mask32 |= OPT_TAGS;
+
        argv += optind;
 
-       uname(&uts);
        parser = config_open2(
-               xasprintf("%s/%s/%s", CONFIG_DEFAULT_MODULES_DIR, uts.release, 
CONFIG_DEFAULT_DEPMOD_FILE),
+               xasprintf("%s/%s/%s", CONFIG_DEFAULT_MODULES_DIR, kernel, 
CONFIG_DEFAULT_DEPMOD_FILE),
                xfopen_for_read
        );
 
@@ -167,7 +173,7 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv)
                filename2modname(bb_basename(tokens[0]), name);
                for (i = 0; argv[i]; i++) {
                        if (fnmatch(argv[i], name, 0) == 0) {
-                               modinfo(tokens[0], uts.release, field);
+                               modinfo(tokens[0], kernel, field);
                                argv[i] = (char *) "";
                        }
                }
@@ -177,7 +183,7 @@ int modinfo_main(int argc UNUSED_PARAM, char **argv)
 
        for (i = 0; argv[i]; i++) {
                if (argv[i][0]) {
-                       modinfo(argv[i], uts.release, field);
+                       modinfo(argv[i], kernel, field);
                }
        }
 
-- 
2.36.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to