1 #ifndef lint 2 static char *sccsid = "@(#)wwspawn.c 3.1 83/08/11"; 3 #endif 4 5 #include "ww.h" 6 7 wwfork(wp) 8 register struct ww *wp; 9 { 10 switch (wp->ww_pid = fork()) { 11 case -1: 12 return -1; 13 case 0: 14 moncontrol(0); 15 wp->ww_state = WWS_INCHILD; 16 wwenviron(wp); 17 return 0; 18 default: 19 wp->ww_state = WWS_HASPROC; 20 (void) close(wp->ww_tty); 21 wp->ww_tty = -1; 22 return wp->ww_pid; 23 } 24 } 25 26 #define TERM "TERM=window" 27 #define TERMCAP "TERMCAP=WW|window|window package:\ 28 :cr=^M:nl=^J:bl=^G:\ 29 :al=\\EL:am:le=^H:bs:cd=\\EJ:ce=\\EK:cl=\\EE:cm=\\EY%%+ %%+ :\ 30 :co#%d:dc=\\EN:dl=\\EM:do=\\EB:ei=\\EO:ho=\\EH:li#%d:im=\\E@:mi:\ 31 :nd=\\EC:ta=^I:pt:up=\\EA:" 32 static char *env[100]; 33 static char buf[1024]; 34 extern char **environ; 35 36 wwenviron(wp) 37 register struct ww *wp; 38 { 39 register i; 40 register char **p, **q; 41 char **termcap = 0; 42 43 (void) dup2(wp->ww_tty, 0); 44 (void) dup2(wp->ww_tty, 1); 45 (void) dup2(wp->ww_tty, 2); 46 for (i = wwdtablesize - 1; i > 2; i--) 47 (void) close(i); 48 49 i = open("/dev/tty"); 50 (void) ioctl(i, (int)TIOCNOTTY, (char *)0); 51 (void) close(i); 52 (void) open(wp->ww_ttyname, 0); 53 54 for (p = environ, q = env; *p; p++, q++) { 55 if (strncmp(*p, "TERM=", 5) == 0) 56 *q = TERM; 57 else if (strncmp(*p, "TERMCAP=", 8) == 0) 58 termcap = q; 59 else 60 *q = *p; 61 } 62 if (termcap == 0) 63 termcap = q++; 64 *q = 0; 65 *termcap = sprintf(buf, TERMCAP, wp->ww_w.nc, wp->ww_w.nr); 66 (void) strcat(buf, wwkeys); 67 environ = env; 68 } 69