From 0aff2284b60cfc3ed1b3d49d38fb22cd8802efa8 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Thu, 18 Aug 2011 01:09:52 +0200 Subject: pkg: fix issue #79 --- sys/src/cmd/pkg/install | 8 ++++---- 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