#ifndef lint
static const char rcsid[] =
- "$Id: tape.c,v 1.93 2009/07/23 14:10:39 stelian Exp $";
+ "$Id: tape.c,v 1.98 2010/06/11 09:57:31 stelian Exp $";
#endif /* not lint */
#include <config.h>
#include <sys/file.h>
#include <sys/mtio.h>
#include <sys/stat.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#ifdef __linux__
#include <sys/time.h>
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 %s\n", name);
skipfile();
+ if (Nflag)
+ return (GOOD);
+ if (! (spcl.c_flags & DR_METAONLY)) {
+ int sk;
+ struct sockaddr_un addr;
+
+ if (uflag)
+ (void)unlink(name);
+
+ if ((sk = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) {
+ warn("%s: cannot create socket", name);
+ return (FAIL);
+ }
+ addr.sun_family = AF_UNIX;
+ strcpy(addr.sun_path, name);
+ if (bind(sk, (const struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
+ warn("%s: cannot create socket", name);
+ return (FAIL);
+ }
+ close(sk);
+ }
+ (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:
{
}
case IFIFO:
+ {
+ uid_t luid = curfile.dip->di_uid;
+ gid_t lgid = curfile.dip->di_gid;
+
Vprintf(stdout, "extract fifo %s\n", name);
- if (Nflag) {
- skipfile();
+ 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);
- skipfile();
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);
(void) chflags(name, flags);
#endif
#endif
- skipfile();
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);
- if (Nflag) {
- skipfile();
+ skipfile();
+ if (Nflag)
return (GOOD);
- }
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);
- skipfile();
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);
}
#endif
#endif
- skipfile();
return (GOOD);
-
+ }
case IFREG:
{
uid_t luid = curfile.dip->di_uid;
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);