wok-next rev 1637
busybox: fix modinfo
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Oct 24 21:24:55 2008 +0000 (2008-10-24) |
parents | c7968a159ca2 |
children | 7d89161a7786 |
files | busybox/stuff/busybox-1.12.0-modinfo.u busybox/stuff/busybox-1.12.0-modprobe.u |
line diff
1.1 --- a/busybox/stuff/busybox-1.12.0-modinfo.u Thu Oct 23 20:39:58 2008 +0000 1.2 +++ b/busybox/stuff/busybox-1.12.0-modinfo.u Fri Oct 24 21:24:55 2008 +0000 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,91 @@ 1.8 +@@ -0,0 +1,82 @@ 1.9 +/* vi: set sw=4 ts=4: */ 1.10 +/* 1.11 + * modinfo - retrieve module info 1.12 @@ -71,7 +71,48 @@ 1.13 +#undef _GNU_SOURCE 1.14 +#define _GNU_SOURCE 1.15 +#include <libbb.h> 1.16 -+#include <sys/utsname.h> /* uname() */ 1.17 ++#include <fnmatch.h> 1.18 ++ 1.19 ++enum { 1.20 ++ ARG_F = (1<<4), /* field name */ 1.21 ++ ARG_0 = (1<<5) /* \0 as separator */ 1.22 ++}; 1.23 ++ 1.24 ++struct modinfo_env { 1.25 ++ char **argv; 1.26 ++ char *field; 1.27 ++}; 1.28 ++ 1.29 ++static void modinfo(char *name, char *path, void *env) 1.30 ++{ 1.31 ++ size_t len; 1.32 ++ int i, length; 1.33 ++ char *ptr, *the_module; 1.34 ++ char **argv = ((struct modinfo_env *) env)->argv; 1.35 ++ char *field = ((struct modinfo_env *) env)->field; 1.36 ++ extern void *xalloc_load_module(const char filename[], size_t *len); 1.37 ++ 1.38 ++ for (i = 0; argv[i]; i++) { 1.39 ++ if (fnmatch(argv[i],name,0) == 0) { 1.40 ++ len = MAXINT(ssize_t); 1.41 ++ ptr = the_module = xalloc_load_module(path, &len); 1.42 ++ length = strlen(field); 1.43 ++ do { 1.44 ++ ptr = memchr(ptr, *field, len - (ptr - (char*)the_module)); 1.45 ++ if (ptr == NULL) /* no occurance left, done */ 1.46 ++ break; 1.47 ++ if (!strncmp(ptr, field, length) && ptr[length] == '=') { 1.48 ++ ptr += length + 1; 1.49 ++ ptr += printf("%s%c",ptr, 1.50 ++ (option_mask32 & ARG_0) ? '\0' : '\n'); 1.51 ++ } 1.52 ++ ++ptr; 1.53 ++ } while (1); 1.54 ++ free(the_module); 1.55 ++ break; 1.56 ++ } 1.57 ++ } 1.58 ++} 1.59 + 1.60 +int modinfo_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 1.61 +int modinfo_main(int argc UNUSED_PARAM, char **argv) 1.62 @@ -82,72 +123,22 @@ 1.63 + "license", 1.64 + "parm" 1.65 + }; 1.66 -+ size_t len; 1.67 -+ int i, length; 1.68 -+ char *field = NULL; 1.69 -+ char *ptr, *the_module, *depends, *filename; 1.70 -+ struct utsname un; 1.71 -+ enum { 1.72 -+ ARG_F = (1<<4), /* field name */ 1.73 -+ ARG_0 = (1<<5) /* \0 as separator */ 1.74 -+ }; 1.75 -+ extern void *xalloc_load_module(const char filename[], size_t *len); 1.76 ++ int i; 1.77 ++ struct modinfo_env env; 1.78 ++ extern void mod_walk(void (*action)(char *name, char *path, void *env), 1.79 ++ void *data); 1.80 + 1.81 -+ getopt32(argv, "adlpF:0", &field); 1.82 -+ argv += optind; 1.83 ++ env.field = NULL; 1.84 ++ getopt32(argv, "adlpF:0", &env.field); 1.85 ++ env.argv = argv += optind; 1.86 + 1.87 + for (i = 0; i < sizeof(shortcuts)/sizeof(shortcuts[0]); i++) 1.88 + if (option_mask32 & (1 << i)) 1.89 -+ field = (char *) shortcuts[i]; 1.90 ++ env.field = (char *) shortcuts[i]; 1.91 + 1.92 -+ if (!field || !*argv) 1.93 ++ if (!env.field || !*env.argv) 1.94 + bb_show_usage(); 1.95 + 1.96 -+ /* get module path from modules.dep */ 1.97 -+ uname(&un); /* never fails */ 1.98 -+ filename = xasprintf(CONFIG_DEFAULT_MODULES_DIR"/%s/"CONFIG_DEFAULT_DEPMOD_FILE, un.release); 1.99 -+ len = MAXINT(ssize_t); 1.100 -+ the_module = xalloc_load_module(*argv, &len); 1.101 -+ if (the_module == NULL) { 1.102 -+ len = MAXINT(ssize_t); 1.103 -+ ptr = depends = xmalloc_open_read_close(filename, &len); 1.104 -+ depends[len-1] = 0; 1.105 -+ if (ENABLE_FEATURE_CLEAN_UP) 1.106 -+ free(filename); 1.107 -+ do { 1.108 -+ ptr = strstr(ptr,*argv); 1.109 -+ length = strlen(*argv); 1.110 -+ if (!ptr) 1.111 -+ bb_show_usage(); 1.112 -+ if (ptr[length] == '.' && ptr[-1] == '/') { 1.113 -+ while (ptr[++length] != ':') 1.114 -+ if (ptr[length] == ' ') goto next; 1.115 -+ ptr[length] = 0; 1.116 -+ while (ptr > depends && ptr[-1] != '\n') ptr--; 1.117 -+ break; 1.118 -+ } 1.119 -+ next: 1.120 -+ ptr++; 1.121 -+ } while (1); 1.122 -+ if (ENABLE_FEATURE_CLEAN_UP) 1.123 -+ free(depends); 1.124 -+ 1.125 -+ len = MAXINT(ssize_t); 1.126 -+ the_module = xalloc_load_module(ptr, &len); 1.127 -+ } 1.128 -+ ptr = the_module; 1.129 -+ length = strlen(field); 1.130 -+ do { 1.131 -+ ptr = memchr(ptr, *field, len - (ptr - (char*)the_module)); 1.132 -+ if (ptr == NULL) /* no occurance left, done */ 1.133 -+ break; 1.134 -+ if (!strncmp(ptr, field, length) && ptr[length] == '=') { 1.135 -+ ptr += length + 1; 1.136 -+ ptr += printf("%s%c",ptr,(option_mask32 & ARG_0) ? '\0' : '\n'); 1.137 -+ } 1.138 -+ ++ptr; 1.139 -+ } while (1); 1.140 -+ if (ENABLE_FEATURE_CLEAN_UP) 1.141 -+ free(the_module); 1.142 ++ mod_walk(modinfo, &env); 1.143 + return 0; 1.144 +}
2.1 --- a/busybox/stuff/busybox-1.12.0-modprobe.u Thu Oct 23 20:39:58 2008 +0000 2.2 +++ b/busybox/stuff/busybox-1.12.0-modprobe.u Fri Oct 24 21:24:55 2008 +0000 2.3 @@ -27,3 +27,27 @@ 2.4 if (remove_opt) { 2.5 do { 2.6 /* (*argv) can be NULL here */ 2.7 + 2.8 +--- busybox-1.12.0/modutils/modprobe.c 2.9 ++++ busybox-1.12.0/modutils/modprobe.c 2.10 +@@ -921,6 +921,20 @@ 2.11 + return rc; 2.12 + } 2.13 + 2.14 ++void mod_walk(void (*action)(char *name, char *path, void *env), void *data); 2.15 ++void mod_walk(void (*action)(char *name, char *path, void *env), void *data) 2.16 ++{ 2.17 ++ struct dep_t *dt; 2.18 ++ 2.19 ++ depend = build_dep(); 2.20 ++ if (!depend) 2.21 ++ bb_error_msg_and_die("cannot parse "CONFIG_DEFAULT_DEPMOD_FILE); 2.22 ++ 2.23 ++ for (dt = depend; dt && dt->m_path; dt = dt->m_next) { 2.24 ++ action(dt->m_name, dt->m_path, data); 2.25 ++ } 2.26 ++} 2.27 ++ 2.28 + int modprobe_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 2.29 + int modprobe_main(int argc UNUSED_PARAM, char **argv) 2.30 + {