summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pkg/unpkg.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-08-18 01:31:01 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-08-18 01:31:01 +0200
commit50bdbb8f48b7bcfc05f201c4e1bf04d09b76f139 (patch)
treece90d530ca47bb99ea37f8aa7e0675182bc0b7de /sys/src/cmd/pkg/unpkg.c
parent0aff2284b60cfc3ed1b3d49d38fb22cd8802efa8 (diff)
pkg: more fixes
Diffstat (limited to 'sys/src/cmd/pkg/unpkg.c')
-rw-r--r--sys/src/cmd/pkg/unpkg.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/src/cmd/pkg/unpkg.c b/sys/src/cmd/pkg/unpkg.c
index 91fd87ec7..ee348ee36 100644
--- a/sys/src/cmd/pkg/unpkg.c
+++ b/sys/src/cmd/pkg/unpkg.c
@@ -56,6 +56,7 @@ void main(int argc, char *argv[]) {
struct th th;
ulong off;
uchar b[512];
+ char err[ERRMAX];
DigestState *s;
int r, wfd;
@@ -76,13 +77,18 @@ void main(int argc, char *argv[]) {
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];