From 33944e4e6a173131286c997ee5aa6088160f09e2 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Mon, 8 Jun 2009 15:04:56 -0400 Subject: [PATCH] Implement file positioning functions for upkg exports. --- src/libupkg.c | 31 +++++++++++++++++++++++++++++++ src/upkg.h | 4 +++- 2 files changed, 34 insertions(+), 1 deletion(-) 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); -- 2.43.2