|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Edward Wang at The University of California, Berkeley.
7: *
8: * Redistribution and use in source and binary forms are permitted provided
9: * that: (1) source distributions retain this entire copyright notice and
10: * comment, and (2) distributions including binaries display the following
11: * acknowledgement: ``This product includes software developed by the
12: * University of California, Berkeley and its contributors'' in the
13: * documentation or other materials provided with the distribution and in
14: * all advertising materials mentioning features or use of this software.
15: * Neither the name of the University nor the names of its contributors may
16: * be used to endorse or promote products derived from this software without
17: * specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)wwenviron.c 3.26 (Berkeley) 6/6/90";
25: #endif /* not lint */
26:
27: #include "ww.h"
28: #ifdef POSIX_TTY
29: #include <sys/ioctl.h>
30: #endif
31: #include <sys/signal.h>
32:
33: /*
34: * Set up the environment of this process to run in window 'wp'.
35: */
36: wwenviron(wp)
37: register struct ww *wp;
38: {
39: register i;
40: #ifndef TIOCSCTTY
41: int pgrp = getpid();
42: #endif
43: char buf[1024];
44:
45: #ifndef TIOCSCTTY
46: if ((i = open("/dev/tty", 0)) < 0)
47: goto bad;
48: if (ioctl(i, TIOCNOTTY, (char *)0) < 0)
49: goto bad;
50: (void) close(i);
51: #endif
52: if ((i = wp->ww_socket) < 0) {
53: struct winsize winsize;
54:
55: if ((i = open(wp->ww_ttyname, 2)) < 0)
56: goto bad;
57: if (wwsettty(i, &wwwintty, (struct ww_tty *)0) < 0)
58: goto bad;
59: winsize.ws_row = wp->ww_w.nr;
60: winsize.ws_col = wp->ww_w.nc;
61: winsize.ws_xpixel = winsize.ws_ypixel = 0;
62: if (ioctl(i, TIOCSWINSZ, (char *)&winsize) < 0)
63: goto bad;
64: }
65: (void) dup2(i, 0);
66: (void) dup2(i, 1);
67: (void) dup2(i, 2);
68: for (i = wwdtablesize - 1; i > 2; i--)
69: (void) close(i);
70: #ifdef TIOCSCTTY
71: (void) setsid(0);
72: (void) ioctl(0, TIOCSCTTY, 0);
73: #else
74: (void) ioctl(0, TIOCSPGRP, (char *)&pgrp);
75: (void) setpgrp(pgrp, pgrp);
76: #endif
77: /* SIGPIPE is the only one we ignore */
78: (void) signal(SIGPIPE, SIG_DFL);
79: (void) sigsetmask(0);
80: /*
81: * Two conditions that make destructive setenv ok:
82: * 1. setenv() copies the string,
83: * 2. we've already called tgetent which copies the termcap entry.
84: */
85: (void) sprintf(buf, "%sco#%d:li#%d:%s",
86: WWT_TERMCAP, wp->ww_w.nc, wp->ww_w.nr, wwwintermcap);
87: (void) setenv("TERMCAP", buf, 1);
88: (void) sprintf(buf, "%d", wp->ww_id + 1);
89: (void) setenv("WINDOW_ID", buf, 1);
90: return 0;
91: bad:
92: wwerrno = WWE_SYS;
93: return -1;
94: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.