Hi, Here's a patch that add the file size in the first column of the 't' command of restore. With this, one can do:
$ restore -tf mydump | sort -n to see what files are eating up all space. The patch is a bit ugly because the file size computation is piggy backed on the extractfile function that is called during actual file walking. Index: extern.h =================================================================== RCS file: /cvs/src/sbin/restore/extern.h,v retrieving revision 1.12 diff -u -p -r1.12 extern.h --- extern.h 7 Sep 2014 19:43:35 -0000 1.12 +++ extern.h 10 Nov 2015 15:51:27 -0000 @@ -61,7 +61,6 @@ int inodetype(ino_t); int linkit(char *, char *, int); struct entry *lookupino(ino_t); struct entry *lookupname(char *); -long listfile(char *, ino_t, int); ino_t lowerbnd(ino_t); void mktempname(struct entry *); void moveentry(struct entry *, char *); @@ -94,6 +93,7 @@ void setup(void); void skipdirs(void); void skipfile(void); void skipmaps(void); +void Tprintfile(char *, ino_t, int, size_t); void treescan(char *, ino_t, long (*)(char *, ino_t, int)); ino_t upperbnd(ino_t); long verifyfile(char *, ino_t, int); Index: main.c =================================================================== RCS file: /cvs/src/sbin/restore/main.c,v retrieving revision 1.23 diff -u -p -r1.23 main.c --- main.c 20 Jan 2015 18:22:21 -0000 1.23 +++ main.c 10 Nov 2015 15:51:27 -0000 @@ -240,8 +240,9 @@ main(int argc, char *argv[]) ino = dirlookup(name); if (ino == 0) continue; - treescan(name, ino, listfile); + treescan(name, ino, addfile); } + createfiles(); break; /* * Batch extraction of tape contents. Index: restore.8 =================================================================== RCS file: /cvs/src/sbin/restore/restore.8,v retrieving revision 1.39 diff -u -p -r1.39 restore.8 --- restore.8 20 Jan 2014 05:07:49 -0000 1.39 +++ restore.8 10 Nov 2015 15:51:27 -0000 @@ -180,7 +180,7 @@ An example of correct usage: # newfs /dev/rsd0g # mount /dev/sd0g /mnt # cd /mnt -# restore rf /dev/rst0 +# restore -rf /dev/rst0 .Ed .Pp Note that Index: restore.c =================================================================== RCS file: /cvs/src/sbin/restore/restore.c,v retrieving revision 1.17 diff -u -p -r1.17 restore.c --- restore.c 24 Apr 2013 13:46:29 -0000 1.17 +++ restore.c 10 Nov 2015 15:51:27 -0000 @@ -44,22 +44,6 @@ static char *keyval(int); /* - * This implements the 't' option. - * List entries on the tape. - */ -long -listfile(char *name, ino_t ino, int type) -{ - long descend = hflag ? GOOD : FAIL; - - if (TSTINO(ino, dumpmap) == 0) - return (descend); - Vprintf(stdout, "%s", type == LEAF ? "leaf" : "dir "); - fprintf(stdout, "%10llu\t%s\n", (unsigned long long)ino, name); - return (descend); -} - -/* * This implements the 'x' option. * Request that new entries be extracted. */ @@ -79,8 +63,12 @@ addfile(char *name, ino_t ino, int type) (unsigned long long)ino); name = buf; if (type == NODE) { - (void)genliteraldir(name, ino); - return (descend); + if (command == 't') { + Tprintfile(name, ino, type, 0); + } else { + (void)genliteraldir(name, ino); + return (descend); + } } } ep = lookupino(ino); @@ -92,8 +80,13 @@ addfile(char *name, ino_t ino, int type) type |= LINK; } ep = addentry(name, ino, type); - if (type == NODE) - newnode(ep); + if (type == NODE) { + if (command == 't') { + Tprintfile(name, ino, type, 0); + } else { + newnode(ep); + } + } ep->e_flags |= NEW; return (descend); } @@ -652,7 +645,7 @@ createfiles(void) Vprintf(stdout, "Extract requested files\n"); curfile.action = SKIP; - getvol((long)1); + if (command != 't') getvol((long)1); skipmaps(); skipdirs(); first = lowerbnd(ROOTINO); Index: tape.c =================================================================== RCS file: /cvs/src/sbin/restore/tape.c,v retrieving revision 1.46 diff -u -p -r1.46 tape.c --- tape.c 25 Aug 2015 04:18:43 -0000 1.46 +++ tape.c 10 Nov 2015 15:51:27 -0000 @@ -75,6 +75,7 @@ static int ofile; static char *map; static char lnkbuf[PATH_MAX + 1]; static size_t pathlen; +static size_t szcount = 0; int oldinofmt; /* old inode format conversion required */ int Bcvt; /* Swap Bytes (for CCI or sun) */ @@ -124,6 +125,7 @@ static void xtrlnkskip(char *, size_t); static void xtrmap(char *, size_t); static void xtrmapskip(char *, size_t); static void xtrskip(char *, size_t); +static void xtrcount(char *, size_t); /* * Set up an input source @@ -547,10 +549,19 @@ extractfile(char *name) skipfile(); return (GOOD); } - Vprintf(stdout, "extract file %s\n", name); - return (genliteraldir(name, curfile.ino)); - + Vprintf(stdout, "extract directory %s\n", name); + if (command != 't') { + return (genliteraldir(name, curfile.ino)); + } else { + return (GOOD); + } + case IFLNK: { + if (command == 't') { + Tprintfile(name, curfile.ino, LINK, 0); + skipfile(); + return (GOOD); + } lnkbuf[0] = '\0'; pathlen = 0; getfile(xtrlnkfile, xtrlnkskip); @@ -568,6 +579,11 @@ extractfile(char *name) case IFCHR: case IFBLK: + if (command == 't') { + Tprintfile(name, curfile.ino, LEAF, 0); + skipfile(); + return (GOOD); + } Vprintf(stdout, "extract special file %s\n", name); if (Nflag) { skipfile(); @@ -588,6 +604,11 @@ extractfile(char *name) return (GOOD); case IFIFO: + if (command == 't') { + Tprintfile(name, curfile.ino, LEAF, 0); + skipfile(); + return (GOOD); + } Vprintf(stdout, "extract fifo %s\n", name); if (Nflag) { skipfile(); @@ -608,6 +629,12 @@ extractfile(char *name) return (GOOD); case IFREG: + if (command == 't') { + getfile(xtrcount, xtrcount); + Tprintfile(name, curfile.ino, LEAF, szcount); + szcount = 0; + return (GOOD); + } Vprintf(stdout, "extract file %s\n", name); if (Nflag) { skipfile(); @@ -805,6 +832,12 @@ xtrnull(char *buf, size_t size) { return; +} + +static void +xtrcount(char *buf, size_t size) +{ + szcount += size; } /* Index: utilities.c =================================================================== RCS file: /cvs/src/sbin/restore/utilities.c,v retrieving revision 1.19 diff -u -p -r1.19 utilities.c --- utilities.c 7 Nov 2015 21:52:55 -0000 1.19 +++ utilities.c 10 Nov 2015 15:51:27 -0000 @@ -340,6 +340,23 @@ reply(char *question) return (FAIL); } +void +Tprintfile(char *name, ino_t ino, int type, size_t size) +{ + switch (type) { + case NODE: + Vprintf(stdout, "dir "); + break; + case LEAF: + Vprintf(stdout, "leaf"); + break; + case LINK: + Vprintf(stdout, "link"); + break; + } + fprintf(stdout, "%10d\t%10llu\t%s\n", size, (unsigned long long)ino, name); +} + /* * handle unexpected inconsistencies */ -- Manuel Giraud