Commit Diff


commit - 3d72637f9b4c42b1fc9b7d95d278ea3dd65c748d
commit + be36ff68854c86247fdc769c0eaa89eb284b5ca7
blob - 9129315b99955acfa20dbddf4cd84a1d5a0e3380
blob + 41624f1d7e83b0d38e29967d30cfeeed2b6aa132
--- bin/9c
+++ bin/9c
@@ -12,7 +12,10 @@ usegcc()
 		-Wno-switch \
 		-Wno-comment \
 		-Wno-sign-compare \
+		-fno-omit-frame-pointer \
 	"
+	# want to put -fno-optimize-sibling-calls here but
+	# that option only works with gcc3+ it seems
 	cflags="$ngflags -ggdb"
 }
 
blob - 082ba5407f9fb6d10db91d4546a5696718255cef
blob + 5b8391793a468dba06edbe86daf4c80442210d9c
--- bin/Getdir
+++ bin/Getdir
@@ -20,7 +20,7 @@ if(! ~ $tag(1) */){
 
 echo -n , | wr addr
 ls -pF $tag(1) | sed 's/\*$//' |
-	9grep -v '^\.|\.o$|^o\.' |
+	9grep -v '^''?\.|\.o$|^''?o\.' |
 mc | wr data
 echo -n '#0' | wr addr
 echo -n 'dot=addr' | wr ctl
blob - 4b579346bf1e70a9e035ca3c8c7b27b79071992c
blob + 9e1a5d5b0c57787a248902f8a300d3872d076bce
--- include/draw.h
+++ include/draw.h
@@ -526,6 +526,8 @@ char *getsnarf(void);
 void putsnarf(char*);
 
 void drawtopwindow(void);
+void drawresizewindow(Rectangle);
+extern char *winsize;
 
 /*
  * Port magic.
blob - ee396cc49082d77905bccd366a0ce719c0c392f5
blob + 8654bd98ffa25355f361ca298c740c299bca4a7c
--- include/libc.h
+++ include/libc.h
@@ -379,7 +379,7 @@ extern	int	netcrypt(void*, void*);
 extern	void	p9notejmp(void*, p9jmp_buf, int);
 extern	void	perror(const char*);
 extern	int	postnote(int, int, char *);
-extern	double	pow10(int);
+extern	double	p9pow10(int);
 /* extern	int	putenv(char*, char*); <stdlib.h. */
 /* extern	void	qsort(void*, long, long, int (*)(void*, void*)); <stdlib.h> */
 /* extern	int	p9setjmp(p9jmp_buf); */
@@ -417,6 +417,7 @@ extern	void	needstack(int);
 #define jmp_buf		p9jmp_buf
 #define syslog		p9syslog
 #define time		p9time
+#define pow10		p9pow10
 #endif
 
 /*
@@ -556,6 +557,7 @@ extern	void		freenetconninfo(NetConnInfo*);
 #define	OTRUNC	16	/* or'ed in (except for exec), truncate file first */
 #define	OCEXEC	32	/* or'ed in, close on exec */
 #define	ORCLOSE	64	/* or'ed in, remove on close */
+#define	ODIRECT	128	/* or'ed in, bypass the cache */
 #define	OEXCL	0x1000	/* or'ed in, exclusive use (create only) */
 
 #define	AEXIST	0	/* accessible: exists */
blob - 18bb409102b97935430c114f6f7f06b7128482af
blob + 356d7b6289e32ec7a4c47d690a5d271da7b2ca51
--- include/thread.h
+++ include/thread.h
@@ -115,7 +115,7 @@ int		threadrecvfd(int);
 long		threadwrite(int, const void*, long);
 int		threadsendfd(int, int);
 int		threadsetgrp(int);	/* set thread group, return old */
-void		threadsetname(char *name);
+void		threadsetname(char *fmt, ...);
 void		threadsleep(int);
 Channel*	threadwaitchan(void);
 int	tprivalloc(void);
blob - feef6b680cb02f227823883153916f7735201a6d
blob + 3dafb38524fa295e202ef54ced147e366bfa6f9d
--- src/cmd/9term/9term.c
+++ src/cmd/9term/9term.c
@@ -186,7 +186,7 @@ Cursor whitearrow = {
 void
 usage(void)
 {
-	fprint(2, "usage: 9term [-ars] [cmd ...]\n");
+	fprint(2, "usage: 9term [-ars] [-W winsize] [cmd ...]\n");
 	threadexitsall("usage");
 }
 
@@ -215,6 +215,9 @@ threadmain(int argc, char *argv[])
 	case 'w':	/* started from "rio" window manager */
 		use9wm = 1;
 		break;
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	}ARGEND
 
 	if(font)
blob - c9e8431e052c631dd28e37268435fe4507f604da
blob + 5449077a1c1954df8185811baa974d7b9abd08cf
--- src/cmd/acidtypes/type.c
+++ src/cmd/acidtypes/type.c
@@ -463,7 +463,7 @@ ttt=ttt->sub;
 					name, nameof(tt, 0));
 				Bprint(b, "\tindent_%s(addr+%lud, indent+\"  \");\n",
 					nameof(tt, 1), t->val[j]);
-				Bprint(b, "\tprint(indent, \"\t}\\n\");\n");
+				Bprint(b, "\tprint(indent, \"}\\n\");\n");
 				break;
 			}
 		}
