-newvol:
- resetmt();
-getvol:
- fprintf(stderr, "Mount desired tape volume; Specify volume #: ");
- if (gets(tbf) == NULL)
- return;
- volno = atoi(tbf);
- if (volno <= 0) {
- fprintf(stderr, "Volume numbers are positive numerics\n");
- goto getvol;
- }
- if (readhdr(&spcl) == 0) {
- fprintf(stderr, "tape is not dump tape\n");
- goto newvol;
- }
- if (checkvol(&spcl, volno) == 0) {
- fprintf(stderr, "Wrong volume (%d)\n", spcl.c_volume);
- goto newvol;
- }
-rbits:
- while (gethead(&spcl) == 0)
- ;
- if (checktype(&spcl, TS_INODE) == 1) {
- fprintf(stderr, "Can't find inode mask!\n");
- goto newvol;
- }
- if (checktype(&spcl, TS_BITS) == 0)
- goto rbits;
- readbits(dumpmap);
- while (xtrcnt > 0) {
-again:
- if (ishead(&spcl) == 0)
- while(gethead(&spcl) == 0)
- ;
- if (checktype(&spcl, TS_END) == 1) {
- fprintf(stderr, "end of tape\n");
- break;
- }
- if (checktype(&spcl, TS_INODE) == 0) {
- gethead(&spcl);
- goto again;
- }
- d = spcl.c_inumber;
- for (xp = xtrlist[INOHASH(d)]; xp; xp = xp->x_next) {
- if (d != xp->x_ino)
- continue;
- if (xp->x_flags & XLINKED)
- continue;
- xp->x_timep[0] = spcl.c_dinode.di_atime;
- xp->x_timep[1] = spcl.c_dinode.di_mtime;
- mode = spcl.c_dinode.di_mode;
- if (mflag)
- strcpy(name, xp->x_name);
- else
- sprintf(name, "%u", xp->x_ino);
- switch (mode & IFMT) {
- default:
- fprintf(stderr, "%s: unknown file type\n", name);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto skipfile;
- case IFCHR:
- case IFBLK:
- fprintf(stdout, "extract special file %s\n", name);
- if (xmknod(name, mode, spcl.c_dinode.di_rdev)) {
- fprintf(stderr, "%s: cannot create special file\n", name);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto skipfile;
- }
- getfile(null, null, spcl.c_dinode.di_size);
- break;
- case IFDIR:
- if (mflag) {
- fprintf(stdout, "extract directory %s\n", name);
- strncat(name, "/.", BUFSIZ);
- checkdir(name);
- xchown(xp->x_name, spcl.c_dinode.di_uid, spcl.c_dinode.di_gid);
- getfile(null, null, spcl.c_dinode.di_size);
- break;
- }
- fprintf(stdout, "extract file %s\n", name);
- if ((ofile = xcreat(name, 0666)) < 0) {
- fprintf(stderr, "%s: cannot create file\n", name);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto skipfile;
- }
- xchown(name, spcl.c_dinode.di_uid, spcl.c_dinode.di_gid);
- if (cvtdir) {
- getfile(xtrcvtdir, xtrcvtskip,
- spcl.c_dinode.di_size);
- flushent(xtrfile);
- } else
- getfile(xtrfile, xtrskip,
- spcl.c_dinode.di_size);
- xclose(ofile);
- break;
- case IFLNK:
- fprintf(stdout, "extract symbolic link %s\n", name);
- uid = spcl.c_dinode.di_uid;
- gid = spcl.c_dinode.di_gid;
- lnkbuf[0] = '\0';
- pathlen = 0;
- getfile(xtrlnkfile, xtrlnkskip, spcl.c_dinode.di_size);
- if (xsymlink(lnkbuf, name) < 0) {
- fprintf(stderr, "%s: cannot create symbolic link\n", name);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto finished;
- }
- xchown(name, uid, gid);
- break;
- case IFREG:
- fprintf(stdout, "extract file %s\n", name);
- if ((ofile = xcreat(name, 0666)) < 0) {
- fprintf(stderr, "%s: cannot create file\n", name);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto skipfile;
- }
- xchown(name, spcl.c_dinode.di_uid, spcl.c_dinode.di_gid);
- getfile(xtrfile, xtrskip, spcl.c_dinode.di_size);
- xclose(ofile);
- break;
- }
- xchmod(name, mode);
- xutime(name, xp->x_timep);
- xp->x_flags |= XTRACTD;
- xtrcnt--;
- goto finished;
- }
-skipfile:
- getfile(null, null, spcl.c_dinode.di_size);
-finished:
- ;
- }
- if (xtrcnt == 0 && !mflag)
- return;
- for (xpp = xtrlist; xpp < &xtrlist[MAXINO]; xpp++) {
- for (xp = *xpp; xp; xp = xp->x_next) {
- if (mflag && (xp->x_flags & XISDIR))
- xutime(xp->x_name, xp->x_timep);
- if (xp->x_flags & XTRACTD)
- continue;
- if ((xp->x_flags & XLINKED) == 0) {
- fprintf(stderr, "cannot find file %s\n",
- xp->x_name);
- continue;
- }
- if (!mflag)
- continue;
- fprintf(stdout, "link %s to %s\n",
- xp->x_linkedto->x_name, xp->x_name);
- if (xlink(xp->x_linkedto->x_name, xp->x_name) < 0)
- fprintf(stderr, "link %s to %s failed\n",
- xp->x_linkedto->x_name, xp->x_name);
- }
- }
-}
-#endif