summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-08-06 12:19:48 -0400
committerJakob Kaivo <jkk@ung.org>2019-08-06 12:19:48 -0400
commit69b820fa2c271f1eafaf692a0a8e57e22e83daa3 (patch)
tree55439cf38d3a18c7529de8b3f5ab10e88a95c924
parent81cd8690e7c4fb4d316355b016a31b823ec9b507 (diff)
combine flags; make implementation-defined default match SUSv3
-rw-r--r--ln.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/ln.c b/ln.c
index 6929bfa..ab73b42 100644
--- a/ln.c
+++ b/ln.c
@@ -35,7 +35,9 @@
#define O_SEARCH 0
#endif
-static int ln(const char *path, int dirfd, const char *target, int sym, int force, int flag)
+enum { SYMBOLIC = 1 << 0, FORCE = 1 << 1 };
+
+static int ln(const char *path, int dirfd, const char *target, int lnflag, int atflag)
{
if (!target) {
target = path;
@@ -43,7 +45,7 @@ static int ln(const char *path, int dirfd, const char *target, int sym, int forc
struct stat st;
if (fstatat(dirfd, target, &st, AT_SYMLINK_NOFOLLOW) == 0) {
- if (!force) {
+ if (!(lnflag & FORCE)) {
fprintf(stderr, "ln: %s: %s\n", target, strerror(EEXIST));
return 1;
}
@@ -62,13 +64,13 @@ static int ln(const char *path, int dirfd, const char *target, int sym, int forc
}
}
- if (sym) {
+ if (lnflag & SYMBOLIC) {
if (symlinkat(path, dirfd, target) != 0) {
fprintf(stderr, "ln: %s -> %s: %s\n", path, target, strerror(errno));
return 1;
}
} else {
- if (linkat(AT_FDCWD, path, dirfd, target, flag) != 0) {
+ if (linkat(AT_FDCWD, path, dirfd, target, atflag) != 0) {
fprintf(stderr, "ln: %s -> %s: %s\n", path, target, strerror(errno));
return 1;
}
@@ -81,27 +83,26 @@ int main(int argc, char *argv[])
{
setlocale(LC_ALL, "");
- int flag = 0;
- int symbolic = 0;
- int force = 0;
+ int atflag = AT_SYMLINK_FOLLOW;
+ int lnflag = 0;
int c;
while ((c = getopt(argc, argv, "fsLP")) != -1) {
switch (c) {
case 'L':
- flag = AT_SYMLINK_FOLLOW;
+ atflag = AT_SYMLINK_FOLLOW;
break;
case 'P':
- flag = 0;
+ atflag = 0;
break;
case 's':
- symbolic = 1;
+ lnflag |= SYMBOLIC;
break;
case 'f':
- force = 1;
+ lnflag |= FORCE;
break;
default:
@@ -123,7 +124,7 @@ int main(int argc, char *argv[])
} else {
target = NULL;
}
- return ln(argv[optind], dirfd, target, symbolic, force, flag);
+ return ln(argv[optind], dirfd, target, lnflag, atflag);
}
if (dirfd == -1) {
@@ -132,7 +133,7 @@ int main(int argc, char *argv[])
int r = 0;
do {
- r |= ln(argv[optind++], dirfd, NULL, symbolic, force, flag);
+ r |= ln(argv[optind++], dirfd, NULL, lnflag, atflag);
} while (optind < argc - 1);
return r;
}