From 1bfeaa365a0d39c5a331134a17e69d4f5cda240a Mon Sep 17 00:00:00 2001 From: Bill Joy Date: Sun, 24 Aug 1980 20:26:28 -0800 Subject: [PATCH] fixed several bugs SCCS-vsn: bin/ln/ln.c 3.2 --- usr/src/bin/ln/ln.c | 75 ++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/usr/src/bin/ln/ln.c b/usr/src/bin/ln/ln.c index c43c13b373..517df9a033 100644 --- a/usr/src/bin/ln/ln.c +++ b/usr/src/bin/ln/ln.c @@ -1,79 +1,72 @@ -static char sccsid[] = "@(#)ln.c 3.1 %G%"; +static char sccsid[] = "@(#)ln.c 3.2 %G%"; /* - * ln [ -f ] file ... name - * - * name must be dir if more than one file given + * ln */ - #include #include #include -struct stat stbuf; - -int fflag; /* force flag set? */ - -char _sobuf[BUFSIZ]; +struct stat stb; +int fflag; /* force flag set? */ +char name[BUFSIZ]; +char *rindex(); main(argc, argv) -register int argc; -register char *argv[]; + int argc; + register char **argv; { - register i, r; + register int i, r; - if (argc > 1 && strcmp(argv[1], "-f") == 0) { + argc--, argv++; + if (argc && strcmp(argv[0], "-f") == 0) { fflag++; argv++; argc--; } - if (argc < 2) + if (argc == 0) goto usage; - else if (argc == 2) + else if (argc == 1) { argv[argc] = "."; - if (argc > 3) { - if (stat(argv[argc-1], &stbuf) < 0) + argc++; + } + if (argc > 2) { + if (stat(argv[argc-1], &stb) < 0) goto usage; - if ((stbuf.st_mode&S_IFMT) != S_IFDIR) + if ((stb.st_mode&S_IFMT) != S_IFDIR) goto usage; } r = 0; - for(i=1; i= 0 - && (stbuf.st_mode&S_IFMT) == S_IFDIR) { + if (fflag == 0 && stat(from, &stb) >= 0 + && (stb.st_mode&S_IFMT) == S_IFDIR) { printf("%s is a directory\n", from); - return 1; + return (1); } - if (stat(to, &stbuf) >=0 && (stbuf.st_mode&S_IFMT) == S_IFDIR) { - p1 = from; - p2 = to; - bp = _sobuf; - while(*bp++ = *p2++) - continue; - bp[-1] = '/'; - p2 = bp; - while(*bp = *p1++) - if (*bp++ == '/') - bp = p2; - to = _sobuf; + if (stat(to, &stb) >=0 && (stb.st_mode&S_IFMT) == S_IFDIR) { + tail = rindex(from, '/'); + if (tail == 0) + tail = from; + else + tail++; + sprintf(name, "%s/%s", to, tail); + to = name; } - else - p1 = NULL; if (link(from, to) < 0) { perror(from); - return 1; + return (1); } return(0); } -- 2.20.1