aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author"Vladimir N. Oleynik" <dzo@simtreas.ru>2005-11-28 15:54:22 +0000
committer"Vladimir N. Oleynik" <dzo@simtreas.ru>2005-11-28 15:54:22 +0000
commit8c44f0179d8c7a94eef0ebde60390d6391bde516 (patch)
tree9594662fcc0a347112dfcdcd42d946ed44b05485
parent52219874fe5db7440f78bc65179a8bd9a4b23192 (diff)
downloadbusybox-w32-8c44f0179d8c7a94eef0ebde60390d6391bde516.tar.gz
busybox-w32-8c44f0179d8c7a94eef0ebde60390d6391bde516.tar.bz2
busybox-w32-8c44f0179d8c7a94eef0ebde60390d6391bde516.zip
use libbb/get_kernel_revision(), reduce stack usage, add loses -w -f option for getopt, convert to bb_getopt_ulflags(), reduce memory usage - xmalloc to bb_common_bufsiz1, size reduce over 200 bytes
-rw-r--r--modutils/rmmod.c108
1 files changed, 48 insertions, 60 deletions
diff --git a/modutils/rmmod.c b/modutils/rmmod.c
index 512221ba5..12580c5cf 100644
--- a/modutils/rmmod.c
+++ b/modutils/rmmod.c
@@ -32,28 +32,20 @@
32#include "busybox.h" 32#include "busybox.h"
33 33
34#ifdef CONFIG_FEATURE_2_6_MODULES 34#ifdef CONFIG_FEATURE_2_6_MODULES
35static inline void filename2modname(char *modname, const char *filename) 35static inline void filename2modname(char *modname, const char *afterslash)
36{ 36{
37 const char *afterslash;
38 unsigned int i; 37 unsigned int i;
39 38
40 afterslash = strrchr(filename, '/'); 39#if ENABLE_FEATURE_2_4_MODULES
41 if (!afterslash) 40 int kr_chk = 1;
42 afterslash = filename; 41 if (get_kernel_revision() <= 2*65536+6*256)
43 else 42 kr_chk = 0;
44 afterslash++; 43#else
44#define kr_chk 1
45#endif
45 46
46 /* Convert to underscores, stop at first . */ 47 /* Convert to underscores, stop at first . */
47 for (i = 0; afterslash[i] && afterslash[i] != '.'; i++) { 48 for (i = 0; afterslash[i] && afterslash[i] != '.'; i++) {
48 int kr_chk = 1;
49
50 if (ENABLE_FEATURE_2_4_MODULES) {
51 struct utsname uname_info;
52 if (uname(&uname_info) == -1)
53 bb_error_msg_and_die("cannot get uname data");
54 if (strcmp(uname_info.release, "2.6") < 0)
55 kr_chk = 0;
56 }
57 if (kr_chk && (afterslash[i] == '-')) 49 if (kr_chk && (afterslash[i] == '-'))
58 modname[i] = '_'; 50 modname[i] = '_';
59 else 51 else
@@ -66,67 +58,63 @@ static inline void filename2modname(char *modname, const char *filename)
66extern int rmmod_main(int argc, char **argv) 58extern int rmmod_main(int argc, char **argv)
67{ 59{
68 int n, ret = EXIT_SUCCESS; 60 int n, ret = EXIT_SUCCESS;
69 size_t nmod = 0; /* number of modules */
70 size_t pnmod = -1; /* previous number of modules */
71 unsigned int flags = O_NONBLOCK|O_EXCL; 61 unsigned int flags = O_NONBLOCK|O_EXCL;
72#ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE 62#ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE
73 void *buf; /* hold the module names which we ignore but must get */ 63 /* bb_common_bufsiz1 hold the module names which we ignore
74 size_t bufsize = 0; 64 but must get */
65 size_t bufsize = sizeof(bb_common_bufsiz1);
75#endif 66#endif
76 67
77 /* Parse command line. */ 68 /* Parse command line. */
78 while ((n = getopt(argc, argv, "a")) != EOF) { 69 n = bb_getopt_ulflags(argc, argv, "wfa");
79 switch (n) { 70 if((n & 1)) // --wait
80 case 'w': // --wait 71 flags &= ~O_NONBLOCK;
81 flags &= ~O_NONBLOCK; 72 if((n & 2)) // --force
82 break; 73 flags |= O_TRUNC;
83 case 'f': // --force 74 if((n & 4)) {
84 flags |= O_TRUNC; 75 /* Unload _all_ unused modules via NULL delete_module() call */
85 break; 76 /* until the number of modules does not change */
86 case 'a': 77 size_t nmod = 0; /* number of modules */
87 /* Unload _all_ unused modules via NULL delete_module() call */ 78 size_t pnmod = -1; /* previous number of modules */
88 /* until the number of modules does not change */ 79
89#ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE 80 while (nmod != pnmod) {
90 buf = xmalloc(bufsize = 256); 81 if (syscall(__NR_delete_module, NULL, flags) < 0) {
91#endif 82 if (errno==EFAULT)
92 while (nmod != pnmod) { 83 return(ret);
93 if (syscall(__NR_delete_module, NULL, flags) < 0) { 84 bb_perror_msg_and_die("rmmod");
94 if (errno==EFAULT) 85 }
95 return(ret); 86 pnmod = nmod;
96 bb_perror_msg_and_die("rmmod");
97 }
98 pnmod = nmod;
99#ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE 87#ifdef CONFIG_FEATURE_QUERY_MODULE_INTERFACE
100 /* 1 == QM_MODULES */ 88 /* 1 == QM_MODULES */
101 if (my_query_module(NULL, 1, &buf, &bufsize, &nmod)) { 89 if (my_query_module(NULL, 1, &bb_common_bufsiz1, &bufsize, &nmod)) {
102 bb_perror_msg_and_die("QM_MODULES"); 90 bb_perror_msg_and_die("QM_MODULES");
103 } 91 }
104#endif
105 }
106#if defined CONFIG_FEATURE_CLEAN_UP && CONFIG_FEATURE_QUERY_MODULE_INTERFACE
107 free(buf);
108#endif 92#endif
109 return EXIT_SUCCESS;
110 default:
111 bb_show_usage();
112 } 93 }
94 return EXIT_SUCCESS;
113 } 95 }
114 96
115 if (optind == argc) 97 if (optind == argc)
116 bb_show_usage(); 98 bb_show_usage();
117 99
118 { 100 for (n = optind; n < argc; n++) {
119 for (n = optind; n < argc; n++) {
120#ifdef CONFIG_FEATURE_2_6_MODULES 101#ifdef CONFIG_FEATURE_2_6_MODULES
121 char module_name[strlen(argv[n]) + 1]; 102 const char *afterslash;
122 filename2modname(module_name, argv[n]); 103 char *module_name;
104
105 afterslash = strrchr(argv[n], '/');
106 if (!afterslash)
107 afterslash = argv[n];
108 else
109 afterslash++;
110 module_name = alloca(strlen(afterslash) + 1);
111 filename2modname(module_name, afterslash);
123#else 112#else
124#define module_name argv[n] 113#define module_name argv[n]
125#endif 114#endif
126 if (syscall(__NR_delete_module, module_name, flags) < 0) { 115 if (syscall(__NR_delete_module, module_name, flags) < 0) {
127 bb_perror_msg("%s", argv[n]); 116 bb_perror_msg("%s", argv[n]);
128 ret = EXIT_FAILURE; 117 ret = EXIT_FAILURE;
129 }
130 } 118 }
131 } 119 }
132 120