* Ported to Linux's Second Extended File System as part of the
* dump and restore backup suit
* Remy Card <card@Linux.EU.Org>, 1994-1997
- * Stelian Pop <pop@cybercable.fr>, 1999-2000
+ * Stelian Pop <pop@noos.fr>, 1999-2000
+ * Stelian Pop <pop@noos.fr> - AlcĂ´ve <www.alcove.fr>, 2000
*/
/*
#ifndef lint
static const char rcsid[] =
- "$Id: utilities.c,v 1.7 2000/01/21 10:17:41 stelian Exp $";
+ "$Id: utilities.c,v 1.12 2001/03/19 13:22:49 stelian Exp $";
#endif /* not lint */
+#include <config.h>
+#include <errno.h>
+#include <compaterr.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
#include <sys/param.h>
#include <sys/stat.h>
#ifdef __linux__
#include <sys/time.h>
#include <linux/ext2_fs.h>
+#include <ext2fs/ext2fs.h>
#include <bsdcompat.h>
#else /* __linux__ */
#include <ufs/ufs/dinode.h>
#include <ufs/ufs/dir.h>
#endif /* __linux__ */
-#include <errno.h>
-#include <compaterr.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-
-#ifdef __linux__
-#include <ext2fs/ext2fs.h>
-#endif
-
#include "restore.h"
#include "extern.h"
ret = link(existing, new);
chflags(existing, s.st_flags);
}
+#else
+ unsigned long s;
+
+ /*
+ * Most likely, the immutable or append-only attribute
+ * is set. Clear the attributes and try again.
+ */
+ if (fgetflags (existing, &s) != -1 &&
+ fsetflags (existing, 0) != -1) {
+ ret = link(existing, new);
+ fsetflags(existing, s);
+ }
#endif
if (ret < 0) {
warn("warning: cannot create hard link %s->%s",