summaryrefslogtreecommitdiffstats
path: root/usr.bin/xinstall
diff options
context:
space:
mode:
authorbrooks <brooks@FreeBSD.org>2013-01-22 16:23:08 +0000
committerbrooks <brooks@FreeBSD.org>2013-01-22 16:23:08 +0000
commit27ebf0630af26a85a667b724d2ea986f6868b749 (patch)
treeef571186bbec2fb534aff6d12ae8f6c8c08636a5 /usr.bin/xinstall
parentbfb934aaf0555bc796b501c204e7318781abe495 (diff)
downloadFreeBSD-src-27ebf0630af26a85a667b724d2ea986f6868b749.zip
FreeBSD-src-27ebf0630af26a85a667b724d2ea986f6868b749.tar.gz
Make "install -l s[ar]" act like "ln -sfh" as intended. This fixes
installation of symbolic links where the target is a link is to an existing directory.
Diffstat (limited to 'usr.bin/xinstall')
-rw-r--r--usr.bin/xinstall/xinstall.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index 101b487..a173873 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -336,8 +336,21 @@ main(int argc, char *argv[])
/* NOTREACHED */
}
- no_target = stat(to_name = argv[argc - 1], &to_sb);
+ to_name = argv[argc - 1];
+ no_target = stat(to_name, &to_sb);
if (!no_target && S_ISDIR(to_sb.st_mode)) {
+ if (dolink & LN_SYMBOLIC) {
+ if (lstat(to_name, &to_sb) != 0)
+ err(EX_OSERR, "%s vanished", to_name);
+ if (S_ISLNK(to_sb.st_mode)) {
+ if (argc != 2) {
+ errno = ENOTDIR;
+ err(EX_USAGE, "%s", to_name);
+ }
+ install(*argv, to_name, fset, iflags);
+ exit(EX_OK);
+ }
+ }
for (; *argv != to_name; ++argv)
install(*argv, to_name, fset, iflags | DIRECTORY);
exit(EX_OK);
OpenPOWER on IntegriCloud