Bläddra i källkod

Use fdio instead of ad-hoc code to handle interrupted I/O

Guillem Jover 15 år sedan
förälder
incheckning
5d74139fda
4 ändrade filer med 28 tillägg och 60 borttagningar
  1. 4 6
      dpkg-deb/build.c
  2. 14 22
      lib/dpkg/buffer.c
  3. 4 9
      lib/dpkg/log.c
  4. 6 23
      src/archives.c

+ 4 - 6
dpkg-deb/build.c

@@ -40,6 +40,7 @@
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
 #include <dpkg/path.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 #include <dpkg/subproc.h>
 #include <dpkg/compress.h>
@@ -114,12 +115,9 @@ file_info_get(const char *root, int fd)
       fnlen += MAXFILENAME;
       fn = m_realloc(fn, fnlen);
     }
-    if ((res=read(fd, (fn+i), sizeof(*fn)))<0) {
-      if ((errno==EINTR) || (errno==EAGAIN))
-	continue;
-      else
-	return NULL;
-    }
+    res = fd_read(fd, (fn + i), sizeof(*fn));
+    if (res < 0)
+      return NULL;
     if (res == 0) /* EOF -> parent died. */
       return NULL;
     if (fn[i] == '\0')

+ 14 - 22
lib/dpkg/buffer.c

@@ -34,6 +34,7 @@
 #include <dpkg/dpkg.h>
 #include <dpkg/varbuf.h>
 #include <dpkg/md5.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 
 struct buffer_write_md5ctx {
@@ -103,7 +104,7 @@ buffer_write(struct buffer_data *data, const void *buf, off_t length)
 		varbufaddbuf((struct varbuf *)data->arg.ptr, buf, length);
 		break;
 	case BUFFER_WRITE_FD:
-		ret = write(data->arg.i, buf, length);
+		ret = fd_write(data->arg.i, buf, length);
 		break;
 	case BUFFER_WRITE_NULL:
 		break;
@@ -125,7 +126,7 @@ buffer_read(struct buffer_data *data, void *buf, off_t length)
 
 	switch (data->type) {
 	case BUFFER_READ_FD:
-		ret = read(data->arg.i, buf, length);
+		ret = fd_read(data->arg.i, buf, length);
 		break;
 	default:
 		internerr("unknown data type '%i' in buffer_read\n",
@@ -152,7 +153,7 @@ static off_t
 buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data,
             off_t limit, const char *desc)
 {
-	char *buf, *writebuf;
+	char *buf;
 	int bufsize = 32768;
 	long bytesread = 0, byteswritten = 0;
 	off_t totalread = 0, totalwritten = 0;
@@ -168,35 +169,26 @@ buffer_copy(struct buffer_data *read_data, struct buffer_data *write_data,
 
 	while (bytesread >= 0 && byteswritten >= 0 && bufsize > 0) {
 		bytesread = buffer_read(read_data, buf, bufsize);
-		if (bytesread < 0) {
-			if (errno == EINTR || errno == EAGAIN)
-				continue;
+		if (bytesread < 0)
 			break;
-		}
 		if (bytesread == 0)
 			break;
 
 		totalread += bytesread;
+
 		if (limit != -1) {
 			limit -= bytesread;
 			if (limit < bufsize)
 				bufsize = limit;
 		}
-		writebuf = buf;
-		while (bytesread) {
-			byteswritten = buffer_write(write_data, writebuf, bytesread);
-			if (byteswritten == -1) {
-				if (errno == EINTR || errno == EAGAIN)
-					continue;
-				break;
-			}
-			if (byteswritten == 0)
-				break;
-
-			bytesread -= byteswritten;
-			totalwritten += byteswritten;
-			writebuf += byteswritten;
-		}
+
+		byteswritten = buffer_write(write_data, buf, bytesread);
+		if (byteswritten < 0)
+			break;
+		if (byteswritten == 0)
+			break;
+
+		totalwritten += byteswritten;
 	}
 
 	if (bytesread < 0)

+ 4 - 9
lib/dpkg/log.c

@@ -31,6 +31,7 @@
 #include <dpkg/i18n.h>
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
+#include <dpkg/fdio.h>
 
 const char *log_file = NULL;
 
@@ -95,8 +96,6 @@ statusfd_send(const char *fmt, ...)
 {
 	static struct varbuf vb;
 	struct pipef *pipef;
-	const char *p;
-	int r, l;
 	va_list args;
 
 	if (!status_pipes)
@@ -112,12 +111,8 @@ statusfd_send(const char *fmt, ...)
 	va_end(args);
 
 	for (pipef = status_pipes; pipef; pipef = pipef->next) {
-		for (p = vb.buf, l = vb.used; l;  p += r, l -= r) {
-			r = write(pipef->fd, p, l);
-			if (r < 0)
-				ohshite(_("unable to write to status fd %d"),
-				        pipef->fd);
-			assert(r && r <= l);
-		}
+		if (fd_write(pipef->fd, vb.buf, vb.used) < 0)
+			ohshite(_("unable to write to status fd %d"),
+			        pipef->fd);
 	}
 }

+ 6 - 23
src/archives.c

@@ -44,6 +44,7 @@
 #include <dpkg/dpkg.h>
 #include <dpkg/dpkg-db.h>
 #include <dpkg/path.h>
+#include <dpkg/fdio.h>
 #include <dpkg/buffer.h>
 #include <dpkg/subproc.h>
 #include <dpkg/command.h>
@@ -66,26 +67,6 @@
 struct pkginfo *conflictor[MAXCONFLICTORS];
 int cflict_index = 0;
 
-/**
- * Special routine to handle partial reads from the tarfile.
- */
-static int safe_read(int fd, void *buf, int len)
-{
-  int r, have= 0;
-  char *p = (char *)buf;
-  while (have < len) {
-    if ((r= read(fd,p,len-have))==-1) {
-      if (errno==EINTR || errno==EAGAIN) continue;
-      return r;
-    }
-    if (r==0)
-      break;
-    have+= r;
-    p+= r;
-  }
-  return have;
-}
-
 static inline void
 fd_writeback_init(int fd)
 {
@@ -193,7 +174,9 @@ void cu_pathname(int argc, void **argv) {
 int tarfileread(void *ud, char *buf, int len) {
   struct tarcontext *tc= (struct tarcontext*)ud;
   int r;
-  if ((r= safe_read(tc->backendpipe,buf,len)) == -1)
+
+  r = fd_read(tc->backendpipe, buf, len);
+  if (r < 0)
     ohshite(_("error reading from dpkg-deb pipe"));
   return r;
 }
@@ -214,7 +197,7 @@ tarfile_skip_one_forward(struct tarcontext *tc, struct tar_entry *ti)
                  path_quote_filename(fnamebuf, ti->name, 256));
     r = ti->size % TARBLKSZ;
     if (r > 0)
-      if (safe_read(tc->backendpipe, databuf, TARBLKSZ - r) == -1)
+      if (fd_read(tc->backendpipe, databuf, TARBLKSZ - r) < 0)
         ohshite(_("error reading from dpkg-deb pipe"));
   }
 }
@@ -711,7 +694,7 @@ tarobject(void *ctx, struct tar_entry *ti)
     }
     r = ti->size % TARBLKSZ;
     if (r > 0)
-      if (safe_read(tc->backendpipe, databuf, TARBLKSZ - r) == -1)
+      if (fd_read(tc->backendpipe, databuf, TARBLKSZ - r) < 0)
         ohshite(_("error reading from dpkg-deb pipe"));
 
     fd_writeback_init(fd);