|
|
1.1 root 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: * @(#)cons.c 7.2 (Berkeley) 5/9/91
39: *
40: * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE
41: * -------------------- ----- ----------------------
42: * CURRENT PATCH LEVEL: 1 00083
43: * -------------------- ----- ----------------------
44: *
45: * 16 Aug 92 Pace Willisson /dev/console redirect (xterm -C, etc.)
46: * 14 Mar 93 Chris G. Demetriou Moved pg() here from isa/pccons.c
47: */
48:
49:
50: #include "sys/param.h"
51: #include "sys/proc.h"
52: #include "sys/user.h"
53: #include "sys/systm.h"
54: #include "sys/buf.h"
55: #include "sys/ioctl.h"
56: #include "sys/tty.h"
57: #include "sys/file.h"
58: #include "sys/conf.h"
59:
60: #include "cons.h"
61:
62: /* XXX - all this could be autoconfig()ed */
63: int pccnprobe(), pccninit(), pccngetc(), pccnputc();
64: #include "com.h"
65: #if NCOM > 0
66: int comcnprobe(), comcninit(), comcngetc(), comcnputc();
67: #endif
68:
69: struct consdev constab[] = {
70: { pccnprobe, pccninit, pccngetc, pccnputc },
71: #if NCOM > 0
72: { comcnprobe, comcninit, comcngetc, comcnputc },
73: #endif
74: { 0 },
75: };
76: /* end XXX */
77:
78: struct tty *constty = 0; /* virtual console output device */
79: struct consdev *cn_tab; /* physical console device info */
80: struct tty *cn_tty; /* XXX: console tty struct for tprintf */
81:
82: cninit()
83: {
84: register struct consdev *cp;
85:
86: /*
87: * Collect information about all possible consoles
88: * and find the one with highest priority
89: */
90: for (cp = constab; cp->cn_probe; cp++) {
91: (*cp->cn_probe)(cp);
92: if (cp->cn_pri > CN_DEAD &&
93: (cn_tab == NULL || cp->cn_pri > cn_tab->cn_pri))
94: cn_tab = cp;
95: }
96: /*
97: * No console, we can handle it
98: */
99: if ((cp = cn_tab) == NULL)
100: return;
101: /*
102: * Turn on console
103: */
104: cn_tty = cp->cn_tp;
105: (*cp->cn_init)(cp);
106: }
107:
108: cnopen(dev, flag, mode, p)
109: dev_t dev;
110: int flag, mode;
111: struct proc *p;
112: {
113: if (cn_tab == NULL)
114: return (0);
115: dev = cn_tab->cn_dev;
116: return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
117: }
118:
119: cnclose(dev, flag, mode, p)
120: dev_t dev;
121: int flag, mode;
122: struct proc *p;
123: {
124: if (cn_tab == NULL)
125: return (0);
126: dev = cn_tab->cn_dev;
127: return ((*cdevsw[major(dev)].d_close)(dev, flag, mode, p));
128: }
129:
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: cnwrite(dev, uio, flag)
141: dev_t dev;
142: struct uio *uio;
143: {
144: if (cn_tab == NULL)
145: return (0);
146: if (constty) /* 16 Aug 92*/
147: dev = constty->t_dev;
148: else
149: dev = cn_tab->cn_dev;
150: return ((*cdevsw[major(dev)].d_write)(dev, uio, flag));
151: }
152:
153: cnioctl(dev, cmd, data, flag, p)
154: dev_t dev;
155: caddr_t data;
156: struct proc *p;
157: {
158: int error;
159:
160: if (cn_tab == NULL)
161: return (0);
162: /*
163: * Superuser can always use this to wrest control of console
164: * output from the "virtual" console.
165: */
166: if (cmd == TIOCCONS && constty) {
167: error = suser(p->p_ucred, (u_short *) NULL);
168: if (error)
169: return (error);
170: constty = NULL;
171: return (0);
172: }
173: dev = cn_tab->cn_dev;
174: return ((*cdevsw[major(dev)].d_ioctl)(dev, cmd, data, flag, p));
175: }
176:
177: /*ARGSUSED*/
178: cnselect(dev, rw, p)
179: dev_t dev;
180: int rw;
181: struct proc *p;
182: {
183: if (cn_tab == NULL)
184: return (1);
185: return (ttselect(cn_tab->cn_dev, rw, p));
186: }
187:
188: cngetc()
189: {
190: if (cn_tab == NULL)
191: return (0);
192: return ((*cn_tab->cn_getc)(cn_tab->cn_dev));
193: }
194:
195: cnputc(c)
196: register int c;
197: {
198: if (cn_tab == NULL)
199: return;
200: if (c) {
201: (*cn_tab->cn_putc)(cn_tab->cn_dev, c);
202: if (c == '\n')
203: (*cn_tab->cn_putc)(cn_tab->cn_dev, '\r');
204: }
205: }
206:
207: pg(p,q,r,s,t,u,v,w,x,y,z) char *p; {
208: printf(p,q,r,s,t,u,v,w,x,y,z);
209: printf("\n>");
210: return(cngetc());
211: }
212:
213:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.