Commit | Line | Data |
---|---|---|
def89b26 | 1 | static char sccsid[] = "@(#)ln.c 4.1 %G%"; |
8fb84ebd | 2 | /* |
1bfeaa36 | 3 | * ln |
8fb84ebd | 4 | */ |
8fb84ebd BJ |
5 | #include <stdio.h> |
6 | #include <sys/types.h> | |
7 | #include <sys/stat.h> | |
8 | ||
1bfeaa36 BJ |
9 | struct stat stb; |
10 | int fflag; /* force flag set? */ | |
11 | char name[BUFSIZ]; | |
12 | char *rindex(); | |
8fb84ebd BJ |
13 | |
14 | main(argc, argv) | |
1bfeaa36 BJ |
15 | int argc; |
16 | register char **argv; | |
8fb84ebd | 17 | { |
1bfeaa36 | 18 | register int i, r; |
8fb84ebd | 19 | |
1bfeaa36 BJ |
20 | argc--, argv++; |
21 | if (argc && strcmp(argv[0], "-f") == 0) { | |
8fb84ebd BJ |
22 | fflag++; |
23 | argv++; | |
24 | argc--; | |
25 | } | |
1bfeaa36 | 26 | if (argc == 0) |
8fb84ebd | 27 | goto usage; |
1bfeaa36 | 28 | else if (argc == 1) { |
8fb84ebd | 29 | argv[argc] = "."; |
1bfeaa36 BJ |
30 | argc++; |
31 | } | |
32 | if (argc > 2) { | |
33 | if (stat(argv[argc-1], &stb) < 0) | |
8fb84ebd | 34 | goto usage; |
1bfeaa36 | 35 | if ((stb.st_mode&S_IFMT) != S_IFDIR) |
8fb84ebd BJ |
36 | goto usage; |
37 | } | |
38 | r = 0; | |
1bfeaa36 | 39 | for(i = 0; i < argc-1; i++) |
8fb84ebd BJ |
40 | r |= linkit(argv[i], argv[argc-1]); |
41 | exit(r); | |
42 | usage: | |
1bfeaa36 | 43 | fprintf(stderr, "Usage: ln f1\nor: ln f1 f2\nln f1 ... fn d2\n"); |
8fb84ebd BJ |
44 | exit(1); |
45 | } | |
46 | ||
47 | linkit(from, to) | |
1bfeaa36 | 48 | char *from, *to; |
8fb84ebd | 49 | { |
1bfeaa36 | 50 | char *tail; |
8fb84ebd BJ |
51 | |
52 | /* is target a directory? */ | |
1bfeaa36 BJ |
53 | if (fflag == 0 && stat(from, &stb) >= 0 |
54 | && (stb.st_mode&S_IFMT) == S_IFDIR) { | |
8fb84ebd | 55 | printf("%s is a directory\n", from); |
1bfeaa36 | 56 | return (1); |
8fb84ebd | 57 | } |
1bfeaa36 BJ |
58 | if (stat(to, &stb) >=0 && (stb.st_mode&S_IFMT) == S_IFDIR) { |
59 | tail = rindex(from, '/'); | |
60 | if (tail == 0) | |
61 | tail = from; | |
62 | else | |
63 | tail++; | |
64 | sprintf(name, "%s/%s", to, tail); | |
65 | to = name; | |
8fb84ebd | 66 | } |
8fb84ebd BJ |
67 | if (link(from, to) < 0) { |
68 | perror(from); | |
1bfeaa36 | 69 | return (1); |
8fb84ebd BJ |
70 | } |
71 | return(0); | |
72 | } |