blob - 7c563380e4f2f3de81035ba808c31b0d2f5db146
blob + 8d0413fa6c1d7d4220cc212fc7c37d9de27c61f9
--- src/cmd/acme/acme.c
+++ src/cmd/acme/acme.c
@@ -96,9 +96,14 @@ threadmain(int argc, char *argv[])
 		if(loadfile == nil)
 			goto Usage;
 		break;
+	case 'W':
+		winsize = ARGF();
+		if(winsize == nil)
+			goto Usage;
+		break;
 	default:
 	Usage:
-		fprint(2, "usage: acme -a -c ncol -f fontname -F fixedwidthfontname -l loadfile\n");
+		fprint(2, "usage: acme -a -c ncol -f fontname -F fixedwidthfontname -l loadfile -W winsize\n");
 		exits("usage");
 	}ARGEND
 
blob - d4c2a29c3fb17fa17bcf963c86582d6888372481
blob + afd88407e0ab1cccca6d9c723f6c4483878391a6
--- src/cmd/auxstats/Linux.c
+++ src/cmd/auxstats/Linux.c
@@ -109,21 +109,20 @@ xnet(int first)
 	totinb = 0;
 	totoub = 0;
 	for(i=0; i<nline; i++){
+		if((q = strchr(line[i], ':')) != nil)
+			*q = ' ';
 		tokens(i);
 		if(ntok < 8+8)
 			continue;
 		if(strncmp(tok[0], "eth", 3) != 0)
 			continue;
-		q = strchr(tok[0], ':');
-		*q++ = 0;
-		tok[0] = q;
-		inb = atoll(tok[0]);
-		oub = atoll(tok[8]);
-		in = atoll(tok[1]);
-		ou = atoll(tok[9]);
+		inb = atoll(tok[1]);
+		oub = atoll(tok[9]);
+		in = atoll(tok[2]);
+		ou = atoll(tok[10]);
 		b = inb+oub;
 		p = in+ou;
-		e = atoll(tok[2])+atoll(tok[10]);
+		e = atoll(tok[3])+atoll(tok[11]);
 		totb += b;
 		totp += p;
 		tote += e;
blob - 82491558f6836ae4a4d271451e90f220a2729a76
blob + 5e80ee2a8b3f8cd025e53818ebd86bcfc8112d54
--- src/cmd/draw/gview.c
+++ src/cmd/draw/gview.c
@@ -1956,7 +1956,7 @@ void usage(void)
 	int i;
 	fprintf(stderr,"Usage %s [options] [infile]\n", argv0);
 	fprintf(stderr,
-"option ::= -l logfile | -m\n"
+"option ::= -W winsize | -l logfile | -m\n"
 "\n"
 "Read a polygonal line graph in an ASCII format (one x y pair per line, delimited\n"
 "by spaces with a label after each polyline), and view it interactively.  Use\n"
@@ -1981,6 +1981,9 @@ void main(int argc, char *argv[])
 		break;
 	case 'l': logfil = fopen(ARGF(),"w");
 		break;
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	default: usage();
 	} ARGEND
 
blob - 354e588528d8c0048c8cc8a2ef4fb52ba5989770
blob + 01caa3c49dfec81dce6aff77b6613a1b919beaaf
--- src/cmd/draw/img.c
+++ src/cmd/draw/img.c
@@ -6,7 +6,7 @@
 void
 usage(void)
 {
-	fprint(2, "usage: img [file]\n");
+	fprint(2, "usage: img [-W winsize] [file]\n");
 	exits("usage");
 }
 
@@ -29,6 +29,9 @@ main(int argc, char **argv)
 	Event e;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	default:
 		usage();
 	}ARGEND
@@ -48,6 +51,8 @@ main(int argc, char **argv)
 	if((image=readimage(display, fd, 0)) == nil)
 		sysfatal("readimage: %r");
 
