#include <zipfile/zipfile.h> | |
#include <string.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
void dump_zipfile(FILE* to, zipfile_t file); | |
int | |
main(int argc, char** argv) | |
{ | |
FILE* f; | |
size_t size, unsize; | |
void* buf; | |
void* scratch; | |
zipfile_t zip; | |
zipentry_t entry; | |
int err; | |
enum { HUH, LIST, UNZIP } what = HUH; | |
if (strcmp(argv[2], "-l") == 0 && argc == 3) { | |
what = LIST; | |
} | |
else if (strcmp(argv[2], "-u") == 0 && argc == 5) { | |
what = UNZIP; | |
} | |
else { | |
fprintf(stderr, "usage: test_zipfile ZIPFILE -l\n" | |
" lists the files in the zipfile\n" | |
" test_zipfile ZIPFILE -u FILENAME SAVETO\n" | |
" saves FILENAME from the zip file into SAVETO\n"); | |
return 1; | |
} | |
f = fopen(argv[1], "r"); | |
if (f == NULL) { | |
fprintf(stderr, "couldn't open %s\n", argv[1]); | |
return 1; | |
} | |
fseek(f, 0, SEEK_END); | |
size = ftell(f); | |
rewind(f); | |
buf = malloc(size); | |
fread(buf, 1, size, f); | |
zip = init_zipfile(buf, size); | |
if (zip == NULL) { | |
fprintf(stderr, "inti_zipfile failed\n"); | |
return 1; | |
} | |
fclose(f); | |
switch (what) | |
{ | |
case HUH: | |
break; | |
case LIST: | |
dump_zipfile(stdout, zip); | |
break; | |
case UNZIP: | |
entry = lookup_zipentry(zip, argv[3]); | |
if (entry == NULL) { | |
fprintf(stderr, "zip file '%s' does not contain file '%s'\n", | |
argv[1], argv[1]); | |
return 1; | |
} | |
f = fopen(argv[4], "w"); | |
if (f == NULL) { | |
fprintf(stderr, "can't open file for writing '%s'\n", argv[4]); | |
return 1; | |
} | |
unsize = get_zipentry_size(entry); | |
size = unsize * 1.001; | |
scratch = malloc(size); | |
printf("scratch=%p\n", scratch); | |
err = decompress_zipentry(entry, scratch, size); | |
if (err != 0) { | |
fprintf(stderr, "error decompressing file\n"); | |
return 1; | |
} | |
fwrite(scratch, unsize, 1, f); | |
free(scratch); | |
fclose(f); | |
break; | |
} | |
free(buf); | |
return 0; | |
} | |