X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/a9c641ccc9a64db71041524402baf4671edf6319..d93758100f2a0e2107957c31450a3e9c6bf278b8:/usr/src/usr.bin/window/wwinit.c diff --git a/usr/src/usr.bin/window/wwinit.c b/usr/src/usr.bin/window/wwinit.c index b9660953d3..be9bfcbb09 100644 --- a/usr/src/usr.bin/window/wwinit.c +++ b/usr/src/usr.bin/window/wwinit.c @@ -1,13 +1,24 @@ -#ifndef lint -static char sccsid[] = "@(#)wwinit.c 3.26 %G%"; -#endif - /* - * Copyright (c) 1983 Regents of the University of California, - * All rights reserved. Redistribution permitted subject to - * the terms of the Berkeley Software License Agreement. + * Copyright (c) 1983 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ +#ifndef lint +static char sccsid[] = "@(#)wwinit.c 3.35 (Berkeley) %G%"; +#endif /* not lint */ + #include "ww.h" #include "tt.h" #include @@ -18,9 +29,6 @@ wwinit() { register i, j; char *kp; - register char **p, **q; - char **env, **termcap = 0; - extern char **environ; int s; wwdtablesize = getdtablesize(); @@ -28,8 +36,12 @@ wwinit() wwhead.ww_back = &wwhead; s = sigblock(sigmask(SIGIO)); - if (signal(SIGIO, wwrint) == BADSIG) + if (signal(SIGIO, wwrint) == BADSIG || + signal(SIGCHLD, wwchild) == BADSIG || + signal(SIGPIPE, SIG_IGN) == BADSIG) { + wwerrno = WWE_SYS; return -1; + } if (wwgettty(0, &wwoldtty) < 0) return -1; @@ -68,13 +80,12 @@ wwinit() } wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; - if (ttinit() < 0) + if (xxinit() < 0) goto bad; wwnrow = tt.tt_nrow; wwncol = tt.tt_ncol; wwavailmodes = tt.tt_availmodes; wwwrap = tt.tt_wrap; - (*tt.tt_init)(); if (wwavailmodes & WWM_REV) wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; @@ -115,10 +126,34 @@ wwinit() for (i = 0; i < wwnrow; i++) wwtouched[i] = 0; + wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd); + if (wwupd == 0) { + wwerrno = WWE_NOMEM; + goto bad; + } + wwindex[WWX_NOBODY] = &wwnobody; wwnobody.ww_order = NWW; - kp = wwkeys; + kp = wwwintermcap; + if (wwavailmodes & WWM_REV) + wwaddcap1(WWT_REV, &kp); + if (wwavailmodes & WWM_BLK) + wwaddcap1(WWT_BLK, &kp); + if (wwavailmodes & WWM_UL) + wwaddcap1(WWT_UL, &kp); + if (wwavailmodes & WWM_GRP) + wwaddcap1(WWT_GRP, &kp); + if (wwavailmodes & WWM_DIM) + wwaddcap1(WWT_DIM, &kp); + if (wwavailmodes & WWM_USR) + wwaddcap1(WWT_USR, &kp); + if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll) + wwaddcap1(WWT_ALDL, &kp); + if (tt.tt_inschar || tt.tt_insspace) + wwaddcap1(WWT_IMEI, &kp); + if (tt.tt_delchar) + wwaddcap1(WWT_DC, &kp); wwaddcap("kb", &kp); wwaddcap("ku", &kp); wwaddcap("kd", &kp); @@ -138,24 +173,17 @@ wwinit() wwaddcap(cap, &kp); } } - for (i = 0, p = environ; *p++; i++) - ; - if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0) - goto bad; - for (p = environ, q = env; *p; p++, q++) { - if (strncmp(*p, "TERM=", 5) == 0) - *q = WWT_TERM; - else if (strncmp(*p, "TERMCAP=", 8) == 0) - termcap = q; - else - *q = *p; - } - *(termcap ? termcap : q++) = wwwintermcap; - *q = 0; - environ = env; + /* + * It's ok to do this here even if setenv() is destructive + * since tt_init() has already made its own copy of it and + * wwterm now points to the copy. + */ + (void) setenv("TERM", WWT_TERM, 1); - (void) signal(SIGPIPE, SIG_IGN); (void) sigsetmask(s); + /* catch typeahead before ASYNC was set */ + (void) kill(getpid(), SIGIO); + xxstart(); return 0; bad: /* @@ -169,8 +197,8 @@ bad: } wwaddcap(cap, kp) -register char *cap; -register char **kp; + register char *cap; + register char **kp; { char tbuf[512]; char *tp = tbuf; @@ -189,3 +217,12 @@ register char **kp; **kp = 0; } } + +wwaddcap1(cap, kp) + register char *cap; + register char **kp; +{ + while (*(*kp)++ = *cap++) + ; + (*kp)--; +}