diff options
-rw-r--r-- | basename.c | 10 | ||||
-rw-r--r-- | coreutils/basename.c | 10 | ||||
-rw-r--r-- | coreutils/ln.c | 18 | ||||
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | ln.c | 18 | ||||
-rw-r--r-- | utility.c | 17 |
6 files changed, 54 insertions, 20 deletions
diff --git a/basename.c b/basename.c index ac371d274..fa15aa979 100644 --- a/basename.c +++ b/basename.c @@ -43,14 +43,7 @@ extern int basename_main(int argc, char **argv) argv++; - s1=*argv+strlen(*argv)-1; - while (s1 && *s1 == '/') { - *s1 = '\0'; - s1--; - } - s = strrchr(*argv, '/'); - if (s==NULL) s=*argv; - else s++; + s = get_last_path_component(*argv); if (argc>2) { argv++; @@ -62,4 +55,3 @@ extern int basename_main(int argc, char **argv) printf("%s\n", s); return(TRUE); } - diff --git a/coreutils/basename.c b/coreutils/basename.c index ac371d274..fa15aa979 100644 --- a/coreutils/basename.c +++ b/coreutils/basename.c @@ -43,14 +43,7 @@ extern int basename_main(int argc, char **argv) argv++; - s1=*argv+strlen(*argv)-1; - while (s1 && *s1 == '/') { - *s1 = '\0'; - s1--; - } - s = strrchr(*argv, '/'); - if (s==NULL) s=*argv; - else s++; + s = get_last_path_component(*argv); if (argc>2) { argv++; @@ -62,4 +55,3 @@ extern int basename_main(int argc, char **argv) printf("%s\n", s); return(TRUE); } - diff --git a/coreutils/ln.c b/coreutils/ln.c index 57e412dc8..beaa58fac 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -52,7 +52,7 @@ static int followLinks = TRUE; extern int ln_main(int argc, char **argv) { - char *linkName; + char *linkName, *dirName; int linkIntoDirFlag; int stopIt = FALSE; @@ -104,6 +104,9 @@ extern int ln_main(int argc, char **argv) exit FALSE; } + if (linkIntoDirFlag == TRUE) + dirName = linkName; + while (argc-- >= 2) { #if 0 char srcName[BUFSIZ + 1]; @@ -126,6 +129,14 @@ extern int ln_main(int argc, char **argv) srcName[nChars] = '\0'; } #endif + if (linkIntoDirFlag == TRUE) { + char *baseName = get_last_path_component(*argv); + linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2); + strcpy(linkName, dirName); + if(dirName[strlen(dirName)-1] != '/') + strcat(linkName, "/"); + strcat(linkName,baseName); + } if (removeoldFlag == TRUE) { status = (unlink(linkName) && errno != ENOENT); @@ -143,6 +154,11 @@ extern int ln_main(int argc, char **argv) perror(linkName); exit FALSE; } + + if (linkIntoDirFlag) + free(linkName); + + argv++; } return( TRUE); } diff --git a/internal.h b/internal.h index 362df3270..a4772b820 100644 --- a/internal.h +++ b/internal.h @@ -259,6 +259,7 @@ extern void *xmalloc (size_t size); extern int find_real_root_device_name(char* name); extern char *get_line_from_file(FILE *file); extern char process_escape_sequence(char **ptr); +extern char *get_last_path_component(char *path); /* These parse entries in /etc/passwd and /etc/group. This is desirable * for BusyBox since we want to avoid using the glibc NSS stuff, which @@ -52,7 +52,7 @@ static int followLinks = TRUE; extern int ln_main(int argc, char **argv) { - char *linkName; + char *linkName, *dirName; int linkIntoDirFlag; int stopIt = FALSE; @@ -104,6 +104,9 @@ extern int ln_main(int argc, char **argv) exit FALSE; } + if (linkIntoDirFlag == TRUE) + dirName = linkName; + while (argc-- >= 2) { #if 0 char srcName[BUFSIZ + 1]; @@ -126,6 +129,14 @@ extern int ln_main(int argc, char **argv) srcName[nChars] = '\0'; } #endif + if (linkIntoDirFlag == TRUE) { + char *baseName = get_last_path_component(*argv); + linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2); + strcpy(linkName, dirName); + if(dirName[strlen(dirName)-1] != '/') + strcat(linkName, "/"); + strcat(linkName,baseName); + } if (removeoldFlag == TRUE) { status = (unlink(linkName) && errno != ENOENT); @@ -143,6 +154,11 @@ extern int ln_main(int argc, char **argv) perror(linkName); exit FALSE; } + + if (linkIntoDirFlag) + free(linkName); + + argv++; } return( TRUE); } @@ -1675,6 +1675,23 @@ char process_escape_sequence(char **ptr) } #endif +#if defined BB_BASENAME || defined BB_LN +char *get_last_path_component(char *path) +{ + char *s=path+strlen(path)-1; + + /* strip trailing slashes */ + while (s && *s == '/') { + *s-- = '\0'; + } + + /* find last component */ + s = strrchr(path, '/'); + if (s==NULL) return path; + else return s+1; +} +#endif + /* END CODE */ /* Local Variables: |