diff options
author | Paul Fox <pgf@brightstareng.com> | 2005-08-04 18:33:36 +0000 |
---|---|---|
committer | Paul Fox <pgf@brightstareng.com> | 2005-08-04 18:33:36 +0000 |
commit | 8eeb655661a0d59be478681425682543b228b5a1 (patch) | |
tree | 2c05b0d96837fd76d21d58de53e843fbd08788d1 | |
parent | 157e8071be672d530fb52a5560d2794821cbf15e (diff) |
applying jim bauer's patch to eliminate modprobe's dependency
on /bin/sh. bug #8.
0000008: modprobe applet is dependent on having a shell
-rw-r--r-- | AUTHORS | 3 | ||||
-rw-r--r-- | modutils/modprobe.c | 64 |
2 files changed, 54 insertions, 13 deletions
@@ -29,6 +29,9 @@ Jeff Angielski <jeff@theptrgroup.com> Enrik Berkhan <Enrik.Berkhan@inka.de> setconsole +Jim Bauer <jfbauer@nfr.com> + modprobe shell dependency + Edward Betts <edward@debian.org> expr, hostid, logname, whoami diff --git a/modutils/modprobe.c b/modutils/modprobe.c index b8268b3ab..8d739ef3c 100644 --- a/modutils/modprobe.c +++ b/modutils/modprobe.c @@ -4,6 +4,7 @@ * * Copyright (c) 2002 by Robert Griebl, griebl@gmx.de * Copyright (c) 2003 by Andrew Dennison, andrew.dennison@motec.com.au + * Copyright (c) 2005 by Jim Bauer, jfbauer@nfr.com * * 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 */ } |