diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-18 01:31:01 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-18 01:31:01 +0200 |
commit | 50bdbb8f48b7bcfc05f201c4e1bf04d09b76f139 (patch) | |
tree | ce90d530ca47bb99ea37f8aa7e0675182bc0b7de /sys/src/cmd/pkg/unpkg.c | |
parent | 0aff2284b60cfc3ed1b3d49d38fb22cd8802efa8 (diff) |
pkg: more fixes
Diffstat (limited to 'sys/src/cmd/pkg/unpkg.c')
-rw-r--r-- | sys/src/cmd/pkg/unpkg.c | 20 |
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]; |