+ if (lchown(name, luid, lgid) < 0)
+ warn("%s: lchown", name);
+#endif
+ extractattr(name);
+ return (GOOD);
+ }
+
+ case IFIFO:
+ {
+ uid_t luid = curfile.dip->di_uid;
+ gid_t lgid = curfile.dip->di_gid;
+
+ Vprintf(stdout, "extract fifo %s\n", name);
+ skipfile();
+ if (Nflag)
+ return (GOOD);
+ if (! (spcl.c_flags & DR_METAONLY)) {
+ if (uflag && !Nflag)
+ (void)unlink(name);
+ if (mkfifo(name, mode) < 0) {
+ warn("%s: cannot create fifo", name);
+ return (FAIL);
+ }
+ }
+ if (chown(name, luid, lgid) < 0)
+ warn("%s: chown", name);
+ if (chmod(name, mode) < 0)
+ warn("%s: chmod", name);
+ extractattr(name);
+ utimes(name, timep);
+ if (flags)
+#ifdef __linux__
+ (void) lsetflags(name, flags);
+#else
+#ifdef sunos
+ {
+ warn("%s: cannot call chflags", name);
+ /* (void) chflags(name, flags); */
+ }
+#else
+ (void) chflags(name, flags);
+#endif
+#endif
+ return (GOOD);
+ }
+ case IFCHR:
+ case IFBLK:
+ {
+ uid_t luid = curfile.dip->di_uid;
+ gid_t lgid = curfile.dip->di_gid;
+ int lrdev = (int)curfile.dip->di_rdev;
+
+ Vprintf(stdout, "extract special file %s\n", name);
+ skipfile();
+ if (Nflag)
+ return (GOOD);
+ if (! (spcl.c_flags & DR_METAONLY)) {
+ if (uflag)
+ (void)unlink(name);
+ if (mknod(name, mode, lrdev) < 0) {
+ warn("%s: cannot create special file", name);
+ return (FAIL);
+ }
+ }
+ if (chown(name, luid, lgid) < 0)
+ warn("%s: chown", name);
+ if (chmod(name, mode) < 0)
+ warn("%s: chmod", name);
+ extractattr(name);
+ utimes(name, timep);
+ if (flags)
+#ifdef __linux__
+ {
+ warn("%s: lsetflags called on a special file", name);
+ (void) lsetflags(name, flags);
+ }
+#else
+#ifdef sunos
+ {
+ warn("%s: cannot call chflags on a special file", name);
+ /* (void) chflags(name, flags); */
+ }
+#else
+ {
+ warn("%s: chflags called on a special file", name);
+ (void) chflags(name, flags);
+ }
+#endif
+#endif
+ return (GOOD);
+ }
+ case IFREG:
+ {
+ uid_t luid = curfile.dip->di_uid;
+ gid_t lgid = curfile.dip->di_gid;
+
+ Vprintf(stdout, "extract file %s\n", name);
+ if (Nflag) {
+ skipfile();
+ return (GOOD);
+ }
+ if (! (spcl.c_flags & DR_METAONLY)) {
+ if (uflag)
+ (void)unlink(name);
+ if ((ofile = OPEN(name, O_WRONLY | O_CREAT | O_TRUNC,
+ 0666)) < 0) {
+ warn("%s: cannot create file", name);
+ skipfile();
+ return (FAIL);
+ }
+ getfile(xtrfile, xtrskip);
+ (void) close(ofile);
+ }
+ else
+ skipfile();
+ if (chown(name, luid, lgid) < 0)
+ warn("%s: chown", name);
+ if (chmod(name, mode) < 0)
+ warn("%s: chmod", name);
+ extractattr(name);
+ utimes(name, timep);
+ if (flags)
+#ifdef __linux__
+ (void) lsetflags(name, flags);
+#else
+#ifdef sunos
+ {
+ warn("%s: cannot call chflags", name);
+ /* (void) chflags(name, flags); */
+ }
+#else
+ (void) chflags(name, flags);
+#endif
+#endif
+ return (GOOD);
+ }
+ }
+ /* NOTREACHED */
+}
+
+static int
+extractattr(char *path)
+{
+ while (spcl.c_flags & DR_EXTATTRIBUTES) {
+ switch (spcl.c_extattributes) {
+ case EXT_MACOSFNDRINFO:
+#ifdef DUMP_MACOSX
+ (void)extractfinderinfoufs(path);
+#else
+ msg("MacOSX not supported in this version, skipping\n");
+ skipfile();
+#endif
+ break;
+ case EXT_MACOSRESFORK:
+#ifdef DUMP_MACOSX
+ (void)extractresourceufs(path);
+#else
+ msg("MacOSX not supported in this version, skipping\n");
+ skipfile();