- 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) {
+
+#ifndef __linux__
+ 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);
+ }
+#endif
+ if (ret < 0) {
+ warn("warning: cannot create hard link %s->%s",
+ new, existing);
+ return (FAIL);
+ }