Browse Source

Plan 9 from Bell Labs 2007-07-03

David du Colombier 17 years ago
parent
commit
bc118dfc6f

+ 9 - 4
dist/replica/_plan9.db

@@ -12823,7 +12823,7 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183184540 11853
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183184528 22430
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
 sys/src/cmd/ndb/dn.c - 664 sys sys 1183184500 35208
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1178508075 3140
@@ -12834,7 +12834,7 @@ sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1175901160 4392
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
 sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1183184439 7440
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183184635 5325
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183406741 5366
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984
@@ -13504,14 +13504,14 @@ sys/src/cmd/tapefs/fs.c - 664 sys sys 1141003366 9887
 sys/src/cmd/tapefs/mkfile - 664 sys sys 1097914131 254
 sys/src/cmd/tapefs/tapefs.h - 664 sys sys 1140966413 1815
 sys/src/cmd/tapefs/tapfs.c - 664 sys sys 1140814624 1924
-sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1141003342 2759
+sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1183421287 4542
 sys/src/cmd/tapefs/tpfs.c - 664 sys sys 1140814810 1999
 sys/src/cmd/tapefs/util.c - 664 sys sys 1140966088 2964
 sys/src/cmd/tapefs/v10fs.c - 664 sys sys 1166887348 4096
 sys/src/cmd/tapefs/v6fs.c - 664 sys sys 1140814625 3993
 sys/src/cmd/tapefs/zip.h - 664 sys sys 1097914153 1428
 sys/src/cmd/tapefs/zipfs.c - 664 sys sys 1140814625 6588
-sys/src/cmd/tar.c - 664 sys sys 1169092124 25725
+sys/src/cmd/tar.c - 664 sys sys 1183409751 25727
 sys/src/cmd/tbl - 20000000775 sys sys 1039727580 0
 sys/src/cmd/tbl/mkfile - 664 sys sys 944961243 268
 sys/src/cmd/tbl/t.h - 664 sys sys 944961244 3987
@@ -15844,3 +15844,8 @@ usr/glenda/lib/profile - 664 glenda glenda 1105128663 890
 usr/glenda/readme.acme - 664 glenda glenda 1019860628 4753
 usr/glenda/readme.rio - 664 glenda glenda 1019860628 6370
 usr/glenda/tmp - 20000000775 glenda glenda 1018802620 0
+386/bin/fs/tarfs - 775 sys sys 1183433212 96282
+386/bin/ndb/dns - 775 sys sys 1183433213 289862
+386/bin/ndb/dnsdebug - 775 sys sys 1183433213 264795
+386/bin/ndb/dnstcp - 775 sys sys 1183433214 263238
+386/bin/tar - 775 sys sys 1183433215 94751

+ 9 - 9
dist/replica/plan9.db

@@ -246,7 +246,7 @@
 386/bin/fs/32vfs - 775 sys sys 1178568272 94157
 386/bin/fs/cpiofs - 775 sys sys 1178568273 92917
 386/bin/fs/tapfs - 775 sys sys 1178568273 95279
-386/bin/fs/tarfs - 775 sys sys 1178568273 94928
+386/bin/fs/tarfs - 775 sys sys 1183433212 96282
 386/bin/fs/tpfs - 775 sys sys 1178568274 92470
 386/bin/fs/v10fs - 775 sys sys 1178568274 94797
 386/bin/fs/v6fs - 775 sys sys 1178568274 93881
@@ -343,10 +343,10 @@
 386/bin/ndb - 20000000775 sys sys 985743147 0
 386/bin/ndb/cs - 775 sys sys 1182283129 149052
 386/bin/ndb/csquery - 775 sys sys 1176488418 61652
-386/bin/ndb/dns - 775 sys sys 1183233470 289845
-386/bin/ndb/dnsdebug - 775 sys sys 1183233471 264781
+386/bin/ndb/dns - 775 sys sys 1183433213 289862
+386/bin/ndb/dnsdebug - 775 sys sys 1183433213 264795
 386/bin/ndb/dnsquery - 775 sys sys 1174704818 64417
