summaryrefslogtreecommitdiff
path: root/modutils/modprobe.c
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2002-05-03 15:48:26 +0000
committerEric Andersen <andersen@codepoet.org>2002-05-03 15:48:26 +0000
commit864b79791a8367d9f8ea2c18eba31fea65bf511a (patch)
treeb5653837256659fad4718f52f8690802396cc563 /modutils/modprobe.c
parent26920c6c94449a96bf4c0701300ff4474bc56515 (diff)
downloadbusybox-w32-864b79791a8367d9f8ea2c18eba31fea65bf511a.tar.gz
busybox-w32-864b79791a8367d9f8ea2c18eba31fea65bf511a.tar.bz2
busybox-w32-864b79791a8367d9f8ea2c18eba31fea65bf511a.zip
Patch from Robert Griebl <griebl@gmx.de> to support modprobe -r properly,
merged in with the latest and greatest.
Diffstat (limited to 'modutils/modprobe.c')
-rw-r--r--modutils/modprobe.c93
1 files changed, 57 insertions, 36 deletions
diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index f9aa0aa55..2f797ec4a 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -34,7 +34,7 @@ struct dep_t {
34}; 34};
35 35
36 36
37static struct dep_t *build_dep ( ) 37static struct dep_t *build_dep ( void )
38{ 38{
39 struct utsname un; 39 struct utsname un;
40 FILE *f; 40 FILE *f;
@@ -55,7 +55,7 @@ static struct dep_t *build_dep ( )
55 return 0; 55 return 0;
56 56
57 while ( fgets ( buffer, sizeof( buffer), f )) { 57 while ( fgets ( buffer, sizeof( buffer), f )) {
58 int l = strlen ( buffer ); 58 int l = xstrlen ( buffer );
59 char *p = 0; 59 char *p = 0;
60 60
61 if ( buffer [l-1] == '\n' ) { 61 if ( buffer [l-1] == '\n' ) {
@@ -74,6 +74,7 @@ static struct dep_t *build_dep ( )
74 if ( col ) { 74 if ( col ) {
75 char *mods; 75 char *mods;
76 char *mod; 76 char *mod;
77 int ext = 0;
77 78
78 *col = 0; 79 *col = 0;
79 mods = strrchr ( buffer, '/' ); 80 mods = strrchr ( buffer, '/' );
@@ -83,10 +84,11 @@ static struct dep_t *build_dep ( )
83 else 84 else
84 mods++; 85 mods++;
85 86
86 mod = (char *) malloc ( col - mods + 1 ); 87 if (( *(col-2) == '.' ) && ( *(col-1) == 'o' ))
87 strncpy ( mod, mods, col - mods ); 88 ext = 2;
88 mod [col - mods] = 0; 89
89 90 mod = xstrndup ( mods, col - mods - ext );
91
90 if ( !current ) { 92 if ( !current ) {
91 first = current = (struct dep_t *) malloc ( sizeof ( struct dep_t )); 93 first = current = (struct dep_t *) malloc ( sizeof ( struct dep_t ));
92 } 94 }
@@ -99,7 +101,7 @@ static struct dep_t *build_dep ( )
99 current-> m_deparr = 0; 101 current-> m_deparr = 0;
100 current-> m_next = 0; 102 current-> m_next = 0;
101 103
102 /* printf ( "%s:\n", mod ); */ 104 //printf ( "%s:\n", mod );
103 105
104 p = col + 1; 106 p = col + 1;
105 } 107 }
@@ -113,6 +115,7 @@ static struct dep_t *build_dep ( )
113 char *end = &buffer [l-1]; 115 char *end = &buffer [l-1];
114 char *deps = strrchr ( end, '/' ); 116 char *deps = strrchr ( end, '/' );
115 char *dep; 117 char *dep;
118 int ext = 0;
116 119
117 while ( isblank ( *end ) || ( *end == '\\' )) 120 while ( isblank ( *end ) || ( *end == '\\' ))
118 end--; 121 end--;
@@ -128,15 +131,16 @@ static struct dep_t *build_dep ( )
128 else 131 else
129 deps++; 132 deps++;
130 133
131 dep = (char *) malloc ( end - deps + 2 ); 134 if (( *(end-1) == '.' ) && ( *end == 'o' ))
132 strncpy ( dep, deps, end - deps + 1 ); 135 ext = 2;
133 dep [end - deps + 1] = 0; 136
137 dep = xstrndup ( deps, end - deps - ext + 1 );
134 138
135 current-> m_depcnt++; 139 current-> m_depcnt++;
136 current-> m_deparr = (char **) realloc ( current-> m_deparr, sizeof ( char *) * current-> m_depcnt ); 140 current-> m_deparr = (char **) xrealloc ( current-> m_deparr, sizeof ( char *) * current-> m_depcnt );
137 current-> m_deparr [current-> m_depcnt - 1] = dep; 141 current-> m_deparr [current-> m_depcnt - 1] = dep;
138 142
139 /* printf ( " %d) %s\n", current-> m_depcnt, current-> m_deparr [current-> m_depcnt -1] ); */ 143 //printf ( " %d) %s\n", current-> m_depcnt, current-> m_deparr [current-> m_depcnt -1] );
140 } 144 }
141 145
142 if ( buffer [l-1] == '\\' ) 146 if ( buffer [l-1] == '\\' )
@@ -152,26 +156,33 @@ static struct dep_t *build_dep ( )
152 156
153static struct dep_t *find_dep ( struct dep_t *dt, char *mod ) 157static struct dep_t *find_dep ( struct dep_t *dt, char *mod )
154{ 158{
155 int lm = strlen ( mod ); 159 int lm = xstrlen ( mod );
156 int hasext = 0; 160 int extpos = 0;
157 161
158 if (( mod [lm-2] == '.' ) && ( mod [lm-1] == 'o' )) 162 if (( mod [lm-2] == '.' ) && ( mod [lm-1] == 'o' ))
159 hasext = 1; 163 extpos = 2;
160 164
165 if ( extpos > 0 )
166 mod [lm - extpos] = 0;
167
161 while ( dt ) { 168 while ( dt ) {
162 if ( hasext && !strcmp ( dt-> m_module, mod )) 169 if ( !strcmp ( dt-> m_module, mod ))
163 break; 170 break;
164 else if ( !hasext && !strncmp ( dt-> m_module, mod, strlen ( dt-> m_module ) - 2 )) 171
165 break;
166
167 dt = dt-> m_next; 172 dt = dt-> m_next;
168 } 173 }
174 if ( extpos > 0 )
175 mod [lm - extpos] = '.';
176
169 return dt; 177 return dt;
170} 178}
171 179
180#define MODPROBE_EXECUTE 0x1
181#define MODPROBE_INSERT 0x2
182#define MODPROBE_REMOVE 0x4
172 183
173static void check_dep ( char *mod, int do_syslog, 184static void check_dep ( char *mod, int do_syslog,
174 int show_only, int verbose, int recursing ) 185 int show_only, int verbose, int flags )
175{ 186{
176 static struct dep_t *depend = (struct dep_t *) -1; 187 static struct dep_t *depend = (struct dep_t *) -1;
177 struct dep_t *dt; 188 struct dep_t *dt;
@@ -179,24 +190,29 @@ static void check_dep ( char *mod, int do_syslog,
179 if ( depend == (struct dep_t *) -1 ) 190 if ( depend == (struct dep_t *) -1 )
180 depend = build_dep ( ); 191 depend = build_dep ( );
181 192
182 /* printf ( "CHECK: %s (%p)\n", mod, depend ); */
183
184 if (( dt = find_dep ( depend, mod ))) { 193 if (( dt = find_dep ( depend, mod ))) {
185 int i; 194 int i;
186 195
187 for ( i = 0; i < dt-> m_depcnt; i++ ) 196 for ( i = 0; i < dt-> m_depcnt; i++ )
188 check_dep ( dt-> m_deparr [i], do_syslog, 197 check_dep ( dt-> m_deparr [i], do_syslog,
189 show_only, verbose, 1); 198 show_only, verbose, flags|MODPROBE_EXECUTE);
190 } 199 }
191 if ( recursing ) { 200 if ( flags & MODPROBE_EXECUTE ) {
192 char lcmd [256]; 201 char lcmd [256];
193 202 if ( flags & MODPROBE_INSERT ) {
194 snprintf(lcmd, sizeof(lcmd)-1, "insmod %s -q -k %s 2>/dev/null", 203 snprintf(lcmd, sizeof(lcmd)-1, "insmod %s -q -k %s 2>/dev/null",
195 do_syslog ? "-s" : "", mod ); 204 do_syslog ? "-s" : "", mod );
196 if (show_only || verbose) 205 }
197 printf("%s\n", lcmd); 206 if ( flags & MODPROBE_REMOVE ) {
198 if (!show_only) 207 snprintf(lcmd, sizeof(lcmd)-1, "insmod %s -q -k %s 2>/dev/null",
199 system ( lcmd ); 208 do_syslog ? "-s" : "", mod );
209 }
210 if ( flags & (MODPROBE_REMOVE|MODPROBE_INSERT) ) {
211 if (verbose)
212 printf("%s\n", lcmd);
213 if (!show_only)
214 system ( lcmd );
215 }
200 } 216 }
201} 217}
202 218
@@ -273,10 +289,15 @@ extern int modprobe_main(int argc, char** argv)
273 optind < argc ? argv[optind] : ""); 289 optind < argc ? argv[optind] : "");
274 if (do_syslog) 290 if (do_syslog)
275 syslog(LOG_INFO, "%s", cmd); 291 syslog(LOG_INFO, "%s", cmd);
276 if (show_only || verbose) 292 if (verbose)
277 printf("%s\n", cmd); 293 printf("%s\n", cmd);
278 if (!show_only) 294 if (!show_only)
279 rc = system(cmd); 295 rc = system(cmd);
296
297#ifdef CONFIG_MODPROBE_DEPEND
298 if ( optind < argc )
299 check_dep ( argv [optind], do_syslog, show_only, verbose, MODPROBE_REMOVE);
300#endif
280 } while (++optind < argc); 301 } while (++optind < argc);
281 exit(EXIT_SUCCESS); 302 exit(EXIT_SUCCESS);
282 } 303 }
@@ -292,7 +313,7 @@ extern int modprobe_main(int argc, char** argv)
292 autoclean ? "-k" : ""); 313 autoclean ? "-k" : "");
293 314
294#ifdef CONFIG_MODPROBE_DEPEND 315#ifdef CONFIG_MODPROBE_DEPEND
295 check_dep ( argv [optind], do_syslog, show_only, verbose, 0); 316 check_dep ( argv [optind], do_syslog, show_only, verbose, MODPROBE_INSERT);
296#endif 317#endif
297 318
298 while (optind < argc) { 319 while (optind < argc) {
@@ -302,7 +323,7 @@ extern int modprobe_main(int argc, char** argv)
302 } 323 }
303 if (do_syslog) 324 if (do_syslog)
304 syslog(LOG_INFO, "%s", cmd); 325 syslog(LOG_INFO, "%s", cmd);
305 if (show_only || verbose) 326 if (verbose)
306 printf("%s\n", cmd); 327 printf("%s\n", cmd);
307 if (!show_only) 328 if (!show_only)
308 rc = system(cmd); 329 rc = system(cmd);