applying jim bauer's patch to eliminate modprobe's dependency on /bin/sh. bug #8. 0000008: modprobe applet is dependent on having a shell
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -29,6 +29,9 @@ Jeff Angielski <[email protected]> | |
| Enrik Berkhan <[email protected]> | |
| setconsole | |
| + | Jim Bauer <[email protected]> |
| + | modprobe shell dependency |
| + | |
| Edward Betts <[email protected]> | |
| expr, hostid, logname, whoami | |
| @@ -4,6 +4,7 @@ | |
| * | |
| * Copyright (c) 2002 by Robert Griebl, [email protected] | |
| * Copyright (c) 2003 by Andrew Dennison, [email protected] | |
| + | * Copyright (c) 2005 by Jim Bauer, [email protected] |
| * | |
| * This program is free software; you can redistribute it and/or modify | |
| * it under the terms of the GNU General Public License as published by | |
| @@ -22,6 +23,8 @@ | |
| */ | |
| #include <sys/utsname.h> | |
| + | #include <sys/types.h> |
| + | #include <sys/wait.h> |
| #include <getopt.h> | |
| #include <stdlib.h> | |
| #include <unistd.h> | |
| @@ -393,30 +396,65 @@ static int already_loaded (const char *name) | |
| static int mod_process ( struct mod_list_t *list, int do_insert ) | |
| { | |
| - | char lcmd [4096]; |
| int rc = 0; | |
| + | char *argv[10]; |
| + | int argc; |
| while ( list ) { | |
| - | *lcmd = '\0'; |
| + | argc = 0; |
| if ( do_insert ) { | |
| - | if (already_loaded (list->m_name) != 1) |
| - | snprintf ( lcmd, sizeof( lcmd ) - 1, "insmod %s %s %s %s %s", |
| - | do_syslog ? "-s" : "", autoclean ? "-k" : "", |
| - | quiet ? "-q" : "", list-> m_path, list-> m_options ? |
| - | list-> m_options : "" ); |
| + | if (already_loaded (list->m_name) != 1) { |
| + | argv[argc++] = "insmod"; |
| + | if (do_syslog) |
| + | argv[argc++] = "-s"; |
| + | if (autoclean) |
| + | argv[argc++] = "-k"; |
| + | if (quiet) |
| + | argv[argc++] = "-q"; |
| + | argv[argc++] = list-> m_path; |
| + | if (list-> m_options) |
| + | argv[argc++] = list-> m_options; |
| + | } |
| } else { | |
| /* modutils uses short name for removal */ | |
| - | if (already_loaded (list->m_name) != 0) |
| - | snprintf ( lcmd, sizeof( lcmd ) - 1, "rmmod %s %s", |
| - | do_syslog ? "-s" : "", list-> m_name ); |
| + | if (already_loaded (list->m_name) != 0) { |
| + | argv[argc++] = "rmmod"; |
| + | if (do_syslog) |
| + | argv[argc++] = "-s"; |
| + | argv[argc++] = list->m_name; |
| + | } |
| } | |
| + | argv[argc] = NULL; |
| - | if (*lcmd) { |
| + | if (argc) { |
| if (verbose) { | |
| - | printf("%s\n", lcmd); |
| + | int i; |
| + | for (i=0; i<argc; i++) |
| + | printf("%s ", argv[i]); |
| + | printf("\n"); |
| } | |
| if (!show_only) { | |
| - | int rc2 = system(lcmd); |
| + | int rc2 = 0; |
| + | int status; |
| + | switch (fork()) { |
| + | case -1: |
| + | rc2 = 1; |
| + | break; |
| + | case 0: //child |
| + | execvp(argv[0], argv); |
| + | bb_perror_msg_and_die("exec of %s", argv[0]); |
| + | /* NOTREACHED */ |
| + | default: |
| + | if (wait(&status) == -1) { |
| + | rc2 = 1; |
| + | break; |
| + | } |
| + | if (WIFEXITED(status)) |
| + | rc2 = WEXITSTATUS(status); |
| + | if (WIFSIGNALED(status)) |
| + | rc2 = WTERMSIG(status); |
| + | break; |
| + | } |
| if (do_insert) { | |
| rc = rc2; /* only last module matters */ | |
| } | |