# HG changeset patch # User Pascal Bellard # Date 1227893129 0 # Node ID 22791a4ca9441d5a8322859b4ac32a1d59de1bf7 # Parent 98a51003b20d8bf493ccff8e0c3fc935b416025e busybox: enhance modinfo diff -r 98a51003b20d -r 22791a4ca944 busybox/stuff/busybox-1.12.0-modinfo.u --- a/busybox/stuff/busybox-1.12.0-modinfo.u Fri Nov 28 17:23:48 2008 +0000 +++ b/busybox/stuff/busybox-1.12.0-modinfo.u Fri Nov 28 17:25:29 2008 +0000 @@ -59,7 +59,7 @@ --- busybox-1.12.0/modutils/modinfo.c +++ busybox-1.12.0/modutils/modinfo.c -@@ -0,0 +1,82 @@ +@@ -0,0 +1,104 @@ +/* vi: set sw=4 ts=4: */ +/* + * modinfo - retrieve module info @@ -73,43 +73,66 @@ +#include +#include + ++#define ALL_TAGS 0x3F ++ +enum { -+ ARG_F = (1<<4), /* field name */ -+ ARG_0 = (1<<5) /* \0 as separator */ ++ ARG_F = (1<<6), /* field name */ ++ ARG_0 = (1<<7) /* \0 as separator */ +}; + +struct modinfo_env { + char **argv; ++ const char **literals; + char *field; ++ int tags; +}; + ++static int display(char *data, const char *pattern, int flag) ++{ ++ if (flag) { ++ int n = printf("%s:",pattern); ++ while (n++ < 16) bb_putchar(' '); ++ } ++ return printf("%s%c",data, (option_mask32 & ARG_0) ? '\0' : '\n'); ++} ++ +static void modinfo(char *name, char *path, void *env) +{ + size_t len; -+ int i, length; ++ int i, j, length; + char *ptr, *the_module; + char **argv = ((struct modinfo_env *) env)->argv; -+ char *field = ((struct modinfo_env *) env)->field; ++ const char **literals = ((struct modinfo_env *) env)->literals; ++ const char *field = ((struct modinfo_env *) env)->field; ++ int tags = ((struct modinfo_env *) env)->tags; + extern void *xalloc_load_module(const char filename[], size_t *len); + + for (i = 0; argv[i]; i++) { + if (fnmatch(argv[i],name,0) == 0) { ++ if (tags & 1) { /* filename */ ++ display(path,literals[0],1 != tags); ++ } + len = MAXINT(ssize_t); -+ ptr = the_module = xalloc_load_module(path, &len); -+ length = strlen(field); -+ do { -+ ptr = memchr(ptr, *field, len - (ptr - (char*)the_module)); -+ if (ptr == NULL) /* no occurance left, done */ -+ break; -+ if (!strncmp(ptr, field, length) && ptr[length] == '=') { -+ ptr += length + 1; -+ ptr += printf("%s%c",ptr, -+ (option_mask32 & ARG_0) ? '\0' : '\n'); -+ } -+ ++ptr; -+ } while (1); ++ the_module = xalloc_load_module(path, &len); ++ if (field) tags |= ALL_TAGS+1; ++ for (j = 1; (1<