aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-06-30 08:04:05 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-06-30 08:04:05 +0000
commitdc757aa16ce53d9784fa3953b0c3762dfa8ccda9 (patch)
tree2eee7a83dcbd38fcfbcdbec8b5d52f4baff3326f
parentf7d07b1723c15ee818f0c1f5cce96c55274024a6 (diff)
downloadbusybox-w32-dc757aa16ce53d9784fa3953b0c3762dfa8ccda9.tar.gz
busybox-w32-dc757aa16ce53d9784fa3953b0c3762dfa8ccda9.tar.bz2
busybox-w32-dc757aa16ce53d9784fa3953b0c3762dfa8ccda9.zip
introduce and use bb_basename()
function old new delta bb_basename - 26 +26 sv_main 1226 1225 -1 passwd_main 1985 1983 -2 showdirs 482 478 -4 sendCgi 1811 1807 -4 make_device 1354 1350 -4 handleIncoming 2443 2439 -4 func_name 82 78 -4 service_name 2292 2285 -7 main 909 901 -8 cmp_main 555 547 -8 test_main 434 422 -12 act 228 216 -12 find_pair 180 164 -16 rmmod_main 298 280 -18 find_pid_by_name 156 134 -22 modprobe_main 1606 1576 -30 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 0/16 up/down: 26/-156) Total: -130 bytes text data bss dec hex filename 734933 3028 14400 752361 b7ae9 busybox_old 734801 3028 14400 752229 b7a65 busybox_unstripped
-rw-r--r--applets/applets.c6
-rw-r--r--coreutils/ls.c14
-rw-r--r--coreutils/test.c5
-rw-r--r--debianutils/run_parts.c5
-rw-r--r--findutils/find.c19
-rw-r--r--include/libbb.h1
-rw-r--r--libbb/Kbuild1
-rw-r--r--libbb/find_pid_by_name.c8
-rw-r--r--libbb/lineedit.c2
-rw-r--r--miscutils/devfsd.c16
-rw-r--r--modutils/modprobe.c21
-rw-r--r--modutils/rmmod.c7
-rw-r--r--networking/httpd.c4
-rw-r--r--util-linux/mdev.c4
14 files changed, 40 insertions, 73 deletions
diff --git a/applets/applets.c b/applets/applets.c
index 57c972f79..89dea3e6a 100644
--- a/applets/applets.c
+++ b/applets/applets.c
@@ -639,8 +639,6 @@ int *const bb_errno __attribute__ ((section (".data")));
639 639
640int main(int argc, char **argv) 640int main(int argc, char **argv)
641{ 641{
642 const char *s;
643
644#ifdef __GLIBC__ 642#ifdef __GLIBC__
645 (*(int **)&bb_errno) = __errno_location(); 643 (*(int **)&bb_errno) = __errno_location();
646#endif 644#endif
@@ -655,9 +653,7 @@ int main(int argc, char **argv)
655 applet_name = argv[0]; 653 applet_name = argv[0];
656 if (applet_name[0] == '-') 654 if (applet_name[0] == '-')
657 applet_name++; 655 applet_name++;
658 s = strrchr(applet_name, '/'); 656 applet_name = bb_basename(applet_name);
659 if (s)
660 applet_name = s + 1;
661 657
662 parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */ 658 parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */
663 659
diff --git a/coreutils/ls.c b/coreutils/ls.c
index e2ed3ee1f..a5bd0e304 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -132,8 +132,8 @@ enum { show_color = 0 };
132 * a directory entry and its stat info are stored here 132 * a directory entry and its stat info are stored here
133 */ 133 */
134struct dnode { /* the basic node */ 134struct dnode { /* the basic node */
135 char *name; /* the dir entry name */ 135 const char *name; /* the dir entry name */
136 char *fullname; /* the dir entry name */ 136 const char *fullname; /* the dir entry name */
137 int allocated; 137 int allocated;
138 struct stat dstat; /* the file stat info */ 138 struct stat dstat; /* the file stat info */
139 USE_SELINUX(security_context_t sid;) 139 USE_SELINUX(security_context_t sid;)
@@ -159,7 +159,7 @@ enum {
159 159
160static int status = EXIT_SUCCESS; 160static int status = EXIT_SUCCESS;
161 161
162static struct dnode *my_stat(char *fullname, char *name, int force_follow) 162static struct dnode *my_stat(const char *fullname, const char *name, int force_follow)
163{ 163{
164 struct stat dstat; 164 struct stat dstat;
165 struct dnode *cur; 165 struct dnode *cur;
@@ -241,7 +241,7 @@ static int count_dirs(struct dnode **dn, int nfiles, int notsubdirs)
241 return 0; 241 return 0;
242 dirs = 0; 242 dirs = 0;
243 for (i = 0; i < nfiles; i++) { 243 for (i = 0; i < nfiles; i++) {
244 char *name; 244 const char *name;
245 if (!S_ISDIR(dn[i]->dstat.st_mode)) 245 if (!S_ISDIR(dn[i]->dstat.st_mode))
246 continue; 246 continue;
247 name = dn[i]->name; 247 name = dn[i]->name;
@@ -288,7 +288,7 @@ static void dfree(struct dnode **dnp, int nfiles)
288 for (i = 0; i < nfiles; i++) { 288 for (i = 0; i < nfiles; i++) {
289 struct dnode *cur = dnp[i]; 289 struct dnode *cur = dnp[i];
290 if (cur->allocated) 290 if (cur->allocated)
291 free(cur->fullname); /* free the filename */ 291 free((char*)cur->fullname); /* free the filename */
292 free(cur); /* free the dnode */ 292 free(cur); /* free the dnode */
293 } 293 }
294 free(dnp); /* free the array holding the dnode pointers */ 294 free(dnp); /* free the array holding the dnode pointers */
@@ -320,7 +320,7 @@ static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which)
320 /* copy the entrys into the file or dir array */ 320 /* copy the entrys into the file or dir array */
321 for (d = i = 0; i < nfiles; i++) { 321 for (d = i = 0; i < nfiles; i++) {
322 if (S_ISDIR(dn[i]->dstat.st_mode)) { 322 if (S_ISDIR(dn[i]->dstat.st_mode)) {
323 char *name; 323 const char *name;
324 if (!(which & (SPLIT_DIR|SPLIT_SUBDIR))) 324 if (!(which & (SPLIT_DIR|SPLIT_SUBDIR)))
325 continue; 325 continue;
326 name = dn[i]->name; 326 name = dn[i]->name;
@@ -513,7 +513,7 @@ static struct dnode **list_dir(const char *path)
513 continue; 513 continue;
514 } 514 }
515 fullname = concat_path_file(path, entry->d_name); 515 fullname = concat_path_file(path, entry->d_name);
516 cur = my_stat(fullname, strrchr(fullname, '/') + 1, 0); 516 cur = my_stat(fullname, bb_basename(fullname), 0);
517 if (!cur) { 517 if (!cur) {
518 free(fullname); 518 free(fullname);
519 continue; 519 continue;
diff --git a/coreutils/test.c b/coreutils/test.c
index 7b87a42f9..82d2664a8 100644
--- a/coreutils/test.c
+++ b/coreutils/test.c
@@ -181,11 +181,10 @@ static void initialize_group_array(void);
181int test_main(int argc, char **argv) 181int test_main(int argc, char **argv)
182{ 182{
183 int res; 183 int res;
184 char *arg0; 184 const char *arg0;
185 bool _off; 185 bool _off;
186 186
187 arg0 = strrchr(argv[0], '/'); 187 arg0 = bb_basename(argv[0]);
188 if (!arg0++) arg0 = argv[0];
189 if (arg0[0] == '[') { 188 if (arg0[0] == '[') {
190 --argc; 189 --argc;
191 if (!arg0[1]) { /* "[" ? */ 190 if (!arg0[1]) { /* "[" ? */
diff --git a/debianutils/run_parts.c b/debianutils/run_parts.c
index cb4a4e4c7..42170bcb8 100644
--- a/debianutils/run_parts.c
+++ b/debianutils/run_parts.c
@@ -60,10 +60,7 @@ struct globals {
60 */ 60 */
61static bool invalid_name(const char *c) 61static bool invalid_name(const char *c)
62{ 62{
63 const char *base_name = strrchr(c, '/'); 63 c = bb_basename(c);
64
65 if (base_name)
66 c = base_name + 1;
67 64
68 while (*c && (isalnum(*c) || *c == '_' || *c == '-')) 65 while (*c && (isalnum(*c) || *c == '_' || *c == '-'))
69 c++; 66 c++;
diff --git a/findutils/find.c b/findutils/find.c
index aa2244141..07cae971e 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -180,18 +180,13 @@ static int exec_actions(action ***appp, const char *fileName, struct stat *statb
180 180
181ACTF(name) 181ACTF(name)
182{ 182{
183 const char *tmp = strrchr(fileName, '/'); 183 const char *tmp = bb_basename(fileName);
184 if (tmp == NULL) 184 if (tmp != fileName && !*tmp) { /* "foo/bar/". Oh no... go back to 'b' */
185 tmp = fileName; 185 tmp--;
186 else { 186 while (tmp != fileName && *--tmp != '/')
187 tmp++; 187 continue;
188 if (!*tmp) { /* "foo/bar/". Oh no... go back to 'b' */ 188 if (*tmp == '/')
189 tmp--; 189 tmp++;
190 while (tmp != fileName && *--tmp != '/')
191 continue;
192 if (*tmp == '/')
193 tmp++;
194 }
195 } 190 }
196 return fnmatch(ap->pattern, tmp, FNM_PERIOD) == 0; 191 return fnmatch(ap->pattern, tmp, FNM_PERIOD) == 0;
197} 192}
diff --git a/include/libbb.h b/include/libbb.h
index e80e76403..6a699a7e6 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -736,6 +736,7 @@ extern int bb_parse_mode(const char* s, mode_t* theMode);
736 736
737char *concat_path_file(const char *path, const char *filename); 737char *concat_path_file(const char *path, const char *filename);
738char *concat_subpath_file(const char *path, const char *filename); 738char *concat_subpath_file(const char *path, const char *filename);
739const char *bb_basename(const char *name);
739/* NB: can violate const-ness (similarly to strchr) */ 740/* NB: can violate const-ness (similarly to strchr) */
740char *last_char_is(const char *s, int c); 741char *last_char_is(const char *s, int c);
741 742
diff --git a/libbb/Kbuild b/libbb/Kbuild
index 693f6092c..ecd50a616 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -8,6 +8,7 @@ lib-y:=
8 8
9lib-y += ask_confirmation.o 9lib-y += ask_confirmation.o
10lib-y += bb_askpass.o 10lib-y += bb_askpass.o
11lib-y += bb_basename.o
11lib-y += bb_do_delay.o 12lib-y += bb_do_delay.o
12lib-y += bb_pwd.o 13lib-y += bb_pwd.o
13lib-y += bb_strtonum.o 14lib-y += bb_strtonum.o
diff --git a/libbb/find_pid_by_name.c b/libbb/find_pid_by_name.c
index cfc5b3468..1fafec83a 100644
--- a/libbb/find_pid_by_name.c
+++ b/libbb/find_pid_by_name.c
@@ -38,14 +38,6 @@ execXXX("/proc/self/exe", applet_name, params....)
38and therefore comm field contains "exe". 38and therefore comm field contains "exe".
39*/ 39*/
40 40
41static const char *bb_basename(const char *name)
42{
43 const char *cp = strrchr(name, '/');
44 if (cp)
45 return cp + 1;
46 return name;
47}
48
49/* find_pid_by_name() 41/* find_pid_by_name()
50 * 42 *
51 * Modified by Vladimir Oleynik for use with libbb/procps.c 43 * Modified by Vladimir Oleynik for use with libbb/procps.c
diff --git a/libbb/lineedit.c b/libbb/lineedit.c
index 1f2e6a54e..62f8949d6 100644
--- a/libbb/lineedit.c
+++ b/libbb/lineedit.c
@@ -1156,7 +1156,7 @@ static void parse_prompt(const char *prmt_ptr)
1156#endif 1156#endif
1157 case 'W': 1157 case 'W':
1158 pbuf = pwd_buf; 1158 pbuf = pwd_buf;
1159 cp = strrchr(pbuf,'/'); 1159 cp = strrchr(pbuf, '/');
1160 if (cp != NULL && cp != pbuf) 1160 if (cp != NULL && cp != pbuf)
1161 pbuf += (cp-pbuf) + 1; 1161 pbuf += (cp-pbuf) + 1;
1162 break; 1162 break;
diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c
index dfb616abe..9daf4e1cc 100644
--- a/miscutils/devfsd.c
+++ b/miscutils/devfsd.c
@@ -240,8 +240,8 @@ static void do_ioctl_and_die(int fd, int request, unsigned long event_mask_flag)
240static void fork_and_execute(int die, char *arg0, char **arg); 240static void fork_and_execute(int die, char *arg0, char **arg);
241static int get_uid_gid(int, const char *); 241static int get_uid_gid(int, const char *);
242static void safe_memcpy(char * dest, const char * src, int len); 242static void safe_memcpy(char * dest, const char * src, int len);
243static unsigned int scan_dev_name_common(const char *d, unsigned int n, int addendum, char *ptr); 243static unsigned int scan_dev_name_common(const char *d, unsigned int n, int addendum, const char *ptr);
244static unsigned int scan_dev_name(const char *d, unsigned int n, char *ptr); 244static unsigned int scan_dev_name(const char *d, unsigned int n, const char *ptr);
245 245
246/* Structs and vars */ 246/* Structs and vars */
247static struct config_entry_struct *first_config = NULL; 247static struct config_entry_struct *first_config = NULL;
@@ -369,7 +369,7 @@ static void safe_memcpy(char *dest, const char *src, int len)
369 dest[len] = '\0'; 369 dest[len] = '\0';
370} 370}
371 371
372static unsigned int scan_dev_name_common(const char *d, unsigned int n, int addendum, char *ptr) 372static unsigned int scan_dev_name_common(const char *d, unsigned int n, int addendum, const char *ptr)
373{ 373{
374 if (d[n - 4] == 'd' && d[n - 3] == 'i' && d[n - 2] == 's' && d[n - 1] == 'c') 374 if (d[n - 4] == 'd' && d[n - 3] == 'i' && d[n - 2] == 's' && d[n - 1] == 'c')
375 return 2 + addendum; 375 return 2 + addendum;
@@ -382,7 +382,7 @@ static unsigned int scan_dev_name_common(const char *d, unsigned int n, int adde
382 return 0; 382 return 0;
383} 383}
384 384
385static unsigned int scan_dev_name(const char *d, unsigned int n, char *ptr) 385static unsigned int scan_dev_name(const char *d, unsigned int n, const char *ptr)
386{ 386{
387 if (d[0] == 's' && d[1] == 'c' && d[2] == 's' && d[3] == 'i' && d[4] == '/') { 387 if (d[0] == 's' && d[1] == 'c' && d[2] == 's' && d[3] == 'i' && d[4] == '/') {
388 if (d[n - 7] == 'g' && d[n - 6] == 'e' && d[n - 5] == 'n' 388 if (d[n - 7] == 'g' && d[n - 6] == 'e' && d[n - 5] == 'n'
@@ -926,7 +926,7 @@ static void action_compat(const struct devfsd_notify_struct *info, unsigned int
926 int ret; 926 int ret;
927 const char *compat_name = NULL; 927 const char *compat_name = NULL;
928 const char *dest_name = info->devname; 928 const char *dest_name = info->devname;
929 char *ptr=NULL; 929 const char *ptr;
930 char compat_buf[STRING_LENGTH], dest_buf[STRING_LENGTH]; 930 char compat_buf[STRING_LENGTH], dest_buf[STRING_LENGTH];
931 int mode, host, bus, target, lun; 931 int mode, host, bus, target, lun;
932 unsigned int i; 932 unsigned int i;
@@ -954,7 +954,7 @@ static void action_compat(const struct devfsd_notify_struct *info, unsigned int
954 break; 954 break;
955 case AC_MKNEWCOMPAT: 955 case AC_MKNEWCOMPAT:
956 case AC_RMNEWCOMPAT: 956 case AC_RMNEWCOMPAT:
957 ptr = strrchr(info->devname, '/') + 1; 957 ptr = bb_basename(info->devname);
958 i = scan_dev_name(info->devname, info->namelen, ptr); 958 i = scan_dev_name(info->devname, info->namelen, ptr);
959 959
960 /* nothing found */ 960 /* nothing found */
@@ -1460,7 +1460,7 @@ const char *get_old_name(const char *devname, unsigned int namelen,
1460*/ 1460*/
1461{ 1461{
1462 const char *compat_name = NULL; 1462 const char *compat_name = NULL;
1463 char *ptr; 1463 const char *ptr;
1464 struct translate_struct *trans; 1464 struct translate_struct *trans;
1465 unsigned int i; 1465 unsigned int i;
1466 char mode; 1466 char mode;
@@ -1497,7 +1497,7 @@ const char *get_old_name(const char *devname, unsigned int namelen,
1497 } 1497 }
1498 } 1498 }
1499 1499
1500 ptr = (strrchr(devname, '/') + 1); 1500 ptr = bb_basename(devname);
1501 i = scan_dev_name(devname, namelen, ptr); 1501 i = scan_dev_name(devname, namelen, ptr);
1502 1502
1503 if (i > 0 && i < 13) 1503 if (i > 0 && i < 13)
diff --git a/modutils/modprobe.c b/modutils/modprobe.c
index dbed4ea0f..3861dd1e3 100644
--- a/modutils/modprobe.c
+++ b/modutils/modprobe.c
@@ -376,18 +376,13 @@ static struct dep_t *build_dep(void)
376 376
377 if (col) { 377 if (col) {
378 /* This line is a dep description */ 378 /* This line is a dep description */
379 char *mods; 379 const char *mods;
380 char *modpath; 380 char *modpath;
381 char *mod; 381 char *mod;
382 382
383 /* Find the beginning of the module file name */ 383 /* Find the beginning of the module file name */
384 *col = 0; 384 *col = 0;
385 mods = strrchr(buffer, '/'); 385 mods = bb_basename(buffer);
386
387 if (!mods)
388 mods = buffer; /* no path for this module */
389 else
390 mods++; /* there was a path for this module... */
391 386
392 /* find the path of the module */ 387 /* find the path of the module */
393 modpath = strchr(buffer, '/'); /* ... and this is the path */ 388 modpath = strchr(buffer, '/'); /* ... and this is the path */
@@ -433,7 +428,7 @@ static struct dep_t *build_dep(void)
433 /* p points to the first dependable module; if NULL, no dependable module */ 428 /* p points to the first dependable module; if NULL, no dependable module */
434 if (p && *p) { 429 if (p && *p) {
435 char *end = &buffer[l-1]; 430 char *end = &buffer[l-1];
436 char *deps; 431 const char *deps;
437 char *dep; 432 char *dep;
438 char *next; 433 char *next;
439 int ext = 0; 434 int ext = 0;
@@ -451,15 +446,11 @@ static struct dep_t *build_dep(void)
451 next = end; 446 next = end;
452 447
453 /* find the beginning of the module file name */ 448 /* find the beginning of the module file name */
454 deps = strrchr(p, '/'); 449 deps = bb_basename(p);
455 450 if (deps == p) {
456 if (!deps || (deps < p)) {
457 deps = p;
458
459 while (isblank(*deps)) 451 while (isblank(*deps))
460 deps++; 452 deps++;
461 } else 453 }
462 deps++;
463 454
464 /* find the end of the module name in the file name */ 455 /* find the end of the module name in the file name */
465 if (ENABLE_FEATURE_2_6_MODULES 456 if (ENABLE_FEATURE_2_6_MODULES
diff --git a/modutils/rmmod.c b/modutils/rmmod.c
index f78f96ccc..13f5ec20b 100644
--- a/modutils/rmmod.c
+++ b/modutils/rmmod.c
@@ -81,12 +81,7 @@ int rmmod_main(int argc, char **argv)
81 81
82 for (n = optind; n < argc; n++) { 82 for (n = optind; n < argc; n++) {
83 if (ENABLE_FEATURE_2_6_MODULES) { 83 if (ENABLE_FEATURE_2_6_MODULES) {
84 const char *afterslash; 84 filename2modname(misc_buf, bb_basename(argv[n]));
85
86 afterslash = strrchr(argv[n], '/');
87 if (!afterslash) afterslash = argv[n];
88 else afterslash++;
89 filename2modname(misc_buf, afterslash);
90 } 85 }
91 86
92 if (syscall(__NR_delete_module, ENABLE_FEATURE_2_6_MODULES ? misc_buf : argv[n], flags)) { 87 if (syscall(__NR_delete_module, ENABLE_FEATURE_2_6_MODULES ? misc_buf : argv[n], flags)) {
diff --git a/networking/httpd.c b/networking/httpd.c
index 383a00635..8c5e29fa8 100644
--- a/networking/httpd.c
+++ b/networking/httpd.c
@@ -1125,7 +1125,7 @@ static int sendCgi(const char *url,
1125 setenv1("HTTP_REFERER", referer); 1125 setenv1("HTTP_REFERER", referer);
1126 1126
1127 /* set execve argp[0] without path */ 1127 /* set execve argp[0] without path */
1128 argp[0] = strrchr(purl, '/') + 1; 1128 argp[0] = (char*)bb_basename(purl);
1129 /* but script argp[0] must have absolute path and chdiring to this */ 1129 /* but script argp[0] must have absolute path and chdiring to this */
1130 script = strrchr(fullpath, '/'); 1130 script = strrchr(fullpath, '/');
1131 if (!script) 1131 if (!script)
@@ -1713,7 +1713,7 @@ static void handleIncoming(void)
1713 if (alarm_signaled) 1713 if (alarm_signaled)
1714 break; 1714 break;
1715 1715
1716 if (strcmp(strrchr(url, '/') + 1, httpd_conf) == 0 || ip_allowed == 0) { 1716 if (strcmp(bb_basename(url), httpd_conf) == 0 || ip_allowed == 0) {
1717 /* protect listing [/path]/httpd_conf or IP deny */ 1717 /* protect listing [/path]/httpd_conf or IP deny */
1718#if ENABLE_FEATURE_HTTPD_CGI 1718#if ENABLE_FEATURE_HTTPD_CGI
1719 FORBIDDEN: /* protect listing /cgi-bin */ 1719 FORBIDDEN: /* protect listing /cgi-bin */
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index 22005aaee..17e5e88c6 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -24,7 +24,7 @@ struct globals {
24/* mknod in /dev based on a path like "/sys/block/hda/hda1" */ 24/* mknod in /dev based on a path like "/sys/block/hda/hda1" */
25static void make_device(char *path, int delete) 25static void make_device(char *path, int delete)
26{ 26{
27 char *device_name; 27 const char *device_name;
28 int major, minor, type, len; 28 int major, minor, type, len;
29 int mode = 0660; 29 int mode = 0660;
30 uid_t uid = 0; 30 uid_t uid = 0;
@@ -46,7 +46,7 @@ static void make_device(char *path, int delete)
46 46
47 /* Determine device name, type, major and minor */ 47 /* Determine device name, type, major and minor */
48 48
49 device_name = strrchr(path, '/') + 1; 49 device_name = bb_basename(path);
50 type = path[5]=='c' ? S_IFCHR : S_IFBLK; 50 type = path[5]=='c' ? S_IFCHR : S_IFBLK;
51 51
52 /* If we have a config file, look up permissions for this device */ 52 /* If we have a config file, look up permissions for this device */