Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_gzio.c
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
static void * gz_alloc(void *, u_int, u_int); | static void * gz_alloc(void *, u_int, u_int); | ||||
static void gz_free(void *, void *); | static void gz_free(void *, void *); | ||||
static int gz_write(struct gzio_stream *, void *, u_int, int); | static int gz_write(struct gzio_stream *, void *, u_int, int); | ||||
struct gzio_stream * | struct gzio_stream * | ||||
gzio_init(gzio_cb cb, enum gzio_mode mode, size_t bufsz, int level, void *arg) | gzio_init(gzio_cb cb, enum gzio_mode mode, size_t bufsz, int level, void *arg) | ||||
{ | { | ||||
struct gzio_stream *s; | struct gzio_stream *s; | ||||
uint8_t *hdr; | |||||
int error; | int error; | ||||
if (bufsz < KERN_GZ_HDRLEN) | if (bufsz < KERN_GZ_HDRLEN) | ||||
return (NULL); | return (NULL); | ||||
if (mode != GZIO_DEFLATE) | if (mode != GZIO_DEFLATE) | ||||
return (NULL); | return (NULL); | ||||
s = gz_alloc(NULL, 1, sizeof(*s)); | s = gz_alloc(NULL, 1, sizeof(*s)); | ||||
s->gz_bufsz = bufsz; | s->gz_bufsz = bufsz; | ||||
s->gz_buffer = gz_alloc(NULL, 1, s->gz_bufsz); | s->gz_buffer = gz_alloc(NULL, 1, s->gz_bufsz); | ||||
s->gz_mode = mode; | s->gz_mode = mode; | ||||
s->gz_crc = ~0U; | |||||
s->gz_cb = cb; | s->gz_cb = cb; | ||||
s->gz_arg = arg; | s->gz_arg = arg; | ||||
s->gz_stream.zalloc = gz_alloc; | s->gz_stream.zalloc = gz_alloc; | ||||
s->gz_stream.zfree = gz_free; | s->gz_stream.zfree = gz_free; | ||||
s->gz_stream.opaque = NULL; | s->gz_stream.opaque = NULL; | ||||
s->gz_stream.next_in = Z_NULL; | s->gz_stream.next_in = Z_NULL; | ||||
s->gz_stream.avail_in = 0; | s->gz_stream.avail_in = 0; | ||||
error = deflateInit2(&s->gz_stream, level, Z_DEFLATED, -MAX_WBITS, | error = deflateInit2(&s->gz_stream, level, Z_DEFLATED, -MAX_WBITS, | ||||
DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); | DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); | ||||
if (error != 0) | if (error != 0) | ||||
goto fail; | goto fail; | ||||
gzio_reset(s); | |||||
return (s); | |||||
fail: | |||||
gz_free(NULL, s->gz_buffer); | |||||
gz_free(NULL, s); | |||||
return (NULL); | |||||
} | |||||
void | |||||
gzio_reset(struct gzio_stream *s) | |||||
{ | |||||
uint8_t *hdr; | |||||
(void)deflateReset(&s->gz_stream); | |||||
s->gz_off = 0; | |||||
s->gz_crc = ~0U; | |||||
s->gz_stream.avail_out = s->gz_bufsz; | s->gz_stream.avail_out = s->gz_bufsz; | ||||
s->gz_stream.next_out = s->gz_buffer; | s->gz_stream.next_out = s->gz_buffer; | ||||
/* Write the gzip header to the output buffer. */ | /* Write the gzip header to the output buffer. */ | ||||
hdr = s->gz_buffer; | hdr = s->gz_buffer; | ||||
memset(hdr, 0, KERN_GZ_HDRLEN); | memset(hdr, 0, KERN_GZ_HDRLEN); | ||||
hdr[0] = KERN_GZ_MAGIC1; | hdr[0] = KERN_GZ_MAGIC1; | ||||
hdr[1] = KERN_GZ_MAGIC2; | hdr[1] = KERN_GZ_MAGIC2; | ||||
hdr[2] = Z_DEFLATED; | hdr[2] = Z_DEFLATED; | ||||
hdr[9] = OS_CODE; | hdr[9] = OS_CODE; | ||||
s->gz_stream.next_out += KERN_GZ_HDRLEN; | s->gz_stream.next_out += KERN_GZ_HDRLEN; | ||||
s->gz_stream.avail_out -= KERN_GZ_HDRLEN; | s->gz_stream.avail_out -= KERN_GZ_HDRLEN; | ||||
return (s); | |||||
fail: | |||||
gz_free(NULL, s->gz_buffer); | |||||
gz_free(NULL, s); | |||||
return (NULL); | |||||
} | } | ||||
int | int | ||||
gzio_write(struct gzio_stream *s, void *data, u_int len) | gzio_write(struct gzio_stream *s, void *data, u_int len) | ||||
{ | { | ||||
return (gz_write(s, data, len, Z_NO_FLUSH)); | return (gz_write(s, data, len, Z_NO_FLUSH)); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 106 Lines • Show Last 20 Lines |