From: Nick Bowler Date: Mon, 8 Jun 2009 19:04:56 +0000 (-0400) Subject: Implement file positioning functions for upkg exports. X-Git-Url: https://git.draconx.ca/gitweb/upkg.git/commitdiff_plain/33944e4e6a173131286c997ee5aa6088160f09e2 Implement file positioning functions for upkg exports. --- diff --git a/src/libupkg.c b/src/libupkg.c index 0dc2ade..64b00d2 100644 --- a/src/libupkg.c +++ b/src/libupkg.c @@ -415,6 +415,37 @@ void upkg_export_close(struct upkg_file *f) free(f); } +long upkg_export_tell(struct upkg_file *f) +{ + return f->offset; +} + +int upkg_export_seek(struct upkg_file *f, long offset, int whence) +{ + int rc = EOF; + + switch (whence) { + case SEEK_CUR: + offset = f->offset + offset; + case SEEK_SET: + if (offset < 0 || offset > f->len) + return EOF; + rc = fseek(f->pkg->priv->f, f->base + offset, SEEK_SET); + break; + case SEEK_END: + offset = -offset; + if (offset < 0 || offset > f->len) + return EOF; + offset = f->len - offset; + rc = fseek(f->pkg->priv->f, f->base + offset, SEEK_SET); + break; + } + + if (rc == 0) + f->pkg->priv->last_file = f; + return rc; +} + size_t upkg_export_read(struct upkg_file *f, void *buf, size_t n) { size_t want = MIN(n, f->len - f->offset); diff --git a/src/upkg.h b/src/upkg.h index ab2dacb..3412445 100644 --- a/src/upkg.h +++ b/src/upkg.h @@ -63,7 +63,9 @@ const char *upkg_get_name(struct upkg *pkg, unsigned long idx); struct upkg_file *upkg_export_open(struct upkg *pkg, unsigned long idx); size_t upkg_export_read(struct upkg_file *f, void *buf, size_t n); -void upkg_export_close(struct upkg_file *f); +int upkg_export_seek(struct upkg_file *f, long offset, int whence); +long upkg_export_tell(struct upkg_file *f); +void upkg_export_close(struct upkg_file *f); size_t upkg_decode_index(long *val, unsigned char *bytes, size_t n);