*: kill bb_get_last_path_component, replace with two functions

(one which strips trailing slash and one which does not)
wget: straighten out as a result of above change
   text    data     bss     dec     hex filename
   5056       1       0    5057    13c1 busybox.t4/networking/wget.o
   5022       0       0    5022    139e busybox.t5/networking/wget.o
This commit is contained in:
Denis Vlasenko 2007-09-24 18:27:04 +00:00
parent a7ce207bd8
commit 818322b9b1
13 changed files with 69 additions and 65 deletions

View File

@ -601,7 +601,7 @@ static int busybox_main(char **argv)
} }
/* We support "busybox /a/path/to/applet args..." too. Allows for /* We support "busybox /a/path/to/applet args..." too. Allows for
* "#!/bin/busybox"-style wrappers */ * "#!/bin/busybox"-style wrappers */
applet_name = bb_get_last_path_component(argv[0]); applet_name = bb_get_last_path_component_nostrip(argv[0]);
run_applet_and_exit(applet_name, argv); run_applet_and_exit(applet_name, argv);
bb_error_msg_and_die("applet not found"); bb_error_msg_and_die("applet not found");
} }

View File

@ -34,7 +34,8 @@ int basename_main(int argc, char **argv)
bb_show_usage(); bb_show_usage();
} }
s = bb_get_last_path_component(*++argv); /* It should strip slash: /abc/def/ -> def */
s = bb_get_last_path_component_strip(*++argv);
if (*++argv) { if (*++argv) {
n = strlen(*argv); n = strlen(*argv);

View File

@ -87,7 +87,7 @@ int cp_main(int argc, char **argv)
} }
while (1) { while (1) {
dest = concat_path_file(last, bb_get_last_path_component(*argv)); dest = concat_path_file(last, bb_get_last_path_component_strip(*argv));
DO_COPY: DO_COPY:
if (copy_file(*argv, dest, flags) < 0) { if (copy_file(*argv, dest, flags) < 0) {
status = 1; status = 1;

View File

@ -45,7 +45,7 @@ int ln_main(int argc, char **argv)
if (argc == optind + 1) { if (argc == optind + 1) {
*--argv = last; *--argv = last;
last = bb_get_last_path_component(xstrdup(last)); last = bb_get_last_path_component_strip(xstrdup(last));
} }
do { do {
@ -57,7 +57,7 @@ int ln_main(int argc, char **argv)
NULL) NULL)
) { ) {
src_name = xstrdup(*argv); src_name = xstrdup(*argv);
src = concat_path_file(src, bb_get_last_path_component(src_name)); src = concat_path_file(src, bb_get_last_path_component_strip(src_name));
free(src_name); free(src_name);
src_name = src; src_name = src;
} }

View File

@ -68,7 +68,7 @@ int mv_main(int argc, char **argv)
} }
do { do {
dest = concat_path_file(last, bb_get_last_path_component(*argv)); dest = concat_path_file(last, bb_get_last_path_component_strip(*argv));
dest_exists = cp_mv_stat(dest, &dest_stat); dest_exists = cp_mv_stat(dest, &dest_stat);
if (dest_exists < 0) { if (dest_exists < 0) {
goto RET_1; goto RET_1;

View File

@ -38,7 +38,7 @@ int rm_main(int argc, char **argv)
if (*argv != NULL) { if (*argv != NULL) {
do { do {
const char *base = bb_get_last_path_component(*argv); const char *base = bb_get_last_path_component_strip(*argv);
if (DOT_OR_DOTDOT(base)) { if (DOT_OR_DOTDOT(base)) {
bb_error_msg("cannot remove '.' or '..'"); bb_error_msg("cannot remove '.' or '..'");

View File

@ -236,9 +236,15 @@ extern void bb_copyfd_exact_size(int fd1, int fd2, off_t size);
/* this helper yells "short read!" if param is not -1 */ /* this helper yells "short read!" if param is not -1 */
extern void complain_copyfd_and_die(off_t sz) ATTRIBUTE_NORETURN; extern void complain_copyfd_and_die(off_t sz) ATTRIBUTE_NORETURN;
extern char bb_process_escape_sequence(const char **ptr); extern char bb_process_escape_sequence(const char **ptr);
/* TODO: sometimes modifies its parameter, which /* xxxx_strip version can modify its parameter:
* makes it rather inconvenient at times: */ * "/" -> "/"
extern char *bb_get_last_path_component(char *path); * "abc" -> "abc"
* "abc/def" -> "def"
* "abc/def/" -> "def" !!
*/
extern char *bb_get_last_path_component_strip(char *path);
/* "abc/def/" -> "" and it never modifies 'path' */
extern char *bb_get_last_path_component_nostrip(const char *path);
int ndelay_on(int fd); int ndelay_on(int fd);
int ndelay_off(int fd); int ndelay_off(int fd);

View File

@ -436,10 +436,11 @@ static pid_t run(const struct init_action *a)
++cmdpath; ++cmdpath;
/* find the last component in the command pathname */ /* find the last component in the command pathname */
s = bb_get_last_path_component(cmdpath); s = bb_get_last_path_component_nostrip(cmdpath);
/* make a new argv[0] */ /* make a new argv[0] */
if ((cmd[0] = malloc(strlen(s) + 2)) == NULL) { cmd[0] = malloc(strlen(s) + 2);
if (cmd[0] == NULL) {
message(L_LOG | L_CONSOLE, bb_msg_memory_exhausted); message(L_LOG | L_CONSOLE, bb_msg_memory_exhausted);
cmd[0] = cmdpath; cmd[0] = cmdpath;
} else { } else {

View File

@ -8,25 +8,35 @@
*/ */
#include "libbb.h" #include "libbb.h"
/*
char *bb_get_last_path_component(char *path) * "/" -> "/"
* "abc" -> "abc"
* "abc/def" -> "def"
* "abc/def/" -> ""
*/
char *bb_get_last_path_component_nostrip(const char *path)
{ {
char *first = path; char *slash = strrchr(path, '/');
char *last;
last = path - 1; if (!slash || (slash == path && !slash[1]))
return (char*)path;
while (*path) { return slash + 1;
if ((*path != '/') && (path > ++last)) { }
last = first = path;
} /*
++path; * "/" -> "/"
} * "abc" -> "abc"
* "abc/def" -> "def"
if (*first == '/') { * "abc/def/" -> "def" !!
last = first; */
} char *bb_get_last_path_component_strip(char *path)
last[1] = '\0'; {
char *slash = last_char_is(path, '/');
return first;
if (slash)
while (*slash == '/' && slash != path)
*slash-- = '\0';
return bb_get_last_path_component_nostrip(path);
} }

View File

@ -67,7 +67,7 @@ void run_shell(const char *shell, int loginshell, const char *command, const cha
args = xmalloc(sizeof(char*) * (4 + additional_args_cnt)); args = xmalloc(sizeof(char*) * (4 + additional_args_cnt));
args[0] = bb_get_last_path_component(xstrdup(shell)); args[0] = bb_get_last_path_component_nostrip(xstrdup(shell));
if (loginshell) if (loginshell)
args[0] = xasprintf("-%s", args[0]); args[0] = xasprintf("-%s", args[0]);

View File

@ -806,7 +806,7 @@ static int check_module_name_match(const char *filename, struct stat *statbuf,
return FALSE; return FALSE;
else { else {
char *tmp, *tmp1 = xstrdup(filename); char *tmp, *tmp1 = xstrdup(filename);
tmp = bb_get_last_path_component(tmp1); tmp = bb_get_last_path_component_nostrip(tmp1);
if (strcmp(tmp, fullname) == 0) { if (strcmp(tmp, fullname) == 0) {
free(tmp1); free(tmp1);
/* Stop searching if we find a match */ /* Stop searching if we find a match */

View File

@ -12,11 +12,11 @@
struct host_info { struct host_info {
// May be used if we ever will want to free() all xstrdup()s... // May be used if we ever will want to free() all xstrdup()s...
/* char *allocated; */ /* char *allocated; */
char *path; const char *path;
char *user; const char *user;
char *host; char *host;
int port; int port;
smallint is_ftp; smallint is_ftp;
}; };
@ -318,9 +318,7 @@ static void parse_url(char *src_url, struct host_info *h)
p = strchr(h->host, '?'); if (!sp || (p && sp > p)) sp = p; p = strchr(h->host, '?'); if (!sp || (p && sp > p)) sp = p;
p = strchr(h->host, '#'); if (!sp || (p && sp > p)) sp = p; p = strchr(h->host, '#'); if (!sp || (p && sp > p)) sp = p;
if (!sp) { if (!sp) {
/* must be writable because of bb_get_last_path_component() */ h->path = "";
static char nullstr[] ALIGN1 = "";
h->path = nullstr;
} else if (*sp == '/') { } else if (*sp == '/') {
*sp = '\0'; *sp = '\0';
h->path = sp + 1; h->path = sp + 1;
@ -328,7 +326,7 @@ static void parse_url(char *src_url, struct host_info *h)
// http://busybox.net?login=john@doe is a valid URL // http://busybox.net?login=john@doe is a valid URL
// memmove converts to: // memmove converts to:
// http:/busybox.nett?login=john@doe... // http:/busybox.nett?login=john@doe...
memmove(h->host-1, h->host, sp - h->host); memmove(h->host - 1, h->host, sp - h->host);
h->host--; h->host--;
sp[-1] = '\0'; sp[-1] = '\0';
h->path = sp; h->path = sp;
@ -497,31 +495,20 @@ int wget_main(int argc, char **argv)
} }
} }
/* Guess an output filename */ /* Guess an output filename, if there was no -O FILE */
if (!fname_out) { if (!fname_out) {
// Dirty hack. Needed because bb_get_last_path_component fname_out = bb_get_last_path_component_nostrip(target.path);
// will destroy trailing / by storing '\0' in last byte! /* handle "wget http://kernel.org//" */
if (!last_char_is(target.path, '/')) { if (fname_out[0] == '/' || !fname_out[0])
fname_out = bb_get_last_path_component(target.path);
#if ENABLE_FEATURE_WGET_STATUSBAR
curfile = fname_out;
#endif
}
if (!fname_out || !fname_out[0]) {
/* bb_get_last_path_component writes
* to last '/' only. We don't have one here... */
fname_out = (char*)"index.html"; fname_out = (char*)"index.html";
#if ENABLE_FEATURE_WGET_STATUSBAR /* -P DIR is considered only if there was no -O FILE */
curfile = fname_out; if (dir_prefix)
#endif
}
if (dir_prefix != NULL)
fname_out = concat_path_file(dir_prefix, fname_out); fname_out = concat_path_file(dir_prefix, fname_out);
#if ENABLE_FEATURE_WGET_STATUSBAR
} else {
curfile = bb_get_last_path_component(fname_out);
#endif
} }
#if ENABLE_FEATURE_WGET_STATUSBAR
curfile = bb_get_last_path_component_nostrip(fname_out);
#endif
/* Impossible? /* Impossible?
if ((opt & WGET_OPT_CONTINUE) && !fname_out) if ((opt & WGET_OPT_CONTINUE) && !fname_out)
bb_error_msg_and_die("cannot specify continue (-c) without a filename (-O)"); */ bb_error_msg_and_die("cannot specify continue (-c) without a filename (-O)"); */

View File

@ -1141,12 +1141,11 @@ static int pseudo_exec(struct child_prog *child)
} }
} }
/* Check if the command matches any busybox internal /* Check if the command matches any busybox internal
* commands ("applets") here. Following discussions from * commands ("applets") here. Following discussions from
* November 2000 on busybox@busybox.net, don't use * November 2000 on busybox@busybox.net, don't use
* bb_get_last_path_component(). This way explicit (with * bb_get_last_path_component_nostrip(). This way explicit
* slashes) filenames will never be interpreted as an * (with slashes) filenames will never be interpreted as an
* applet, just like with builtins. This way the user can * applet, just like with builtins. This way the user can
* override an applet with an explicit filename reference. * override an applet with an explicit filename reference.
* The only downside to this change is that an explicit * The only downside to this change is that an explicit