Просмотр исходного кода

Added generic setup code to buffer copy loop.

Adam Heath лет назад: 25
Родитель
Сommit
7bc3f3e19b
4 измененных файлов с 77 добавлено и 55 удалено
  1. 5 0
      ChangeLog
  2. 11 6
      include/dpkg.h.in
  3. 49 32
      lib/mlib.c
  4. 12 17
      po/dpkg.pot

+ 5 - 0
ChangeLog

@@ -1,3 +1,8 @@
+Mon Dec 25 00:31:05 CST 2000 Adam Heath <doogie@debian.org>
+
+  * include/dpkg.h.in, lib/mlib.c: Added generic setup code to buffer
+    copy loop.
+
 Sun Dec 24 23:48:45 CST 2000 Adam Heath <doogie@debian.org>
 
   * include/dpkg.h.in, lib/Makefile.in, lib/mlib.c, utils/Makefile.in,

+ 11 - 6
include/dpkg.h.in

@@ -206,6 +206,11 @@ void waitsubproc(pid_t pid, const char *description, int sigpipeok);
 #define BUFFER_READ_FD 0
 #define BUFFER_READ_STREAM 1
 
+#define BUFFER_WRITE_SETUP 1 << 16
+#define BUFFER_READ_SETUP 1 << 17
+#define BUFFER_WRITE_SHUTDOWN 1 << 18
+#define BUFFER_READ_SHUTDOWN 1 << 19
+
 typedef struct buffer_data *buffer_data_t;
 typedef ssize_t (*buffer_proc_t)(buffer_data_t data, void *buf, ssize_t size, char *desc);
 struct buffer_data {
@@ -215,11 +220,13 @@ struct buffer_data {
 };
 
 #define fd_md5(fd, hash, limit, desc...)\
-	buffer_md5_setup((void *)fd, BUFFER_READ_FD, NULL, \
-			  hash, limit, desc)
+	buffer_copy_setup((void *)fd, BUFFER_READ_FD, NULL, \
+			   hash, BUFFER_WRITE_MD5, NULL, \
+			   limit, desc)
 #define stream_md5(file, hash, limit, desc...)\
-	buffer_md5_setup((void *)file, BUFFER_READ_STREAM, NULL, \
-			  hash, limit, desc)
+	buffer_copy_setup((void *)file, BUFFER_READ_STREAM, NULL, \
+			   hash, BUFFER_WRITE_MD5, NULL, \
+			   limit, desc)
 
 #define fd_fd_copy(fd1, fd2, limit, desc...)\
 	buffer_copy_setup((void *)fd1, BUFFER_READ_FD, NULL, \
@@ -254,8 +261,6 @@ struct buffer_data {
 ssize_t buffer_copy_setup(void *argIn, int typeIn, void *procIn,
 		       void *argOut, int typeOut, void *procOut,
 		       ssize_t limit, const char *desc, ...);
-ssize_t buffer_md5_setup(void *argIn, int typeIn, void *procIn,
-		       unsigned char hash[33], ssize_t limit, const char *desc, ...);
 ssize_t buffer_copy(buffer_data_t read_data, buffer_data_t write_data, ssize_t limit, char *desc);
 
 extern volatile int onerr_abort;

+ 49 - 32
lib/mlib.c

@@ -127,6 +127,38 @@ void waitsubproc(pid_t pid, const char *description, int sigpipeok) {
 
 ssize_t buffer_write(buffer_data_t data, void *buf, ssize_t length, char *desc) {
   ssize_t ret= length;
+  if(data->type & BUFFER_WRITE_SETUP) {
+    switch(data->type ^ BUFFER_WRITE_SETUP) {
+      case BUFFER_WRITE_MD5:
+	{
+	  unsigned char *hash= data->data;
+	  void ** array= malloc(sizeof(void *) * 2);
+	  data->data= array;
+	  array[0]= hash;
+	  array[1]= malloc(sizeof(struct MD5Context));
+	  MD5Init((struct MD5Context *)array[1]);
+	}
+	break;
+    }
+    return 0;
+  }
+  if(data->type & BUFFER_WRITE_SHUTDOWN) {
+    switch(data->type ^ BUFFER_WRITE_SHUTDOWN) {
+      case BUFFER_WRITE_MD5:
+	{
+	  int i;
+	  unsigned char digest[16], *p = digest;
+	  unsigned char *hash= (unsigned char *)((void **)data->data)[0];
+	  MD5Final(digest, (struct MD5Context *)((void **)data->data)[1]);
+	  for (i = 0; i < 16; ++i) {
+	    sprintf(hash, "%02x", *p++);
+	    hash += 2;
+	  }
+	}
+	break;
+    }
+    return 0;
+  }
   switch(data->type) {
     case BUFFER_WRITE_BUF:
       memcpy(data->data, buf, length);
@@ -149,7 +181,7 @@ ssize_t buffer_write(buffer_data_t data, void *buf, ssize_t length, char *desc)
 	ohshite(_("error in buffer_write(stream): %s"), desc);
       break;
     case BUFFER_WRITE_MD5:
-      MD5Update((struct MD5Context *)data->data, buf, length);
+      MD5Update((struct MD5Context *)((void **)data->data)[1], buf, length);
       break;
     default:
       fprintf(stderr, _("unknown data type `%i' in buffer_write\n"), data->type);
@@ -159,6 +191,12 @@ ssize_t buffer_write(buffer_data_t data, void *buf, ssize_t length, char *desc)
 
 ssize_t buffer_read(buffer_data_t data, void *buf, ssize_t length, char *desc) {
   ssize_t ret= length;
+  if(data->type & BUFFER_READ_SETUP) {
+    return 0;
+  }
+  if(data->type & BUFFER_READ_SHUTDOWN) {
+    return 0;
+  }
   switch(data->type) {
     case BUFFER_READ_FD:
       if((ret= read((int)data->data, buf, length)) < 0 && errno != EINTR)
@@ -197,42 +235,21 @@ ssize_t buffer_copy_setup(void *argIn, int typeIn, void *procIn,
     read_data.proc = buffer_read;
   if ( procOut == NULL )
     write_data.proc = buffer_write;
+  read_data.type |= BUFFER_READ_SETUP;
+  read_data.proc(&read_data, NULL, 0, v.buf);
+  read_data.type = typeIn;
+  write_data.type |= BUFFER_WRITE_SETUP;
+  write_data.proc(&write_data, NULL, 0, v.buf);
+  write_data.type = typeOut;
   ret = buffer_copy(&read_data, &write_data, limit, v.buf);
+  write_data.type |= BUFFER_WRITE_SHUTDOWN;
+  write_data.proc(&write_data, NULL, 0, v.buf);
+  read_data.type |= BUFFER_READ_SHUTDOWN;
+  read_data.proc(&read_data, NULL, 0, v.buf);
   varbuffree(&v);
   return ret;
 }
 
-ssize_t buffer_md5_setup(void *argIn, int typeIn, void *procIn,
-		      unsigned char hash[33], ssize_t limit, const char *desc, ...)
-{
-  struct MD5Context ctx;
-  struct buffer_data read_data = { procIn, argIn, typeIn },
-		     write_data = { buffer_write, &ctx, BUFFER_WRITE_MD5 };
-  va_list al;
-  struct varbuf v;
-  int ret, i;
-  unsigned char digest[16], *p = digest;
-
-  varbufinit(&v);
-
-  va_start(al,desc);
-  varbufvprintf(&v, desc, al);
-  va_end(al);
-
-  if ( procIn == NULL )
-    read_data.proc = buffer_read;
-  MD5Init(&ctx);
-  ret = buffer_copy(&read_data, &write_data, limit, v.buf);
-  MD5Final(digest, &ctx);
-  for (i = 0; i < 16; ++i) {
-    sprintf(hash, "%02x", *p++);
-    hash += 2;
-  }
-  varbuffree(&v);
-  return ret;
-}
-
-
 ssize_t buffer_copy(buffer_data_t read_data, buffer_data_t write_data, ssize_t limit, char *desc) {
   char *buf, *writebuf;
   long bytesread= 0, byteswritten= 0;

+ 12 - 17
po/dpkg.pot

@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-12-24 23:33-0600\n"
+"POT-Creation-Date: 2000-12-25 00:29-0600\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -452,52 +452,47 @@ msgstr ""
 msgid "wait for %s failed"
 msgstr ""
 
-#: lib/mlib.c:140
+#: lib/mlib.c:172
 #, c-format
 msgid "failed in buffer_write(fd) (%i, ret=%i, %s)"
 msgstr ""
 
-#: lib/mlib.c:147
+#: lib/mlib.c:179
 #, c-format
 msgid "eof in buffer_write(stream): %s"
 msgstr ""
 
-#: lib/mlib.c:149
+#: lib/mlib.c:181
 #, c-format
 msgid "error in buffer_write(stream): %s"
 msgstr ""
 
-#: lib/mlib.c:155
+#: lib/mlib.c:187
 #, c-format
 msgid "unknown data type `%i' in buffer_write\n"
 msgstr ""
 
-#: lib/mlib.c:165
+#: lib/mlib.c:203
 #, c-format
 msgid "failed in buffer_read(fd): %s"
 msgstr ""
 
-#: lib/mlib.c:171
-#, c-format
-msgid "eof in buffer_read(stream): %s"
-msgstr ""
-
-#: lib/mlib.c:173
+#: lib/mlib.c:210
 #, c-format
 msgid "error in buffer_read(stream): %s"
 msgstr ""
 
-#: lib/mlib.c:176
+#: lib/mlib.c:213
 #, c-format
 msgid "unknown data type `%i' in buffer_read\n"
 msgstr ""
 
-#: lib/mlib.c:244
+#: lib/mlib.c:260
 #, c-format
 msgid "failed to allocate buffer in buffer_copy (%s)"
 msgstr ""
 
-#: lib/mlib.c:275
+#: lib/mlib.c:291
 #, c-format
 msgid "failed in buffer_copy (%s)"
 msgstr ""
@@ -1299,11 +1294,11 @@ msgid ""
 "`%s')\n"
 msgstr ""
 
-#: main/configure.c:545
+#: main/configure.c:543
 msgid "md5hash"
 msgstr ""
 
-#: main/configure.c:551
+#: main/configure.c:549
 #, c-format
 msgid "dpkg: %s: warning - unable to open conffile %s for hash: %s\n"
 msgstr ""