1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <zipfile/zipfile.h> 262188564fab23418373295d9f4a942c3094a9f46Ariel Bernal#include <string.h> 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdio.h> 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h> 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid dump_zipfile(FILE* to, zipfile_t file); 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectmain(int argc, char** argv) 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project FILE* f; 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size_t size, unsize; 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void* buf; 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project void* scratch; 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zipfile_t zip; 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zipentry_t entry; 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project int err; 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project enum { HUH, LIST, UNZIP } what = HUH; 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (strcmp(argv[2], "-l") == 0 && argc == 3) { 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project what = LIST; 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else if (strcmp(argv[2], "-u") == 0 && argc == 5) { 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project what = UNZIP; 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project else { 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "usage: test_zipfile ZIPFILE -l\n" 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " lists the files in the zipfile\n" 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " test_zipfile ZIPFILE -u FILENAME SAVETO\n" 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project " saves FILENAME from the zip file into SAVETO\n"); 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f = fopen(argv[1], "r"); 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (f == NULL) { 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "couldn't open %s\n", argv[1]); 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fseek(f, 0, SEEK_END); 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size = ftell(f); 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project rewind(f); 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project buf = malloc(size); 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fread(buf, 1, size, f); 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project zip = init_zipfile(buf, size); 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (zip == NULL) { 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "inti_zipfile failed\n"); 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(f); 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project switch (what) 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project { 5862188564fab23418373295d9f4a942c3094a9f46Ariel Bernal case HUH: 5962188564fab23418373295d9f4a942c3094a9f46Ariel Bernal break; 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case LIST: 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project dump_zipfile(stdout, zip); 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project case UNZIP: 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project entry = lookup_zipentry(zip, argv[3]); 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (entry == NULL) { 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "zip file '%s' does not contain file '%s'\n", 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project argv[1], argv[1]); 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project f = fopen(argv[4], "w"); 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (f == NULL) { 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "can't open file for writing '%s'\n", argv[4]); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project unsize = get_zipentry_size(entry); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project size = unsize * 1.001; 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project scratch = malloc(size); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project printf("scratch=%p\n", scratch); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project err = decompress_zipentry(entry, scratch, size); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (err != 0) { 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fprintf(stderr, "error decompressing file\n"); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 1; 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fwrite(scratch, unsize, 1, f); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(scratch); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project fclose(f); 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project break; 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project free(buf); 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return 0; 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 95