diff options
-rw-r--r-- | busybox/AUTHORS | 3 | ||||
-rw-r--r-- | busybox/Makefile | 29 | ||||
-rw-r--r-- | busybox/modutils/modprobe.c | 64 |
3 files changed, 68 insertions, 28 deletions
diff --git a/busybox/AUTHORS b/busybox/AUTHORS index cf2dedd..1edf800 100644 --- a/busybox/AUTHORS +++ b/busybox/AUTHORS @@ -23,6 +23,9 @@ Laurence Anderson <l.d.anderson@warwick.ac.uk> Jeff Angielski <jeff@theptrgroup.com> ftpput, ftpget +Jim Bauer <jfbauer@nfr.com> + modprobe shell dependency + Edward Betts <edward@debian.org> expr, hostid, logname, whoami diff --git a/busybox/Makefile b/busybox/Makefile index 048194d..0bfb700 100644 --- a/busybox/Makefile +++ b/busybox/Makefile @@ -286,20 +286,20 @@ distclean: clean - $(MAKE) -C scripts/config clean release: distclean #doc - cd ..; \ - rm -rf $(PROG)-$(VERSION); \ - cp -a busybox $(PROG)-$(VERSION); \ - \ - find $(PROG)-$(VERSION)/ -type d \ - -name CVS \ - -print \ - -exec rm -rf {} \; ; \ - \ - find $(PROG)-$(VERSION)/ -type f \ - -name .\#* \ - -print \ - -exec rm -f {} \; ; \ - \ + cd ..; \ + rm -rf $(PROG)-$(VERSION); \ + cp -a busybox $(PROG)-$(VERSION); \ + \ + find $(PROG)-$(VERSION)/ -type d \ + -name CVS \ + -print \ + -exec rm -rf {} \; ; \ + \ + find $(PROG)-$(VERSION)/ -type f \ + -name .\#* \ + -print \ + -exec rm -f {} \; ; \ + \ tar -cvzf $(PROG)-$(VERSION).tar.gz $(PROG)-$(VERSION)/; tags: @@ -312,4 +312,3 @@ endif # ifeq ($(skip-makefile),) .PHONY: dummy subdirs release distclean clean config oldconfig \ menuconfig tags check test depend buildtree - diff --git a/busybox/modutils/modprobe.c b/busybox/modutils/modprobe.c index 83244fc..a014752 100644 --- a/busybox/modutils/modprobe.c +++ b/busybox/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 */ } |