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

Handle partial reads while reading a pipe

Wichert Akkerman лет назад: 25
Родитель
Сommit
018600d208
2 измененных файлов с 26 добавлено и 2 удалено
  1. 6 0
      ChangeLog
  2. 20 2
      main/archives.c

+ 6 - 0
ChangeLog

@@ -1,3 +1,9 @@
+Sun May  6 13:20:07 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
+
+  * main/archives.c: add safe_read() to read from a pipe and deal
+    with partial reads. Modify tarobject() and tarfileread() to use
+    those.
+
 Sat May  5 00:49:31 CEST 2001 Wichert Akkerman <wakkerma@debian.org>
 
   * pl/cs.po: Updated

+ 20 - 2
main/archives.c

@@ -109,6 +109,24 @@ quote_filename(char *buf, int size, char *s)
 
 }
 
+/* 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;
+}
+
 int filesavespackage(struct fileinlist *file, struct pkginfo *pkgtobesaved,
                      struct pkginfo *pkgbeinginstalled) {
   struct pkginfo *divpkg, *thirdpkg;
@@ -180,7 +198,7 @@ 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= read(tc->backendpipe,buf,len)) == -1)
+  if ((r= safe_read(tc->backendpipe,buf,len)) == -1)
     ohshite(_("error reading from dpkg-deb pipe"));
   return r;
 }
@@ -469,7 +487,7 @@ int tarobject(struct TarInfo *ti) {
     fd_fd_copy(tc->backendpipe, fd, ti->Size, _("backend dpkg-deb during `%.255s'"),quote_filename(fnamebuf,256,ti->Name));
     }
     r= ti->Size % TARBLKSZ;
-    if (r > 0) r= read(tc->backendpipe,databuf,TARBLKSZ - r);
+    if (r > 0) r= safe_read(tc->backendpipe,databuf,TARBLKSZ - r);
     if (nifd->namenode->statoverride) 
       debug(dbg_eachfile, "tarobject ... stat override, uid=%d, gid=%d, mode=%04o",
 			  nifd->namenode->statoverride->uid,