The following commit has been merged in the master branch: commit 2b824afa6bb06b7cb757423b248f6907e9919e86 Author: Guillem Jover <guil...@debian.org> Date: Mon May 2 21:51:47 2011 +0200
libdpkg: Detangle buffer filter logic from write logic diff --git a/lib/dpkg/buffer.c b/lib/dpkg/buffer.c index 99015d2..f0cf91f 100644 --- a/lib/dpkg/buffer.c +++ b/lib/dpkg/buffer.c @@ -66,6 +66,26 @@ buffer_filter_init(struct buffer_data *data) return 0; } +static off_t +buffer_filter_update(struct buffer_data *filter, const void *buf, off_t length) +{ + off_t ret = length; + + switch (filter->type) { + case BUFFER_FILTER_NULL: + break; + case BUFFER_FILTER_MD5: + MD5Update(&(((struct buffer_md5_ctx *)filter->arg.ptr)->ctx), + buf, length); + break; + default: + internerr("unknown data type '%i' in buffer_filter_update", + filter->type); + } + + return ret; +} + static void buffer_md5_done(struct buffer_data *data) { @@ -111,10 +131,6 @@ buffer_write(struct buffer_data *data, const void *buf, off_t length) ret = fd_write(data->arg.i, buf, length); break; case BUFFER_WRITE_NULL: - case BUFFER_FILTER_NULL: - break; - case BUFFER_FILTER_MD5: - MD5Update(&(((struct buffer_md5_ctx *)data->arg.ptr)->ctx), buf, length); break; default: internerr("unknown data type '%i' in buffer_write", @@ -142,20 +158,22 @@ buffer_read(struct buffer_data *data, void *buf, off_t length) } off_t -buffer_hash(const void *input, void *output, int type, off_t limit) +buffer_filter(const void *input, void *output, int type, off_t limit) { struct buffer_data data = { .arg.ptr = output, .type = type }; off_t ret; buffer_filter_init(&data); - ret = buffer_write(&data, input, limit); + ret = buffer_filter_update(&data, input, limit); buffer_filter_done(&data); return ret; } static off_t -buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data, +buffer_copy(struct buffer_data *read_data, + struct buffer_data *filter, + struct buffer_data *write_data, off_t limit, const char *desc) { char *buf; @@ -170,7 +188,7 @@ buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data, buf = m_malloc(bufsize); - buffer_filter_init(write_data); + buffer_filter_init(filter); while (bufsize > 0) { bytesread = buffer_read(read_data, buf, bufsize); @@ -187,6 +205,8 @@ buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data, bufsize = limit; } + buffer_filter_update(filter, buf, bytesread); + byteswritten = buffer_write(write_data, buf, bytesread); if (byteswritten < 0) break; @@ -203,7 +223,7 @@ buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data, if (limit > 0) ohshit(_("short read on buffer copy for %s"), desc); - buffer_filter_done(write_data); + buffer_filter_done(filter); free(buf); @@ -212,11 +232,13 @@ buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data, off_t buffer_copy_IntInt(int Iin, int Tin, + void *Pfilter, int Tfilter, int Iout, int Tout, off_t limit, const char *desc, ...) { va_list args; struct buffer_data read_data = { .type = Tin, .arg.i = Iin }; + struct buffer_data filter = { .type = Tfilter, .arg.ptr = Pfilter }; struct buffer_data write_data = { .type = Tout, .arg.i = Iout }; struct varbuf v = VARBUF_INIT; off_t ret; @@ -225,7 +247,7 @@ buffer_copy_IntInt(int Iin, int Tin, varbuf_vprintf(&v, desc, args); va_end(args); - ret = buffer_copy(&read_data, &write_data, limit, v.buf); + ret = buffer_copy(&read_data, &filter, &write_data, limit, v.buf); varbuf_destroy(&v); @@ -234,11 +256,13 @@ buffer_copy_IntInt(int Iin, int Tin, off_t buffer_copy_IntPtr(int Iin, int Tin, + void *Pfilter, int Tfilter, void *Pout, int Tout, off_t limit, const char *desc, ...) { va_list args; struct buffer_data read_data = { .type = Tin, .arg.i = Iin }; + struct buffer_data filter = { .type = Tfilter, .arg.ptr = Pfilter }; struct buffer_data write_data = { .type = Tout, .arg.ptr = Pout }; struct varbuf v = VARBUF_INIT; off_t ret; @@ -247,7 +271,7 @@ buffer_copy_IntPtr(int Iin, int Tin, varbuf_vprintf(&v, desc, args); va_end(args); - ret = buffer_copy(&read_data, &write_data, limit, v.buf); + ret = buffer_copy(&read_data, &filter, &write_data, limit, v.buf); varbuf_destroy(&v); @@ -258,6 +282,7 @@ static off_t buffer_skip(struct buffer_data *input, off_t limit, const char *desc) { struct buffer_data output; + struct buffer_data filter; switch (input->type) { case BUFFER_READ_FD: @@ -273,8 +298,10 @@ buffer_skip(struct buffer_data *input, off_t limit, const char *desc) output.type = BUFFER_WRITE_NULL; output.arg.ptr = NULL; + filter.type = BUFFER_FILTER_NULL; + filter.arg.ptr = NULL; - return buffer_copy(input, &output, limit, desc); + return buffer_copy(input, &filter, &output, limit, desc); } off_t diff --git a/lib/dpkg/buffer.h b/lib/dpkg/buffer.h index 3677d76..98b519a 100644 --- a/lib/dpkg/buffer.h +++ b/lib/dpkg/buffer.h @@ -50,29 +50,40 @@ struct buffer_data { }; # define buffer_md5(buf, hash, limit) \ - buffer_hash(buf, hash, BUFFER_FILTER_MD5, limit) + buffer_filter(buf, hash, BUFFER_FILTER_MD5, limit) # define fd_md5(fd, hash, limit, ...) \ - buffer_copy_IntPtr(fd, BUFFER_READ_FD, hash, BUFFER_FILTER_MD5, \ + buffer_copy_IntPtr(fd, BUFFER_READ_FD, \ + hash, BUFFER_FILTER_MD5, \ + NULL, BUFFER_WRITE_NULL, \ limit, __VA_ARGS__) # define fd_fd_copy(fd1, fd2, limit, ...) \ - buffer_copy_IntInt(fd1, BUFFER_READ_FD, fd2, BUFFER_WRITE_FD, \ + buffer_copy_IntInt(fd1, BUFFER_READ_FD, \ + NULL, BUFFER_FILTER_NULL, \ + fd2, BUFFER_WRITE_FD, \ limit, __VA_ARGS__) # define fd_vbuf_copy(fd, buf, limit, ...) \ - buffer_copy_IntPtr(fd, BUFFER_READ_FD, buf, BUFFER_WRITE_VBUF, \ + buffer_copy_IntPtr(fd, BUFFER_READ_FD, \ + NULL, BUFFER_FILTER_NULL, \ + buf, BUFFER_WRITE_VBUF, \ limit, __VA_ARGS__) # define fd_skip(fd, limit, ...) \ buffer_skip_Int(fd, BUFFER_READ_FD, limit, __VA_ARGS__) -off_t buffer_copy_IntPtr(int i, int typeIn, void *p, int typeOut, + +off_t buffer_copy_IntPtr(int i, int typeIn, + void *f, int typeFilter, + void *p, int typeOut, off_t limit, const char *desc, - ...) DPKG_ATTR_PRINTF(6); -off_t buffer_copy_IntInt(int i1, int typeIn, int i2, int typeOut, + ...) DPKG_ATTR_PRINTF(8); +off_t buffer_copy_IntInt(int i1, int typeIn, + void *f, int typeFilter, + int i2, int typeOut, off_t limit, const char *desc, - ...) DPKG_ATTR_PRINTF(6); + ...) DPKG_ATTR_PRINTF(8); off_t buffer_skip_Int(int I, int T, off_t limit, const char *desc_fmt, ...) - DPKG_ATTR_PRINTF(4); -off_t buffer_hash(const void *buf, void *hash, int typeOut, off_t length); + DPKG_ATTR_PRINTF(4); +off_t buffer_filter(const void *buf, void *hash, int typeFilter, off_t length); DPKG_END_DECLS -- dpkg's main repository -- To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org