xref: /original-bsd/usr.bin/window/wwspawn.c (revision 8251a00e)
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