/* * Set up the environment of this process to run in window 'wp'. */ int wwenviron(struct ww *wp) { int i; #ifndef TIOCSCTTY int pgrp = getpid(); #endif char buf[1024]; sigset_t nsigset; #ifndef TIOCSCTTY if ((i = open("/dev/tty", 0)) < 0) goto bad; if (ioctl(i, TIOCNOTTY, (char *)0) < 0) goto bad; (void) close(i); #endif if ((i = wp->ww_socket) < 0) { if ((i = open(wp->ww_ttyname, 2)) < 0) goto bad; if (wwsettty(i, &wwwintty) < 0) goto bad; if (wwsetttysize(i, wp->ww_w.nr, wp->ww_w.nc) < 0) goto bad; } (void) dup2(i, 0); (void) dup2(i, 1); (void) dup2(i, 2); (void) close(i); #ifdef TIOCSCTTY (void) setsid(); (void) ioctl(0, TIOCSCTTY, 0); #else (void) ioctl(0, TIOCSPGRP, (char *)&pgrp); (void) setpgid(pgrp, pgrp); #endif /* SIGPIPE is the only one we ignore */ (void) signal(SIGPIPE, SIG_DFL); sigemptyset(&nsigset); sigprocmask(SIG_SETMASK, &nsigset, (sigset_t *)0); /* * Two conditions that make destructive setenv ok: * 1. setenv() copies the string, * 2. we've already called tgetent which copies the termcap entry. */ (void) sprintf(buf, "%sco#%d:li#%d:%s", WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap); (void) setenv("TERMCAP", buf, 1); (void) sprintf(buf, "%d", wp->ww_id + 1); (void) setenv("WINDOW_ID", buf, 1); return 0; bad: wwerrno = WWE_SYS; return -1; }
wwend() { wwupdate(); if (tt.tt_insert) (*tt.tt_setinsert)(0); if (tt.tt_modes) (*tt.tt_setmodes)(0); (*tt.tt_move)(tt.tt_nrow - 1, 0); (*tt.tt_end)(); ttflush(); (void) wwsettty(0, &wwoldtty, &wwnewtty); }
wwsuspend() { int (*oldsig)(); oldsig = signal(SIGTSTP, SIG_IGN); wwend(); (void) signal(SIGTSTP, SIG_DFL); (void) kill(0, SIGTSTP); (void) signal(SIGTSTP, SIG_IGN); (void) wwsettty(0, &wwnewtty, &wwoldtty); (*tt.tt_init)(); wwredraw(); (void) signal(SIGTSTP, oldsig); }
wwinit() { register i, j; char *kp; int s; wwdtablesize = getdtablesize(); wwhead.ww_forw = &wwhead; wwhead.ww_back = &wwhead; s = sigblock(sigmask(SIGIO)); 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; wwwintty = wwoldtty; #ifdef OLD_TTY wwwintty.ww_sgttyb.sg_flags &= ~XTABS; wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; wwnewtty.ww_sgttyb.sg_erase = -1; wwnewtty.ww_sgttyb.sg_kill = -1; wwnewtty.ww_sgttyb.sg_flags |= CBREAK; wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); wwnewtty.ww_tchars.t_intrc = -1; wwnewtty.ww_tchars.t_quitc = -1; wwnewtty.ww_tchars.t_startc = -1; wwnewtty.ww_tchars.t_stopc = -1; wwnewtty.ww_tchars.t_eofc = -1; wwnewtty.ww_tchars.t_brkc = -1; wwnewtty.ww_ltchars.t_suspc = -1; wwnewtty.ww_ltchars.t_dsuspc = -1; wwnewtty.ww_ltchars.t_rprntc = -1; wwnewtty.ww_ltchars.t_flushc = -1; wwnewtty.ww_ltchars.t_werasc = -1; wwnewtty.ww_ltchars.t_lnextc = -1; wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; #else #ifndef OXTABS #define OXTABS XTABS #endif #ifndef _POSIX_VDISABLE #define _POSIX_VDISABLE -1 #endif wwwintty.ww_termios.c_oflag &= ~OXTABS; wwnewtty.ww_termios = wwoldtty.ww_termios; wwnewtty.ww_termios.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL); wwnewtty.ww_termios.c_iflag |= INPCK; wwnewtty.ww_termios.c_oflag = 0; wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB); wwnewtty.ww_termios.c_cflag |= CS8; wwnewtty.ww_termios.c_lflag = 0; for (i = 0; i < NCCS; i++) wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE; #endif wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; if (wwsettty(0, &wwnewtty) < 0) goto bad; if ((wwterm = getenv("TERM")) == 0) { wwerrno = WWE_BADTERM; goto bad; } if (tgetent(wwtermcap, wwterm) != 1) { wwerrno = WWE_BADTERM; goto bad; } #ifdef OLD_TTY wwospeed = wwoldtty.ww_sgttyb.sg_ospeed; #else wwospeed = cfgetospeed(&wwoldtty.ww_termios); #endif switch (wwospeed) { default: case B0: wwbaud = 0; break; case B50: wwbaud = 50; break; case B75: wwbaud = 75; break; case B110: wwbaud = 110; break; case B134: wwbaud = 134; break; case B150: wwbaud = 150; break; case B200: wwbaud = 200; break; case B300: wwbaud = 300; break; case B600: wwbaud = 600; break; case B1200: wwbaud = 1200; break; case B1800: wwbaud = 1800; break; case B2400: wwbaud = 2400; break; case B4800: wwbaud = 4800; break; case B9600: wwbaud = 9600; break; #ifdef B19200 case B19200: #else case EXTA: #endif wwbaud = 19200; break; #ifdef B38400 case B38400: #else case EXTB: #endif wwbaud = 38400; break; } if (xxinit() < 0) goto bad; wwnrow = tt.tt_nrow; wwncol = tt.tt_ncol; wwavailmodes = tt.tt_availmodes; wwwrap = tt.tt_wrap; if (wwavailmodes & WWM_REV) wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; else if (wwavailmodes & WWM_UL) wwcursormodes = WWM_UL; if ((wwib = malloc((unsigned) 512)) == 0) goto bad; wwibe = wwib + 512; wwibq = wwibp = wwib; if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) goto bad; for (i = 0; i < wwnrow; i++) for (j = 0; j < wwncol; j++) wwsmap[i][j] = WWX_NOBODY; wwos = (union ww_char **) wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); if (wwos == 0) goto bad; for (i = 0; i < wwnrow; i++) for (j = 0; j < wwncol; j++) wwos[i][j].c_w = ' '; wwns = (union ww_char **) wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); if (wwns == 0) goto bad; for (i = 0; i < wwnrow; i++) for (j = 0; j < wwncol; j++) wwns[i][j].c_w = ' '; wwtouched = malloc((unsigned) wwnrow); if (wwtouched == 0) { wwerrno = WWE_NOMEM; goto bad; } 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 = 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) wwaddcap1(WWT_IMEI, &kp); if (tt.tt_insspace) wwaddcap1(WWT_IC, &kp); if (tt.tt_delchar) wwaddcap1(WWT_DC, &kp); wwaddcap("kb", &kp); wwaddcap("ku", &kp); wwaddcap("kd", &kp); wwaddcap("kl", &kp); wwaddcap("kr", &kp); wwaddcap("kh", &kp); if ((j = tgetnum("kn")) >= 0) { char cap[32]; (void) sprintf(kp, "kn#%d:", j); for (; *kp; kp++) ; for (i = 1; i <= j; i++) { (void) sprintf(cap, "k%d", i); wwaddcap(cap, &kp); cap[0] = 'l'; wwaddcap(cap, &kp); } } /* * 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) sigsetmask(s); /* catch typeahead before ASYNC was set */ (void) kill(getpid(), SIGIO); xxstart(); return 0; bad: /* * Don't bother to free storage. We're supposed * to exit when wwinit fails anyway. */ (void) wwsettty(0, &wwoldtty); (void) signal(SIGIO, SIG_DFL); (void) sigsetmask(s); return -1; }