sbase

suckless unix tools
git clone git://git.2f30.org/sbase.git
Log | Files | Refs | README | LICENSE

commit 43578242669d7f6bf7c3713d2745034acbc4b804
parent f242473831ce1bfe783643b7d84a7c34943a6b11
Author: sin <sin@2f30.org>
Date:   Wed Apr 22 23:22:07 +0100

tar: Skip over data before processing the next entry

When we selectively process entries from the archive, ensure that
we jump over the data section of each uninteresting entry before going
on to process the next entry.  Not doing so, leaves the file stream
pointer in the wrong place.

Diffstat:
tar.c | 11++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/tar.c b/tar.c @@ -323,17 +323,22 @@ xt(int argc, char *argv[], int (*fn)(char *, ssize_t, char[BLKSIZ])) snprintf(fname + n, sizeof(fname) - n, "%.*s", (int)sizeof(h->name), h->name); + if ((size = strtol(h->size, &p, 8)) < 0 || *p != '\0') + eprintf("strtol %s: invalid number\n", h->size); + if (argc) { /* only extract the given files */ for (i = 0; i < argc; i++) if (!strcmp(argv[i], fname)) break; - if (i == argc) + if (i == argc) { + for (; size > 0; size -= BLKSIZ) + if (fread(b, BLKSIZ, 1, tarfile) != 1) + eprintf("fread %s:", tarfilename); continue; + } } - if ((size = strtol(h->size, &p, 8)) < 0 || *p != '\0') - eprintf("strtol %s: invalid number\n", h->size); fn(fname, size, b); } if (ferror(tarfile))