wok-6.x diff busybox/stuff/busybox-1.12.0-modinfo.u @ rev 5308

busybox: update init scripts
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Apr 20 18:23:21 2010 +0200 (2010-04-20)
parents 85fbd04c1fd6
children
line diff
     1.1 --- a/busybox/stuff/busybox-1.12.0-modinfo.u	Fri Oct 24 21:24:55 2008 +0000
     1.2 +++ b/busybox/stuff/busybox-1.12.0-modinfo.u	Tue Apr 20 18:23:21 2010 +0200
     1.3 @@ -59,7 +59,7 @@
     1.4  
     1.5  --- busybox-1.12.0/modutils/modinfo.c
     1.6  +++ busybox-1.12.0/modutils/modinfo.c
     1.7 -@@ -0,0 +1,82 @@
     1.8 +@@ -0,0 +1,104 @@
     1.9  +/* vi: set sw=4 ts=4: */
    1.10  +/*
    1.11  + * modinfo - retrieve module info
    1.12 @@ -73,43 +73,66 @@
    1.13  +#include <libbb.h>
    1.14  +#include <fnmatch.h>
    1.15  +
    1.16 ++#define ALL_TAGS	0x3F
    1.17 ++
    1.18  +enum {
    1.19 -+	ARG_F = (1<<4), /* field name */
    1.20 -+	ARG_0 = (1<<5)  /* \0 as separator */
    1.21 ++	ARG_F = (1<<6), /* field name */
    1.22 ++	ARG_0 = (1<<7)  /* \0 as separator */
    1.23  +};
    1.24  +
    1.25  +struct modinfo_env {
    1.26  +	char **argv;
    1.27 ++	const char **literals;
    1.28  +	char *field;
    1.29 ++	int tags;
    1.30  +};
    1.31  +
    1.32 ++static int display(char *data, const char *pattern, int flag)
    1.33 ++{
    1.34 ++	if (flag) {
    1.35 ++		int n = printf("%s:",pattern);
    1.36 ++		while (n++ < 16) bb_putchar(' ');
    1.37 ++	}
    1.38 ++	return printf("%s%c",data, (option_mask32 & ARG_0) ? '\0' : '\n');
    1.39 ++}
    1.40 ++
    1.41  +static void modinfo(char *name, char *path, void *env)
    1.42  +{
    1.43  +	size_t len;
    1.44 -+	int i, length;
    1.45 ++	int i, j, length;
    1.46  +	char *ptr, *the_module;
    1.47  +	char **argv = ((struct modinfo_env *) env)->argv;
    1.48 -+	char *field = ((struct modinfo_env *) env)->field;
    1.49 ++	const char **literals = ((struct modinfo_env *) env)->literals;
    1.50 ++	const char *field = ((struct modinfo_env *) env)->field;
    1.51 ++	int tags = ((struct modinfo_env *) env)->tags;
    1.52  +	extern void *xalloc_load_module(const char filename[], size_t *len);
    1.53  +
    1.54  +	for (i = 0; argv[i]; i++) {
    1.55  +		if (fnmatch(argv[i],name,0) == 0) {
    1.56 ++			if (tags & 1) { /* filename */
    1.57 ++				display(path,literals[0],1 != tags);
    1.58 ++			}
    1.59  +			len = MAXINT(ssize_t);
    1.60 -+			ptr = the_module = xalloc_load_module(path, &len);
    1.61 -+			length = strlen(field);
    1.62 -+			do {
    1.63 -+				ptr = memchr(ptr, *field, len - (ptr - (char*)the_module));
    1.64 -+				if (ptr == NULL) /* no occurance left, done */
    1.65 -+					break;
    1.66 -+				if (!strncmp(ptr, field, length) && ptr[length] == '=') {
    1.67 -+					ptr += length + 1;
    1.68 -+					ptr += printf("%s%c",ptr,
    1.69 -+								(option_mask32 & ARG_0) ? '\0' : '\n');
    1.70 -+				}
    1.71 -+				++ptr;
    1.72 -+			} while (1);
    1.73 ++			the_module = xalloc_load_module(path, &len);
    1.74 ++			if (field) tags |= ALL_TAGS+1;
    1.75 ++			for (j = 1; (1<<j) & (ALL_TAGS+ALL_TAGS+1); j++)	{
    1.76 ++				const char *pattern = field;
    1.77 ++				if ((1<<j) & ALL_TAGS) pattern = literals[j];
    1.78 ++				if (!((1<<j) & tags)) continue;
    1.79 ++				length = strlen(pattern);
    1.80 ++				ptr = the_module;
    1.81 ++				do {
    1.82 ++					ptr = memchr(ptr, *pattern, len - (ptr - (char*)the_module));
    1.83 ++					if (ptr == NULL) /* no occurance left, done */
    1.84 ++						break;
    1.85 ++					if (!strncmp(ptr, pattern, length) && ptr[length] == '=') {
    1.86 ++						ptr += length + 1;
    1.87 ++						ptr += display(ptr,pattern,(1<<j) != tags);
    1.88 ++					}
    1.89 ++					++ptr;
    1.90 ++				} while (1);
    1.91 ++			}
    1.92  +			free(the_module);
    1.93 -+			break;
    1.94  +		}
    1.95  +	}
    1.96  +}
    1.97 @@ -118,25 +141,24 @@
    1.98  +int modinfo_main(int argc UNUSED_PARAM, char **argv)
    1.99  +{
   1.100  +	static const char *shortcuts[] = {
   1.101 ++		"filename",
   1.102 ++		"description",
   1.103  +		"author",
   1.104 -+		"description",
   1.105  +		"license",
   1.106 -+		"parm"
   1.107 ++		"vermagic",
   1.108 ++		"parm",
   1.109  +	};
   1.110 -+	int i;
   1.111  +	struct modinfo_env env;
   1.112  +	extern void mod_walk(void (*action)(char *name, char *path, void *env),
   1.113  +						 void *data);
   1.114  +
   1.115  +	env.field = NULL;
   1.116 -+	getopt32(argv, "adlpF:0", &env.field);
   1.117 ++	env.literals = shortcuts;
   1.118 ++	getopt32(argv, "fdalvpF:0", &env.field);
   1.119  +	env.argv = argv += optind;
   1.120 ++	env.tags = (option_mask32) ? option_mask32 & ALL_TAGS : ALL_TAGS;
   1.121  +
   1.122 -+	for (i = 0; i < sizeof(shortcuts)/sizeof(shortcuts[0]); i++)
   1.123 -+		if (option_mask32 & (1 << i))
   1.124 -+			env.field = (char *) shortcuts[i];
   1.125 -+
   1.126 -+	if (!env.field || !*env.argv)
   1.127 ++	if (!*env.argv)
   1.128  +		bb_show_usage();
   1.129  +
   1.130  +	mod_walk(modinfo, &env);