ignore SIGPIPE
[unix-history] / usr / src / usr.bin / window / wwinit.c
CommitLineData
5528a91e 1#ifndef lint
3f32a92a 2static char *sccsid = "@(#)wwinit.c 3.19 84/05/16";
5528a91e
EW
3#endif
4
5#include "ww.h"
e908bfac 6#include "tt.h"
b1189050
EW
7#include <sys/signal.h>
8#include <fcntl.h>
0e64e422 9#include "char.h"
5528a91e 10
5528a91e
EW
11wwinit()
12{
bb05dfb5 13 register i, j;
4222244b
EW
14 char *kp;
15 register char **p, **q;
16 char **env, **termcap;
17 extern char **environ;
7c38ad4d 18 int s;
4711df8b 19
bb05dfb5 20 wwdtablesize = getdtablesize();
4222244b
EW
21 wwhead.ww_forw = &wwhead;
22 wwhead.ww_back = &wwhead;
b1189050 23
7c38ad4d 24 s = sigblock(sigmask(SIGIO));
b1189050
EW
25 if (signal(SIGIO, wwrint) == BADSIG)
26 return -1;
b1189050 27
4711df8b
EW
28 if (wwgettty(0, &wwoldtty) < 0)
29 return -1;
c44edccd
EW
30 wwwintty = wwoldtty;
31 wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
4222244b
EW
32 wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
33 wwnewtty.ww_sgttyb.sg_erase = -1;
34 wwnewtty.ww_sgttyb.sg_kill = -1;
4711df8b 35 wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
2b44d852 36 wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
4222244b
EW
37 wwnewtty.ww_tchars.t_intrc = -1;
38 wwnewtty.ww_tchars.t_quitc = -1;
39 wwnewtty.ww_tchars.t_startc = -1;
40 wwnewtty.ww_tchars.t_stopc = -1;
41 wwnewtty.ww_tchars.t_eofc = -1;
42 wwnewtty.ww_tchars.t_brkc = -1;
43 wwnewtty.ww_ltchars.t_suspc = -1;
44 wwnewtty.ww_ltchars.t_dsuspc = -1;
45 wwnewtty.ww_ltchars.t_rprntc = -1;
46 wwnewtty.ww_ltchars.t_flushc = -1;
47 wwnewtty.ww_ltchars.t_werasc = -1;
48 wwnewtty.ww_ltchars.t_lnextc = -1;
49 wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
50 wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
51 wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
52
4711df8b 53 if (wwsettty(0, &wwnewtty) < 0)
bb05dfb5
EW
54 goto bad;
55
03e75950
EW
56 if ((wwterm = getenv("TERM")) == 0) {
57 wwerrno = WWE_BADTERM;
bb05dfb5 58 goto bad;
03e75950
EW
59 }
60 if (tgetent(wwtermcap, wwterm) != 1) {
61 wwerrno = WWE_BADTERM;
bb05dfb5 62 goto bad;
03e75950 63 }
bb05dfb5
EW
64 wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
65
66 if (ttinit() < 0)
67 goto bad;
68 wwnrow = tt.tt_nrow;
69 wwncol = tt.tt_ncol;
7d77e730 70 wwavailmodes = tt.tt_availmodes;
5e785082 71 wwwrap = tt.tt_wrap;
e908bfac 72 (*tt.tt_init)();
bb05dfb5 73
73218728
EW
74 if (wwavailmodes & WWM_REV)
75 wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
76 else if (wwavailmodes & WWM_UL)
77 wwcursormodes = WWM_UL;
78
8fa6d94c
EW
79 if ((wwib = malloc((unsigned) 512)) == 0)
80 goto bad;
81 wwibe = wwib + 512;
b1189050 82 wwibq = wwibp = wwib;
8fa6d94c 83
f2a77fe1 84 if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
bb05dfb5
EW
85 goto bad;
86 for (i = 0; i < wwnrow; i++)
87 for (j = 0; j < wwncol; j++)
88 wwsmap[i][j] = WWX_NOBODY;
0896e17e 89
bb05dfb5 90 wwos = (union ww_char **)
f2a77fe1 91 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
92 if (wwos == 0)
93 goto bad;
94 for (i = 0; i < wwnrow; i++)
95 for (j = 0; j < wwncol; j++)
96 wwos[i][j].c_w = ' ';
97 wwns = (union ww_char **)
f2a77fe1 98 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
99 if (wwns == 0)
100 goto bad;
101 for (i = 0; i < wwnrow; i++)
102 for (j = 0; j < wwncol; j++)
103 wwns[i][j].c_w = ' ';
104
861cd1ed 105 wwtouched = malloc((unsigned) wwnrow);
03e75950
EW
106 if (wwtouched == 0) {
107 wwerrno = WWE_NOMEM;
861cd1ed 108 goto bad;
03e75950 109 }
861cd1ed
EW
110 for (i = 0; i < wwnrow; i++)
111 wwtouched[i] = 0;
112
bb05dfb5
EW
113 wwindex[WWX_NOBODY] = &wwnobody;
114 wwnobody.ww_order = NWW;
3e0824a9 115
4222244b 116 kp = wwkeys;
3f32a92a
EW
117 wwaddcap("kb", &kp);
118 wwaddcap("ku", &kp);
119 wwaddcap("kd", &kp);
120 wwaddcap("kl", &kp);
121 wwaddcap("kr", &kp);
122 wwaddcap("kh", &kp);
4222244b
EW
123 if ((j = tgetnum("kn")) >= 0) {
124 char cap[32];
3e0824a9
EW
125 int i;
126
4222244b 127 (void) sprintf(kp, "kn#%d:", j);
3e0824a9
EW
128 for (; *kp; kp++)
129 ;
4222244b 130 for (i = 1; i <= j; i++) {
bb05dfb5 131 (void) sprintf(cap, "k%d", i);
3f32a92a 132 wwaddcap(cap, &kp);
3e0824a9 133 cap[0] = 'l';
3f32a92a 134 wwaddcap(cap, &kp);
3e0824a9
EW
135 }
136 }
4222244b
EW
137 for (i = 0, p = environ; *p++; i++)
138 ;
139 if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
140 goto bad;
141 for (p = environ, q = env; *p; p++, q++) {
142 if (strncmp(*p, "TERM=", 5) == 0)
143 *q = WWT_TERM;
144 else if (strncmp(*p, "TERMCAP=", 8) == 0)
145 termcap = q;
146 else
147 *q = *p;
148 }
149 *(termcap ? termcap : q++) = wwwintermcap;
150 *q = 0;
151 environ = env;
152
3f32a92a 153 (void) signal(SIGPIPE, SIG_IGN);
7c38ad4d 154 (void) sigsetmask(s);
4711df8b 155 return 0;
bb05dfb5 156bad:
861cd1ed
EW
157 /*
158 * Don't bother to free storage. We're supposed
159 * to exit when wwinit fails anyway.
160 */
bb05dfb5 161 (void) wwsettty(0, &wwoldtty);
b1189050 162 (void) signal(SIGIO, SIG_DFL);
7c38ad4d 163 (void) sigsetmask(s);
bb05dfb5 164 return -1;
5528a91e 165}
3e0824a9 166
3f32a92a 167wwaddcap(cap, kp)
3e0824a9 168register char *cap;
4222244b 169register char **kp;
3e0824a9 170{
bb05dfb5
EW
171 char tbuf[512];
172 char *tp = tbuf;
9ad71678 173 register char *str, *p;
3e0824a9
EW
174
175 if ((str = tgetstr(cap, &tp)) != 0) {
4222244b 176 while (*(*kp)++ = *cap++)
3e0824a9 177 ;
4222244b 178 (*kp)[-1] = '=';
9ad71678 179 while (*str) {
4222244b 180 for (p = unctrl(*str++); *(*kp)++ = *p++;)
9ad71678 181 ;
4222244b 182 (*kp)--;
9ad71678 183 }
4222244b
EW
184 *(*kp)++ = ':';
185 **kp = 0;
3e0824a9
EW
186 }
187}