svn commit: r303932 - head/usr.bin/xinstall
Bryan Drewery
bdrewery at FreeBSD.org
Wed Aug 10 18:19:13 UTC 2016
Author: bdrewery
Date: Wed Aug 10 18:19:11 2016
New Revision: 303932
URL: https://svnweb.freebsd.org/changeset/base/303932
Log:
Fix -b failure not restoring flags on the destination file.
MFC after: 1 week
Sponsored by: EMC / Isilon Storage Division
Modified:
head/usr.bin/xinstall/xinstall.c
Modified: head/usr.bin/xinstall/xinstall.c
==============================================================================
--- head/usr.bin/xinstall/xinstall.c Wed Aug 10 18:19:08 2016 (r303931)
+++ head/usr.bin/xinstall/xinstall.c Wed Aug 10 18:19:11 2016 (r303932)
@@ -904,6 +904,8 @@ install(const char *from_name, const cha
(void)printf("install: %s -> %s\n", to_name, backup);
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);
@@ -911,6 +913,8 @@ install(const char *from_name, const cha
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, "link: %s to %s", to_name,
backup);
@@ -1133,16 +1137,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-head
mailing list