set file flags; add restoration of FIFO's
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 24 Aug 1994 01:38:48 +0000 (17:38 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Wed, 24 Aug 1994 01:38:48 +0000 (17:38 -0800)
SCCS-vsn: sbin/restore/tape.c 8.4

usr/src/sbin/restore/tape.c

index 0597c4b..f539cff 100644 (file)
@@ -11,7 +11,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)tape.c     8.3 (Berkeley) %G%";
+static char sccsid[] = "@(#)tape.c     8.4 (Berkeley) %G%";
 #endif /* not lint */
 
 #include <sys/param.h>
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -474,7 +474,8 @@ int
 extractfile(name)
        char *name;
 {
 extractfile(name)
        char *name;
 {
-       int mode;
+       int flags;
+       mode_t mode;
        struct timeval timep[2];
        struct entry *ep;
 
        struct timeval timep[2];
        struct entry *ep;
 
@@ -485,6 +486,7 @@ extractfile(name)
        timep[1].tv_sec = curfile.dip->di_mtime.ts_sec;
        timep[1].tv_usec = curfile.dip->di_mtime.ts_nsec / 1000;
        mode = curfile.dip->di_mode;
        timep[1].tv_sec = curfile.dip->di_mtime.ts_sec;
        timep[1].tv_usec = curfile.dip->di_mtime.ts_nsec / 1000;
        mode = curfile.dip->di_mode;
+       flags = curfile.dip->di_flags;
        switch (mode & IFMT) {
 
        default:
        switch (mode & IFMT) {
 
        default:
@@ -534,6 +536,26 @@ extractfile(name)
                }
                (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) chmod(name, mode);
                }
                (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) chmod(name, mode);
+               (void) chflags(name, flags);
+               skipfile();
+               utimes(name, timep);
+               return (GOOD);
+
+       case IFIFO:
+               vprintf(stdout, "extract fifo %s\n", name);
+               if (Nflag) {
+                       skipfile();
+                       return (GOOD);
+               }
+               if (mkfifo(name, mode) < 0) {
+                       fprintf(stderr, "%s: cannot create fifo: %s\n",
+                           name, strerror(errno));
+                       skipfile();
+                       return (FAIL);
+               }
+               (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
+               (void) chmod(name, mode);
+               (void) chflags(name, flags);
                skipfile();
                utimes(name, timep);
                return (GOOD);
                skipfile();
                utimes(name, timep);
                return (GOOD);
@@ -552,6 +574,7 @@ extractfile(name)
                }
                (void) fchown(ofile, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) fchmod(ofile, mode);
                }
                (void) fchown(ofile, curfile.dip->di_uid, curfile.dip->di_gid);
                (void) fchmod(ofile, mode);
+               (void) fchflags(ofile, flags);
                getfile(xtrfile, xtrskip);
                (void) close(ofile);
                utimes(name, timep);
                getfile(xtrfile, xtrskip);
                (void) close(ofile);
                utimes(name, timep);