From: Bill Joy Date: Mon, 15 Mar 1982 20:11:16 +0000 (-0800) Subject: symbolic links X-Git-Tag: BSD-4_1c_2-Snapshot-Development~3885 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/a3954b4f2a82b7223dd67338eeb8c3be5d6238eb symbolic links SCCS-vsn: bin/ln/ln.c 4.2 --- diff --git a/usr/src/bin/ln/ln.c b/usr/src/bin/ln/ln.c index 743bec37fe..868b59088f 100644 --- a/usr/src/bin/ln/ln.c +++ b/usr/src/bin/ln/ln.c @@ -1,4 +1,4 @@ -static char sccsid[] = "@(#)ln.c 4.1 %G%"; +static char sccsid[] = "@(#)ln.c 4.2 %G%"; /* * ln */ @@ -8,6 +8,7 @@ static char sccsid[] = "@(#)ln.c 4.1 %G%"; struct stat stb; int fflag; /* force flag set? */ +int sflag; char name[BUFSIZ]; char *rindex(); @@ -18,19 +19,25 @@ main(argc, argv) register int i, r; argc--, argv++; +again: 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 > 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; @@ -40,22 +47,25 @@ main(argc, argv) 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); } +int link(), symlink(); + linkit(from, to) char *from, *to; { char *tail; + int (*linkf)() = sflag ? symlink : link; /* 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); } - 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; @@ -64,9 +74,9 @@ linkit(from, to) sprintf(name, "%s/%s", to, tail); to = name; } - if (link(from, to) < 0) { + if ((*linkf)(from, to) < 0) { perror(from); return (1); } - return(0); + return (0); }