X-Git-Url: https://git.wh0rd.org/?p=dump.git;a=blobdiff_plain;f=restore%2Ftape.c;h=5ee9973f5fdf4bb996652060f28f3dd089af6854;hp=fa4a9618f3a8323ef7f5ea3ea0e18ab46c6dea57;hb=ec5c1bc937c43be6649a203619bae2d3d9b0d3c2;hpb=2e555f4100de1ce92bb01d09fd4b635fb0e133f4 diff --git a/restore/tape.c b/restore/tape.c index fa4a961..5ee9973 100644 --- a/restore/tape.c +++ b/restore/tape.c @@ -42,7 +42,7 @@ #ifndef lint static const char rcsid[] = - "$Id: tape.c,v 1.94 2009/12/03 12:46:30 stelian Exp $"; + "$Id: tape.c,v 1.97 2010/06/11 09:51:59 stelian Exp $"; #endif /* not lint */ #include @@ -843,9 +843,43 @@ extractfile(struct entry *ep, int doremove) return (FAIL); case IFSOCK: - Vprintf(stdout, "skipped socket %s\n", name); + { + uid_t luid = curfile.dip->di_uid; + gid_t lgid = curfile.dip->di_gid; + + Vprintf(stdout, "extract socket as dummy file %s\n", name); skipfile(); + if (Nflag) + return (GOOD); + if (! (spcl.c_flags & DR_METAONLY)) { + int fd; + if (uflag) + (void)unlink(name); + if ((fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { + warn("%s: cannot create dummy file", name); + return (FAIL); + } + close(fd); + } + (void) chown(name, luid, lgid); + (void) chmod(name, mode); + 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 IFDIR: { @@ -891,6 +925,10 @@ extractfile(struct entry *ep, int doremove) } 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) @@ -903,7 +941,7 @@ extractfile(struct entry *ep, int doremove) return (FAIL); } } - (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid); + (void) chown(name, luid, lgid); (void) chmod(name, mode); extractattr(name); utimes(name, timep); @@ -921,9 +959,14 @@ extractfile(struct entry *ep, int doremove) #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) @@ -931,12 +974,12 @@ extractfile(struct entry *ep, int doremove) if (! (spcl.c_flags & DR_METAONLY)) { if (uflag) (void)unlink(name); - if (mknod(name, mode, (int)curfile.dip->di_rdev) < 0) { + if (mknod(name, mode, lrdev) < 0) { warn("%s: cannot create special file", name); return (FAIL); } } - (void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid); + (void) chown(name, luid, lgid); (void) chmod(name, mode); extractattr(name); utimes(name, timep); @@ -960,7 +1003,7 @@ extractfile(struct entry *ep, int doremove) #endif #endif return (GOOD); - + } case IFREG: { uid_t luid = curfile.dip->di_uid; @@ -1229,12 +1272,20 @@ readxattr(char *buffer) skipfile(); return (FAIL); } - + memset(xattrbuf, 0, XATTR_MAXSIZE); xattrlen = 0; + /* + * ugly hack: cope with invalid spcl.c_addr[] records written by + * old versions of dump. + */ + readmapflag = 1; + getfile(xtrxattr, xtrnull); + readmapflag = 0; + memcpy(buffer, xattrbuf, XATTR_MAXSIZE); return (GOOD);