|
|
1.1 ! root 1: static char sccsid[] = "@(#)ln.c 4.3 3/31/82"; ! 2: /* ! 3: * ln ! 4: */ ! 5: #include <stdio.h> ! 6: #include <sys/types.h> ! 7: #include <sys/stat.h> ! 8: ! 9: struct stat stb; ! 10: int fflag; ! 11: int sflag; ! 12: char name[BUFSIZ]; ! 13: char *rindex(); ! 14: ! 15: main(argc, argv) ! 16: int argc; ! 17: register char **argv; ! 18: { ! 19: register int i, r; ! 20: ! 21: argc--, argv++; ! 22: again: ! 23: if (argc && strcmp(argv[0], "-f") == 0) { ! 24: fflag++; ! 25: argv++; ! 26: argc--; ! 27: } ! 28: if (argc && strcmp(argv[0], "-s") == 0) { ! 29: sflag++; ! 30: argv++; ! 31: argc--; ! 32: } ! 33: if (argc == 0) ! 34: goto usage; ! 35: else if (argc == 1) { ! 36: argv[argc] = "."; ! 37: argc++; ! 38: } ! 39: if (sflag == 0 && argc > 2) { ! 40: if (stat(argv[argc-1], &stb) < 0) ! 41: goto usage; ! 42: if ((stb.st_mode&S_IFMT) != S_IFDIR) ! 43: goto usage; ! 44: } ! 45: r = 0; ! 46: for(i = 0; i < argc-1; i++) ! 47: r |= linkit(argv[i], argv[argc-1]); ! 48: exit(r); ! 49: usage: ! 50: fprintf(stderr, "Usage: ln [ -s ] f1\nor: ln [ -s ] f1 f2\nln [ -s ] f1 ... fn d2\n"); ! 51: exit(1); ! 52: } ! 53: ! 54: int link(), symlink(); ! 55: ! 56: linkit(from, to) ! 57: char *from, *to; ! 58: { ! 59: char *tail; ! 60: int (*linkf)() = sflag ? symlink : link; ! 61: ! 62: /* is target a directory? */ ! 63: if (sflag == 0 && fflag == 0 && stat(from, &stb) >= 0 ! 64: && (stb.st_mode&S_IFMT) == S_IFDIR) { ! 65: fprintf(stderr, "ln: %s is a directory\n", from); ! 66: return (1); ! 67: } ! 68: if (stat(to, &stb) >= 0 && (stb.st_mode&S_IFMT) == S_IFDIR) { ! 69: tail = rindex(from, '/'); ! 70: if (tail == 0) ! 71: tail = from; ! 72: else ! 73: tail++; ! 74: sprintf(name, "%s/%s", to, tail); ! 75: to = name; ! 76: } ! 77: if ((*linkf)(from, to) < 0) { ! 78: lnerror(from, to); ! 79: return (1); ! 80: } ! 81: return (0); ! 82: } ! 83: ! 84: lnerror(from, to) ! 85: char *from, *to; ! 86: { ! 87: char buf[BUFSIZ]; ! 88: ! 89: sprintf(buf, "ln %s %s", from, to); ! 90: perror(buf); ! 91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.