-386/bin/ndb/dnstcp - 775 sys sys 1183233472 263224
+386/bin/ndb/dnstcp - 775 sys sys 1183433214 263238
 386/bin/ndb/ipquery - 775 sys sys 1178568296 95524
 386/bin/ndb/mkdb - 775 sys sys 1168402340 64211
 386/bin/ndb/mkhash - 775 sys sys 1178568296 83312
@@ -424,7 +424,7 @@
 386/bin/swap - 775 sys sys 1168402350 62373
 386/bin/syscall - 775 sys sys 1178568305 73944
 386/bin/tail - 775 sys sys 1168402351 66406
-386/bin/tar - 775 sys sys 1169151814 94824
+386/bin/tar - 775 sys sys 1183433215 94751
 386/bin/tbl - 775 sys sys 1176520501 113420
 386/bin/tcs - 775 sys sys 1176520502 320129
 386/bin/tee - 775 sys sys 1148500692 38463
@@ -12823,7 +12823,7 @@ sys/src/cmd/ndb/convDNS2M.c - 664 sys sys 1182554015 7035
 sys/src/cmd/ndb/convM2DNS.c - 664 sys sys 1183184540 11853
 sys/src/cmd/ndb/cs.c - 664 sys sys 1182275681 33213
 sys/src/cmd/ndb/csquery.c - 664 sys sys 1174626119 1073
-sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183184528 22430
+sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
 sys/src/cmd/ndb/dn.c - 664 sys sys 1183184500 35208
 sys/src/cmd/ndb/dnarea.c - 664 sys sys 1175664421 2519
 sys/src/cmd/ndb/dnnotify.c - 664 sys sys 1178508075 3140
@@ -12834,7 +12834,7 @@ sys/src/cmd/ndb/dnsdebug.c - 664 sys sys 1183184428 8754
 sys/src/cmd/ndb/dnserver.c - 664 sys sys 1175901160 4392
 sys/src/cmd/ndb/dnsquery.c - 664 sys sys 1174626126 2435
 sys/src/cmd/ndb/dnstcp.c - 664 sys sys 1183184439 7440
-sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183184635 5325
+sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183406741 5366
 sys/src/cmd/ndb/ipquery.c - 664 sys sys 1124711423 773
 sys/src/cmd/ndb/mkdb.c - 664 sys sys 957402054 2886
 sys/src/cmd/ndb/mkfile - 664 sys sys 1174623575 1984
@@ -13504,14 +13504,14 @@ sys/src/cmd/tapefs/fs.c - 664 sys sys 1141003366 9887
 sys/src/cmd/tapefs/mkfile - 664 sys sys 1097914131 254
 sys/src/cmd/tapefs/tapefs.h - 664 sys sys 1140966413 1815
 sys/src/cmd/tapefs/tapfs.c - 664 sys sys 1140814624 1924
-sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1141003342 2759
+sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1183421287 4542
 sys/src/cmd/tapefs/tpfs.c - 664 sys sys 1140814810 1999
 sys/src/cmd/tapefs/util.c - 664 sys sys 1140966088 2964
 sys/src/cmd/tapefs/v10fs.c - 664 sys sys 1166887348 4096
 sys/src/cmd/tapefs/v6fs.c - 664 sys sys 1140814625 3993
 sys/src/cmd/tapefs/zip.h - 664 sys sys 1097914153 1428
 sys/src/cmd/tapefs/zipfs.c - 664 sys sys 1140814625 6588
-sys/src/cmd/tar.c - 664 sys sys 1169092124 25725
+sys/src/cmd/tar.c - 664 sys sys 1183409751 25727
 sys/src/cmd/tbl - 20000000775 sys sys 1039727580 0
 sys/src/cmd/tbl/mkfile - 664 sys sys 944961243 268
 sys/src/cmd/tbl/t.h - 664 sys sys 944961244 3987

+ 10 - 0
dist/replica/plan9.log

@@ -49411,3 +49411,13 @@
 1183260623 1 c sys/man/1/INDEX - 664 sys sys 1183260468 3139
 1183260623 2 c sys/man/3/INDEX - 664 sys sys 1183260468 377
 1183260623 3 c sys/man/8/INDEX - 664 sys sys 1183260468 2773
