diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-18 01:09:52 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-08-18 01:09:52 +0200 |
commit | 0aff2284b60cfc3ed1b3d49d38fb22cd8802efa8 (patch) | |
tree | 9746f104e8cba35257fdb0a63033c88f8cd08288 /sys/src/cmd/pkg | |
parent | 925ac75c2c500e836bf179cb00e5967236cc8e8b (diff) |
pkg: fix issue #79
Diffstat (limited to 'sys/src/cmd/pkg')
-rwxr-xr-x | sys/src/cmd/pkg/install | 8 | ||||
-rw-r--r-- | sys/src/cmd/pkg/unpkg.c | 52 |
2 files changed, 31 insertions, 29 deletions
diff --git a/sys/src/cmd/pkg/install b/sys/src/cmd/pkg/install index fe9a18949..99afc4e8f 100755 --- a/sys/src/cmd/pkg/install +++ b/sys/src/cmd/pkg/install @@ -1,4 +1,4 @@ -#!/bin/rc -e +#!/bin/rc if(~ $#pkgpath 0) pkgpath=http://pkg.violetti.org/$cputype @@ -14,6 +14,6 @@ if(~ $pkgpath ftp* http*) cmd=hget if not cmd=cat -$cmd $pkgpath/$1.tbz | bunzip2 | pkg/unpkg>[2]/sys/lib/pkg/$1 -echo Done - +if(! $cmd $pkgpath/$1.tbz | bunzip2 | pkg/unpkg >/sys/lib/pkg/$1) + if(! test -s /sys/lib/pkg/$1) + rm -f /sys/lib/pkg/$1 diff --git a/sys/src/cmd/pkg/unpkg.c b/sys/src/cmd/pkg/unpkg.c index 2c749e3b3..91fd87ec7 100644 --- a/sys/src/cmd/pkg/unpkg.c +++ b/sys/src/cmd/pkg/unpkg.c @@ -23,23 +23,24 @@ static char *sndup(char* s, ulong n) { } -int readheader(int fd, struct th* th) { +int readheader(struct th* th) { int i; char b[512]; - if(readn(fd, b, 512) != 512) return -1; + + if(readn(0, b, 512) != 512) return -1; // Check for end of archive for(i=0; i<512; i++) { if(b[i]!=0) goto rhok; } - if(readn(fd, b, 512) != 512) return -1; + if(readn(0, b, 512) != 512) return -1; for(i=0; i<512; i++) { if(b[i]!=0) return -1; } return 0; rhok: - th->name = sndup(b, 100); + th->name = cleanname(sndup(b, 100)); th->perm = strtoul(b+100, nil, 8); th->size = strtoul(b+124, nil, 8); th->type = b[156]; @@ -48,49 +49,50 @@ int readheader(int fd, struct th* th) { return 1; } -int main(void) { - while(1) { +void main(int argc, char *argv[]) { + ARGBEGIN { + } ARGEND; + for(;;) { struct th th; ulong off; uchar b[512]; DigestState *s; - int wfd; - int r = readheader(0, &th); - if(r <= 0) return r; + int r, wfd; + r = readheader(&th); + if(r == 0) + exits(nil); + if(r < 0) + sysfatal("unexpected eof"); + switch(th.type) { case '5': - create(th.name, OREAD, DMDIR|th.perm); + if((wfd = create(th.name, OREAD, DMDIR|th.perm)) >= 0) + close(wfd); break; case '0': case 0: - print("A %s\n", th.name); - r = access(th.name, 0); - if(r == 0) { - print("File already exists: %s\n", th.name); - return -1; - } - if((wfd = create(th.name, OWRITE, th.perm)) < 0) { - print("Create failed: %s\n", th.name); - return -1; - } + fprint(2, "A %s\n", th.name); + if((wfd = create(th.name, OWRITE|OEXCL, th.perm)) < 0) + 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) return -1; - if(write(wfd, b, n) != n) return -1; + 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); } uchar digest[20], hdigest[41]; sha1(nil, 0, digest, s); enc16((char*)hdigest, 41, digest, 20); - fprint(2, "%s\t%s\n", th.name, hdigest); + print("%s\t%s\n", th.name, hdigest); close(wfd); break; default: - print("Unknown file type '%c'\n", th.type); - return -1; + sysfatal("Unknown file type '%c'", th.type); } free(th.name); |