diff options
author | rsc <devnull@localhost> | 2003-12-03 22:50:48 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-12-03 22:50:48 +0000 |
commit | 669250d159e93a6933afa4cd25f410af801515ec (patch) | |
tree | 1f053fd518cf1a172863e07050e6e3bf13762f7d /src | |
parent | 5a82f26e50fbfbb3090b4cf839decf012637a00e (diff) | |
download | plan9port-669250d159e93a6933afa4cd25f410af801515ec.tar.gz plan9port-669250d159e93a6933afa4cd25f410af801515ec.tar.bz2 plan9port-669250d159e93a6933afa4cd25f410af801515ec.zip |
Various fixes.
B - fixed usage, DISPLAY :0 vs :0.0
9term - fixed various terminal things
rc - notice traps in Read
_p9dir - only run disk code for disks
dirread - getdirentries on FreeBSD and Linux
are different w.r.t. meaning of off.
notify - set up so signals interrupt system calls
bprint - use bfmt.
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/9term/9term.c | 67 | ||||
-rw-r--r-- | src/cmd/9term/FreeBSD.c | 3 | ||||
-rw-r--r-- | src/cmd/rc/plan9ish.c | 16 | ||||
-rw-r--r-- | src/lib9/_p9dir.c | 32 | ||||
-rw-r--r-- | src/lib9/dirread.c | 11 | ||||
-rw-r--r-- | src/lib9/notify.c | 11 | ||||
-rw-r--r-- | src/libbio/bcat.c | 4 | ||||
-rw-r--r-- | src/libbio/bprint.c | 28 | ||||
-rw-r--r-- | src/libbio/mkfile | 5 |
9 files changed, 116 insertions, 61 deletions
diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c index 1386c158..89b609e0 100644 --- a/src/cmd/9term/9term.c +++ b/src/cmd/9term/9term.c @@ -108,7 +108,6 @@ threadmain(int argc, char *argv[]) draw(screen, screen->r, cols[BACK], nil, ZP); geom(); - loop(); } @@ -118,7 +117,7 @@ hangupnote(void *a, char *msg) if(getpid() != mainpid) noted(NDFLT); if(strcmp(msg, "hangup") == 0 && rcpid != 0){ - postnote(PNPROC, rcpid, "hangup"); + postnote(PNGROUP, rcpid, "hangup"); noted(NDFLT); } noted(NDFLT); @@ -206,9 +205,13 @@ doreshape(void) scrdraw(); } +struct winsize ows; + void geom(void) { + struct winsize ws; + Point p; Rectangle r; r = screen->r; @@ -223,6 +226,18 @@ geom(void) t.f->maxtab = maxtab*stringwidth(font, "0"); fill(); updatesel(); + + p = stringsize(font, "0"); + if(p.x == 0 || p.y == 0) + return; + + ws.ws_row = Dy(r)/p.y; + ws.ws_col = Dx(r)/p.x; + ws.ws_xpixel = Dx(r); + ws.ws_ypixel = Dy(r); + if(ws.ws_row != ows.ws_row || ws.ws_col != ows.ws_col) + if(ioctl(rcfd[0], TIOCSWINSZ, &ws) < 0) + fprint(2, "ioctl: %r\n"); } void @@ -422,6 +437,7 @@ void key(Rune r) { char buf[1]; + uint sig; if(r == 0) return; @@ -472,12 +488,9 @@ key(Rune r) case 0x7F: /* DEL: send interrupt */ t.qh = t.q0 = t.q1 = t.nr; show(t.q0); - buf[0] = 0x7f; - if(write(rcfd[1], buf, 1) < 0) - exits(0); - /* get rc to print prompt */ -// r = '\n'; -// paste(&r, 1, 1); + sig = 2; /* SIGINT */ + if(ioctl(rcfd[0], TIOCSIG, &sig) < 0) + fprint(2, "sending interrupt: %r\n"); break; case 0x08: /* ^H: erase character */ case 0x15: /* ^U: erase line */ @@ -543,7 +556,10 @@ consready(void) for(i=t.qh; i<t.nr; i++){ c = t.r[i]; if(c=='\n' || c=='\004') +{ +fprint(2, "ready %d\n", c); return 1; +} } return 0; } @@ -561,6 +577,7 @@ consread(void) n = sizeof(buf); p = buf; + c = 0; while(n >= UTFmax && (t.qh<t.nr || t.nraw > 0)) { if(t.qh == t.nr){ width = runetochar(p, &t.raw[0]); @@ -571,18 +588,17 @@ consread(void) c = *p; p += width; n -= width; - if(!rawon && (c == '\n' || c == '\004')) { - if(c == '\004') - p--; + if(!rawon && (c == '\n' || c == '\004')) break; - } } - if(n < UTFmax && t.qh<t.nr && t.r[t.qh]=='\004') - t.qh++; - /* put in control-d when doing a zero length write */ - if(p == buf) - *p++ = '\004'; - if(write(rcfd[1], buf, p-buf) < 0) + /* take out control-d when not doing a zero length write */ + n = p-buf; + if(n > 1 && c == '\004') +{ +fprint(2, "remove 004\n"); + n--; +} + if(write(rcfd[1], buf, n) < 0) exits(0); /* mallocstats(); */ } @@ -1138,19 +1154,32 @@ rcstart(int fd[2]) argv[1] = "-i"; argv[2] = 0; - getpts(fd, slave); + /* + * fd0 is slave (tty), fd1 is master (pty) + */ + fd[0] = fd[1] = -1; + if(getpts(fd, slave) < 0) + fprint(2, "getpts: %r\n"); + switch(pid = fork()) { case 0: putenv("TERM=9term"); close(fd[1]); setsid(); + // tcsetpgrp(0, pid); sfd = open(slave, ORDWR); + fprint(2, "slave %s\n", slave); + if(sfd < 0) + fprint(2, "open %s: %r\n", slave); + if(ioctl(sfd, TIOCSCTTY, 0) < 0) + fprint(2, "ioctl TIOCSCTTY: %r\n"); // ioctl(sfd, I_PUSH, "ptem"); // ioctl(sfd, I_PUSH, "ldterm"); dup(sfd, 0); dup(sfd, 1); dup(sfd, 2); execvp(argv[0], argv); + _exits("oops"); break; case -1: fatal("proc failed: %r"); diff --git a/src/cmd/9term/FreeBSD.c b/src/cmd/9term/FreeBSD.c index f59977e1..e8b894dc 100644 --- a/src/cmd/9term/FreeBSD.c +++ b/src/cmd/9term/FreeBSD.c @@ -13,6 +13,5 @@ getchildwd(int pid, char *wdir, int bufn) int getpts(int fd[], char *slave) { - openpty(&fd[1], &fd[0], slave, 0, 0); - return 0; + return openpty(&fd[1], &fd[0], slave, 0, 0); } diff --git a/src/cmd/rc/plan9ish.c b/src/cmd/rc/plan9ish.c index 0c3076ec..1b250ba1 100644 --- a/src/cmd/rc/plan9ish.c +++ b/src/cmd/rc/plan9ish.c @@ -392,10 +392,12 @@ void notifyf(void *unused0, char *s) { int i; - for(i=0;syssigname[i];i++) if(strncmp(s, syssigname[i], strlen(syssigname[i]))==0){ - if(strncmp(s, "sys: ", 5)!=0) interrupted=1; - goto Out; - } + for(i=0;syssigname[i];i++) + if(strncmp(s, syssigname[i], strlen(syssigname[i]))==0){ + if(strncmp(s, "sys: ", 5)!=0) interrupted=1; + goto Out; + } + pfmt(err, "rc: note: %s\n", s); noted(NDFLT); return; @@ -423,7 +425,11 @@ long Write(int fd, char *buf, long cnt) } long Read(int fd, char *buf, long cnt) { - return read(fd, buf, cnt); + int i; + + i = read(fd, buf, cnt); + if(ntrap) dotrap(); + return i; } long Seek(int fd, long cnt, long whence) { diff --git a/src/lib9/_p9dir.c b/src/lib9/_p9dir.c index 43752222..af2a16c4 100644 --- a/src/lib9/_p9dir.c +++ b/src/lib9/_p9dir.c @@ -10,6 +10,36 @@ #if defined(__FreeBSD__) #include <sys/disklabel.h> +static int diskdev[] = { + 151, /* aacd */ + 116, /* ad */ + 157, /* ar */ + 118, /* afd */ + 133, /* amrd */ + 13, /* da */ + 102, /* fla */ + 109, /* idad */ + 95, /* md */ + 131, /* mlxd */ + 168, /* pst */ + 147, /* twed */ + 43, /* vn */ + 3, /* wd */ + 87, /* wfd */ +}; +static int +isdisk(struct stat *st) +{ + int i, dev; + + if(!S_ISCHR(st->st_mode)) + return 0; + dev = major(st->st_rdev); + for(i=0; i<nelem(diskdev); i++) + if(diskdev[i] == dev) + return 1; + return 0; +} #define _HAVEDISKLABEL #endif @@ -108,7 +138,7 @@ _p9dir(struct stat *st, char *name, Dir *d, char **str, char *estr) /* fetch real size for disks */ #ifdef _HAVEDISKLABEL - if(S_ISCHR(st->st_mode)){ + if(isdisk(st)){ int fd, n; struct disklabel lab; diff --git a/src/lib9/dirread.c b/src/lib9/dirread.c index 1e479fe4..5aa5c449 100644 --- a/src/lib9/dirread.c +++ b/src/lib9/dirread.c @@ -10,7 +10,6 @@ extern int _p9dir(struct stat*, char*, Dir*, char**, char*); static int mygetdents(int fd, struct dirent *buf, int n) { - ssize_t nn; off_t off; off = p9seek(fd, 0, 1); @@ -23,14 +22,8 @@ mygetdents(int fd, struct dirent *buf, int n) static int mygetdents(int fd, struct dirent *buf, int n) { - ssize_t nn; long off; - - off = p9seek(fd, 0, 1); - nn = getdirentries(fd, (void*)buf, n, &off); - if(nn > 0) - p9seek(fd, off, 0); - return nn; + return getdirentries(fd, (void*)buf, n, &off); } #elif defined(__sun__) static int @@ -38,7 +31,7 @@ mygetdents(int fd, struct dirent *buf, int n) { return getdents(fd, (void*)buf, n); } -#endif +#endif static int countde(char *p, int n) diff --git a/src/lib9/notify.c b/src/lib9/notify.c index 7e3c04f7..460eabfe 100644 --- a/src/lib9/notify.c +++ b/src/lib9/notify.c @@ -13,7 +13,7 @@ static int sigs[] = { SIGQUIT, SIGILL, SIGTRAP, - SIGABRT, +/* SIGABRT, */ #ifdef SIGEMT SIGEMT, #endif @@ -63,16 +63,17 @@ int notify(void (*f)(void*, char*)) { int i; - void (*sf)(int); + struct sigaction sa; + memset(&sa, 0, sizeof sa); if(f == nil) - sf = SIG_DFL; + sa.sa_handler = SIG_DFL; else{ notifyf = f; - sf = notifysigf; + sa.sa_handler = notifysigf; } for(i=0; i<nelem(sigs); i++) - signal(sigs[i], sf); + sigaction(sigs[i], &sa, 0); return 0; } diff --git a/src/libbio/bcat.c b/src/libbio/bcat.c index dea346a5..7c9b39e9 100644 --- a/src/libbio/bcat.c +++ b/src/libbio/bcat.c @@ -22,8 +22,12 @@ main(int argc, char **argv) { int i; Biobuf b, *bp; + Fmt fmt; Binit(&bout, 1, O_WRONLY); + Bfmtinit(&fmt, &bout); + fmtprint(&fmt, "hello, world\n"); + Bfmtflush(&fmt); if(argc == 1){ Binit(&b, 0, O_RDONLY); diff --git a/src/libbio/bprint.c b/src/libbio/bprint.c index 81e71e5e..2b66605c 100644 --- a/src/libbio/bprint.c +++ b/src/libbio/bprint.c @@ -4,25 +4,17 @@ int Bprint(Biobuf *bp, char *fmt, ...) { - va_list ap; - char *ip, *ep, *out; + va_list args; + Fmt f; int n; - ep = (char*)bp->ebuf; - ip = ep + bp->ocount; - va_start(ap, fmt); - out = vseprint(ip, ep, fmt, ap); - va_end(ap); - if(out == 0 || out >= ep-5) { - Bflush(bp); - ip = ep + bp->ocount; - va_start(ap, fmt); - out = vseprint(ip, ep, fmt, ap); - va_end(ap); - if(out >= ep-5) - return Beof; - } - n = out-ip; - bp->ocount += n; + if(Bfmtinit(&f, bp) < 0) + return -1; + va_start(args, fmt); + f.args = args; + n = dofmt(&f, fmt); + va_end(args); + if(n > 0 && Bfmtflush(&f) < 0) + return -1; return n; } diff --git a/src/libbio/mkfile b/src/libbio/mkfile index 2c64b257..e808b178 100644 --- a/src/libbio/mkfile +++ b/src/libbio/mkfile @@ -7,6 +7,7 @@ OFILES=\ bbuffered.$O\ bfildes.$O\ bflush.$O\ + bfmt.$O\ bgetc.$O\ bgetd.$O\ binit.$O\ @@ -26,6 +27,6 @@ HFILES=\ <$PLAN9/src/mksyslib -bcat: bcat.$O $LIB - $CC -o bcat bcat.$O -L$PLAN9/lib -lbio -lfmt -lutf +bcat: bcat.$O $PLAN9/lib/$LIB + $LD -o bcat bcat.$O -lbio -lfmt -lutf |