+ return lbx_open(f, &lbx_default_fops, NULL, name);
+}
+
+size_t lbx_numfiles(struct lbx_state *lbx)
+{
+ return lbx->nfiles;
+}
+
+int lbx_stat(struct lbx_state *lbx, size_t index, struct lbx_statbuf *buf)
+{
+ static char str[256]; /* FIXME */
+
+ if (index >= lbx->nfiles) {
+ buf->name = NULL;
+ lbx_errno = LBX_ERANGE;
+ return -1;
+ }
+
+ snprintf(str, sizeof str, "%s.%03zu", lbx->name, index);
+ buf->name = str;
+ buf->size = lbx->offsets[index+1] - lbx->offsets[index];
+ return 0;
+}
+
+static size_t
+_lbx_fextract(struct lbx_state *lbx, size_t base, size_t len, FILE *of)
+{
+ unsigned char buf[1024];
+ size_t rc, written = 0;
+
+ assert(lbx->f);
+
+ if (lbx->fops->seek(lbx->f, base, SEEK_SET) != 0) {
+ lbx_errno = -errno;
+ return 0;
+ }