1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)wwenviron.c 3.20 (Berkeley) 06/29/88"; 20 #endif /* not lint */ 21 22 #include "ww.h" 23 #include <sys/signal.h> 24 25 /* 26 * Set up the environment of this process to run in window 'wp'. 27 */ 28 wwenviron(wp) 29 register struct ww *wp; 30 { 31 register i; 32 int pgrp = getpid(); 33 char buf[1024]; 34 35 if ((i = open("/dev/tty", 0)) < 0) 36 goto bad; 37 if (ioctl(i, TIOCNOTTY, (char *)0) < 0) 38 goto bad; 39 (void) close(i); 40 if ((i = wp->ww_socket) < 0 && (i = open(wp->ww_ttyname, 2)) < 0) 41 goto bad; 42 (void) dup2(i, 0); 43 (void) dup2(i, 1); 44 (void) dup2(i, 2); 45 for (i = wwdtablesize - 1; i > 2; i--) 46 (void) close(i); 47 (void) ioctl(0, TIOCSPGRP, (char *)&pgrp); 48 (void) setpgrp(pgrp, pgrp); 49 /* SIGPIPE is the only one we ignore */ 50 (void) signal(SIGPIPE, SIG_DFL); 51 (void) sigsetmask(0); 52 /* 53 * Two conditions that make destructive setenv ok: 54 * 1. setenv() copies the string, 55 * 2. we've already called tgetent which copies the termcap entry. 56 */ 57 (void) sprintf(buf, "%sco#%d:li#%d:%s", 58 WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap); 59 (void) setenv("TERMCAP", buf, 1); 60 (void) sprintf(buf, "%d", wp->ww_id + 1); 61 (void) setenv("WINDOW_ID", buf, 1); 62 return 0; 63 bad: 64 wwerrno = WWE_SYS; 65 return -1; 66 } 67