summaryrefslogtreecommitdiff
path: root/sys/src/cmd/pkg
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-05-05 16:07:24 +0300
committerTaru Karttunen <taruti@taruti.net>2011-05-05 16:07:24 +0300
commit843b25665fa21d578b043c6b961b05c6cc360005 (patch)
treec5eb185bab5bac9e9d2294fa7330e836e84eed5b /sys/src/cmd/pkg
parenta895a7593c66b53400d47bf9bfc671de2f7b73cb (diff)
Add pkg/*
Diffstat (limited to 'sys/src/cmd/pkg')
-rwxr-xr-xsys/src/cmd/pkg/create21
-rwxr-xr-xsys/src/cmd/pkg/install12
-rwxr-xr-xsys/src/cmd/pkg/list3
-rw-r--r--sys/src/cmd/pkg/mkfile20
-rwxr-xr-xsys/src/cmd/pkg/remove18
-rw-r--r--sys/src/cmd/pkg/unpkg.c100
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);
+ }
+}