diff options
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 |
commit | 8c44f0179d8c7a94eef0ebde60390d6391bde516 (patch) | |
tree | 9594662fcc0a347112dfcdcd42d946ed44b05485 | |
parent | 52219874fe5db7440f78bc65179a8bd9a4b23192 (diff) | |
download | busybox-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.c | 108 |
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 |
35 | static inline void filename2modname(char *modname, const char *filename) | 35 | static 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) | |||
66 | extern int rmmod_main(int argc, char **argv) | 58 | extern 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 | ||