11043 and 11011
authorRob Landley <rob@landley.net>
Sat, 13 Aug 2005 02:28:34 +0000 (02:28 -0000)
committerRob Landley <rob@landley.net>
Sat, 13 Aug 2005 02:28:34 +0000 (02:28 -0000)
busybox/AUTHORS
busybox/Makefile
busybox/modutils/modprobe.c

index cf2dedd3ac07289d33e7520d0bae7404d91b3c64..1edf8005e7ea11696cddf51e6250dfcf2a46cc2e 100644 (file)
@@ -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
 
index 048194dea07a52274e4f41553296cce2ed055699..0bfb700b612fe7f27e72494f29fb3ddd9998f574 100644 (file)
@@ -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
-
index 83244fca5a312d7377aa8f0374ca6296830b5e41..a01475258f22b170c44f9dc190500ac83160fc2d 100644 (file)
@@ -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 */
                                }