diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-05-05 16:07:24 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-05-05 16:07:24 +0300 |
commit | 843b25665fa21d578b043c6b961b05c6cc360005 (patch) | |
tree | c5eb185bab5bac9e9d2294fa7330e836e84eed5b /sys/src/cmd/pkg | |
parent | a895a7593c66b53400d47bf9bfc671de2f7b73cb (diff) |
Add pkg/*
Diffstat (limited to 'sys/src/cmd/pkg')
-rwxr-xr-x | sys/src/cmd/pkg/create | 21 | ||||
-rwxr-xr-x | sys/src/cmd/pkg/install | 12 | ||||
-rwxr-xr-x | sys/src/cmd/pkg/list | 3 | ||||
-rw-r--r-- | sys/src/cmd/pkg/mkfile | 20 | ||||
-rwxr-xr-x | sys/src/cmd/pkg/remove | 18 | ||||
-rw-r--r-- | sys/src/cmd/pkg/unpkg.c | 100 |
6 files changed, 174 insertions, 0 deletions
diff --git a/sys/src/cmd/pkg/create b/sys/src/cmd/pkg/create new file mode 100755 index 000000000..ec350e731 --- /dev/null +++ b/sys/src/cmd/pkg/create @@ -0,0 +1,21 @@ +#!/bin/rc -e + +i=`{basename $1} +d=$1 +echo Creating $i +C=`{pwd} +@{ +rfork en +cd $d +mkdir /tmp/$i +mk +divergefs -p /tmp/$i / +mk install clean +unmount / +} +cd /tmp/$i/files +rm -r env +tar cv * | bzip2 -9 > $C/$i.tbz +cd /tmp +rm -r $i +echo Created $C/$i.tbz diff --git a/sys/src/cmd/pkg/install b/sys/src/cmd/pkg/install new file mode 100755 index 000000000..7bc228c8f --- /dev/null +++ b/sys/src/cmd/pkg/install @@ -0,0 +1,12 @@ +#!/bin/rc -e + +cd / +mkdir -p /sys/lib/pkg +if (test -s /sys/lib/pkg/$1) { + echo $i already installed + exit +} +echo Installing $1 +hget http://pkg.violetti.org/$cputype/$1.tbz | bunzip2 | pkg/unpkg>[2]/sys/lib/pkg/$1 +echo Done + diff --git a/sys/src/cmd/pkg/list b/sys/src/cmd/pkg/list new file mode 100755 index 000000000..419e47a52 --- /dev/null +++ b/sys/src/cmd/pkg/list @@ -0,0 +1,3 @@ +#!/bin/rc + +hget http://pkg.violetti.org/$cputype | htmlfmt | grep '\.tbz' | sed -e 's/\.tbz$//' diff --git a/sys/src/cmd/pkg/mkfile b/sys/src/cmd/pkg/mkfile new file mode 100644 index 000000000..eb206806e --- /dev/null +++ b/sys/src/cmd/pkg/mkfile @@ -0,0 +1,20 @@ +</$objtype/mkfile + +all: $O.unpkg + echo + +$O.unpkg: unpkg.c + $CC unpkg.c + $LD -o $O.unpkg unpkg.$O + +install:V: $O.unpkg + mkdir -p /$objtype/bin/pkg + cp $O.unpkg /$objtype/bin/pkg/unpkg + cp create install list remove /$objtype/bin/pkg + +clean: + rm -f $O.unpkg *.$O + +nuke: clean + rm -f /$objtype/bin/pkg/* + diff --git a/sys/src/cmd/pkg/remove b/sys/src/cmd/pkg/remove new file mode 100755 index 000000000..349d18410 --- /dev/null +++ b/sys/src/cmd/pkg/remove @@ -0,0 +1,18 @@ +#!/bin/rc -e + +cd / +if(test -s /sys/lib/pkg/$1) { + fs=(`{cat /sys/lib/pkg/$1 | awk '{print $1}'}) + ss=(`{cat /sys/lib/pkg/$1 | awk '{print $2}'}) + for(i in `{seq $#fs}) { + s=`{sha1sum $fs($i) | awk '{print $1}' | tr a-z A-Z} + if(test $s '=' $ss($i)) { + echo D $fs($i) + rm $fs($i) + } + if not { + echo M $fs($i) NOT DELETING + } + } + rm /sys/lib/pkg/$1 +} diff --git a/sys/src/cmd/pkg/unpkg.c b/sys/src/cmd/pkg/unpkg.c new file mode 100644 index 000000000..2c749e3b3 --- /dev/null +++ b/sys/src/cmd/pkg/unpkg.c @@ -0,0 +1,100 @@ +#include <u.h> +#include <libc.h> +#include <mp.h> +#include <libsec.h> + +struct th { + char *name; + ulong perm; + ulong size; + char type; + char *user, *group; +}; + +static char *sndup(char* s, ulong n) { + char *d, *p; + p = memchr(s, 0, n); + if(p) + n = p-s; + d = malloc(n+1); + memcpy(d,s,n); + d[n] = 0; + return d; +} + + +int readheader(int fd, struct th* th) { + int i; + char b[512]; + if(readn(fd, 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; + for(i=0; i<512; i++) { + if(b[i]!=0) return -1; + } + return 0; + + rhok: + th->name = sndup(b, 100); + th->perm = strtoul(b+100, nil, 8); + th->size = strtoul(b+124, nil, 8); + th->type = b[156]; + th->user = sndup(b+265, 32); + th->group= sndup(b+297, 32); + return 1; +} + +int main(void) { + while(1) { + struct th th; + ulong off; + uchar b[512]; + DigestState *s; + int wfd; + int r = readheader(0, &th); + if(r <= 0) return r; + + switch(th.type) { + case '5': + create(th.name, OREAD, DMDIR|th.perm); + 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; + } + 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; + 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); + close(wfd); + break; + default: + print("Unknown file type '%c'\n", th.type); + return -1; + } + + free(th.name); + free(th.user); + free(th.group); + } +} |