+	drawresizewindow(Rect(0,0,Dx(image->r),Dy(image->r)));
+
 	einit(Emouse|Ekeyboard);
 	eresized(0);
 	for(;;){
blob - f49f541ce181acb6b4abd6ad3a6fb7eb9959673f
blob + 8a43fb09f7a7dbbff28ccee39476026f963da968
--- src/cmd/draw/stats.c
+++ src/cmd/draw/stats.c
@@ -332,7 +332,7 @@ update1(Graph *g, long v, ulong vmax)
 void
 usage(void)
 {
-	fprint(2, "usage: stats [-O] [-S scale] [-LY] [-%s] [machine...]\n", argchars);
+	fprint(2, "usage: stats [-O] [-S scale] [-LY] [-W winsize] [-%s] [machine...]\n", argchars);
 	exits("usage");
 }
 
@@ -710,6 +710,9 @@ threadmain(int argc, char *argv[])
 	case 'O':
 		oldsystem = 1;
 		break;
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	default:
 		if(nargs>=sizeof args || strchr(argchars, ARGC())==nil)
 			usage();
blob - c7e12878cce18e8a736332c17b51e17cbc7a9975
blob + 82a22ee187bb393b615cdcef50197d6e5607555c
--- src/cmd/draw/tweak.c
+++ src/cmd/draw/tweak.c
@@ -172,12 +172,26 @@ void	drawall(void);
 void	tclose1(Thing*);
 
 void
+usage(void)
+{
+	fprint(2, "usage: tweak [-W winsize] file...\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int i;
 	Event e;
 	Thing *t;
 
+	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
+	default:
+		usage();
+	}ARGEND
 	mag = Mag;
 	if(initdraw(error, 0, "tweak") < 0){
 		fprint(2, "tweak: initdraw failed: %r\n");
@@ -191,7 +205,7 @@ main(int argc, char *argv[])
 	}
 	einit(Emouse|Ekeyboard);
 	eresized(0);
-	i = 1;
+	i = 0;
 	setjmp(err);
 	for(; i<argc; i++){
 		file = argv[i];
blob - f7e07a01525aad3e432f846f7f77988fdc2f3aab
blob + ba1b813a5b80581cec5b98d12eb72b9cd314cc52
--- src/cmd/jpg/bmp.c
+++ src/cmd/jpg/bmp.c
@@ -44,12 +44,22 @@ eresized(int new)
 }
 
 void
+usage(void)
+{
+	fprint(2, "usage: bmp -39cdektv -W winsize [file.bmp ...]\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int fd, i;
 	char *err;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case '3':		/* produce encoded, compressed, three-color bitmap file; no display by default */
 		threeflag++;
 		/* fall through */
@@ -89,8 +99,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: bmp -39cdektv  [file.bmp ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	err = nil;
blob - f9927017601f89b6ae348443c40561311e90bfa4
blob + f8f89de9fe531c20524dd019bc1e6cfe2c4f76df
--- src/cmd/jpg/gif.c
+++ src/cmd/jpg/gif.c
@@ -54,8 +54,16 @@ eresized(int new)
 	r.min.y += allims[which]->r.min.y - allims[0]->r.min.y;
 	drawop(screen, r, allims[which], allmasks[which], allims[which]->r.min, S);
 	flushimage(display, 1);
+}
+
+void
+usage(void)
+{
+	fprint(2, "usage: gif -39cdektv -W winsize [file.gif ...]\n");
+	exits("usage");
 }
 
+
 void
 main(int argc, char *argv[])
 {
@@ -63,6 +71,9 @@ main(int argc, char *argv[])
 	char *err;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case '3':		/* produce encoded, compressed, three-color bitmap file; no display by default */
 		threeflag++;
 		/* fall through */
@@ -102,8 +113,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: gif -39cdektv  [file.gif ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	err = nil;
blob - 3a275e655ceff88a2f9a0b64ddbb6a64e613b478
blob + 1380b18ff994e6efa68ba7041ef249dcf52477fa
--- src/cmd/jpg/ico.c
+++ src/cmd/jpg/ico.c
@@ -258,7 +258,7 @@ Bgeticon(Biobuf *b, Icon *icon)
 void
 usage(void)
 {
-	fprint(2, "usage: %s [file]\n", argv0);
+	fprint(2, "usage: %s -W winsize [file]\n", argv0);
 	exits("usage");
 }
 
@@ -444,6 +444,9 @@ main(int argc, char **argv)
 	Event e;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case 'd':
 		debug = 1;
 		break;
blob - cf438a93cd5ca6912cecf6a6a82989aad296fd2f
blob + f61172a514a9fa955aa785ef8e37d230147d3d5e
--- src/cmd/jpg/jpg.c
+++ src/cmd/jpg/jpg.c
@@ -46,6 +46,13 @@ eresized(int new)
 }
 
 void
+usage(void)
+{
+	fprint(2, "usage: jpg -39cdefFkJrtv -W winsize [file.jpg ...]\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int fd, i, yflag;
@@ -54,6 +61,9 @@ main(int argc, char *argv[])
 
 	yflag = 0;
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case 'c':		/* produce encoded, compressed, bitmap file; no display by default */
 		cflag++;
 		dflag++;
@@ -110,8 +120,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: jpg -39cdefFkJrtv [file.jpg ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	if(yflag==0 && dflag==0 && colorspace==CYCbCr){	/* see if we should convert right to RGB */
blob - d653fe6a9c2838c4064b06734b61b4875b4ce6fd
blob + a815abfcdb7dba9d8cc0b0dc03d002f59a53c6a4
--- src/cmd/jpg/png.c
+++ src/cmd/jpg/png.c
@@ -44,6 +44,13 @@ eresized(int new)
 }
 
 void
+usage(void)
+{
+	fprint(2, "usage: png -39cdekrtv -W winsize [file.png ...]\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int fd, i;
@@ -51,6 +58,9 @@ main(int argc, char *argv[])
 	char buf[12+1];
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case 'c':		/* produce encoded, compressed, bitmap file; no display by default */
 		cflag++;
 		dflag++;
@@ -96,8 +106,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: png -39cdekrtv [file.png ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	if(dflag==0 && colorspace==CYCbCr){	/* see if we should convert right to RGB */
blob - 24019dfa1cd06e0fa05c3f264bd27e5c1cd46175
blob + d90344ed997f7e46a257c7d1fcf36c65b437367b
--- src/cmd/jpg/ppm.c
+++ src/cmd/jpg/ppm.c
@@ -42,12 +42,22 @@ eresized(int new)
 }
 
 void
+usage(void)
+{
+	fprint(2, "usage: ppm -39cdektv -W winsize [file.ppm ...]\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int fd, i;
 	char *err;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case '3':		/* produce encoded, compressed, three-color bitmap file; no display by default */
 		threeflag++;
 		/* fall through */
@@ -87,8 +97,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: ppm -39cdektv  [file.ppm ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	err = nil;
blob - 929ccf39fd547c080d5e48599ab8fc2c4c3f70ef
blob + 6027236b3d67655fa259d4f00c127f72814c6eda
--- src/cmd/jpg/yuv.c
+++ src/cmd/jpg/yuv.c
@@ -44,12 +44,22 @@ eresized(int new)
 }
 
 void
+usage(void)
+{
+	fprint(2, "usage: yuv -39cdektv -W winsize [file.yuv ...]\n");
+	exits("usage");
+}
+
+void
 main(int argc, char *argv[])
 {
 	int fd, i;
 	char *err;
 
 	ARGBEGIN{
+	case 'W':
+		winsize = EARGF(usage());
+		break;
 	case '3':		/* produce encoded, compressed, three-color bitmap file; no display by default */
 		threeflag++;
 		/* fall through */
@@ -89,8 +99,7 @@ main(int argc, char *argv[])
 			outchan = CMAP8;
 		break;
 	default:
-		fprint(2, "usage: yuv -39cdektv  [file.yuv ...]\n");
-		exits("usage");
+		usage();
 	}ARGEND;
 
 	err = nil;
blob - 45e7adf4a21c83346dabdd4cabf96e1fe7483961 (mode 644)
blob + /dev/null
--- src/cmd/mc.c
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * mc - columnate
- *
- * mc[-][-LINEWIDTH][-t][file...]
- *	- causes break on colon
- *	-LINEWIDTH sets width of line in which to columnate(default 80)
- *	-t suppresses expanding multiple blanks into tabs
- *
- */
-#include	<u.h>
-#include	<sys/ioctl.h>
-#include	<sys/termios.h>
-#include	<libc.h>
-#include	<draw.h>
-#include	<bio.h>
-
-#define	WIDTH			80
-#define	TAB	4
-#define	WORD_ALLOC_QUANTA	1024
-#define	ALLOC_QUANTA		4096
-
-int linewidth=WIDTH;
-int colonflag=0;
-int tabflag=0;	/* -t flag turned off forever */
-Rune *cbuf, *cbufp;
-Rune **word;
-int maxwidth=0;
-int nalloc=ALLOC_QUANTA;
-int nwalloc=WORD_ALLOC_QUANTA;
-int nchars=0;
-int nwords=0;
-Biobuf	bin;
-Biobuf	bout;
-
-void getwidth(void), readbuf(int), error(char *);
-void scanwords(void), columnate(void), morechars(void);
-
-void
-main(int argc, char *argv[])
-{
-	int i;
-	int lineset;
-	int ifd;
-
-	lineset = 0;
-	Binit(&bout, 1, OWRITE);
-	while(argc > 1 && argv[1][0] == '-'){
-		--argc; argv++;
-		switch(argv[0][1]){
-		case '\0':
-			colonflag = 1;
-			break;
-		case 't':
-			tabflag = 0;
-			break;
-		default:
-			linewidth = atoi(&argv[0][1]);
-			if(linewidth <= 1)
-				linewidth = WIDTH;
-			lineset = 1;
-			break;
-		}
-	}
-	if(lineset == 0)
-		getwidth();
-	cbuf = cbufp = malloc(ALLOC_QUANTA*(sizeof *cbuf));
-	word = malloc(WORD_ALLOC_QUANTA*(sizeof *word));
-	if(word == 0 || cbuf == 0)
-		error("out of memory");
-	if(argc == 1)
-		readbuf(0);
-	else{
-		for(i = 1; i < argc; i++){
-			if((ifd = open(*++argv, OREAD)) == -1)
-				fprint(2, "mc: can't open %s (%r)\n", *argv);
-			else{
-				readbuf(ifd);
-				Bflush(&bin);
-				close(ifd);
-			}
-		}
-	}
-	columnate();
-	exits(0);
-}
-void
-error(char *s)
-{
-	fprint(2, "mc: %s\n", s);
-	exits(s);
-}
-void
-readbuf(int fd)
-{
-	int lastwascolon = 0;
-	long c;
-	int linesiz = 0;
-
-	Binit(&bin, fd, OREAD);
-	do{
-		if(nchars++ >= nalloc)
-			morechars();
-		*cbufp++ = c = Bgetrune(&bin);
-		linesiz++;
-		if(c == '\t') {
-			cbufp[-1] = L' ';
-			while(linesiz%TAB != 0) {
-				if(nchars++ >= nalloc)
-					morechars();
-				*cbufp++ = L' ';
-				linesiz++;
-			}
-		}
-		if(colonflag && c == ':')
-			lastwascolon++;
-		else if(lastwascolon){
-			if(c == '\n'){
-				--nchars; 	/* skip newline */
-				*cbufp = L'\0';
-				while(nchars > 0 && cbuf[--nchars] != '\n')
-					;
-				if(nchars)
-					nchars++;
-				columnate();
-				if (nchars)
-					Bputc(&bout, '\n');
-				Bprint(&bout, "%S", cbuf+nchars);
-				nchars = 0;
-				cbufp = cbuf;
-			}
-			lastwascolon = 0;
-		}
-		if(c == '\n')
-			linesiz = 0;
-	}while(c >= 0);
-}
-void
-scanwords(void)
-{
-	Rune *p, *q;
-	int i;
-
-	nwords=0;
-	maxwidth=0;
-	for(p = q = cbuf, i = 0; i < nchars; i++){
-		if(*p++ == L'\n'){
-			if(nwords >= nwalloc){
-				nwalloc += WORD_ALLOC_QUANTA;
-				if((word = realloc(word, nwalloc*sizeof(*word)))==0)
-					error("out of memory");
-			}
-			word[nwords++] = q;
-			p[-1] = L'\0';
-			if(p-q > maxwidth)
-				maxwidth = p-q;
-			q = p;
-		}
-	}
-}
-
-void
-columnate(void)
-{
-	int i, j;
-	int words_per_line;
-	int nlines;
-	int col;
-	int endcol;
-
-
-	scanwords();
-	if(nwords==0)
-		return;
-	words_per_line = linewidth/maxwidth;
-	if(words_per_line <= 0)
-		words_per_line = 1;
-	nlines=(nwords+words_per_line-1)/words_per_line;
-	for(i = 0; i < nlines; i++){
-		col = endcol = 0;
-		for(j = i; j < nwords; j += nlines){
-			endcol += maxwidth;
-			Bprint(&bout, "%S", word[j]);
-			col += word[j+1]-word[j]-1;
-			if(j+nlines < nwords){
-				if(tabflag) {
-					int tabcol = (col|(TAB-1))+1;
-					while(tabcol <= endcol){
-						Bputc(&bout, '\t');
-						col = tabcol;
-						tabcol += TAB;
-					}
-				}
-				while(col < endcol){
-					Bputc(&bout, ' ');
-					col++;
-				}
-			}
-		}
-		Bputc(&bout, '\n');
-	}
-}
-
-void
-morechars(void)
-{
-	nalloc += ALLOC_QUANTA;
-	if((cbuf = realloc(cbuf, nalloc*sizeof(*cbuf))) == 0)
-		error("out of memory");
-	cbufp = cbuf+nchars-1;
-}
-
-/*
- * These routines discover the width of the display.
- * It takes some work.  If we do the easy calls to the
- * draw library, the screen flashes due to repainting
- * when mc exits.
- */
-
-int
-windowrect(struct winsize *ws)
-{
-	int tty;
-
-	if((tty = open("/dev/tty", OWRITE)) < 0)
-		tty = 1;
-
-	if(ioctl(tty, TIOCGWINSZ, ws) < 0){
-		if(tty != 1)
-			close(tty);
-		return -1;
-	}
-	if(tty != 1)
-		close(tty);
-	return 0;
-}
-
-void
-getwidth(void)
-{
-	struct winsize ws;
-
-	if(windowrect(&ws) < 0)
-		return;
-	linewidth = ws.ws_col;
-}
blob - 04e5cf549017934a2887619748cd3d84ab7644b7
blob + 1360f6864ce77b79e69e221588de07f97aeb5b32
--- src/cmd/plot/plot.c
+++ src/cmd/plot/plot.c
@@ -149,6 +149,7 @@ main(int arc, char *arv[]){
 	fd = dup(0, -1);		/* because openpl will close 0! */
 	dflag=0;
 	oflag="";
+	winsize = "512x512";
 	for(i=1;i!=arc;i++) if(arv[i][0]=='-') switch(arv[i][1]){
 	case 'd': dflag=1; break;
 	case 'o': oflag=arv[i]+2; break;
@@ -168,7 +169,6 @@ main(int arc, char *arv[]){
 			case 'D': break;
 			case 'd': break;
 			case 'o': break;
-			case 'W': break;
 			case 's': break;
 			case 'e': erase(); break;
 			case 'C': closepl(); break;
@@ -177,6 +177,7 @@ main(int arc, char *arv[]){
 			case 'f': cfill(ap+1); break;
 			case 'p': pen(ap+1); break;
 			case 'g': grade(atof(ap+1)); break;
+			case 'W': winsize = ap+1; break;
 			}
 		}
 		else if ((bp = Bopen(arv[1], OREAD)) == 0) {
blob - 078d943932485187b2176ce7c44d32f1a7779cbd
blob + 5a009bb0c13a5450cd858c5e0a32e0acecf0c484
--- src/cmd/sam/sam.c
+++ src/cmd/sam/sam.c
@@ -29,6 +29,8 @@ File	*lastfile;
 Disk	*disk;
 long	seq;
 
+char *winsize;
+
 Rune	baddir[] = { '<', 'b', 'a', 'd', 'd', 'i', 'r', '>', '\n'};
 
 void	usage(void);
@@ -81,6 +83,10 @@ main(int argc, char *argv[])
                         *ap++ = *argv;
                         argc--;
                         break;
+
+		case 'W':
+			--argc, argv++;
+			break;
 
 		default:
 			dprint("sam: unknown flag %c\n", argv[0][1]);
@@ -101,7 +107,7 @@ main(int argc, char *argv[])
 	if(home == 0)
 		home = "/";
 	if(!dflag)
-		startup(machine, Rflag, arg, ap);
+		startup(machine, Rflag, arg, argv);
 	notify(notifyf);
 	getcurwd();
 	if(argc>1){
blob - feb8957384629e6520326669e71a8be793a5c4ee
blob + 4d58c609e612954253961357ce9ec33b47309a10
--- src/cmd/samterm/plan9.c
+++ src/cmd/samterm/plan9.c
@@ -28,10 +28,15 @@ static char *exname;
 void
 getscreen(int argc, char **argv)
 {
+	int i;
 	char *t;
 
-	USED(argc);
-	USED(argv);
+	/* not exactly right */
+	for(i=0; i<argc-1; i++){
+		if(strcmp(argv[i], "-W") == 0)
+			winsize = argv[i+1];
+	}
+
 	if(initdraw(panic1, nil, "sam") < 0){
 		fprint(2, "samterm: initdraw: %r\n");
 		threadexitsall("init");
blob - daabedc625c96634728a136d068e336d2116a71e
blob + ee6a0c62891759a2afff405646fb9eb0ffc4ea78
--- src/cmd/vac/vtdump.c
+++ src/cmd/vac/vtdump.c
@@ -87,10 +87,12 @@ threadmain(int argc, char *argv[])
 		Bprint(bout, "prev: %V\n", root.prev);
 	}
 
+fprint(2, "read...\n");
 	n = vtread(z, root.score, VtDirType, buf, bsize);
 	if(n < 0)
 		sysfatal("could not read root dir");
 
+fprint(2, "...\n");
 	/* fake up top level source */
 	memset(&source, 0, sizeof(source));
 	memmove(source.score, root.score, VtScoreSize);
blob - 97f6e7e2a2540b09548fe7881751401c556a5b9e
blob + eaea479c4111a89eeb3d802cb3683f6fde24017a
--- src/lib9/create.c
+++ src/lib9/create.c
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE	/* for Linux O_DIRECT */
 #include <u.h>
 #define NOPLAN9DEFINES
 #include <libc.h>
@@ -25,6 +26,10 @@ p9create(char *path, int mode, ulong perm)
 	}else{
 		umode = (mode&3)|O_CREAT|O_TRUNC;
 		mode &= ~(3|OTRUNC);
+		if(mode&ODIRECT){
+			umode |= O_DIRECT;
+			mode &= ~ODIRECT;
+		}
 		if(mode&OEXCL){
 			umode |= O_EXCL;
 			mode &= ~OEXCL;
blob - 6a3b1fcab397d8cf60bbc9a0f08b4347cdcb1aa4
blob + 273a79ba12f711f317f4f3e757ca21a05e28fce8
--- src/lib9/mkfile
+++ src/lib9/mkfile
@@ -167,3 +167,4 @@ HFILES=\
 %.$O: utf/%.c
 	$CC $CFLAGS utf/$stem.c
 
+rendez-Linux.$O: rendez-futex.c rendez-signal.c
blob - 0356a7dabc561721f96dfe4fc29cab25526404ae
blob + b70a9a271cfd8e0da89af1ed83c872964c3d7dc2
--- src/lib9/open.c
+++ src/lib9/open.c
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE	/* for Linux O_DIRECT */
 #include <u.h>
 #define NOPLAN9DEFINES
 #include <libc.h>
@@ -16,6 +17,10 @@ p9open(char *name, int mode)
 		umode |= O_TRUNC;
 		mode ^= OTRUNC;
 	}
+	if(mode&ODIRECT){
+		umode |= O_DIRECT;
+		mode ^= ODIRECT;
+	}
 	if(mode){
 		werrstr("mode not supported");
 		return -1;
blob - 55a18466c0b794fc3bd1e10bc43d0155ecabbd43
blob + 00bbcc7d7deb3b90b26204bcdc6aaab8bbb891f6
--- src/lib9/qlock.c
+++ src/lib9/qlock.c
@@ -34,8 +34,10 @@ getqlp(void)
 	for(p = op+1; ; p++){
 		if(p == &ql.x[nelem(ql.x)])
 			p = ql.x;
-		if(p == op)
+		if(p == op){
+			fprint(2, "qlock: out of qlp\n");
 			abort();
+		}
 		if(_tas(&(p->inuse)) == 0){
 			ql.p = p;
 			p->next = nil;
@@ -233,8 +235,10 @@ wunlock(RWLock *q)
 	QLp *p;
 
 	lock(&q->lock);
-	if(q->writer == 0)
+	if(q->writer == 0){
+		fprint(2, "wunlock: not holding lock\n");
 		abort();
+	}
 	p = q->head;
 	if(p == nil){
 		q->writer = 0;
@@ -252,8 +256,10 @@ wunlock(RWLock *q)
 		return;
 	}
 
-	if(p->state != QueuingR)
+	if(p->state != QueuingR){
+		fprint(2, "wunlock: bad state\n");
 		abort();
+	}
 
 	/* wake waiting readers */
 	while(q->head != nil && q->head->state == QueuingR){
@@ -274,12 +280,16 @@ rsleep(Rendez *r)
 {
 	QLp *t, *me;
 
-	if(!r->l)
+	if(!r->l){
+		fprint(2, "rsleep: no lock\n");
 		abort();
+	}
 	lock(&r->l->lock);
 	/* we should hold the qlock */
-	if(!r->l->locked)
+	if(!r->l->locked){
+		fprint(2, "rsleep: not locked\n");
 		abort();
+	}
 
 	/* add ourselves to the wait list */
 	me = getqlp();
@@ -309,8 +319,10 @@ rsleep(Rendez *r)
 	while((*_rendezvousp)((ulong)me, 0x23456) == ~0)
 		;
 	me->inuse = 0;
-	if(!r->l->locked)
+	if(!r->l->locked){
+		fprint(2, "rsleep: not locked after wakeup\n");
 		abort();
+	}
 }
 
 int
@@ -323,11 +335,15 @@ rwakeup(Rendez *r)
 	 * put on front so guys that have been waiting will not get starved
 	 */
 	
-	if(!r->l)
+	if(!r->l){
+		fprint(2, "rwakeup: no lock\n");
 		abort();
+	}
 	lock(&r->l->lock);
-	if(!r->l->locked)
+	if(!r->l->locked){
+		fprint(2, "rwakeup: not locked\n");
 		abort();
+	}
 
 	t = r->head;
 	if(t == nil){
blob - 671de1d58d0c12001bc58e37898bd2c8c6c3f7cb
blob + 3388407dd83f565fd228f2143dd6aee990850e7f
--- src/libdraw/x11-init.c
+++ src/libdraw/x11-init.c
@@ -10,6 +10,9 @@
 #include <mouse.h>
 #include <cursor.h>
 #include "x11-memdraw.h"
+
+char *winsize;
+static int parsewinsize(char*, Rectangle*, int*);
 
 static Memimage	*xattach(char*);
 static void	plan9cmap(void);
@@ -180,7 +183,7 @@ static Memimage*
 xattach(char *label)
 {
 	char *argv[2], *disp;
-	int i, n, xrootid;
+	int i, n, xrootid, havemin;
 	Rectangle r;
 	XClassHint classhint;
 	XDrawable pmid;
@@ -318,8 +321,14 @@ xattach(char *label)
 	 * This is arbitrary.  In theory we should read the
 	 * command line and allow the traditional X options.
 	 */
-	r = Rect(0, 0, WidthOfScreen(xscreen)*3/4,
+	if(winsize){
+		if(parsewinsize(winsize, &r, &havemin) < 0)
+			sysfatal("%r");
+	}else{
+		r = Rect(0, 0, WidthOfScreen(xscreen)*3/4,
 			HeightOfScreen(xscreen)*3/4);
+		havemin = 0;
+	}
 
 	memset(&attr, 0, sizeof attr);
 	attr.colormap = _x.cmap;
@@ -353,7 +362,14 @@ xattach(char *label)
 	name.nitems = strlen((char*)name.value);
 
 	memset(&normalhint, 0, sizeof normalhint);
-	normalhint.flags = USSize|PMaxSize;
+	normalhint.flags = PSize|PMaxSize;
+	if(winsize){
+		normalhint.flags &= ~PSize;
+		normalhint.flags |= USSize;
+		normalhint.width = Dx(r);
+		normalhint.height = Dy(r);
+	}
+
 	normalhint.max_width = WidthOfScreen(xscreen);
 	normalhint.max_height = HeightOfScreen(xscreen);
 
@@ -381,7 +397,16 @@ xattach(char *label)
 		&classhint	/* XA_WM_CLASSHINTS */
 	);
 	XFlush(_x.display);
+
+	if(havemin){
+		XWindowChanges ch;
 
+		memset(&ch, 0, sizeof ch);
+		ch.x = r.min.x;
+		ch.y = r.min.y;
+		XConfigureWindow(_x.display, _x.drawable, CWX|CWY, &ch);
+fprint(2, "havemin %d %d\n", r.min.x, r.min.y);
+	}
 	/*
 	 * Look up clipboard atom.
 	 */
@@ -783,3 +808,73 @@ xreplacescreenimage(void)
 	return 1;
 }
 
+static int
+parsewinsize(char *s, Rectangle *r, int *havemin)
+{
+	char c, *os;
+	int i, j, k, l;
+
+	os = s;
+	*havemin = 0;
+	*r = Rect(0,0,0,0);
+	if(!isdigit(*s))
+		goto oops;
+	i = strtol(s, &s, 0);
+	if(*s == 'x'){
+		s++;
+		if(!isdigit(*s))
+			goto oops;
+		j = strtol(s, &s, 0);
+		r->max.x = i;
+		r->max.y = j;
+		if(*s == 0)
+			return 0;
+		if(*s != '@')
+			goto oops;
+
+		s++;
+		if(!isdigit(*s))
+			goto oops;
+		i = strtol(s, &s, 0);
+		if(*s != ',' && *s != ' ')
+			goto oops;
+		s++;
+		if(!isdigit(*s))
+			goto oops;
+		j = strtol(s, &s, 0);
+		if(*s != 0)
+			goto oops;
+		*r = rectaddpt(*r, Pt(i,j));
+		*havemin = 1;
+		return 0;
+	}
+
+	c = *s;
+	if(c != ' ' && c != ',')
+		goto oops;
+	s++;
+	if(!isdigit(*s))
+		goto oops;
+	j = strtol(s, &s, 0);
+	if(*s != c)
+		goto oops;
+	s++;
+	if(!isdigit(*s))
+		goto oops;
+	k = strtol(s, &s, 0);
+	if(*s != c)
+		goto oops;
+	s++;
+	if(!isdigit(*s))
+		goto oops;
+	l = strtol(s, &s, 0);
+	if(*s != 0)
+		goto oops;
+	*r = Rect(i,j,k,l);
+	*havemin = 1;
+	return 0;
+
+oops:
+	werrstr("bad syntax in window size '%s'", os);
+	return -1;
+}
blob - c996bd31afd225c5c11167bf90f3f96701955777
blob + 83f3e1b40105dafe831779d26198cbe93bb7a018
--- src/libdraw/x11-wsys.c
+++ src/libdraw/x11-wsys.c
@@ -15,3 +15,18 @@ drawtopwindow(void)
 	XFlush(_x.display);
 }
 
+void
+drawresizewindow(Rectangle r)
+{
+//	XConfigureRequestEvent e;
+	XWindowChanges e;
+	int value_mask;
+
+	memset(&e, 0, sizeof e);
+	value_mask = CWWidth|CWHeight;
+//	e.x = r.min.x;
+//	e.y = r.min.y;
+	e.width = Dx(r);
+	e.height = Dy(r);
+	XConfigureWindow(_x.display, _x.drawable, value_mask, &e);
+}
blob - da8558c4b741376f9f6cffc348ab266275e7f13b
blob + 3e9fe650659f1f1d39140538afb1adf066aa84e4
--- src/libmach/dwarfget.c
+++ src/libmach/dwarfget.c
@@ -156,6 +156,7 @@ dwarfget128(DwarfBuf *b)
 {n1++;
 		return c;
 }
+	c &= ~0x80;
 	d = *b->p++;
 	c |= (d&0x7F)<<7;
 	if(!(d&0x80))
blob - a8647f9480ad18086193b9e81f1aa6acb647aae2
blob + b63fee44416722030a85ba93d03527fa9a2c25c7
--- src/libthread/create.c
+++ src/libthread/create.c
@@ -155,6 +155,7 @@ _newproc(void (*f)(void *arg), void *arg, uint stacksi
 	else
 		*_threadpq.tail = p;
 	_threadpq.tail = &p->next;
+
 	if(_threadprocs == 1)
 		_threadmultiproc();
 	_threadprocs++;
blob - 727798d38510545277c3887f605bc03ce2a0f062
blob + e920b87bc8ee87719b9915727ca1a7406c8cfd57
--- src/libthread/id.c
+++ src/libthread/id.c
@@ -52,20 +52,20 @@ threadgetgrp(void)
 }
 
 void
-threadsetname(char *name)
+threadsetname(char *fmt, ...)
 {
-/*
-	int fd, n;
-	char buf[128], *s;
-*/
 	Proc *p;
 	Thread *t;
+	va_list arg;
 
 	p = _threadgetproc();
 	t = p->thread;
 	if (t->cmdname)
 		free(t->cmdname);
-	t->cmdname = strdup(name);
+	va_start(arg, fmt);
+	t->cmdname = vsmprint(fmt, arg);
+	va_end(fmt);
+
 /* Plan 9 only 
 	if(p->nthreads == 1){
 		snprint(buf, sizeof buf, "#p/%d/args", getpid());
blob - e028f982076010724a04dd9dad4a28d9eee16ca0
blob + 89d30c0366bfb446f129c129948df9b8561af677
--- src/libthread/tprimes.c
+++ src/libthread/tprimes.c
@@ -52,7 +52,7 @@ threadmain(int argc, char **argv)
 		buffer = atoi(ARGF());
 		break;
 	case 'p':
-		fn=proccreate;
+		fn = proccreate;
 		break;
 	}ARGEND
 
blob - 7ecaf7c355f0a030f4bc5211bff3e59a38f8c00d
blob + 837cbf45ce28fcb8a3f5e443a74deff509df51f1
--- src/libventi/server.c
+++ src/libventi/server.c
@@ -13,6 +13,8 @@ typedef struct VtSconn VtSconn;
 struct VtSconn
 {
 	int ctl;
+	int ref;
+	QLock lk;
 	char dir[NETPATHLEN];
 	VtSrv *srv;
 	VtConn *c;
@@ -29,6 +31,27 @@ struct VtSrv
 static void listenproc(void*);
 static void connproc(void*);
 
+static void
+scincref(VtSconn *sc)
+{
+	qlock(&sc->lk);
+	sc->ref++;
+	qunlock(&sc->lk);
+}
+
+static void
+scdecref(VtSconn *sc)
+{
+	qlock(&sc->lk);
+	if(--sc->ref > 0){
+		qunlock(&sc->lk);
+		return;
+	}
+	if(sc->c)
+		vtfreeconn(sc->c);
+	vtfree(sc);
+}
+
 VtSrv*
 vtlisten(char *addr)
 {
@@ -55,14 +78,13 @@ listenproc(void *v)
 
 	srv = v;
 	for(;;){
-fprint(2, "listen for venti\n");
 		ctl = listen(srv->adir, dir);
 		if(ctl < 0){
 			srv->dead = 1;
 			break;
 		}
-fprint(2, "got one\n");
 		sc = vtmallocz(sizeof(VtSconn));
+		sc->ref = 1;
 		sc->ctl = ctl;
 		sc->srv = srv;
 		strcpy(sc->dir, dir);
@@ -82,8 +104,8 @@ connproc(void *v)
 	int fd;
 
 	r = nil;
-	c = nil;
 	sc = v;
+	sc->c = nil;
 	fprint(2, "new call %s on %d\n", sc->dir, sc->ctl);
 	fd = accept(sc->ctl, sc->dir);
 	close(sc->ctl);
@@ -122,7 +144,9 @@ connproc(void *v)
 			break;
 		r->rx.tag = r->tx.tag;
 		r->sc = sc;
+		scincref(sc);
 		if(_vtqsend(sc->srv->q, r) < 0){
+			scdecref(sc);
 			fprint(2, "hungup queue\n");
 			break;
 		}
@@ -136,10 +160,8 @@ out:
 		vtfcallclear(&r->tx);
 		vtfree(r);
 	}
-	if(c)
-		vtfreeconn(c);
 	fprint(2, "freed %s\n", sc->dir);
-	vtfree(sc);
+	scdecref(sc);
 	return;
 }
 
@@ -167,6 +189,7 @@ vtrespond(VtReq *r)
 		return;
 	}
 	vtsend(sc->c, p);
+	scdecref(sc);
 	vtfcallclear(&r->tx);
 	vtfcallclear(&r->rx);
 	vtfree(r);