sbase

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

commit 7a0d9fb3eaa85f8dec5ba5e3bd6ecee681ab2816
parent 2fc73e410c13ef5ea8157b9654b76efd2c6e0e1e
Author: sin <sin@2f30.org>
Date:   Wed, 22 Apr 2015 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:
Mtar.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))