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);
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);