cons.c revision 1.8.4.2 1 /*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1991 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * from: @(#)cons.c 7.2 (Berkeley) 5/9/91
39 * $Id: cons.c,v 1.8.4.2 1993/10/17 14:03:04 mycroft Exp $
40 */
41
42
43 #include "param.h"
44 #include "proc.h"
45 #include "user.h"
46 #include "systm.h"
47 #include "buf.h"
48 #include "ioctl.h"
49 #include "tty.h"
50 #include "file.h"
51 #include "conf.h"
52
53 #include "cons.h"
54
55 /* XXX - all this could be autoconfig()ed */
56 #include "pc.h"
57 #if NPC > 0
58 int pccnprobe(), pccninit(), pccngetc(), pccnputc();
59 #endif
60 #include "com.h"
61 #if NCOM > 0
62 int comcnprobe(), comcninit(), comcngetc(), comcnputc();
63 #endif
64
65 struct consdev constab[] = {
66 #if NPC > 0
67 { pccnprobe, pccninit, pccngetc, pccnputc },
68 #endif
69 #if NCOM > 0
70 { comcnprobe, comcninit, comcngetc, comcnputc },
71 #endif
72 { 0 },
73 };
74 /* end XXX */
75
76 struct tty *constty = 0; /* virtual console output device */
77 struct consdev *cn_tab; /* physical console device info */
78
79 void
80 consinit()
81 {
82 register struct consdev *cp;
83
84 /*
85 * Collect information about all possible consoles
86 * and find the one with highest priority
87 */
88 for (cp = constab; cp->cn_probe; cp++) {
89 (*cp->cn_probe)(cp);
90 if (cp->cn_pri > CN_DEAD &&
91 (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
92 cn_tab = cp;
93 }
94 /*
95 * No console, we can handle it
96 */
97 if ((cp = cn_tab) == NULL)
98 return;
99 /*
100 * Turn on console
101 */
102 (*cp->cn_attach)(cp);
103 }
104
105 int
106 cnopen(dev, flag, mode, p)
107 dev_t dev;
108 int flag, mode;
109 struct proc *p;
110 {
111 if (cn_tab == NULL)
112 return (0);
113 dev = cn_tab->cn_dev;
114 return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
115 }
116
117 int
118 cnclose(dev, flag, mode, p)
119 dev_t dev;
120 int flag, mode;
121 struct proc *p;
122 {
123 if (cn_tab == NULL)
124 return (0);
125 dev = cn_tab->cn_dev;
126 return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
127 }
128
129 int
130 cnread(dev, uio, flag)
131 dev_t dev;
132 struct uio *uio;
133 {
134 if (cn_tab == NULL)
135 return (0);
136 dev = cn_tab->cn_dev;
137 return ((*cdevsw[major(dev)].d_read)(dev, uio, flag));
138 }
139
140 int
141 cnwrite(dev, uio, flag)
142 dev_t dev;
143 struct uio *uio;
144 {
145 if (cn_tab == NULL)
146 return (0);
147 if (constty) /* 16 Aug 92*/
148 dev = constty->t_dev;
149 else
150 dev = cn_tab->cn_dev;
151 return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
152 }
153
154 int
155 cnioctl(dev, cmd, data, flag, p)
156 dev_t dev;
157 caddr_t data;
158 struct proc *p;
159 {
160 int error;
161
162 if (cn_tab == NULL)
163 return (0);
164 /*
165 * Superuser can always use this to wrest control of console
166 * output from the "virtual" console.
167 */
168 if (cmd == TIOCCONS && constty) {
169 error = suser(p->p_ucred, (u_short *) NULL);
170 if (error)
171 return (error);
172 constty = NULL;
173 return (0);
174 }
175 dev = cn_tab->cn_dev;
176 return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
177 }
178
179 /*ARGSUSED*/
180 int
181 cnselect(dev, rw, p)
182 dev_t dev;
183 int rw;
184 struct proc *p;
185 {
186 if (cn_tab == NULL)
187 return (1);
188 return (ttselect(cn_tab->cn_dev, rw, p));
189 }
190
191 int
192 cngetc()
193 {
194 if (cn_tab == NULL)
195 return (0);
196 return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
197 }
198
199 int
200 cnputc(c)
201 register int c;
202 {
203 if (cn_tab == NULL)
204 return;
205 if (c) {
206 (*cn_tab->cn_putc)(cn_tab->cn_dev, c);
207 if (c == '\n')
208 (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
209 }
210 }
211
212 int pg_wait = 0;
213 pg(p,q,r,s,t,u,v,w,x,y,z) char *p; {
214 printf(p,q,r,s,t,u,v,w,x,y,z);
215 if (pg_wait) {
216 printf("\n>");
217 return(cngetc());
218 } else
219 return 0;
220 }
221