xref: /csrg-svn/usr.bin/window/wwenviron.c (revision 14888)
114689Sedward #ifndef lint
2*14888Sedward static	char *sccsid = "@(#)wwenviron.c	3.3 83/08/31";
314689Sedward #endif
414689Sedward 
514689Sedward #include "ww.h"
614689Sedward 
714689Sedward extern char **environ;
814689Sedward 
9*14888Sedward /*
10*14888Sedward  * Set up the environment of this process to run in window 'wp'.
11*14888Sedward  * Can't report errors in any intelligent way, so don't.
12*14888Sedward  */
1314689Sedward wwenviron(wp)
1414689Sedward register struct ww *wp;
1514689Sedward {
1614689Sedward 	register i;
1714689Sedward 	register char **p, **q;
1814689Sedward 	char **termcap = 0;
1914689Sedward 	char **env;
2014689Sedward 	char *tbuf;
2114689Sedward 
2214689Sedward 	(void) dup2(wp->ww_tty, 0);
2314689Sedward 	(void) dup2(wp->ww_tty, 1);
2414689Sedward 	(void) dup2(wp->ww_tty, 2);
2514689Sedward 	for (i = wwdtablesize - 1; i > 2; i--)
2614689Sedward 		(void) close(i);
2714689Sedward 
28*14888Sedward 	i = open("/dev/tty", 0);
29*14888Sedward 	if (i < 0) {
30*14888Sedward 		perror("/dev/tty");
31*14888Sedward 		return;
32*14888Sedward 	}
33*14888Sedward 	if (ioctl(i, (int)TIOCNOTTY, (char *)0) < 0) {
34*14888Sedward 		perror("ioctl(TIOCNOTTY)");
35*14888Sedward 		return;
36*14888Sedward 	}
3714689Sedward 	(void) close(i);
38*14888Sedward 	if (open(wp->ww_ttyname, 0) < 0) {
39*14888Sedward 		perror(wp->ww_ttyname);
40*14888Sedward 		return;
41*14888Sedward 	}
4214689Sedward 
4314689Sedward 	for (i = 0, p = environ; *p; p++, i++)
4414689Sedward 		;
4514689Sedward 	if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
46*14888Sedward 		return;
4714689Sedward 	if ((tbuf = malloc((unsigned) 1024)) == 0)
48*14888Sedward 		return;
4914689Sedward 	for (p = environ, q = env; *p; p++, q++) {
5014689Sedward 		if (strncmp(*p, "TERM=", 5) == 0)
5114689Sedward 			*q = WWT_TERM;
5214689Sedward 		else if (strncmp(*p, "TERMCAP=", 8) == 0)
5314689Sedward 			termcap = q;
5414689Sedward 		else
5514689Sedward 			*q = *p;
5614689Sedward 	}
5714689Sedward 	if (termcap == 0)
5814689Sedward 		termcap = q++;
5914689Sedward 	*q = 0;
6014710Sedward 	*termcap = sprintf(tbuf, "TERMCAP=%sco#%d:li#%d:",
6114710Sedward 		WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr);
6214689Sedward 	if (wwavailmodes & WWM_REV)
6314689Sedward 		(void) strcat(tbuf, WWT_REV);
6414689Sedward 	if (wwavailmodes & WWM_UL)
6514689Sedward 		(void) strcat(tbuf, WWT_UL);
6614689Sedward 	(void) strcat(tbuf, wwkeys);
6714689Sedward 	environ = env;
6814689Sedward }
69