2 * Copyright (c) 2003 Guido Draheim <guidod@gmx.de>
3 * Use freely under the restrictions of the ZLIB license.
5 * This file is used as an example to clarify zzip api usage.
13 #include <zzip/__mkdir.h>
14 #include <zzip/__string.h>
15 #include <zzip/__fnmatch.h>
16 #include "unzzipcat-zip.h"
17 #include "unzzip-states.h"
19 #ifdef ZZIP_HAVE_UNISTD_H
26 static int exitcode(int e)
32 case ZZIP_OUTOFMEM: /* out of memory */
34 case ZZIP_DIR_OPEN: /* failed to open zipfile, see errno for details */
35 return EXIT_ZIP_NOT_FOUND;
36 case ZZIP_DIR_STAT: /* failed to fstat zipfile, see errno for details */
37 case ZZIP_DIR_SEEK: /* failed to lseek zipfile, see errno for details */
38 case ZZIP_DIR_READ: /* failed to read zipfile, see errno for details */
39 case ZZIP_DIR_TOO_SHORT:
40 case ZZIP_DIR_EDH_MISSING:
41 return EXIT_FILEFORMAT;
43 return EXIT_EARLY_END_OF_FILE;
45 return EXIT_FILE_NOT_FOUND;
46 case ZZIP_UNSUPP_COMPR:
47 return EXIT_UNSUPPORTED_COMPRESSION;
50 case ZZIP_DIR_LARGEFILE:
51 return EXIT_FILEFORMAT;
56 static void unzzip_cat_file(ZZIP_DIR* disk, char* name, FILE* out)
58 ZZIP_FILE* file = zzip_fopen(name, "r");
61 char buffer[1024]; int len;
62 while ((len = zzip_fread (buffer, 1, 1024, file)))
64 fwrite (buffer, 1, len, out);
71 static void makedirs(const char* name)
73 char* p = strrchr(name, '/');
75 char* dir_name = _zzip_strndup(name, p-name);
79 _zzip_mkdir(name, 775);
84 static FILE* create_fopen(char* name, char* mode, int subdirs)
88 char* p = strrchr(name, '/');
90 char* dir_name = _zzip_strndup(name, p-name);
95 return fopen(name, mode);
98 static int unzzip_cat (int argc, char ** argv, int extract)
105 printf (__FILE__" version "ZZIP_PACKAGE" "ZZIP_VERSION"\n");
106 return EXIT_OK; /* better provide an archive argument */
109 disk = zzip_opendir (argv[1]);
112 return exitcode(errno);
117 ZZIP_DIRENT* entry = 0;
118 while((entry = zzip_readdir(disk)))
120 char* name = entry->d_name;
122 if (extract) out = create_fopen(name, "w", 1);
123 unzzip_cat_file (disk, name, out);
124 if (extract) fclose(out);
128 { /* list only the matching entries - in order of zip directory */
129 ZZIP_DIRENT* entry = 0;
130 while((entry = zzip_readdir(disk)))
132 char* name = entry->d_name;
133 for (argn=1; argn < argc; argn++)
135 if (! _zzip_fnmatch (argv[argn], name,
136 FNM_NOESCAPE|FNM_PATHNAME|FNM_PERIOD))
139 char* zip_name = argv[1];
140 int zip_name_len = strlen(zip_name);
141 int name_len = strlen(name);
142 char* mix_name = malloc(zip_name_len + 2 + name_len);
143 if (zip_name_len > 4 && !strcmp(zip_name+zip_name_len-4, ".zip"))
145 memcpy(mix_name, zip_name, zip_name_len);
146 mix_name[zip_name_len] = '/';
147 strcpy(mix_name + zip_name_len + 1, name);
148 if (extract) out = create_fopen(name, "w", 1);
149 fprintf(stderr, "%s %s -> %s\n", zip_name, name, mix_name);
150 /* 'test1.zip' 'README' -> 'test1/README' */
151 unzzip_cat_file (disk, mix_name, out);
152 if (extract) fclose(out);
153 break; /* match loop */
162 int unzzip_print (int argc, char ** argv)
164 return unzzip_cat(argc, argv, 0);
167 int unzzip_extract (int argc, char ** argv)
169 return unzzip_cat(argc, argv, 1);
174 * c-file-style: "stroustrup"