The following commit has been merged in the master branch:
commit 2b824afa6bb06b7cb757423b248f6907e9919e86
Author: Guillem Jover <[email protected]>
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 [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]