};
int list(FILE *f, const char *name, int verbose) {
- LBX *lbx = lbx_fopen(f, name);
+ LBX *lbx;
+ size_t nfiles;
+ unsigned int i;
+
+ lbx = lbx_fopen(f, name);
+ if (!lbx) {
+ errmsg("failed to open archive: %s.\n", lbx_strerror());
+ return EXIT_FAILURE;
+ }
+
+ nfiles = lbx_numfiles(lbx);
+ if (verbose) {
+ printf("Files in archive: %zu\n", nfiles);
+ }
+
+ for (i = 0; i < nfiles; i++) {
+ struct lbx_statbuf stat;
+
+ lbx_stat(lbx, i, &stat);
+ printf("%s", stat.name);
+ if (verbose) {
+ printf(" size=%zu bytes", stat.size);
+ }
+
+ putchar('\n');
+ }
+
+ lbx_close(lbx);
+ return EXIT_SUCCESS;
+}
+
+int extract(FILE *f, const char *name, int verbose) {
+ LBX *lbx;
+ size_t nfiles;
+ unsigned int i;
+
+ lbx = lbx_fopen(f, name);
if (!lbx) {
errmsg("failed to open archive: %s.\n", lbx_strerror());
return EXIT_FAILURE;
}
+ nfiles = lbx_numfiles(lbx);
if (verbose) {
- printf("Files in archive: %zd\n", lbx_numfiles(lbx));
+ printf("Files in archive: %zu\n", nfiles);
+ }
+
+ for (i = 0; i < nfiles; i++) {
+ struct lbx_statbuf stat;
+ size_t rc;
+ FILE *of;
+
+ lbx_stat(lbx, i, &stat);
+ of = fopen(stat.name, "wbx");
+ if (!of) {
+ errmsg("failed to create output file %s: %m.\n",
+ stat.name);
+ break;
+ }
+
+ if (verbose) printf("extracting %s...\n", stat.name);
+ rc = lbx_extract(lbx, i, of);
+ if (rc < stat.size) {
+ errmsg("error extracting %s: %s.\n",
+ stat.name, lbx_strerror());
+ break;
+ }
+ if (verbose) printf("wrote %zu bytes.\n", rc);
}
lbx_close(lbx);
+ return EXIT_SUCCESS;
}
int main(int argc, char **argv)
case MODE_LIST:
return list(f, name, verbose);
case MODE_EXTRACT:
- return EXIT_SUCCESS;
+ return extract(f, name, verbose);
}
fprintf(stderr, "%s: you must specify a mode.\n", progname);