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