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) | |||
43 | 43 | ||
44 | argv++; | 44 | argv++; |
45 | 45 | ||
46 | s1=*argv+strlen(*argv)-1; | 46 | s = get_last_path_component(*argv); |
47 | while (s1 && *s1 == '/') { | ||
48 | *s1 = '\0'; | ||
49 | s1--; | ||
50 | } | ||
51 | s = strrchr(*argv, '/'); | ||
52 | if (s==NULL) s=*argv; | ||
53 | else s++; | ||
54 | 47 | ||
55 | if (argc>2) { | 48 | if (argc>2) { |
56 | argv++; | 49 | argv++; |
@@ -62,4 +55,3 @@ extern int basename_main(int argc, char **argv) | |||
62 | printf("%s\n", s); | 55 | printf("%s\n", s); |
63 | return(TRUE); | 56 | return(TRUE); |
64 | } | 57 | } |
65 | |||
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) | |||
43 | 43 | ||
44 | argv++; | 44 | argv++; |
45 | 45 | ||
46 | s1=*argv+strlen(*argv)-1; | 46 | s = get_last_path_component(*argv); |
47 | while (s1 && *s1 == '/') { | ||
48 | *s1 = '\0'; | ||
49 | s1--; | ||
50 | } | ||
51 | s = strrchr(*argv, '/'); | ||
52 | if (s==NULL) s=*argv; | ||
53 | else s++; | ||
54 | 47 | ||
55 | if (argc>2) { | 48 | if (argc>2) { |
56 | argv++; | 49 | argv++; |
@@ -62,4 +55,3 @@ extern int basename_main(int argc, char **argv) | |||
62 | printf("%s\n", s); | 55 | printf("%s\n", s); |
63 | return(TRUE); | 56 | return(TRUE); |
64 | } | 57 | } |
65 | |||
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; | |||
52 | 52 | ||
53 | extern int ln_main(int argc, char **argv) | 53 | extern int ln_main(int argc, char **argv) |
54 | { | 54 | { |
55 | char *linkName; | 55 | char *linkName, *dirName; |
56 | int linkIntoDirFlag; | 56 | int linkIntoDirFlag; |
57 | int stopIt = FALSE; | 57 | int stopIt = FALSE; |
58 | 58 | ||
@@ -104,6 +104,9 @@ extern int ln_main(int argc, char **argv) | |||
104 | exit FALSE; | 104 | exit FALSE; |
105 | } | 105 | } |
106 | 106 | ||
107 | if (linkIntoDirFlag == TRUE) | ||
108 | dirName = linkName; | ||
109 | |||
107 | while (argc-- >= 2) { | 110 | while (argc-- >= 2) { |
108 | #if 0 | 111 | #if 0 |
109 | char srcName[BUFSIZ + 1]; | 112 | char srcName[BUFSIZ + 1]; |
@@ -126,6 +129,14 @@ extern int ln_main(int argc, char **argv) | |||
126 | srcName[nChars] = '\0'; | 129 | srcName[nChars] = '\0'; |
127 | } | 130 | } |
128 | #endif | 131 | #endif |
132 | if (linkIntoDirFlag == TRUE) { | ||
133 | char *baseName = get_last_path_component(*argv); | ||
134 | linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2); | ||
135 | strcpy(linkName, dirName); | ||
136 | if(dirName[strlen(dirName)-1] != '/') | ||
137 | strcat(linkName, "/"); | ||
138 | strcat(linkName,baseName); | ||
139 | } | ||
129 | 140 | ||
130 | if (removeoldFlag == TRUE) { | 141 | if (removeoldFlag == TRUE) { |
131 | status = (unlink(linkName) && errno != ENOENT); | 142 | status = (unlink(linkName) && errno != ENOENT); |
@@ -143,6 +154,11 @@ extern int ln_main(int argc, char **argv) | |||
143 | perror(linkName); | 154 | perror(linkName); |
144 | exit FALSE; | 155 | exit FALSE; |
145 | } | 156 | } |
157 | |||
158 | if (linkIntoDirFlag) | ||
159 | free(linkName); | ||
160 | |||
161 | argv++; | ||
146 | } | 162 | } |
147 | return( TRUE); | 163 | return( TRUE); |
148 | } | 164 | } |
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); | |||
259 | extern int find_real_root_device_name(char* name); | 259 | extern int find_real_root_device_name(char* name); |
260 | extern char *get_line_from_file(FILE *file); | 260 | extern char *get_line_from_file(FILE *file); |
261 | extern char process_escape_sequence(char **ptr); | 261 | extern char process_escape_sequence(char **ptr); |
262 | extern char *get_last_path_component(char *path); | ||
262 | 263 | ||
263 | /* These parse entries in /etc/passwd and /etc/group. This is desirable | 264 | /* These parse entries in /etc/passwd and /etc/group. This is desirable |
264 | * for BusyBox since we want to avoid using the glibc NSS stuff, which | 265 | * for BusyBox since we want to avoid using the glibc NSS stuff, which |
@@ -52,7 +52,7 @@ static int followLinks = TRUE; | |||
52 | 52 | ||
53 | extern int ln_main(int argc, char **argv) | 53 | extern int ln_main(int argc, char **argv) |
54 | { | 54 | { |
55 | char *linkName; | 55 | char *linkName, *dirName; |
56 | int linkIntoDirFlag; | 56 | int linkIntoDirFlag; |
57 | int stopIt = FALSE; | 57 | int stopIt = FALSE; |
58 | 58 | ||
@@ -104,6 +104,9 @@ extern int ln_main(int argc, char **argv) | |||
104 | exit FALSE; | 104 | exit FALSE; |
105 | } | 105 | } |
106 | 106 | ||
107 | if (linkIntoDirFlag == TRUE) | ||
108 | dirName = linkName; | ||
109 | |||
107 | while (argc-- >= 2) { | 110 | while (argc-- >= 2) { |
108 | #if 0 | 111 | #if 0 |
109 | char srcName[BUFSIZ + 1]; | 112 | char srcName[BUFSIZ + 1]; |
@@ -126,6 +129,14 @@ extern int ln_main(int argc, char **argv) | |||
126 | srcName[nChars] = '\0'; | 129 | srcName[nChars] = '\0'; |
127 | } | 130 | } |
128 | #endif | 131 | #endif |
132 | if (linkIntoDirFlag == TRUE) { | ||
133 | char *baseName = get_last_path_component(*argv); | ||
134 | linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2); | ||
135 | strcpy(linkName, dirName); | ||
136 | if(dirName[strlen(dirName)-1] != '/') | ||
137 | strcat(linkName, "/"); | ||
138 | strcat(linkName,baseName); | ||
139 | } | ||
129 | 140 | ||
130 | if (removeoldFlag == TRUE) { | 141 | if (removeoldFlag == TRUE) { |
131 | status = (unlink(linkName) && errno != ENOENT); | 142 | status = (unlink(linkName) && errno != ENOENT); |
@@ -143,6 +154,11 @@ extern int ln_main(int argc, char **argv) | |||
143 | perror(linkName); | 154 | perror(linkName); |
144 | exit FALSE; | 155 | exit FALSE; |
145 | } | 156 | } |
157 | |||
158 | if (linkIntoDirFlag) | ||
159 | free(linkName); | ||
160 | |||
161 | argv++; | ||
146 | } | 162 | } |
147 | return( TRUE); | 163 | return( TRUE); |
148 | } | 164 | } |
@@ -1675,6 +1675,23 @@ char process_escape_sequence(char **ptr) | |||
1675 | } | 1675 | } |
1676 | #endif | 1676 | #endif |
1677 | 1677 | ||
1678 | #if defined BB_BASENAME || defined BB_LN | ||
1679 | char *get_last_path_component(char *path) | ||
1680 | { | ||
1681 | char *s=path+strlen(path)-1; | ||
1682 | |||
1683 | /* strip trailing slashes */ | ||
1684 | while (s && *s == '/') { | ||
1685 | *s-- = '\0'; | ||
1686 | } | ||
1687 | |||
1688 | /* find last component */ | ||
1689 | s = strrchr(path, '/'); | ||
1690 | if (s==NULL) return path; | ||
1691 | else return s+1; | ||
1692 | } | ||
1693 | #endif | ||
1694 | |||
1678 | /* END CODE */ | 1695 | /* END CODE */ |
1679 | /* | 1696 | /* |
1680 | Local Variables: | 1697 | Local Variables: |