git: 9front

Download patch

ref: 9bdaed577d3f1725eccbdeaaf1bde79e5b2f8990
parent: 97db7ab3660e6f322e33682e5424bd97f21cbd6b
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Wed Aug 17 21:31:01 EDT 2011

pkg: more fixes

--- a/sys/src/cmd/pkg/install
+++ b/sys/src/cmd/pkg/install
@@ -6,7 +6,7 @@
 cd /
 mkdir -p /sys/lib/pkg
 if (test -s /sys/lib/pkg/$1) {
-	echo $i already installed
+	echo $1 already installed
 	exit
 }
 echo Installing $1
--- a/sys/src/cmd/pkg/unpkg.c
+++ b/sys/src/cmd/pkg/unpkg.c
@@ -56,6 +56,7 @@
 	struct th th;
 	ulong off;
 	uchar b[512];
+	char err[ERRMAX];
 	DigestState *s;
 	int r, wfd;
 
@@ -76,13 +77,18 @@
 			sysfatal("%r", th.name);
 		s = nil;
 		for(off=0; off<th.size; off+=512) {
-			int n = th.size-off;
-			n = n<512 ? n : 512;
-			if(readn(0, b, 512) != 512)
-				sysfatal("%r");
-			if(write(wfd, b, n) != n)
-				sysfatal("%s: %r", th.name);
-			s = sha1(b, n, nil, s);
+			if(readn(0, b, 512) == 512){
+				if((r = th.size-off) > 512)
+					r = 512;
+				if(write(wfd, b, r) == r){
+					s = sha1(b, r, nil, s);
+					continue;
+				}
+			}
+			errstr(err, sizeof(err));
+			remove(th.name);
+			errstr(err, sizeof(err));
+			sysfatal("%s: %r", th.name);
 		}
 
 		uchar digest[20], hdigest[41];
--