xref: /csrg-svn/usr.bin/window/wwenviron.c (revision 15659)
114689Sedward #ifndef lint
2*15659Sedward static	char *sccsid = "@(#)wwenviron.c	3.6 83/12/03";
314689Sedward #endif
414689Sedward 
514689Sedward #include "ww.h"
614689Sedward 
714888Sedward /*
814888Sedward  * Set up the environment of this process to run in window 'wp'.
915632Sedward  * Can't report errors in any intelligent way, because the parent
1015632Sedward  * hangs in vfork() until we die, but we can't die until output
1115632Sedward  * drains (i.e. deadlock).  So don't say anything.
1214888Sedward  */
1314689Sedward wwenviron(wp)
1414689Sedward register struct ww *wp;
1514689Sedward {
1615607Sedward 	static char **termcap = 0;
1715607Sedward 	static char *tbuf;
1814689Sedward 	register i;
19*15659Sedward 	int pgrp = getpid();
2014689Sedward 
2114888Sedward 	i = open("/dev/tty", 0);
2215632Sedward 	if (i < 0)
2314888Sedward 		return;
2415632Sedward 	if (ioctl(i, (int)TIOCNOTTY, (char *)0) < 0)
2514888Sedward 		return;
2614689Sedward 	(void) close(i);
2715632Sedward 	if ((i = open(wp->ww_ttyname, 2)) < 0)
2814888Sedward 		return;
2915632Sedward 	(void) dup2(i, 0);
3015632Sedward 	(void) dup2(i, 1);
3115632Sedward 	(void) dup2(i, 2);
3215632Sedward 	for (i = wwdtablesize - 1; i > 2; i--)
3315632Sedward 		(void) close(i);
34*15659Sedward 	if (ioctl(0, (int)TIOCSPGRP, &pgrp) < 0)
35*15659Sedward 		return;
36*15659Sedward 	(void) setpgrp(pgrp, pgrp);
3714689Sedward 
3815607Sedward 	/*
3915607Sedward 	 * Do this only once if vfork().
4015607Sedward 	 */
4115607Sedward 	if (termcap == 0) {
4215607Sedward 		extern char **environ;
4315607Sedward 		static char **env;
4415607Sedward 		register char **p, **q;
4515607Sedward 
4615607Sedward 		for (i = 0, p = environ; *p; p++, i++)
4715607Sedward 			;
4815607Sedward 		env = (char **)malloc((unsigned)(i + 3) * sizeof (char *));
4915607Sedward 		if (env == 0)
5015607Sedward 			return;
5115607Sedward 		if ((tbuf = malloc((unsigned) 1024)) == 0)
5215607Sedward 			return;
5315607Sedward 		for (p = environ, q = env; *p; p++, q++) {
5415607Sedward 			if (strncmp(*p, "TERM=", 5) == 0)
5515607Sedward 				*q = WWT_TERM;
5615607Sedward 			else if (strncmp(*p, "TERMCAP=", 8) == 0)
5715607Sedward 				termcap = q;
5815607Sedward 			else
5915607Sedward 				*q = *p;
6015607Sedward 		}
6115607Sedward 		if (termcap == 0)
6215607Sedward 			termcap = q++;
6315607Sedward 		*q = 0;
6415607Sedward 		environ = env;
6514689Sedward 	}
6614710Sedward 	*termcap = sprintf(tbuf, "TERMCAP=%sco#%d:li#%d:",
6714710Sedward 		WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr);
6814689Sedward 	if (wwavailmodes & WWM_REV)
6914689Sedward 		(void) strcat(tbuf, WWT_REV);
7014689Sedward 	if (wwavailmodes & WWM_UL)
7114689Sedward 		(void) strcat(tbuf, WWT_UL);
7214689Sedward 	(void) strcat(tbuf, wwkeys);
7314689Sedward }
74