Blame


1 ff3adf60 2004-04-14 devnull #include <u.h>
2 ff3adf60 2004-04-14 devnull #include <libc.h>
3 ff3adf60 2004-04-14 devnull #include <bio.h>
4 ff3adf60 2004-04-14 devnull #include <flate.h>
5 ff3adf60 2004-04-14 devnull #include "zip.h"
6 ff3adf60 2004-04-14 devnull
7 ff3adf60 2004-04-14 devnull enum
8 ff3adf60 2004-04-14 devnull {
9 cbeb0b26 2006-04-01 devnull HeadAlloc = 64
10 ff3adf60 2004-04-14 devnull };
11 ff3adf60 2004-04-14 devnull
12 ff3adf60 2004-04-14 devnull static void zip(Biobuf *bout, char *file, int stdout);
13 ff3adf60 2004-04-14 devnull static void zipDir(Biobuf *bout, int fd, ZipHead *zh, int stdout);
14 ff3adf60 2004-04-14 devnull static int crcread(void *fd, void *buf, int n);
15 ff3adf60 2004-04-14 devnull static int zwrite(void *bout, void *buf, int n);
16 8425b514 2010-02-23 rsc static void put4(Biobuf *b, u32int v);
17 ff3adf60 2004-04-14 devnull static void put2(Biobuf *b, int v);
18 ff3adf60 2004-04-14 devnull static void put1(Biobuf *b, int v);
19 ff3adf60 2004-04-14 devnull static void header(Biobuf *bout, ZipHead *zh);
20 ff3adf60 2004-04-14 devnull static void trailer(Biobuf *bout, ZipHead *zh, vlong off);
21 ff3adf60 2004-04-14 devnull static void putCDir(Biobuf *bout);
22 ff3adf60 2004-04-14 devnull
23 ff3adf60 2004-04-14 devnull static void error(char*, ...);
24 ff3adf60 2004-04-14 devnull /* #pragma varargck argpos error 1 */
25 ff3adf60 2004-04-14 devnull
26 ff3adf60 2004-04-14 devnull static Biobuf bout;
27 8425b514 2010-02-23 rsc static u32int crc;
28 8425b514 2010-02-23 rsc static u32int *crctab;
29 ff3adf60 2004-04-14 devnull static int debug;
30 ff3adf60 2004-04-14 devnull static int eof;
31 ff3adf60 2004-04-14 devnull static int level;
32 ff3adf60 2004-04-14 devnull static int nzheads;
33 8425b514 2010-02-23 rsc static u32int totr;
34 8425b514 2010-02-23 rsc static u32int totw;
35 ff3adf60 2004-04-14 devnull static int verbose;
36 ff3adf60 2004-04-14 devnull static int zhalloc;
37 ff3adf60 2004-04-14 devnull static ZipHead *zheads;
38 ff3adf60 2004-04-14 devnull static jmp_buf zjmp;
39 ff3adf60 2004-04-14 devnull
40 ff3adf60 2004-04-14 devnull void
41 ff3adf60 2004-04-14 devnull usage(void)
42 ff3adf60 2004-04-14 devnull {
43 ff3adf60 2004-04-14 devnull fprint(2, "usage: zip [-vD] [-1-9] [-f zipfile] file ...\n");
44 ff3adf60 2004-04-14 devnull exits("usage");
45 ff3adf60 2004-04-14 devnull }
46 ff3adf60 2004-04-14 devnull
47 ff3adf60 2004-04-14 devnull void
48 f7b74c17 2004-12-28 devnull main(int volatile argc, char **volatile argv)
49 ff3adf60 2004-04-14 devnull {
50 f7b74c17 2004-12-28 devnull char *volatile zfile;
51 ff3adf60 2004-04-14 devnull int i, fd, err;
52 ff3adf60 2004-04-14 devnull
53 ff3adf60 2004-04-14 devnull zfile = nil;
54 ff3adf60 2004-04-14 devnull level = 6;
55 ff3adf60 2004-04-14 devnull ARGBEGIN{
56 ff3adf60 2004-04-14 devnull case 'D':
57 ff3adf60 2004-04-14 devnull debug++;
58 ff3adf60 2004-04-14 devnull break;
59 ff3adf60 2004-04-14 devnull case 'f':
60 ff3adf60 2004-04-14 devnull zfile = ARGF();
61 ff3adf60 2004-04-14 devnull if(zfile == nil)
62 ff3adf60 2004-04-14 devnull usage();
63 ff3adf60 2004-04-14 devnull break;
64 ff3adf60 2004-04-14 devnull case 'v':
65 ff3adf60 2004-04-14 devnull verbose++;
66 ff3adf60 2004-04-14 devnull break;
67 ff3adf60 2004-04-14 devnull case '1': case '2': case '3': case '4':
68 ff3adf60 2004-04-14 devnull case '5': case '6': case '7': case '8': case '9':
69 ff3adf60 2004-04-14 devnull level = ARGC() - '0';
70 ff3adf60 2004-04-14 devnull break;
71 ff3adf60 2004-04-14 devnull default:
72 ff3adf60 2004-04-14 devnull usage();
73 ff3adf60 2004-04-14 devnull break;
74 ff3adf60 2004-04-14 devnull }ARGEND
75 ff3adf60 2004-04-14 devnull
76 ff3adf60 2004-04-14 devnull if(argc == 0)
77 ff3adf60 2004-04-14 devnull usage();
78 ff3adf60 2004-04-14 devnull
79 ff3adf60 2004-04-14 devnull crctab = mkcrctab(ZCrcPoly);
80 ff3adf60 2004-04-14 devnull err = deflateinit();
81 ff3adf60 2004-04-14 devnull if(err != FlateOk)
82 ff3adf60 2004-04-14 devnull sysfatal("deflateinit failed: %s\n", flateerr(err));
83 ff3adf60 2004-04-14 devnull
84 ff3adf60 2004-04-14 devnull if(zfile == nil)
85 ff3adf60 2004-04-14 devnull fd = 1;
86 ff3adf60 2004-04-14 devnull else{
87 ff3adf60 2004-04-14 devnull fd = create(zfile, OWRITE, 0664);
88 ff3adf60 2004-04-14 devnull if(fd < 0)
89 ff3adf60 2004-04-14 devnull sysfatal("can't create %s: %r\n", zfile);
90 ff3adf60 2004-04-14 devnull }
91 ff3adf60 2004-04-14 devnull Binit(&bout, fd, OWRITE);
92 ff3adf60 2004-04-14 devnull
93 ff3adf60 2004-04-14 devnull if(setjmp(zjmp)){
94 ff3adf60 2004-04-14 devnull if(zfile != nil){
95 ff3adf60 2004-04-14 devnull fprint(2, "zip: removing output file %s\n", zfile);
96 ff3adf60 2004-04-14 devnull remove(zfile);
97 ff3adf60 2004-04-14 devnull }
98 ff3adf60 2004-04-14 devnull exits("errors");
99 ff3adf60 2004-04-14 devnull }
100 ff3adf60 2004-04-14 devnull
101 ff3adf60 2004-04-14 devnull for(i = 0; i < argc; i++)
102 ff3adf60 2004-04-14 devnull zip(&bout, argv[i], zfile == nil);
103 ff3adf60 2004-04-14 devnull
104 ff3adf60 2004-04-14 devnull putCDir(&bout);
105 ff3adf60 2004-04-14 devnull
106 ff3adf60 2004-04-14 devnull exits(nil);
107 ff3adf60 2004-04-14 devnull }
108 ff3adf60 2004-04-14 devnull
109 ff3adf60 2004-04-14 devnull static void
110 ff3adf60 2004-04-14 devnull zip(Biobuf *bout, char *file, int stdout)
111 ff3adf60 2004-04-14 devnull {
112 ff3adf60 2004-04-14 devnull Tm *t;
113 ff3adf60 2004-04-14 devnull ZipHead *zh;
114 ff3adf60 2004-04-14 devnull Dir *dir;
115 ff3adf60 2004-04-14 devnull vlong off;
116 ff3adf60 2004-04-14 devnull int fd, err;
117 ff3adf60 2004-04-14 devnull
118 ff3adf60 2004-04-14 devnull fd = open(file, OREAD);
119 ff3adf60 2004-04-14 devnull if(fd < 0)
120 ff3adf60 2004-04-14 devnull error("can't open %s: %r", file);
121 ff3adf60 2004-04-14 devnull dir = dirfstat(fd);
122 ff3adf60 2004-04-14 devnull if(dir == nil)
123 ff3adf60 2004-04-14 devnull error("can't stat %s: %r", file);
124 ff3adf60 2004-04-14 devnull
125 ff3adf60 2004-04-14 devnull /*
126 ff3adf60 2004-04-14 devnull * create the header
127 ff3adf60 2004-04-14 devnull */
128 ff3adf60 2004-04-14 devnull if(nzheads >= zhalloc){
129 ff3adf60 2004-04-14 devnull zhalloc += HeadAlloc;
130 ff3adf60 2004-04-14 devnull zheads = realloc(zheads, zhalloc * sizeof(ZipHead));
131 ff3adf60 2004-04-14 devnull if(zheads == nil)
132 ff3adf60 2004-04-14 devnull error("out of memory");
133 ff3adf60 2004-04-14 devnull }
134 ff3adf60 2004-04-14 devnull zh = &zheads[nzheads++];
135 ff3adf60 2004-04-14 devnull zh->madeos = ZDos;
136 ff3adf60 2004-04-14 devnull zh->madevers = (2 * 10) + 0;
137 ff3adf60 2004-04-14 devnull zh->extos = ZDos;
138 ff3adf60 2004-04-14 devnull zh->extvers = (2 * 10) + 0;
139 fa325e9b 2020-01-10 cross
140 ff3adf60 2004-04-14 devnull t = localtime(dir->mtime);
141 ff3adf60 2004-04-14 devnull zh->modtime = (t->hour<<11) | (t->min<<5) | (t->sec>>1);
142 ff3adf60 2004-04-14 devnull zh->moddate = ((t->year-80)<<9) | ((t->mon+1)<<5) | t->mday;
143 ff3adf60 2004-04-14 devnull
144 ff3adf60 2004-04-14 devnull zh->flags = 0;
145 ff3adf60 2004-04-14 devnull zh->crc = 0;
146 ff3adf60 2004-04-14 devnull zh->csize = 0;
147 ff3adf60 2004-04-14 devnull zh->uncsize = 0;
148 ff3adf60 2004-04-14 devnull zh->file = strdup(file);
149 ff3adf60 2004-04-14 devnull if(zh->file == nil)
150 ff3adf60 2004-04-14 devnull error("out of memory");
151 ff3adf60 2004-04-14 devnull zh->iattr = 0;
152 ff3adf60 2004-04-14 devnull zh->eattr = ZDArch;
153 ff3adf60 2004-04-14 devnull if((dir->mode & 0700) == 0)
154 ff3adf60 2004-04-14 devnull zh->eattr |= ZDROnly;
155 ff3adf60 2004-04-14 devnull zh->off = Boffset(bout);
156 ff3adf60 2004-04-14 devnull
157 ff3adf60 2004-04-14 devnull if(dir->mode & DMDIR){
158 ff3adf60 2004-04-14 devnull zh->eattr |= ZDDir;
159 ff3adf60 2004-04-14 devnull zh->meth = 0;
160 ff3adf60 2004-04-14 devnull zipDir(bout, fd, zh, stdout);
161 ff3adf60 2004-04-14 devnull }else{
162 ff3adf60 2004-04-14 devnull zh->meth = 8;
163 ff3adf60 2004-04-14 devnull if(stdout)
164 ff3adf60 2004-04-14 devnull zh->flags |= ZTrailInfo;
165 ff3adf60 2004-04-14 devnull off = Boffset(bout);
166 ff3adf60 2004-04-14 devnull header(bout, zh);
167 ff3adf60 2004-04-14 devnull
168 ff3adf60 2004-04-14 devnull crc = 0;
169 ff3adf60 2004-04-14 devnull eof = 0;
170 ff3adf60 2004-04-14 devnull totr = 0;
171 ff3adf60 2004-04-14 devnull totw = 0;
172 3ca675a5 2006-04-20 devnull err = deflate(bout, zwrite, (void*)(uintptr)fd, crcread, level, debug);
173 ff3adf60 2004-04-14 devnull if(err != FlateOk)
174 ff3adf60 2004-04-14 devnull error("deflate failed: %s: %r", flateerr(err));
175 ff3adf60 2004-04-14 devnull
176 ff3adf60 2004-04-14 devnull zh->csize = totw;
177 ff3adf60 2004-04-14 devnull zh->uncsize = totr;
178 ff3adf60 2004-04-14 devnull zh->crc = crc;
179 ff3adf60 2004-04-14 devnull trailer(bout, zh, off);
180 ff3adf60 2004-04-14 devnull }
181 ff3adf60 2004-04-14 devnull close(fd);
182 ff3adf60 2004-04-14 devnull free(dir);
183 ff3adf60 2004-04-14 devnull }
184 ff3adf60 2004-04-14 devnull
185 ff3adf60 2004-04-14 devnull static void
186 ff3adf60 2004-04-14 devnull zipDir(Biobuf *bout, int fd, ZipHead *zh, int stdout)
187 ff3adf60 2004-04-14 devnull {
188 ff3adf60 2004-04-14 devnull Dir *dirs;
189 ff3adf60 2004-04-14 devnull char *file, *pfile;
190 ff3adf60 2004-04-14 devnull int i, nf, nd;
191 ff3adf60 2004-04-14 devnull
192 ff3adf60 2004-04-14 devnull nf = strlen(zh->file) + 1;
193 ff3adf60 2004-04-14 devnull if(strcmp(zh->file, ".") == 0){
194 ff3adf60 2004-04-14 devnull nzheads--;
195 ff3adf60 2004-04-14 devnull free(zh->file);
196 ff3adf60 2004-04-14 devnull pfile = "";
197 ff3adf60 2004-04-14 devnull nf = 1;
198 ff3adf60 2004-04-14 devnull }else{
199 ff3adf60 2004-04-14 devnull nf++;
200 ff3adf60 2004-04-14 devnull pfile = malloc(nf);
201 ff3adf60 2004-04-14 devnull if(pfile == nil)
202 ff3adf60 2004-04-14 devnull error("out of memory");
203 ff3adf60 2004-04-14 devnull snprint(pfile, nf, "%s/", zh->file);
204 ff3adf60 2004-04-14 devnull free(zh->file);
205 ff3adf60 2004-04-14 devnull zh->file = pfile;
206 ff3adf60 2004-04-14 devnull header(bout, zh);
207 ff3adf60 2004-04-14 devnull }
208 ff3adf60 2004-04-14 devnull
209 ff3adf60 2004-04-14 devnull nf += 256; /* plenty of room */
210 ff3adf60 2004-04-14 devnull file = malloc(nf);
211 ff3adf60 2004-04-14 devnull if(file == nil)
212 ff3adf60 2004-04-14 devnull error("out of memory");
213 ff3adf60 2004-04-14 devnull while((nd = dirread(fd, &dirs)) > 0){
214 ff3adf60 2004-04-14 devnull for(i = 0; i < nd; i++){
215 ff3adf60 2004-04-14 devnull snprint(file, nf, "%s%s", pfile, dirs[i].name);
216 ff3adf60 2004-04-14 devnull zip(bout, file, stdout);
217 ff3adf60 2004-04-14 devnull }
218 ff3adf60 2004-04-14 devnull free(dirs);
219 ff3adf60 2004-04-14 devnull }
220 ff3adf60 2004-04-14 devnull }
221 ff3adf60 2004-04-14 devnull
222 ff3adf60 2004-04-14 devnull static void
223 ff3adf60 2004-04-14 devnull header(Biobuf *bout, ZipHead *zh)
224 ff3adf60 2004-04-14 devnull {
225 ff3adf60 2004-04-14 devnull int flen;
226 ff3adf60 2004-04-14 devnull
227 ff3adf60 2004-04-14 devnull if(verbose)
228 ff3adf60 2004-04-14 devnull fprint(2, "adding %s\n", zh->file);
229 ff3adf60 2004-04-14 devnull put4(bout, ZHeader);
230 ff3adf60 2004-04-14 devnull put1(bout, zh->extvers);
231 ff3adf60 2004-04-14 devnull put1(bout, zh->extos);
232 ff3adf60 2004-04-14 devnull put2(bout, zh->flags);
233 ff3adf60 2004-04-14 devnull put2(bout, zh->meth);
234 ff3adf60 2004-04-14 devnull put2(bout, zh->modtime);
235 ff3adf60 2004-04-14 devnull put2(bout, zh->moddate);
236 ff3adf60 2004-04-14 devnull put4(bout, zh->crc);
237 ff3adf60 2004-04-14 devnull put4(bout, zh->csize);
238 ff3adf60 2004-04-14 devnull put4(bout, zh->uncsize);
239 ff3adf60 2004-04-14 devnull flen = strlen(zh->file);
240 ff3adf60 2004-04-14 devnull put2(bout, flen);
241 ff3adf60 2004-04-14 devnull put2(bout, 0);
242 ff3adf60 2004-04-14 devnull if(Bwrite(bout, zh->file, flen) != flen)
243 ff3adf60 2004-04-14 devnull error("write error");
244 ff3adf60 2004-04-14 devnull }
245 ff3adf60 2004-04-14 devnull
246 ff3adf60 2004-04-14 devnull static void
247 ff3adf60 2004-04-14 devnull trailer(Biobuf *bout, ZipHead *zh, vlong off)
248 ff3adf60 2004-04-14 devnull {
249 ff3adf60 2004-04-14 devnull vlong coff;
250 ff3adf60 2004-04-14 devnull
251 ff3adf60 2004-04-14 devnull coff = -1;
252 ff3adf60 2004-04-14 devnull if(!(zh->flags & ZTrailInfo)){
253 ff3adf60 2004-04-14 devnull coff = Boffset(bout);
254 ff3adf60 2004-04-14 devnull if(Bseek(bout, off + ZHeadCrc, 0) < 0)
255 ff3adf60 2004-04-14 devnull error("can't seek in archive");
256 ff3adf60 2004-04-14 devnull }
257 ff3adf60 2004-04-14 devnull put4(bout, zh->crc);
258 ff3adf60 2004-04-14 devnull put4(bout, zh->csize);
259 ff3adf60 2004-04-14 devnull put4(bout, zh->uncsize);
260 ff3adf60 2004-04-14 devnull if(!(zh->flags & ZTrailInfo)){
261 ff3adf60 2004-04-14 devnull if(Bseek(bout, coff, 0) < 0)
262 ff3adf60 2004-04-14 devnull error("can't seek in archive");
263 ff3adf60 2004-04-14 devnull }
264 ff3adf60 2004-04-14 devnull }
265 ff3adf60 2004-04-14 devnull
266 ff3adf60 2004-04-14 devnull static void
267 ff3adf60 2004-04-14 devnull cheader(Biobuf *bout, ZipHead *zh)
268 ff3adf60 2004-04-14 devnull {
269 ff3adf60 2004-04-14 devnull int flen;
270 ff3adf60 2004-04-14 devnull
271 ff3adf60 2004-04-14 devnull put4(bout, ZCHeader);
272 ff3adf60 2004-04-14 devnull put1(bout, zh->madevers);
273 ff3adf60 2004-04-14 devnull put1(bout, zh->madeos);
274 ff3adf60 2004-04-14 devnull put1(bout, zh->extvers);
275 ff3adf60 2004-04-14 devnull put1(bout, zh->extos);
276 ff3adf60 2004-04-14 devnull put2(bout, zh->flags & ~ZTrailInfo);
277 ff3adf60 2004-04-14 devnull put2(bout, zh->meth);
278 ff3adf60 2004-04-14 devnull put2(bout, zh->modtime);
279 ff3adf60 2004-04-14 devnull put2(bout, zh->moddate);
280 ff3adf60 2004-04-14 devnull put4(bout, zh->crc);
281 ff3adf60 2004-04-14 devnull put4(bout, zh->csize);
282 ff3adf60 2004-04-14 devnull put4(bout, zh->uncsize);
283 ff3adf60 2004-04-14 devnull flen = strlen(zh->file);
284 ff3adf60 2004-04-14 devnull put2(bout, flen);
285 ff3adf60 2004-04-14 devnull put2(bout, 0);
286 ff3adf60 2004-04-14 devnull put2(bout, 0);
287 ff3adf60 2004-04-14 devnull put2(bout, 0);
288 ff3adf60 2004-04-14 devnull put2(bout, zh->iattr);
289 ff3adf60 2004-04-14 devnull put4(bout, zh->eattr);
290 ff3adf60 2004-04-14 devnull put4(bout, zh->off);
291 ff3adf60 2004-04-14 devnull if(Bwrite(bout, zh->file, flen) != flen)
292 ff3adf60 2004-04-14 devnull error("write error");
293 ff3adf60 2004-04-14 devnull }
294 ff3adf60 2004-04-14 devnull
295 ff3adf60 2004-04-14 devnull static void
296 ff3adf60 2004-04-14 devnull putCDir(Biobuf *bout)
297 ff3adf60 2004-04-14 devnull {
298 ff3adf60 2004-04-14 devnull vlong hoff, ecoff;
299 ff3adf60 2004-04-14 devnull int i;
300 ff3adf60 2004-04-14 devnull
301 ff3adf60 2004-04-14 devnull hoff = Boffset(bout);
302 ff3adf60 2004-04-14 devnull
303 ff3adf60 2004-04-14 devnull for(i = 0; i < nzheads; i++)
304 ff3adf60 2004-04-14 devnull cheader(bout, &zheads[i]);
305 ff3adf60 2004-04-14 devnull
306 ff3adf60 2004-04-14 devnull ecoff = Boffset(bout);
307 ff3adf60 2004-04-14 devnull
308 ff3adf60 2004-04-14 devnull if(nzheads >= (1 << 16))
309 ff3adf60 2004-04-14 devnull error("too many entries in zip file: max %d", (1 << 16) - 1);
310 ff3adf60 2004-04-14 devnull put4(bout, ZECHeader);
311 ff3adf60 2004-04-14 devnull put2(bout, 0);
312 ff3adf60 2004-04-14 devnull put2(bout, 0);
313 ff3adf60 2004-04-14 devnull put2(bout, nzheads);
314 ff3adf60 2004-04-14 devnull put2(bout, nzheads);
315 ff3adf60 2004-04-14 devnull put4(bout, ecoff - hoff);
316 ff3adf60 2004-04-14 devnull put4(bout, hoff);
317 ff3adf60 2004-04-14 devnull put2(bout, 0);
318 ff3adf60 2004-04-14 devnull }
319 ff3adf60 2004-04-14 devnull
320 ff3adf60 2004-04-14 devnull static int
321 ff3adf60 2004-04-14 devnull crcread(void *fd, void *buf, int n)
322 ff3adf60 2004-04-14 devnull {
323 ff3adf60 2004-04-14 devnull int nr, m;
324 ff3adf60 2004-04-14 devnull
325 ff3adf60 2004-04-14 devnull nr = 0;
326 ff3adf60 2004-04-14 devnull for(; !eof && n > 0; n -= m){
327 3ca675a5 2006-04-20 devnull m = read((int)(uintptr)fd, (char*)buf+nr, n);
328 ff3adf60 2004-04-14 devnull if(m <= 0){
329 ff3adf60 2004-04-14 devnull eof = 1;
330 ff3adf60 2004-04-14 devnull if(m < 0)
331 ff3adf60 2004-04-14 devnull {
332 ff3adf60 2004-04-14 devnull fprint(2, "input error %r\n");
333 ff3adf60 2004-04-14 devnull return -1;
334 ff3adf60 2004-04-14 devnull }
335 ff3adf60 2004-04-14 devnull break;
336 ff3adf60 2004-04-14 devnull }
337 ff3adf60 2004-04-14 devnull nr += m;
338 ff3adf60 2004-04-14 devnull }
339 ff3adf60 2004-04-14 devnull crc = blockcrc(crctab, crc, buf, nr);
340 ff3adf60 2004-04-14 devnull totr += nr;
341 ff3adf60 2004-04-14 devnull return nr;
342 ff3adf60 2004-04-14 devnull }
343 ff3adf60 2004-04-14 devnull
344 ff3adf60 2004-04-14 devnull static int
345 ff3adf60 2004-04-14 devnull zwrite(void *bout, void *buf, int n)
346 ff3adf60 2004-04-14 devnull {
347 ff3adf60 2004-04-14 devnull if(n != Bwrite(bout, buf, n)){
348 ff3adf60 2004-04-14 devnull eof = 1;
349 ff3adf60 2004-04-14 devnull return -1;
350 ff3adf60 2004-04-14 devnull }
351 ff3adf60 2004-04-14 devnull totw += n;
352 ff3adf60 2004-04-14 devnull return n;
353 ff3adf60 2004-04-14 devnull }
354 ff3adf60 2004-04-14 devnull
355 ff3adf60 2004-04-14 devnull static void
356 8425b514 2010-02-23 rsc put4(Biobuf *b, u32int v)
357 ff3adf60 2004-04-14 devnull {
358 ff3adf60 2004-04-14 devnull int i;
359 ff3adf60 2004-04-14 devnull
360 ff3adf60 2004-04-14 devnull for(i = 0; i < 4; i++){
361 ff3adf60 2004-04-14 devnull if(Bputc(b, v) < 0)
362 ff3adf60 2004-04-14 devnull error("write error");
363 ff3adf60 2004-04-14 devnull v >>= 8;
364 ff3adf60 2004-04-14 devnull }
365 ff3adf60 2004-04-14 devnull }
366 ff3adf60 2004-04-14 devnull
367 ff3adf60 2004-04-14 devnull static void
368 ff3adf60 2004-04-14 devnull put2(Biobuf *b, int v)
369 ff3adf60 2004-04-14 devnull {
370 ff3adf60 2004-04-14 devnull int i;
371 ff3adf60 2004-04-14 devnull
372 ff3adf60 2004-04-14 devnull for(i = 0; i < 2; i++){
373 ff3adf60 2004-04-14 devnull if(Bputc(b, v) < 0)
374 ff3adf60 2004-04-14 devnull error("write error");
375 ff3adf60 2004-04-14 devnull v >>= 8;
376 ff3adf60 2004-04-14 devnull }
377 ff3adf60 2004-04-14 devnull }
378 ff3adf60 2004-04-14 devnull
379 ff3adf60 2004-04-14 devnull static void
380 ff3adf60 2004-04-14 devnull put1(Biobuf *b, int v)
381 ff3adf60 2004-04-14 devnull {
382 ff3adf60 2004-04-14 devnull if(Bputc(b, v)< 0)
383 ff3adf60 2004-04-14 devnull error("unexpected eof reading file information");
384 ff3adf60 2004-04-14 devnull }
385 ff3adf60 2004-04-14 devnull
386 ff3adf60 2004-04-14 devnull static void
387 ff3adf60 2004-04-14 devnull error(char *fmt, ...)
388 ff3adf60 2004-04-14 devnull {
389 ff3adf60 2004-04-14 devnull va_list arg;
390 ff3adf60 2004-04-14 devnull
391 ff3adf60 2004-04-14 devnull fprint(2, "zip: ");
392 ff3adf60 2004-04-14 devnull va_start(arg, fmt);
393 ff3adf60 2004-04-14 devnull vfprint(2, fmt, arg);
394 ff3adf60 2004-04-14 devnull va_end(arg);
395 ff3adf60 2004-04-14 devnull fprint(2, "\n");
396 ff3adf60 2004-04-14 devnull
397 ff3adf60 2004-04-14 devnull longjmp(zjmp, 1);
398 ff3adf60 2004-04-14 devnull }