171
static int zlib_value(int value, char** rbuf, int rlen)
175
static int zlib_value2(int msg_code, int value, char** rbuf, int rlen)
173
int msg_code = 2; /* 2 = integer */
174
177
char* dst = *rbuf;
178
182
*dst++ = msg_code;
179
183
*dst++ = (value >> 24) & 0xff;
180
184
*dst++ = (value >> 16) & 0xff;
181
185
*dst++ = (value >> 8) & 0xff;
182
*dst++ = (value >> 0) & 0xff;
186
*dst++ = value & 0xff;
190
static int zlib_value(int value, char** rbuf, int rlen)
192
return zlib_value2(2, value, rbuf, rlen);
186
195
static int zlib_output_init(ZLibData* d)
188
197
if (d->bin != NULL)
190
199
if ((d->bin = driver_alloc_binary(d->binsz_need)) == NULL)
192
201
d->binsz = d->binsz_need;
193
d->s.next_out = d->bin->orig_bytes;
202
d->s.next_out = (unsigned char*)d->bin->orig_bytes;
194
203
d->s.avail_out = d->binsz;
228
237
SysIOVec* iov = driver_peekq(d->port, &vlen);
239
int possibly_more_output = 0;
231
241
d->s.next_in = iov[0].iov_base;
232
242
d->s.avail_in = iov[0].iov_len;
234
while((d->s.avail_in > 0) && (res != Z_STREAM_END)) {
243
while((possibly_more_output || (d->s.avail_in > 0)) && (res != Z_STREAM_END)) {
235
244
res = inflate(&d->s, Z_NO_FLUSH);
238
if (d->s.avail_out == 0) {
245
if (res == Z_NEED_DICT) {
246
/* Essential to eat the header bytes that zlib has looked at */
247
len = iov[0].iov_len - d->s.avail_in;
248
driver_deq(d->port, len);
254
if (d->s.avail_out != 0) {
255
possibly_more_output = 0;
240
d->crc = crc32(d->crc, d->bin->orig_bytes,
258
d->crc = crc32(d->crc, (unsigned char*)d->bin->orig_bytes,
241
259
d->binsz - d->s.avail_out);
261
possibly_more_output = 1;
245
264
len = iov[0].iov_len - d->s.avail_in;
246
265
driver_deq(d->port, len);
249
if (flush != Z_NO_FLUSH) {
250
if ((res = inflate(&d->s, flush)) < 0)
252
while(d->s.avail_out < d->binsz) {
254
d->crc = crc32(d->crc, d->bin->orig_bytes,
255
d->binsz - d->s.avail_out);
257
if (res == Z_STREAM_END)
259
if ((res = inflate(&d->s, flush)) < 0)
269
d->crc = crc32(d->crc, d->bin->orig_bytes,
270
d->binsz - d->s.avail_out);
273
if (res == Z_STREAM_END) {
274
d->inflate_eos_seen = 1;
281
294
d->s.avail_in = iov[0].iov_len;
283
296
while((d->s.avail_in > 0) && (res != Z_STREAM_END)) {
284
if ((res = deflate(&d->s, Z_NO_FLUSH)) < 0)
297
if ((res = deflate(&d->s, Z_NO_FLUSH)) < 0) {
286
if (d->s.avail_out == 0)
300
if (d->s.avail_out == 0) {
289
304
len = iov[0].iov_len - d->s.avail_in;
291
306
d->crc = crc32(d->crc, iov[0].iov_base, len);
292
308
driver_deq(d->port, len);
295
311
if (flush != Z_NO_FLUSH) {
296
if ((res = deflate(&d->s, flush)) < 0)
312
if ((res = deflate(&d->s, flush)) < 0) {
298
while(d->s.avail_out < d->binsz) {
300
if (res == Z_STREAM_END)
302
if ((res = deflate(&d->s, flush)) < 0)
315
if (flush == Z_FINISH) {
316
while (d->s.avail_out < d->binsz) {
318
if (res == Z_STREAM_END) {
321
if ((res = deflate(&d->s, flush)) < 0) {
326
while (d->s.avail_out < d->binsz) {
328
if (res == Z_STREAM_END) {
401
430
case DEFLATE_SETDICT:
402
431
if (d->state != ST_DEFLATE) goto badarg;
403
res = deflateSetDictionary(&d->s, buf, len);
404
return zlib_return(res, rbuf, rlen);
432
res = deflateSetDictionary(&d->s, (unsigned char*)buf, len);
434
return zlib_value(d->s.adler, rbuf, rlen);
436
return zlib_return(res, rbuf, rlen);
406
439
case DEFLATE_RESET:
407
440
if (len != 0) goto badarg;
459
494
case INFLATE_SETDICT:
460
495
if (d->state != ST_INFLATE) goto badarg;
461
res = inflateSetDictionary(&d->s, buf, len);
496
res = inflateSetDictionary(&d->s, (unsigned char*)buf, len);
462
497
return zlib_return(res, rbuf, rlen);
464
499
case INFLATE_SYNC:
465
500
if (d->state != ST_INFLATE) goto badarg;
466
501
if (len != 0) goto badarg;
467
res = inflateSync(&d->s);
502
if (driver_sizeq(d->port) == 0) {
506
SysIOVec* iov = driver_peekq(d->port, &vlen);
508
d->s.next_in = iov[0].iov_base;
509
d->s.avail_in = iov[0].iov_len;
510
res = inflateSync(&d->s);
468
512
return zlib_return(res, rbuf, rlen);
470
514
case INFLATE_RESET:
472
516
if (len != 0) goto badarg;
473
517
driver_deq(d->port, driver_sizeq(d->port));
474
518
res = inflateReset(&d->s);
519
d->inflate_eos_seen = 0;
475
520
return zlib_return(res, rbuf, rlen);
477
522
case INFLATE_END:
479
524
if (len != 0) goto badarg;
480
525
driver_deq(d->port, driver_sizeq(d->port));
481
526
res = inflateEnd(&d->s);
527
if (res == Z_OK && d->inflate_eos_seen == 0) {
482
530
d->state = ST_NONE;
483
531
return zlib_return(res, rbuf, rlen);
486
534
if (d->state != ST_INFLATE) goto badarg;
487
535
if (len != 4) goto badarg;
488
536
res = zlib_inflate(d, i32(buf));
489
return zlib_return(res, rbuf, rlen);
537
if (res == Z_NEED_DICT) {
538
return zlib_value2(3, d->s.adler, rbuf, rlen);
540
return zlib_return(res, rbuf, rlen);
492
544
return zlib_value(driver_sizeq(d->port), rbuf, rlen);
522
574
uLong crc = crc32(0L, Z_NULL, 0);
523
crc = crc32(crc, buf, len);
575
crc = crc32(crc, (unsigned char*)buf, len);
524
576
return zlib_value(crc, rbuf, rlen);
529
581
if (len < 4) goto badarg;
531
crc = crc32(crc, buf+4, len-4);
583
crc = crc32(crc, (unsigned char*)buf+4, len-4);
532
584
return zlib_value(crc, rbuf, rlen);
588
uLong adler = adler32(0L, Z_NULL, 0);
589
adler = adler32(adler, buf, len);
590
return zlib_value(adler, rbuf, rlen);
595
if (len < 4) goto badarg;
597
adler = adler32(adler, buf+4, len-4);
598
return zlib_value(adler, rbuf, rlen);