commit - 3d72637f9b4c42b1fc9b7d95d278ea3dd65c748d
commit + be36ff68854c86247fdc769c0eaa89eb284b5ca7
blob - 9129315b99955acfa20dbddf4cd84a1d5a0e3380
blob + 41624f1d7e83b0d38e29967d30cfeeed2b6aa132
--- bin/9c
+++ bin/9c
-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
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
void putsnarf(char*);
void drawtopwindow(void);
+void drawresizewindow(Rectangle);
+extern char *winsize;
/*
* Port magic.
blob - ee396cc49082d77905bccd366a0ce719c0c392f5
blob + 8654bd98ffa25355f361ca298c740c299bca4a7c
--- include/libc.h
+++ include/libc.h
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); */
#define jmp_buf p9jmp_buf
#define syslog p9syslog
#define time p9time
+#define pow10 p9pow10
#endif
/*
#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
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
void
usage(void)
{
- fprint(2, "usage: 9term [-ars] [cmd ...]\n");
+ fprint(2, "usage: 9term [-ars] [-W winsize] [cmd ...]\n");
threadexitsall("usage");
}
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
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
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
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
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"
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
void
usage(void)
{
- fprint(2, "usage: img [file]\n");
+ fprint(2, "usage: img [-W winsize] [file]\n");
exits("usage");
}
Event e;
ARGBEGIN{
+ case 'W':
+ winsize = EARGF(usage());
+ break;
default:
usage();
}ARGEND
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
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");
}
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
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");
}
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
}
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 */
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
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[])
{
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 */
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
void
usage(void)
{
- fprint(2, "usage: %s [file]\n", argv0);
+ fprint(2, "usage: %s -W winsize [file]\n", argv0);
exits("usage");
}
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
}
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;
yflag = 0;
ARGBEGIN{
+ case 'W':
+ winsize = EARGF(usage());
+ break;
case 'c': /* produce encoded, compressed, bitmap file; no display by default */
cflag++;
dflag++;
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
}
void
+usage(void)
+{
+ fprint(2, "usage: png -39cdekrtv -W winsize [file.png ...]\n");
+ exits("usage");
+}
+
+void
main(int argc, char *argv[])
{
int fd, i;
char buf[12+1];
ARGBEGIN{
+ case 'W':
+ winsize = EARGF(usage());
+ break;
case 'c': /* produce encoded, compressed, bitmap file; no display by default */
cflag++;
dflag++;
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
}
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 */
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
}
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 */
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
-/*
- * 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
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;
case 'D': break;
case 'd': break;
case 'o': break;
- case 'W': break;
case 's': break;
case 'e': erase(); break;
case 'C': closepl(); break;
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
Disk *disk;
long seq;
+char *winsize;
+
Rune baddir[] = { '<', 'b', 'a', 'd', 'd', 'i', 'r', '>', '\n'};
void usage(void);
*ap++ = *argv;
argc--;
break;
+
+ case 'W':
+ --argc, argv++;
+ break;
default:
dprint("sam: unknown flag %c\n", argv[0][1]);
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
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
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
+#define _GNU_SOURCE /* for Linux O_DIRECT */
#include <u.h>
#define NOPLAN9DEFINES
#include <libc.h>
}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
%.$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
+#define _GNU_SOURCE /* for Linux O_DIRECT */
#include <u.h>
#define NOPLAN9DEFINES
#include <libc.h>
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
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;
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;
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){
{
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();
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
* 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
#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);
xattach(char *label)
{
char *argv[2], *disp;
- int i, n, xrootid;
+ int i, n, xrootid, havemin;
Rectangle r;
XClassHint classhint;
XDrawable pmid;
* 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;
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);
&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.
*/
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
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
{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
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
}
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
buffer = atoi(ARGF());
break;
case 'p':
- fn=proccreate;
+ fn = proccreate;
break;
}ARGEND
blob - 7ecaf7c355f0a030f4bc5211bff3e59a38f8c00d
blob + 837cbf45ce28fcb8a3f5e443a74deff509df51f1
--- src/libventi/server.c
+++ src/libventi/server.c
struct VtSconn
{
int ctl;
+ int ref;
+ QLock lk;
char dir[NETPATHLEN];
VtSrv *srv;
VtConn *c;
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)
{
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);
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);
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;
}
vtfcallclear(&r->tx);
vtfree(r);
}
- if(c)
- vtfreeconn(c);
fprint(2, "freed %s\n", sc->dir);
- vtfree(sc);
+ scdecref(sc);
return;
}
return;
}
vtsend(sc->c, p);
+ scdecref(sc);
vtfcallclear(&r->tx);
vtfcallclear(&r->rx);
vtfree(r);