SCCS-vsn: bin/ln/ln.c 4.2
-static char sccsid[] = "@(#)ln.c 4.1 %G%";
+static char sccsid[] = "@(#)ln.c 4.2 %G%";
struct stat stb;
int fflag; /* force flag set? */
struct stat stb;
int fflag; /* force flag set? */
char name[BUFSIZ];
char *rindex();
char name[BUFSIZ];
char *rindex();
register int i, r;
argc--, argv++;
register int i, r;
argc--, argv++;
if (argc && strcmp(argv[0], "-f") == 0) {
fflag++;
argv++;
argc--;
}
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 == 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;
goto usage;
if ((stb.st_mode&S_IFMT) != S_IFDIR)
goto usage;
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\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");
+int link(), symlink();
+
linkit(from, to)
char *from, *to;
{
char *tail;
linkit(from, to)
char *from, *to;
{
char *tail;
+ int (*linkf)() = sflag ? symlink : link;
/* is target a directory? */
/* 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);
}
&& (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;
tail = rindex(from, '/');
if (tail == 0)
tail = from;
sprintf(name, "%s/%s", to, tail);
to = name;
}
sprintf(name, "%s/%s", to, tail);
to = name;
}
- if (link(from, to) < 0) {
+ if ((*linkf)(from, to) < 0) {
perror(from);
return (1);
}
perror(from);
return (1);
}