diff options
-rw-r--r-- | coreutils/ln.c | 49 | ||||
-rw-r--r-- | ln.c | 49 |
2 files changed, 62 insertions, 36 deletions
diff --git a/coreutils/ln.c b/coreutils/ln.c index 9dc7f5d8c..e35bf7a03 100644 --- a/coreutils/ln.c +++ b/coreutils/ln.c @@ -41,42 +41,47 @@ static const int LN_NODEREFERENCE = 4; * linkDestName is where the link points to, * linkSrcName is the name of the link to be created. */ -static int fs_link(const char *link_DestName, const char *link_SrcName, const int flag) +static int fs_link(const char *link_destname, const char *link_srcname, + const int flag) { int status; - int srcIsDir; - char *srcName; + int src_is_dir; + char *src_name; - if (link_DestName==NULL) + if (link_destname==NULL) return(FALSE); - srcName = (char *) malloc(strlen(link_SrcName)+strlen(link_DestName)+1); + src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1); - if (link_SrcName==NULL) - strcpy(srcName, link_DestName); + if (link_srcname==NULL) + strcpy(src_name, link_destname); else - strcpy(srcName, link_SrcName); + strcpy(src_name, link_srcname); if (flag&LN_NODEREFERENCE) - srcIsDir = is_directory(srcName, TRUE, NULL); + src_is_dir = is_directory(src_name, TRUE, NULL); else - srcIsDir = is_directory(srcName, FALSE, NULL); + src_is_dir = is_directory(src_name, FALSE, NULL); - if ((srcIsDir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) { - strcat(srcName, "/"); - strcat(srcName, link_DestName); + if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) { + char* srcdir_name; + + srcdir_name = xstrdup(link_destname); + strcat(src_name, "/"); + strcat(src_name, get_last_path_component(srcdir_name)); + free(srcdir_name); } if (flag&LN_FORCE) - unlink(srcName); + unlink(src_name); if (flag&LN_SYMLINK) - status = symlink(link_DestName, srcName); + status = symlink(link_destname, src_name); else - status = link(link_DestName, srcName); + status = link(link_destname, src_name); if (status != 0) { - perror(srcName); + perror_msg(src_name); return(FALSE); } return(TRUE); @@ -104,12 +109,20 @@ extern int ln_main(int argc, char **argv) show_usage(); } } + if (optind > (argc-1)) { + show_usage(); + } + if (optind == (argc-1)) { + if (fs_link(argv[optind], + get_last_path_component(argv[optind]), flag)==FALSE) + status = EXIT_FAILURE; + } while(optind<(argc-1)) { if (fs_link(argv[optind], argv[argc-1], flag)==FALSE) status = EXIT_FAILURE; optind++; } - return(status); + exit(status); } /* @@ -41,42 +41,47 @@ static const int LN_NODEREFERENCE = 4; * linkDestName is where the link points to, * linkSrcName is the name of the link to be created. */ -static int fs_link(const char *link_DestName, const char *link_SrcName, const int flag) +static int fs_link(const char *link_destname, const char *link_srcname, + const int flag) { int status; - int srcIsDir; - char *srcName; + int src_is_dir; + char *src_name; - if (link_DestName==NULL) + if (link_destname==NULL) return(FALSE); - srcName = (char *) malloc(strlen(link_SrcName)+strlen(link_DestName)+1); + src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1); - if (link_SrcName==NULL) - strcpy(srcName, link_DestName); + if (link_srcname==NULL) + strcpy(src_name, link_destname); else - strcpy(srcName, link_SrcName); + strcpy(src_name, link_srcname); if (flag&LN_NODEREFERENCE) - srcIsDir = is_directory(srcName, TRUE, NULL); + src_is_dir = is_directory(src_name, TRUE, NULL); else - srcIsDir = is_directory(srcName, FALSE, NULL); + src_is_dir = is_directory(src_name, FALSE, NULL); - if ((srcIsDir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) { - strcat(srcName, "/"); - strcat(srcName, link_DestName); + if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) { + char* srcdir_name; + + srcdir_name = xstrdup(link_destname); + strcat(src_name, "/"); + strcat(src_name, get_last_path_component(srcdir_name)); + free(srcdir_name); } if (flag&LN_FORCE) - unlink(srcName); + unlink(src_name); if (flag&LN_SYMLINK) - status = symlink(link_DestName, srcName); + status = symlink(link_destname, src_name); else - status = link(link_DestName, srcName); + status = link(link_destname, src_name); if (status != 0) { - perror(srcName); + perror_msg(src_name); return(FALSE); } return(TRUE); @@ -104,12 +109,20 @@ extern int ln_main(int argc, char **argv) show_usage(); } } + if (optind > (argc-1)) { + show_usage(); + } + if (optind == (argc-1)) { + if (fs_link(argv[optind], + get_last_path_component(argv[optind]), flag)==FALSE) + status = EXIT_FAILURE; + } while(optind<(argc-1)) { if (fs_link(argv[optind], argv[argc-1], flag)==FALSE) status = EXIT_FAILURE; optind++; } - return(status); + exit(status); } /* |