Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/modutils/rmmod.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/modutils/rmmod.c
r821 r1770 8 8 */ 9 9 10 #include "busybox.h" 11 #include <stdio.h> 12 #include <errno.h> 13 #include <unistd.h> 14 #include <stdlib.h> 15 #include <getopt.h> 16 #include <fcntl.h> 17 #include <string.h> 18 #include <sys/utsname.h> 10 #include "libbb.h" 19 11 #include <sys/syscall.h> 20 12 21 #if def CONFIG_FEATURE_2_6_MODULES13 #if ENABLE_FEATURE_2_6_MODULES 22 14 static inline void filename2modname(char *modname, const char *afterslash) 23 15 { 24 16 unsigned int i; 17 int kr_chk = 1; 25 18 26 #if ENABLE_FEATURE_2_4_MODULES 27 int kr_chk = 1; 28 if (get_linux_version_code() <= KERNEL_VERSION(2,6,0)) 29 kr_chk = 0; 30 #else 31 #define kr_chk 1 32 #endif 19 if (ENABLE_FEATURE_2_4_MODULES 20 && get_linux_version_code() <= KERNEL_VERSION(2,6,0)) 21 kr_chk = 0; 33 22 34 23 /* Convert to underscores, stop at first . */ … … 41 30 modname[i] = '\0'; 42 31 } 32 #else 33 void filename2modname(char *modname, const char *afterslash); 43 34 #endif 44 35 36 // There really should be a header file for this... 37 38 int query_module(const char *name, int which, void *buf, 39 size_t bufsize, size_t *ret); 40 41 int rmmod_main(int argc, char **argv); 45 42 int rmmod_main(int argc, char **argv) 46 43 { 47 44 int n, ret = EXIT_SUCCESS; 48 45 unsigned int flags = O_NONBLOCK|O_EXCL; 49 #ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE 50 /* bb_common_bufsiz1 hold the module names which we ignore 51 but must get */ 52 size_t bufsize = sizeof(bb_common_bufsiz1); 53 #endif 46 47 #define misc_buf bb_common_bufsiz1 54 48 55 49 /* Parse command line. */ 56 n = bb_getopt_ulflags(argc,argv, "wfa");57 if ((n & 1)) // --wait50 n = getopt32(argv, "wfa"); 51 if (n & 1) // --wait 58 52 flags &= ~O_NONBLOCK; 59 if ((n & 2)) // --force53 if (n & 2) // --force 60 54 flags |= O_TRUNC; 61 if ((n & 4)) {55 if (n & 4) { 62 56 /* Unload _all_ unused modules via NULL delete_module() call */ 63 57 /* until the number of modules does not change */ … … 67 61 while (nmod != pnmod) { 68 62 if (syscall(__NR_delete_module, NULL, flags) != 0) { 69 if (errno ==EFAULT)70 return (ret);63 if (errno == EFAULT) 64 return ret; 71 65 bb_perror_msg_and_die("rmmod"); 72 66 } 73 67 pnmod = nmod; 74 #ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE 75 /* 1 == QM_MODULES */ 76 if (my_query_module(NULL, 1, &bb_common_bufsiz1, &bufsize, &nmod)) { 68 // the 1 here is QM_MODULES. 69 if (ENABLE_FEATURE_QUERY_MODULE_INTERFACE && query_module(NULL, 70 1, misc_buf, sizeof(misc_buf), 71 &nmod)) 72 { 77 73 bb_perror_msg_and_die("QM_MODULES"); 78 74 } 79 #endif80 75 } 81 76 return EXIT_SUCCESS; … … 86 81 87 82 for (n = optind; n < argc; n++) { 88 #ifdef CONFIG_FEATURE_2_6_MODULES 89 const char *afterslash;90 char *module_name;83 if (ENABLE_FEATURE_2_6_MODULES) { 84 filename2modname(misc_buf, bb_basename(argv[n])); 85 } 91 86 92 afterslash = strrchr(argv[n], '/'); 93 if (!afterslash) 94 afterslash = argv[n]; 95 else 96 afterslash++; 97 module_name = alloca(strlen(afterslash) + 1); 98 filename2modname(module_name, afterslash); 99 #else 100 #define module_name argv[n] 101 #endif 102 if (syscall(__NR_delete_module, module_name, flags) != 0) { 87 if (syscall(__NR_delete_module, ENABLE_FEATURE_2_6_MODULES ? misc_buf : argv[n], flags)) { 103 88 bb_perror_msg("%s", argv[n]); 104 89 ret = EXIT_FAILURE; … … 106 91 } 107 92 108 return (ret);93 return ret; 109 94 }
Note:
See TracChangeset
for help on using the changeset viewer.