summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pkg
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@centraldogma>2011-08-18 01:09:52 +0200
committercinap_lenrek <cinap_lenrek@centraldogma>2011-08-18 01:09:52 +0200
commit0aff2284b60cfc3ed1b3d49d38fb22cd8802efa8 (patch)
tree9746f104e8cba35257fdb0a63033c88f8cd08288 /sys/src/cmd/pkg
parent925ac75c2c500e836bf179cb00e5967236cc8e8b (diff)
pkg: fix issue #79
Diffstat (limited to 'sys/src/cmd/pkg')
-rwxr-xr-xsys/src/cmd/pkg/install8
-rw-r--r--sys/src/cmd/pkg/unpkg.c52
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);