fixed several bugs
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Mon, 25 Aug 1980 04:26:28 +0000 (20:26 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Mon, 25 Aug 1980 04:26:28 +0000 (20:26 -0800)
SCCS-vsn: bin/ln/ln.c 3.2

usr/src/bin/ln/ln.c

index c43c13b..517df9a 100644 (file)
@@ -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 <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 
-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)
 
 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--;
        }
                fflag++;
                argv++;
                argc--;
        }
-       if (argc < 2
+       if (argc == 0
                goto usage;
                goto usage;
-       else if (argc == 2)
+       else if (argc == 1) {
                argv[argc] = ".";
                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;
                        goto usage;
-               if ((stbuf.st_mode&S_IFMT) != S_IFDIR) 
+               if ((stb.st_mode&S_IFMT) != S_IFDIR) 
                        goto usage;
        }
        r = 0;
                        goto usage;
        }
        r = 0;
-       for(i=1; i<argc-1;i++)
+       for(i = 0; i < argc-1; i++)
                r |= linkit(argv[i], argv[argc-1]);
        exit(r);
 usage:
                r |= linkit(argv[i], argv[argc-1]);
        exit(r);
 usage:
-       fprintf(stderr, "Usage: ln: f1 f2; or ln f1 ... fn d2\n");
+       fprintf(stderr, "Usage: ln f1\nor: ln f1 f2\nln f1 ... fn d2\n");
        exit(1);
 }
 
 linkit(from, to)
        exit(1);
 }
 
 linkit(from, to)
-register char  *from, *to;
+       char *from, *to;
 {
 {
-       register char   *p1, *p2, *bp;
+       char *tail;
 
        /* is target a directory? */
 
        /* is target a directory? */
-       if (fflag == 0 && stat(from, &stbuf) >= 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);
                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);
        if (link(from, to) < 0) {
                perror(from);
-               return 1;
+               return (1);
        }
        return(0);
 }
        }
        return(0);
 }