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