svn commit: r304471 - stable/10/usr.bin/xinstall
Bryan Drewery
bdrewery at FreeBSD.org
Fri Aug 19 16:59:17 UTC 2016
Author: bdrewery
Date: Fri Aug 19 16:59:16 2016
New Revision: 304471
URL: https://svnweb.freebsd.org/changeset/base/304471
Log:
MFC r303929,r303930,r303931,r303932,r303933:
r303929:
Fix -S with -b not atomically updating the destination file.
r303930:
Support -v for -l.
r303931:
Fix -S with -l not being atomic.
r303932:
Fix -b failure not restoring flags on the destination file.
r303933:
Squelch a false-positive Clang static analyzer warning.
Modified:
stable/10/usr.bin/xinstall/xinstall.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/usr.bin/xinstall/xinstall.c
==============================================================================
--- stable/10/usr.bin/xinstall/xinstall.c Fri Aug 19 16:59:01 2016 (r304470)
+++ stable/10/usr.bin/xinstall/xinstall.c Fri Aug 19 16:59:16 2016 (r304471)
@@ -151,6 +151,7 @@ main(int argc, char *argv[])
char *p;
const char *to_name;
+ fset = 0;
iflags = 0;
group = owner = NULL;
while ((ch = getopt(argc, argv, "B:bCcD:df:g:h:l:M:m:N:o:pSsT:Uv")) !=
@@ -535,7 +536,9 @@ do_link(const char *from_name, const cha
if (target_sb->st_flags & NOCHANGEBITS)
(void)chflags(to_name, target_sb->st_flags &
~NOCHANGEBITS);
- unlink(to_name);
+ if (verbose)
+ printf("install: link %s -> %s\n",
+ from_name, to_name);
ret = rename(tmpl, to_name);
/*
* If rename has posix semantics, then the temporary
@@ -545,8 +548,12 @@ do_link(const char *from_name, const cha
(void)unlink(tmpl);
}
return (ret);
- } else
+ } else {
+ if (verbose)
+ printf("install: link %s -> %s\n",
+ from_name, to_name);
return (link(from_name, to_name));
+ }
}
/*
@@ -575,14 +582,18 @@ do_symlink(const char *from_name, const
if (target_sb->st_flags & NOCHANGEBITS)
(void)chflags(to_name, target_sb->st_flags &
~NOCHANGEBITS);
- unlink(to_name);
-
+ if (verbose)
+ printf("install: symlink %s -> %s\n",
+ from_name, to_name);
if (rename(tmpl, to_name) == -1) {
/* Remove temporary link before exiting. */
(void)unlink(tmpl);
err(EX_OSERR, "%s: rename", to_name);
}
} else {
+ if (verbose)
+ printf("install: symlink %s -> %s\n",
+ from_name, to_name);
if (symlink(from_name, to_name) == -1)
err(EX_OSERR, "symlink %s -> %s", from_name, to_name);
}
@@ -882,11 +893,21 @@ install(const char *from_name, const cha
}
if (verbose)
(void)printf("install: %s -> %s\n", to_name, backup);
- if (rename(to_name, backup) < 0) {
+ if (unlink(backup) < 0 && errno != ENOENT) {
+ serrno = errno;
+ if (to_sb.st_flags & NOCHANGEBITS)
+ (void)chflags(to_name, to_sb.st_flags);
+ unlink(tempfile);
+ errno = serrno;
+ err(EX_OSERR, "unlink: %s", backup);
+ }
+ if (link(to_name, backup) < 0) {
serrno = errno;
unlink(tempfile);
+ if (to_sb.st_flags & NOCHANGEBITS)
+ (void)chflags(to_name, to_sb.st_flags);
errno = serrno;
- err(EX_OSERR, "rename: %s to %s", to_name,
+ err(EX_OSERR, "link: %s to %s", to_name,
backup);
}
}
@@ -1109,16 +1130,26 @@ create_newfile(const char *path, int tar
if (dobackup) {
if ((size_t)snprintf(backup, MAXPATHLEN, "%s%s",
- path, suffix) != strlen(path) + strlen(suffix))
+ path, suffix) != strlen(path) + strlen(suffix)) {
+ saved_errno = errno;
+ if (sbp->st_flags & NOCHANGEBITS)
+ (void)chflags(path, sbp->st_flags);
+ errno = saved_errno;
errx(EX_OSERR, "%s: backup filename too long",
path);
+ }
(void)snprintf(backup, MAXPATHLEN, "%s%s",
path, suffix);
if (verbose)
(void)printf("install: %s -> %s\n",
path, backup);
- if (rename(path, backup) < 0)
+ if (rename(path, backup) < 0) {
+ saved_errno = errno;
+ if (sbp->st_flags & NOCHANGEBITS)
+ (void)chflags(path, sbp->st_flags);
+ errno = saved_errno;
err(EX_OSERR, "rename: %s to %s", path, backup);
+ }
} else
if (unlink(path) < 0)
saved_errno = errno;
More information about the svn-src-stable
mailing list