summaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
authorEric Andersen2000-07-10 16:44:03 +0000
committerEric Andersen2000-07-10 16:44:03 +0000
commit0b4551faf520e44a9a0bf2ac72b3dcd6a145a0a1 (patch)
tree4694959864edc8f08b950f9cc2547dfe87422819 /coreutils
parenta03d86cf5496a24ccf81bfbf8fdbb10b1ad13a0a (diff)
downloadbusybox-0b4551faf520e44a9a0bf2ac72b3dcd6a145a0a1.zip
busybox-0b4551faf520e44a9a0bf2ac72b3dcd6a145a0a1.tar.gz
From Matt Kraai <kraai@alumni.carnegiemellon.edu>:
Howdy, Bug #1006 reports that ln -s /tmp/foo . does not work correctly. In fact, it appears that any instantiation of ln -s FILE... DIRECTORY does not work. The following patch adds support for this form, which then fixes the particular instance noted in the bug report. In the process, I needed the basename function. This appears in the string.h provided by glibc, but not uC-libc. So I wrote my own to go in utility.c, called get_last_path_component. I also modified the basename utility to use this function. At some point it might be desirous to use the basename from the library if it exists, and otherwise compile our own. But I don't know how to do this. Matt
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/basename.c10
-rw-r--r--coreutils/ln.c18
2 files changed, 18 insertions, 10 deletions
diff --git a/coreutils/basename.c b/coreutils/basename.c
index ac371d2..fa15aa9 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 57e412d..beaa58f 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);
}