machine independent
[unix-history] / usr / src / bin / ln / ln.c
CommitLineData
def89b26 1static 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
9struct stat stb;
10int fflag; /* force flag set? */
11char name[BUFSIZ];
12char *rindex();
8fb84ebd
BJ
13
14main(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);
42usage:
1bfeaa36 43 fprintf(stderr, "Usage: ln f1\nor: ln f1 f2\nln f1 ... fn d2\n");
8fb84ebd
BJ
44 exit(1);
45}
46
47linkit(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}