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