Initial revision
[silc.git] / lib / zlib / contrib / minizip / minizip.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <time.h>
5 #include <errno.h>
6 #include <fcntl.h>
7
8 #ifdef unix
9 # include <unistd.h>
10 # include <utime.h>
11 # include <sys/types.h>
12 # include <sys/stat.h>
13 #else
14 # include <direct.h>
15 # include <io.h>
16 #endif
17
18 #include "zip.h"
19
20
21 #define WRITEBUFFERSIZE (16384)
22 #define MAXFILENAME (256)
23
24 #ifdef WIN32
25 uLong filetime(f, tmzip, dt)
26     char *f;                /* name of file to get info on */
27     tm_zip *tmzip;             /* return value: access, modific. and creation times */
28     uLong *dt;             /* dostime */
29 {
30   int ret = 0;
31   {
32       FILETIME ftLocal;
33       HANDLE hFind;
34       WIN32_FIND_DATA  ff32;
35
36       hFind = FindFirstFile(f,&ff32);
37       if (hFind != INVALID_HANDLE_VALUE)
38       {
39         FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
40         FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
41         FindClose(hFind);
42         ret = 1;
43       }
44   }
45   return ret;
46 }
47 #else
48 #ifdef unix
49 uLong filetime(f, tmzip, dt)
50     char *f;                /* name of file to get info on */
51     tm_zip *tmzip;             /* return value: access, modific. and creation times */
52     uLong *dt;             /* dostime */
53 {
54   int ret=0;
55   struct stat s;        /* results of stat() */
56   struct tm* filedate;
57   time_t tm_t=0;
58   
59   if (strcmp(f,"-")!=0)
60   {
61     char name[MAXFILENAME];
62     int len = strlen(f);
63     strcpy(name, f);
64     if (name[len - 1] == '/')
65       name[len - 1] = '\0';
66     /* not all systems allow stat'ing a file with / appended */
67     if (stat(name,&s)==0)
68     {
69       tm_t = s.st_mtime;
70       ret = 1;
71     }
72   }
73   filedate = localtime(&tm_t);
74
75   tmzip->tm_sec  = filedate->tm_sec;
76   tmzip->tm_min  = filedate->tm_min;
77   tmzip->tm_hour = filedate->tm_hour;
78   tmzip->tm_mday = filedate->tm_mday;
79   tmzip->tm_mon  = filedate->tm_mon ;
80   tmzip->tm_year = filedate->tm_year;
81
82   return ret;
83 }
84 #else
85 uLong filetime(f, tmzip, dt)
86     char *f;                /* name of file to get info on */
87     tm_zip *tmzip;             /* return value: access, modific. and creation times */
88     uLong *dt;             /* dostime */
89 {
90     return 0;
91 }
92 #endif
93 #endif
94
95
96
97
98 int check_exist_file(filename)
99     const char* filename;
100 {
101         FILE* ftestexist;
102     int ret = 1;
103         ftestexist = fopen(filename,"rb");
104         if (ftestexist==NULL)
105         ret = 0;
106     else
107         fclose(ftestexist);
108     return ret;
109 }
110
111 void do_banner()
112 {
113         printf("MiniZip 0.15, demo of zLib + Zip package written by Gilles Vollant\n");
114         printf("more info at http://wwww.winimage/zLibDll/unzip.htm\n\n");
115 }
116
117 void do_help()
118 {       
119         printf("Usage : minizip [-o] file.zip [files_to_add]\n\n") ;
120 }
121
122 int main(argc,argv)
123         int argc;
124         char *argv[];
125 {
126         int i;
127         int opt_overwrite=0;
128     int opt_compress_level=Z_DEFAULT_COMPRESSION;
129     int zipfilenamearg = 0;
130         char filename_try[MAXFILENAME];
131     int zipok;
132     int err=0;
133     int size_buf=0;
134     void* buf=NULL,
135
136
137         do_banner();
138         if (argc==1)
139         {
140                 do_help();
141                 exit(0);
142         return 0;
143         }
144         else
145         {
146                 for (i=1;i<argc;i++)
147                 {
148                         if ((*argv[i])=='-')
149                         {
150                                 const char *p=argv[i]+1;
151                                 
152                                 while ((*p)!='\0')
153                                 {                       
154                                         char c=*(p++);;
155                                         if ((c=='o') || (c=='O'))
156                                                 opt_overwrite = 1;
157                     if ((c>='0') && (c<='9'))
158                         opt_compress_level = c-'0';
159                                 }
160                         }
161                         else
162                                 if (zipfilenamearg == 0)
163                     zipfilenamearg = i ;
164                 }
165         }
166
167     size_buf = WRITEBUFFERSIZE;
168     buf = (void*)malloc(size_buf);
169     if (buf==NULL)
170     {
171         printf("Error allocating memory\n");
172         return ZIP_INTERNALERROR;
173     }
174
175         if (zipfilenamearg==0)
176         zipok=0;
177     else
178         {
179         int i,len;
180         int dot_found=0;
181
182         zipok = 1 ;
183                 strcpy(filename_try,argv[zipfilenamearg]);
184         len=strlen(filename_try);
185         for (i=0;i<len;i++)
186             if (filename_try[i]=='.')
187                 dot_found=1;
188
189         if (dot_found==0)
190             strcat(filename_try,".zip");
191
192         if (opt_overwrite==0)
193             if (check_exist_file(filename_try)!=0)
194                         {
195                 char rep;
196                                 do
197                                 {
198                                         char answer[128];
199                                         printf("The file %s exist. Overwrite ? [y]es, [n]o : ",filename_try);
200                                         scanf("%1s",answer);
201                                         rep = answer[0] ;
202                                         if ((rep>='a') && (rep<='z'))
203                                                 rep -= 0x20;
204                                 }
205                                 while ((rep!='Y') && (rep!='N'));
206                 if (rep=='N')
207                     zipok = 0;
208                         }
209     }
210
211     if (zipok==1)
212     {
213         zipFile zf;
214         int errclose;
215         zf = zipOpen(filename_try,0);
216         if (zf == NULL)
217         {
218             printf("error opening %s\n",filename_try);
219             err= ZIP_ERRNO;
220         }
221         else 
222             printf("creating %s\n",filename_try);
223
224         for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
225         {
226             if (((*(argv[i]))!='-') && ((*(argv[i]))!='/'))
227             {
228                 FILE * fin;
229                 int size_read;
230                 const char* filenameinzip = argv[i];
231                 zip_fileinfo zi;
232
233                 zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = 
234                 zi.tmz_date.tm_mday = zi.tmz_date.tm_min = zi.tmz_date.tm_year = 0;
235                 zi.dosDate = 0;
236                 zi.internal_fa = 0;
237                 zi.external_fa = 0;
238                 filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
239
240
241                 err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
242                                  NULL,0,NULL,0,NULL /* comment*/,
243                                  (opt_compress_level != 0) ? Z_DEFLATED : 0,
244                                  opt_compress_level);
245
246                 if (err != ZIP_OK)
247                     printf("error in opening %s in zipfile\n",filenameinzip);
248                 else
249                 {
250                     fin = fopen(filenameinzip,"rb");
251                     if (fin==NULL)
252                     {
253                         err=ZIP_ERRNO;
254                         printf("error in opening %s for reading\n",filenameinzip);
255                     }
256                 }
257
258                 if (err == ZIP_OK)
259                     do
260                     {
261                         err = ZIP_OK;
262                         size_read = fread(buf,1,size_buf,fin);
263                         if (size_read < size_buf)
264                             if (feof(fin)==0)
265                         {
266                             printf("error in reading %s\n",filenameinzip);
267                             err = ZIP_ERRNO;
268                         }
269
270                         if (size_read>0)
271                         {
272                             err = zipWriteInFileInZip (zf,buf,size_read);
273                             if (err<0)
274                             {
275                                 printf("error in writing %s in the zipfile\n",
276                                                  filenameinzip);
277                             }
278                                 
279                         }
280                     } while ((err == ZIP_OK) && (size_read>0));
281
282                 fclose(fin);
283                 if (err<0)
284                     err=ZIP_ERRNO;
285                 else
286                 {                    
287                     err = zipCloseFileInZip(zf);
288                     if (err!=ZIP_OK)
289                         printf("error in closing %s in the zipfile\n",
290                                     filenameinzip);
291                 }
292             }
293         }
294         errclose = zipClose(zf,NULL);
295         if (errclose != ZIP_OK)
296             printf("error in closing %s\n",filename_try);
297    }
298
299     free(buf);
300     exit(0);
301         return 0;  /* to avoid warning */
302 }