#ifndef lint
static const char rcsid[] =
- "$Id: tape.c,v 1.87 2005/01/24 10:37:58 stelian Exp $";
+ "$Id: tape.c,v 1.92 2007/02/22 20:16:23 stelian Exp $";
#endif /* not lint */
#include <config.h>
static void xtrmap __P((char *, size_t));
static void xtrmapskip __P((char *, size_t));
static void xtrskip __P((char *, size_t));
+static void xtrxattr __P((char *, size_t));
static void setmagtapein __P((void));
static int extractattr __P((char *));
static void compareattr __P((char *));
static int readmapflag;
static int readingmaps; /* set to 1 while reading the maps */
+static char xattrbuf[XATTR_MAXSIZE];
+static int xattrlen;
+
#ifdef DUMP_MACOSX
static DumpFinderInfo gFndrInfo;
#endif
#endif
FLUSHTAPEBUF();
findtapeblksize();
+ cvtflag = 0;
if (gethead(&spcl) == FAIL) {
blkcnt--; /* push back this block */
blksread--;
}
if (haderror || (bot_code && !Mflag)) {
haderror = 0;
+ if (compare_errors)
+ fprintf(stderr, "%d compare errors so far\n", compare_errors);
#ifdef sunos
fprintf(stderr, "Mount volume %ld\n", (long)newvol);
#else
}
(void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
(void) chmod(name, mode);
+ extractattr(name);
+ utimes(name, timep);
if (flags)
#ifdef __linux__
(void) lsetflags(name, flags);
#endif
#endif
skipfile();
- extractattr(name);
- utimes(name, timep);
return (GOOD);
case IFCHR:
}
(void) chown(name, curfile.dip->di_uid, curfile.dip->di_gid);
(void) chmod(name, mode);
+ extractattr(name);
+ utimes(name, timep);
if (flags)
#ifdef __linux__
{
#endif
#endif
skipfile();
- extractattr(name);
- utimes(name, timep);
return (GOOD);
case IFREG:
skipfile();
(void) chown(name, luid, lgid);
(void) chmod(name, mode);
+ extractattr(name);
+ utimes(name, timep);
if (flags)
#ifdef __linux__
(void) lsetflags(name, flags);
(void) chflags(name, flags);
#endif
#endif
- extractattr(name);
- utimes(name, timep);
return (GOOD);
}
}
skipfile();
#endif
break;
- case EXT_XATTR:
- msg("EA/ACLs not supported in this version, skipping\n");
- skipfile();
- break;
+ case EXT_XATTR: {
+ char xattr[XATTR_MAXSIZE];
+
+ if (readxattr(xattr) == GOOD) {
+ xattr_extract(path, xattr);
+ break;
+ }
+ }
default:
msg("unexpected inode extension %ld, skipping\n", spcl.c_extattributes);
skipfile();
u_int32_t uid;
u_int32_t gid;
char path[MAXPATHLEN], fname[MAXPATHLEN];
- int toto;
curfile.name = name;
curfile.action = USING;
(void) fchown(ofile, uid, gid);
(void) fchmod(ofile, mode);
(void) close(ofile);
- (void) lsetflags(oFileRsrc, flags);
utimes(oFileRsrc, timep);
+ (void) lsetflags(oFileRsrc, flags);
return (GOOD);
}
/* NOTREACHED */
}
#endif /* DUMP_MACOSX */
+int
+readxattr(char *buffer)
+{
+ if (dflag)
+ msg("reading EA data for inode %lu\n", curfile.ino);
+
+ curfile.name = "EA block";
+ if (curfile.dip->di_size > XATTR_MAXSIZE) {
+ fprintf(stderr, "EA size too big (%ld)", (long)curfile.dip->di_size);
+ skipfile();
+ return (FAIL);
+ }
+
+ memset(xattrbuf, 0, XATTR_MAXSIZE);
+ xattrlen = 0;
+
+ getfile(xtrxattr, xtrnull);
+
+ memcpy(buffer, xattrbuf, XATTR_MAXSIZE);
+
+ return (GOOD);
+}
+
/*
* skip over bit maps on the tape
*/
static void
xtrfilefinderinfo(char *buf, size_t size)
{
- if (Nflag)
- return;
bcopy(buf, &gFndrInfo, size);
}
#endif /* DUMP_MACOSX */
}
#endif /* COMPARE_ONTHEFLY */
+static void
+xtrxattr(char *buf, size_t size)
+{
+ if (xattrlen + size > XATTR_MAXSIZE) {
+ fprintf(stderr, "EA size too big (%ld)", (long)xattrlen + size);
+ return;
+ }
+ memcpy(xattrbuf + xattrlen, buf, size);
+ xattrlen += size;
+}
+
#if !COMPARE_ONTHEFLY
static int
do_cmpfiles(int fd_tape, int fd_disk, OFF_T size)
static void
compareattr(char *name)
{
+ int xattr_done = 0;
+
while (spcl.c_flags & DR_EXTATTRIBUTES) {
switch (spcl.c_extattributes) {
case EXT_MACOSFNDRINFO:
msg("MacOSX not supported for comparision in this version, skipping\n");
skipfile();
break;
- case EXT_XATTR:
- msg("EA/ACLs not supported for comparision in this version, skipping\n");
- skipxattr();
+ case EXT_XATTR: {
+ char xattr[XATTR_MAXSIZE];
+
+ if (readxattr(xattr) == GOOD) {
+ if (xattr_compare(name, xattr) == FAIL)
+ do_compare_error;
+ xattr_done = 1;
+ }
+ else
+ do_compare_error;
break;
+ }
default:
msg("unexpected inode extension %ld, skipping\n", spcl.c_extattributes);
skipfile();
break;
}
}
+ if (!xattr_done && xattr_compare(name, NULL) == FAIL)
+ do_compare_error;
}
#if !COMPARE_ONTHEFLY
errx(1, "Tape read error on first record");
memcpy(&spclpt, tapebuf, TP_BSIZE);
+ cvtflag = 0;
if (converthead(&spclpt) == FAIL) {
cvtflag++;
if (converthead(&spclpt) == FAIL) {
if (checksum((int *)buf) == FAIL)
return (FAIL);
if (Bcvt)
- swabst((u_char *)"8i4s31i528bi192b3i", (u_char *)buf);
+ swabst((u_char *)"8i4s1l29i528bi192b4i", (u_char *)buf);
goto good;
}
memcpy(&u_ospcl.s_ospcl, buf, TP_BSIZE);