#ifndef lint
static const char rcsid[] =
- "$Id: tape.c,v 1.75 2003/10/26 16:05:48 stelian Exp $";
+ "$Id: tape.c,v 1.81 2004/05/25 10:39:31 stelian Exp $";
#endif /* not lint */
#include <config.h>
dump_ino_t oldmaxino = maxino;
maxino += (spcl.c_count * TP_BSIZE * NBBY) + 1;
resizemaps(oldmaxino, maxino);
+ map = usedinomap;
spcl.c_dinode.di_size = spcl.c_count * TP_BSIZE;
getfile(xtrmap, xtrmapskip);
}
Dprintf(stdout, "maxino = %lu\n", (unsigned long)maxino);
- if (spcl.c_type != TS_BITS)
+ if (spcl.c_type != TS_BITS) {
+ if (spcl.c_type == TS_END) {
+ msg("Cannot find file dump list, assuming empty tape\n");
+ exit(0);
+ }
errx(1, "Cannot find file dump list");
+ }
map = calloc((unsigned)1, (unsigned)howmany(maxino, NBBY));
if (map == (char *)NULL)
errx(1, "no memory for file dump list");
int flags;
mode_t mode;
struct timeval timep[2];
- struct entry *ep;
- int sz;
- attrinfo_block_t gABuf;
u_int32_t uid;
u_int32_t gid;
char path[MAXPATHLEN], fname[MAXPATHLEN];
+ int toto;
curfile.name = name;
curfile.action = USING;
fprintf(stderr,
"%s: device changed from %d,%d to %d,%d.\n",
name,
- ((int)curfile.dip->di_rdev >> 8) & 0xff,
- (int)curfile.dip->di_rdev & 0xff,
- ((int)sb.st_rdev >> 8) & 0xff,
- (int)sb.st_rdev & 0xff);
+ major(curfile.dip->di_rdev),
+ minor(curfile.dip->di_rdev),
+ major(sb.st_rdev),
+ minor(sb.st_rdev));
do_compare_error;
}
skipfile();
/* zflag gets set in setup() from the dump header */
int cresult, blocklen;
unsigned long worklen;
-#ifdef HAVE_BZLIB
- unsigned int worklen2;
-#endif
char *output = NULL,*reason = NULL, *lengtherr = NULL;
/* build a length error message */
#ifndef HAVE_BZLIB
errx(1,"This restore version doesn't support bzlib decompression");
#else
- worklen2 = worklen;
+ unsigned int worklen2 = worklen;
cresult = BZ2_bzBuffToBuffDecompress(
comprbuf, &worklen2,
tpbin->buf, blocklen, 0, 0);
#ifndef HAVE_LZO
errx(1,"This restore version doesn't support lzo decompression");
#else
+ lzo_uint worklen2 = worklen;
cresult = lzo1x_decompress(tpbin->buf, blocklen,
- comprbuf, (lzo_uintp) &worklen,NULL);
+ comprbuf, &worklen2, NULL);
+ worklen = worklen2;
output = comprbuf;
switch (cresult) {
case LZO_E_OK:
}
if (reason) {
if (lengtherr)
- fprintf(stderr, "%s compressed block: %d expected: %d\n",
+ fprintf(stderr, "%s compressed block: %d expected: %u\n",
lengtherr, readsize, tpbin->length + PREFIXSIZE);
fprintf(stderr, "decompression error, block %ld: %s\n",
tpblksread+1, reason);
goto good;
}
memcpy(&u_ospcl.s_ospcl, buf, TP_BSIZE);
- memset((char *)buf, 0, (long)TP_BSIZE);
- buf->c_type = u_ospcl.s_ospcl.c_type;
- buf->c_date = u_ospcl.s_ospcl.c_date;
- buf->c_ddate = u_ospcl.s_ospcl.c_ddate;
- buf->c_volume = u_ospcl.s_ospcl.c_volume;
- buf->c_tapea = u_ospcl.s_ospcl.c_tapea;
- buf->c_inumber = u_ospcl.s_ospcl.c_inumber;
- buf->c_checksum = u_ospcl.s_ospcl.c_checksum;
- buf->c_magic = u_ospcl.s_ospcl.c_magic;
- buf->c_dinode.di_mode = u_ospcl.s_ospcl.c_dinode.odi_mode;
- buf->c_dinode.di_nlink = u_ospcl.s_ospcl.c_dinode.odi_nlink;
- buf->c_dinode.di_uid = u_ospcl.s_ospcl.c_dinode.odi_uid;
- buf->c_dinode.di_gid = u_ospcl.s_ospcl.c_dinode.odi_gid;
- buf->c_dinode.di_size = u_ospcl.s_ospcl.c_dinode.odi_size;
- buf->c_dinode.di_rdev = u_ospcl.s_ospcl.c_dinode.odi_rdev;
+ if (checksum((int *)(&u_ospcl.s_ospcl)) == FAIL)
+ return(FAIL);
+ if (u_ospcl.s_ospcl.c_magic == OFS_MAGIC) {
+ memset((char *)buf, 0, (long)TP_BSIZE);
+ buf->c_type = u_ospcl.s_ospcl.c_type;
+ buf->c_date = u_ospcl.s_ospcl.c_date;
+ buf->c_ddate = u_ospcl.s_ospcl.c_ddate;
+ buf->c_volume = u_ospcl.s_ospcl.c_volume;
+ buf->c_tapea = u_ospcl.s_ospcl.c_tapea;
+ buf->c_inumber = u_ospcl.s_ospcl.c_inumber;
+ buf->c_checksum = u_ospcl.s_ospcl.c_checksum;
+ buf->c_magic = u_ospcl.s_ospcl.c_magic;
+ buf->c_dinode.di_mode = u_ospcl.s_ospcl.c_dinode.odi_mode;
+ buf->c_dinode.di_nlink = u_ospcl.s_ospcl.c_dinode.odi_nlink;
+ buf->c_dinode.di_uid = u_ospcl.s_ospcl.c_dinode.odi_uid;
+ buf->c_dinode.di_gid = u_ospcl.s_ospcl.c_dinode.odi_gid;
+ buf->c_dinode.di_size = u_ospcl.s_ospcl.c_dinode.odi_size;
+ buf->c_dinode.di_rdev = u_ospcl.s_ospcl.c_dinode.odi_rdev;
#if defined(__linux__) || defined(sunos)
- buf->c_dinode.di_atime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_atime;
- buf->c_dinode.di_mtime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_mtime;
- buf->c_dinode.di_ctime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_ctime;
+ buf->c_dinode.di_atime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_atime;
+ buf->c_dinode.di_mtime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_mtime;
+ buf->c_dinode.di_ctime.tv_sec = u_ospcl.s_ospcl.c_dinode.odi_ctime;
#else /* __linux__ || sunos */
- buf->c_dinode.di_atime = u_ospcl.s_ospcl.c_dinode.odi_atime;
- buf->c_dinode.di_mtime = u_ospcl.s_ospcl.c_dinode.odi_mtime;
- buf->c_dinode.di_ctime = u_ospcl.s_ospcl.c_dinode.odi_ctime;
+ buf->c_dinode.di_atime = u_ospcl.s_ospcl.c_dinode.odi_atime;
+ buf->c_dinode.di_mtime = u_ospcl.s_ospcl.c_dinode.odi_mtime;
+ buf->c_dinode.di_ctime = u_ospcl.s_ospcl.c_dinode.odi_ctime;
#endif /* __linux__ || sunos */
- buf->c_count = u_ospcl.s_ospcl.c_count;
- memmove(buf->c_addr, u_ospcl.s_ospcl.c_fill, (long)256);
- if (u_ospcl.s_ospcl.c_magic != OFS_MAGIC ||
- checksum((int *)(&u_ospcl.s_ospcl)) == FAIL)
+ buf->c_count = u_ospcl.s_ospcl.c_count;
+ memmove(buf->c_addr, u_ospcl.s_ospcl.c_fill, (long)256);
+ }
+ else if (u_ospcl.s_ospcl.c_magic == FS_UFS2_MAGIC) {
+ buf->c_date = (int32_t)(*(int64_t *)&u_ospcl.dummy[896]);
+ buf->c_ddate = (int32_t)(*(int64_t *)&u_ospcl.dummy[904]);
+ buf->c_tapea = (int32_t)(*(int64_t *)&u_ospcl.dummy[912]);
+ buf->c_firstrec = (int32_t)(*(int64_t *)&u_ospcl.dummy[920]);
+ buf->c_ntrec = 0;
+ buf->c_extattributes = 0;
+ buf->c_flags |= DR_NEWINODEFMT;
+ ufs2flag = 1;
+ }
+ else
return(FAIL);
buf->c_magic = NFS_MAGIC;