#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include <getopt.h>
#include <fnmatch.h>
return EXIT_SUCCESS;
}
+int extract_file(LBXfile *f, const struct lbx_statbuf *stat)
+{
+ int ret = -1;
+ size_t rc;
+ FILE *of;
+
+ of = fopen(stat->name, "wb");
+ if (!of) {
+ errmsg("%s: fopen: %s\n",
+ stat->name, strerror(errno));
+ return -1;
+ }
+
+ while (1) {
+ unsigned char buf[1024];
+
+ rc = lbx_file_read(f, buf, sizeof buf);
+ if (rc == 0) {
+ if (lbx_file_eof(f))
+ ret = 0;
+ break;
+ }
+
+ if (fwrite(buf, rc, 1, of) != 1) {
+ errmsg("%s: fwrite: %s\n", stat->name, strerror(errno));
+ break;
+ }
+
+ if (rc < sizeof buf) {
+ if (lbx_file_eof(f))
+ ret = 0;
+ break;
+ }
+ }
+
+ if (fclose(of) == EOF) {
+ errmsg("%s: fclose: %s\n", stat->name, strerror(errno));
+ return -1;
+ }
+
+ return ret;
+}
+
int extract(LBX *lbx, const char *name, int verbose, char **argv) {
size_t nfiles;
unsigned int i;
for (i = 0; i < nfiles; i++) {
struct lbx_statbuf stat;
- size_t rc;
- FILE *of;
- int j;
+ LBXfile *file;
lbx_stat(lbx, i, &stat);
default: return EXIT_FAILURE;
}
- of = fopen(stat.name, "wbx");
- if (!of) {
- errmsg("failed to create output file %s: %m.\n",
- stat.name);
- return EXIT_FAILURE;
+ file = lbx_file_open(lbx, i);
+ if (!file) {
+ errmsg("failed to open archive member %s: %s.\n",
+ stat.name, lbx_strerror());
+ continue;
}
- if (verbose) printf("extracting %s...\n", stat.name);
- rc = lbx_extract(lbx, i, of);
- if (rc < stat.size) {
- if (rc == 0) remove(stat.name);
- errmsg("error extracting %s: %s.\n",
- stat.name, lbx_strerror());
+ if (extract_file(file, &stat) == -1)
return EXIT_FAILURE;
- }
- if (verbose) printf("wrote %zu bytes.\n", rc);
+ lbx_file_close(file);
}
return EXIT_SUCCESS;