summaryrefslogtreecommitdiffstats
path: root/sbin/restore
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-07-09 03:57:26 +0000
committerjdp <jdp@FreeBSD.org>1998-07-09 03:57:26 +0000
commiteca7605ba4fa5895ad5ae3fd87d22b6e18c96185 (patch)
tree5aca1ae0bb5a1d1739f6a6412641d2eabb5ffdfa /sbin/restore
parent8c57af43f0be6d4d032faa8e8fc0afeb53ef5f61 (diff)
downloadFreeBSD-src-eca7605ba4fa5895ad5ae3fd87d22b6e18c96185.zip
FreeBSD-src-eca7605ba4fa5895ad5ae3fd87d22b6e18c96185.tar.gz
Fix a bug that prevented the restoration of hard links to files that
had the schg flag set. Reported by Matthew Thyer <thyerm@camtech.net.au>.
Diffstat (limited to 'sbin/restore')
-rw-r--r--sbin/restore/utilities.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/sbin/restore/utilities.c b/sbin/restore/utilities.c
index 3232b9b..265b596 100644
--- a/sbin/restore/utilities.c
+++ b/sbin/restore/utilities.c
@@ -218,11 +218,26 @@ linkit(existing, new, type)
return (FAIL);
}
} else if (type == HARDLINK) {
- if (!Nflag && link(existing, new) < 0) {
- fprintf(stderr,
- "warning: cannot create hard link %s->%s: %s\n",
- new, existing, strerror(errno));
- return (FAIL);
+ int ret;
+
+ if (!Nflag && (ret = link(existing, new)) < 0) {
+ struct stat s;
+
+ /*
+ * Most likely, the schg flag is set. Clear the
+ * flags and try again.
+ */
+ if (stat(existing, &s) == 0 && s.st_flags != 0 &&
+ chflags(existing, 0) == 0) {
+ ret = link(existing, new);
+ chflags(existing, s.st_flags);
+ }
+ if (ret < 0) {
+ fprintf(stderr, "warning: cannot create "
+ "hard link %s->%s: %s\n",
+ new, existing, strerror(errno));
+ return (FAIL);
+ }
}
} else {
panic("linkit: unknown type %d\n", type);
OpenPOWER on IntegriCloud