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