symbolic links
authorBill Joy <root@ucbvax.Berkeley.EDU>
Mon, 15 Mar 1982 20:11:16 +0000 (12:11 -0800)
committerBill Joy <root@ucbvax.Berkeley.EDU>
Mon, 15 Mar 1982 20:11:16 +0000 (12:11 -0800)
SCCS-vsn: bin/ln/ln.c 4.2

usr/src/bin/ln/ln.c

index 743bec3..868b590 100644 (file)
@@ -1,4 +1,4 @@
-static char sccsid[] = "@(#)ln.c 4.1 %G%";
+static char sccsid[] = "@(#)ln.c 4.2 %G%";
 /*
  * ln
  */
 /*
  * ln
  */
@@ -8,6 +8,7 @@ static  char sccsid[] = "@(#)ln.c 4.1 %G%";
 
 struct stat stb;
 int    fflag;          /* force flag set? */
 
 struct stat stb;
 int    fflag;          /* force flag set? */
+int    sflag;
 char   name[BUFSIZ];
 char   *rindex();
 
 char   name[BUFSIZ];
 char   *rindex();
 
@@ -18,19 +19,25 @@ main(argc, argv)
        register int i, r;
 
        argc--, argv++;
        register int i, r;
 
        argc--, argv++;
+again:
        if (argc && strcmp(argv[0], "-f") == 0) {
                fflag++;
                argv++;
                argc--;
        }
        if (argc && strcmp(argv[0], "-f") == 0) {
                fflag++;
                argv++;
                argc--;
        }
+       if (argc && strcmp(argv[0], "-s") == 0) {
+               sflag++;
+               argv++;
+               argc--;
+       }
        if (argc == 0) 
                goto usage;
        else if (argc == 1) {
                argv[argc] = ".";
                argc++;
        }
        if (argc == 0) 
                goto usage;
        else if (argc == 1) {
                argv[argc] = ".";
                argc++;
        }
-       if (argc > 2) {
-               if (stat(argv[argc-1], &stb) < 0)
+       if (sflag == 0 && argc > 2) {
+               if (lstat(argv[argc-1], &stb) < 0)
                        goto usage;
                if ((stb.st_mode&S_IFMT) != S_IFDIR) 
                        goto usage;
                        goto usage;
                if ((stb.st_mode&S_IFMT) != S_IFDIR) 
                        goto usage;
@@ -40,22 +47,25 @@ main(argc, argv)
                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\nor: ln f1 f2\nln f1 ... fn d2\n");
+       fprintf(stderr, "Usage: ln [ -s ] f1\nor: ln [ -s ] f1 f2\nln [ -s ] f1 ... fn d2\n");
        exit(1);
 }
 
        exit(1);
 }
 
+int    link(), symlink();
+
 linkit(from, to)
        char *from, *to;
 {
        char *tail;
 linkit(from, to)
        char *from, *to;
 {
        char *tail;
+       int (*linkf)() = sflag ? symlink : link;
 
        /* is target a directory? */
 
        /* is target a directory? */
-       if (fflag == 0 && stat(from, &stb) >= 0
+       if (sflag == 0 && fflag == 0 && lstat(from, &stb) >= 0
            && (stb.st_mode&S_IFMT) == S_IFDIR) {
                printf("%s is a directory\n", from);
                return (1);
        }
            && (stb.st_mode&S_IFMT) == S_IFDIR) {
                printf("%s is a directory\n", from);
                return (1);
        }
-       if (stat(to, &stb) >=0 && (stb.st_mode&S_IFMT) == S_IFDIR) {
+       if (lstat(to, &stb) >= 0 && (stb.st_mode&S_IFMT) == S_IFDIR) {
                tail = rindex(from, '/');
                if (tail == 0)
                        tail = from;
                tail = rindex(from, '/');
                if (tail == 0)
                        tail = from;
@@ -64,9 +74,9 @@ linkit(from, to)
                sprintf(name, "%s/%s", to, tail);
                to = name;
        }
                sprintf(name, "%s/%s", to, tail);
                to = name;
        }
-       if (link(from, to) < 0) {
+       if ((*linkf)(from, to) < 0) {
                perror(from);
                return (1);
        }
                perror(from);
                return (1);
        }
-       return(0);
+       return (0);
 }
 }