+1183408223 0 c sys/src/cmd/ndb/dblookup.c - 664 sys sys 1183406703 22445
+1183408223 1 c sys/src/cmd/ndb/dnudpserver.c - 664 sys sys 1183406741 5366
+1183410022 0 c sys/src/cmd/tar.c - 664 sys sys 1183409751 25727
+1183419023 0 c sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1183418804 4680
+1183422623 0 c sys/src/cmd/tapefs/tarfs.c - 664 sys sys 1183421287 4542
+1183433423 0 c 386/bin/fs/tarfs - 775 sys sys 1183433212 96282
+1183433423 1 c 386/bin/ndb/dns - 775 sys sys 1183433213 289862
+1183433423 2 c 386/bin/ndb/dnsdebug - 775 sys sys 1183433213 264795
+1183433423 3 c 386/bin/ndb/dnstcp - 775 sys sys 1183433214 263238
+1183433423 4 c 386/bin/tar - 775 sys sys 1183433215 94751

+ 1 - 0
sys/src/cmd/ndb/dblookup.c

@@ -1035,6 +1035,7 @@ createptrs(void)
 				continue;
 			}
 			parseipmask(mask, nt->val);
+			ndbfree(t);
 			n = 5;
 			break;
 		default:

+ 6 - 2
sys/src/cmd/ndb/dnudpserver.c

@@ -3,6 +3,10 @@
 #include <ip.h>
 #include "dns.h"
 
+enum {
+	Logqueries = 0,
+};
+
 static int	udpannounce(char*);
 static void	reply(int, uchar*, DNSmsg*, Request*);
 
@@ -129,7 +133,7 @@ restart:
 			/* first bytes in buf are source IP addr */
 			dnslog("server: input error: %s from %I", err, buf);
 			free(err);
-			continue;
+			goto freereq;
 		}
 		if (rcode == 0)
 			if(reqmsg.qdcount < 1){
@@ -159,7 +163,7 @@ restart:
 			goto freereq;
 		}
 
