pkg: fix issue #79
This commit is contained in:
parent
925ac75c2c
commit
0aff2284b6
2 changed files with 31 additions and 29 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue