SCCS-vsn: bin/ln/ln.c 3.2
-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
#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();
-register int argc;
-register char *argv[];
+ int argc;
+ register char **argv;
- 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 > 3) {
- if (stat(argv[argc-1], &stbuf) < 0)
+ argc++;
+ }
+ if (argc > 2) {
+ if (stat(argv[argc-1], &stb) < 0)
- if ((stbuf.st_mode&S_IFMT) != S_IFDIR)
+ if ((stb.st_mode&S_IFMT) != S_IFDIR)
+ 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;
- register char *p1, *p2, *bp;
/* 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);
- 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;
if (link(from, to) < 0) {
perror(from);
if (link(from, to) < 0) {
perror(from);