-		if (0) {
+		if (Logqueries) {
 			RR *rr;
 
 			for (rr = reqmsg.qd; rr; rr = rr->next)

+ 155 - 67
sys/src/cmd/tapefs/tarfs.c

@@ -1,90 +1,174 @@
+/*
+ * File system for tar archives (read-only)
+ */
+
 #include <u.h>
 #include <libc.h>
 #include <auth.h>
 #include <fcall.h>
 #include "tapefs.h"
 
+/* fundamental constants */
+enum {
+	Tblock = 512,
+	Namsiz = 100,
+	Maxpfx = 155,		/* from POSIX */
+	Maxname = Namsiz + 1 + Maxpfx,
+	Binsize = 0x80,		/* flag in size[0], from gnu: positive binary size */
+	Binnegsz = 0xff,	/* flag in size[0]: negative binary size */
+};
+
+/* POSIX link flags */
+enum {
+	LF_PLAIN1 =	'\0',
+	LF_PLAIN2 =	'0',
+	LF_LINK =	'1',
+	LF_SYMLINK1 =	'2',
+	LF_SYMLINK2 =	's',		/* 4BSD used this */
+	LF_CHR =	'3',
+	LF_BLK =	'4',
+	LF_DIR =	'5',
+	LF_FIFO =	'6',
+	LF_CONTIG =	'7',
+	/* 'A' - 'Z' are reserved for custom implementations */
+};
+
+typedef union {
+	char	dummy[Tblock];
+	char	tbuf[Maxbuf];
+	struct Header {
+		char	name[Namsiz];
+		char	mode[8];
+		char	uid[8];
+		char	gid[8];
+		char	size[12];
+		char	mtime[12];
+		char	chksum[8];
+		char	linkflag;
+		char	linkname[Namsiz];
+
+		/* rest are defined by POSIX's ustar format; see p1003.2b */
+		char	magic[6];	/* "ustar" */
+		char	version[2];
+		char	uname[32];
+		char	gname[32];
+		char	devmajor[8];
+		char	devminor[8];
+		char	prefix[Maxpfx]; /* if non-null, path= prefix "/" name */
+	};
+} Hdr;
+
+Hdr dblock;
+int tapefile;
+
+int	checksum(void);
+
+static int
+isustar(Hdr *hp)
+{
+	return strcmp(hp->magic, "ustar") == 0;
+}
+
 /*
- * File system for tar tapes (read-only)
+ * s is at most n bytes long, but need not be NUL-terminated.
+ * if shorter than n bytes, all bytes after the first NUL must also
+ * be NUL.
  */
+static int
+strnlen(char *s, int n)
+{
+	return s[n - 1] != '\0'? n: strlen(s);
+}
 
-#define TBLOCK	512
-#define NBLOCK	40	/* maximum blocksize */
-#define DBLOCK	20	/* default blocksize */
-#define TNAMSIZ	100
-
-union hblock {
-	char dummy[TBLOCK];
-	char tbuf[Maxbuf];
-	struct header {
-		char name[TNAMSIZ];
-		char mode[8];
-		char uid[8];
-		char gid[8];
-		char size[12];
-		char mtime[12];
-		char chksum[8];
-		char linkflag;
-		char linkname[TNAMSIZ];
-	} dbuf;
-} dblock;
-
-int	tapefile;
-int	checksum(void);
+/* set fullname from header */
+static char *
+tarname(Hdr *hp)
+{
+	int pfxlen, namlen;
+	static char fullname[Maxname+1];
+
+	namlen = strnlen(hp->name, sizeof hp->name);
+	if (hp->prefix[0] == '\0' || !isustar(hp)) {	/* old-style name? */
+		memmove(fullname, hp->name, namlen);
+		fullname[namlen] = '\0';
+		return fullname;
+	}
+
+	/* posix name: name is in two pieces */
+	pfxlen = strnlen(hp->prefix, sizeof hp->prefix);
+	memmove(fullname, hp->prefix, pfxlen);
+	fullname[pfxlen] = '/';
+	memmove(fullname + pfxlen + 1, hp->name, namlen);
+	fullname[pfxlen + 1 + namlen] = '\0';
+	return fullname;
+}
 
 void
 populate(char *name)
 {
-	long blkno, isabs, chksum, linkflg;
+	long chksum, linkflg;
+	vlong blkno;
+	char *fname;
 	Fileinf f;
+	Hdr *hp;
 
 	tapefile = open(name, OREAD);
-	if (tapefile<0)
+	if (tapefile < 0)
 		error("Can't open argument file");
 	replete = 1;
-	for (blkno = 0;;) {
-		seek(tapefile, TBLOCK*blkno, 0);
-		if (read(tapefile, dblock.dummy, sizeof(dblock.dummy))<sizeof(dblock.dummy))
+	hp = &dblock;
+	for (blkno = 0; ; blkno++) {
+		seek(tapefile, Tblock*blkno, 0);
+		if (readn(tapefile, hp->dummy, sizeof hp->dummy) < sizeof hp->dummy)
 			break;
-		if (dblock.dbuf.name[0]=='\0')
+		fname = tarname(hp);
+		if (fname[0] == '\0')
 			break;
-		f.addr = blkno+1;
-		f.mode = strtoul(dblock.dbuf.mode, 0, 8);
-		f.uid = strtoul(dblock.dbuf.uid, 0, 8);
-		f.gid = strtoul(dblock.dbuf.gid, 0, 8);
-		if((uchar)dblock.dbuf.size[0] == 0x80)
-			f.size = b8byte(dblock.dbuf.size+3);
+
+		/* crack header */
+		f.addr = blkno + 1;
+		f.mode = strtoul(hp->mode, 0, 8);
+		f.uid  = strtoul(hp->uid, 0, 8);
+		f.gid  = strtoul(hp->gid, 0, 8);
+		if((uchar)hp->size[0] == 0x80)
+			f.size = b8byte(hp->size+3);
 		else
-			f.size = strtoull(dblock.dbuf.size, 0, 8);
-		f.mdate = strtoul(dblock.dbuf.mtime, 0, 8);
-		chksum = strtoul(dblock.dbuf.chksum, 0, 8);
+			f.size = strtoull(hp->size, 0, 8);
+		f.mdate = strtoul(hp->mtime, 0, 8);
+		chksum  = strtoul(hp->chksum, 0, 8);
 		/* the mode test is ugly but sometimes necessary */
-		if (dblock.dbuf.linkflag == '5'
-		|| (f.mode&0170000) == 040000
-		||  strrchr(dblock.dbuf.name, '\0')[-1] == '/'){
+		if (hp->linkflag == LF_DIR || (f.mode&0170000) == 040000 ||
+		    strrchr(fname, '\0')[-1] == '/'){
 			f.mode |= DMDIR;
 			f.size = 0;
 		}
-		f.mode &= DMDIR|0777;
-		linkflg = dblock.dbuf.linkflag=='s' || dblock.dbuf.linkflag=='1';
-		isabs = dblock.dbuf.name[0]=='/';
+		f.mode &= DMDIR | 0777;
+
+		/* make file name safe and canonical */
+		while (fname[0] == '/')		/* don't allow absolute paths */
+			++fname;
+		cleanname(fname);
+
+		/* reject links */
+		linkflg = hp->linkflag == LF_SYMLINK1 ||
+			hp->linkflag == LF_SYMLINK2 || hp->linkflag == LF_LINK;
 		if (chksum != checksum()){
-			fprint(1, "bad checksum on %.28s\n", dblock.dbuf.name);
+			fprint(2, "%s: bad checksum on %.28s at offset %lld\n",
+				argv0, fname, Tblock*blkno);
 			exits("checksum");
 		}
 		if (linkflg) {
-			/*fprint(2, "link %s->%s skipped\n", dblock.dbuf.name,
-			   dblock.dbuf.linkname);*/
+			/*fprint(2, "link %s->%s skipped\n", fname, hp->linkname);*/
 			f.size = 0;
-			blkno += 1;
-			continue;
+		} else {
+			/* accept this file */
+			f.name = fname;
+			if (f.name[0] == '\0')
+				fprint(2, "%s: null name skipped\n", argv0);
+			else
+				poppath(f, 1);
+			blkno += (f.size + Tblock - 1)/Tblock;
 		}
-		f.name = dblock.dbuf.name+isabs;
-		if (f.name[0]=='\0')
-			fprint(1, "null name skipped\n");
-		else
-			poppath(f, 1);
-		blkno += 1 + (f.size+TBLOCK-1)/TBLOCK;
 	}
 }
 
@@ -103,10 +187,14 @@ docreate(Ram *r)
 char *
 doread(Ram *r, vlong off, long cnt)
 {
-	seek(tapefile, TBLOCK*r->addr+off, 0);
-	if (cnt>sizeof(dblock.tbuf))
+	int n;
+
+	seek(tapefile, Tblock*r->addr + off, 0);
+	if (cnt > sizeof dblock.tbuf)
 		error("read too big");
-	read(tapefile, dblock.tbuf, cnt);
+	n = readn(tapefile, dblock.tbuf, cnt);
+	if (n != cnt)
+		memset(dblock.tbuf + n, 0, cnt - n);
 	return dblock.tbuf;
 }
 
@@ -130,15 +218,15 @@ dopermw(Ram *r)
 }
 
 int
-checksum()
+checksum(void)
 {
-	int i;
-	char *cp;
+	int i, n;
+	uchar *cp;
 
-	for (cp = dblock.dbuf.chksum; cp < &dblock.dbuf.chksum[sizeof(dblock.dbuf.chksum)]; cp++)
-		*cp = ' ';
+	memset(dblock.chksum, ' ', sizeof dblock.chksum);
+	cp = (uchar *)dblock.dummy;
 	i = 0;
-	for (cp = dblock.dummy; cp < &dblock.dummy[TBLOCK]; cp++)
-		i += *cp&0xff;
-	return(i);
+	for (n = Tblock; n-- > 0; )
+		i += *cp++;
+	return i;
 }

+ 1 - 1
sys/src/cmd/tar.c

@@ -888,7 +888,7 @@ prefix(char *name, char *pfx)
 		return 0;
 	strcpy(clpfx, pfx);
 	cleanname(clpfx);
-	return strncmp(pfx, name, pfxlen) == 0 &&
+	return strncmp(clpfx, name, pfxlen) == 0 &&
 		(name[pfxlen] == '\0' || name[pfxlen] == '/');
 }