|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * The contents of this file constitute Original Code as defined in and
7: * are subject to the Apple Public Source License Version 1.1 (the
8: * "License"). You may not use this file except in compliance with the
9: * License. Please obtain a copy of the License at
10: * http://www.apple.com/publicsource and read it before using this file.
11: *
12: * This Original Code and all software distributed under the License are
13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17: * License for the specific language governing rights and limitations
18: * under the License.
19: *
20: * @APPLE_LICENSE_HEADER_END@
21: */
22: /*
23: * Copyright (c) 1997 by Apple Computer, Inc., all rights reserved
24: * Copyright (c) 1993 NeXT Computer, Inc.
25: *
26: * UNIX Device switch tables.
27: *
28: * HISTORY
29: *
30: * 30 July 1997 Umesh Vaishampayan ([email protected])
31: * enabled file descriptor pseudo-device.
32: * 18 June 1993 ? at NeXT
33: * Cleaned up a lot of stuff in this file.
34: */
35:
36: #import <sys/param.h>
37: #import <sys/systm.h>
38: #import <sys/buf.h>
39: #import <sys/ioctl.h>
40: #import <sys/tty.h>
41: #import <sys/conf.h>
42:
43:
44: extern int nulldev();
45:
46: struct bdevsw bdevsw[] =
47: {
48: /*
49: * For block devices, every other block of 8 slots is
50: * reserved to NeXT. The other slots are available for
51: * the user. This way we can both add new entries without
52: * running into each other. Be sure to fill in NeXT's
53: * 8 reserved slots when you jump over us -- we'll do the
54: * same for you.
55: */
56:
57: /* 0 - 7 are reserved to NeXT */
58:
59: NO_BDEVICE, /* 0*/
60: NO_BDEVICE, /* 1*/
61: NO_BDEVICE, /* 2*/
62: NO_BDEVICE, /* 3*/
63: NO_BDEVICE, /* 4*/
64: NO_BDEVICE, /* 5*/
65: NO_BDEVICE, /* 6*/
66: NO_BDEVICE, /* 7*/
67:
68: /* 8 - 15 are reserved to the user */
69: NO_BDEVICE, /* 8*/
70: NO_BDEVICE, /* 9*/
71: NO_BDEVICE, /*10*/
72: NO_BDEVICE, /*11*/
73: NO_BDEVICE, /*12*/
74: NO_BDEVICE, /*13*/
75: NO_BDEVICE, /*14*/
76: NO_BDEVICE, /*15*/
77:
78: /* 16 - 23 are reserved to NeXT */
79: NO_BDEVICE, /*16*/
80: NO_BDEVICE, /*17*/
81: NO_BDEVICE, /*18*/
82: NO_BDEVICE, /*18*/
83: NO_BDEVICE, /*20*/
84: NO_BDEVICE, /*21*/
85: NO_BDEVICE, /*22*/
86: NO_BDEVICE, /*23*/
87: };
88:
89: int nblkdev = sizeof (bdevsw) / sizeof (bdevsw[0]);
90:
91: extern struct tty *km_tty[];
92: extern int cnopen(),cnclose(),cnread(),cnwrite(),cnioctl(),
93: cnselect(),cngetc(), cnputc(dev_t dev, char c);
94: extern int kmopen(),kmclose(),kmread(),kmwrite(),kmioctl(),
95: kmgetc(), kmputc(dev_t dev, char c);
96: extern int sgopen(),sgclose(), sgioctl();
97: #if notyet
98: #import <vol.h>
99: #endif
100: #if NVOL > 0
101: extern int volopen(),volclose(),volioctl();
102: #else
103: #define volopen eno_opcl
104: #define volclose eno_opcl
105: #define volioctl eno_ioctl
106: #endif
107:
108: extern int cttyopen(), cttyread(), cttywrite(), cttyioctl(), cttyselect();
109:
110: extern int mmread(),mmwrite();
111: #define mmselect seltrue
112: #define mmmmap eno_mmap
113:
114: #import <pty.h>
115: #if NPTY > 0
116: extern struct tty *pt_tty[];
117: extern int ptsopen(),ptsclose(),ptsread(),ptswrite(),ptsstop(),ptsputc();
118: extern int ptcopen(),ptcclose(),ptcread(),ptcwrite(),ptcselect(),
119: ptyioctl();
120: #else
121: #define ptsopen eno_opcl
122: #define ptsclose eno_opcl
123: #define ptsread eno_rdwrt
124: #define ptswrite eno_rdwrt
125: #define ptsstop nulldev
126: #define ptsputc nulldev
127:
128: #define ptcopen eno_opcl
129: #define ptcclose eno_opcl
130: #define ptcread eno_rdwrt
131: #define ptcwrite eno_rdwrt
132: #define ptcselect eno_select
133: #define ptyioctl eno_ioctl
134: #endif
135:
136: extern int logopen(),logclose(),logread(),logioctl(),logselect();
137: extern int fdesc_open(), fdesc_read(), fdesc_write(),
138: fdesc_ioctl(), fdesc_select();
139:
140: extern int seltrue();
141:
142: extern int bpfopen(), bpfclose(), bpfread(), bpfwrite(), bpfioctl(),
143: bpfpoll();
144:
145: struct cdevsw cdevsw[] =
146: {
147: /*
148: * For character devices, every other block of 16 slots is
149: * reserved to NeXT. The other slots are available for
150: * the user. This way we can both add new entries without
151: * running into each other. Be sure to fill in NeXT's
152: * 16 reserved slots when you jump over us -- we'll do the
153: * same for you.
154: */
155:
156: /* 0 - 15 are reserved to NeXT */
157:
158: {
159: cnopen, cnclose, cnread, cnwrite, /* 0*/
160: cnioctl, nulldev, nulldev, 0, cnselect,
161: eno_mmap, eno_strat, cngetc, cnputc, D_TTY
162: },
163: NO_CDEVICE, /* 1*/
164: {
165: cttyopen, nulldev, cttyread, cttywrite, /* 2*/
166: cttyioctl, nulldev, nulldev, 0, cttyselect,
167: eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
168: },
169: {
170: nulldev, nulldev, mmread, mmwrite, /* 3*/
171: eno_ioctl, nulldev, nulldev, 0, mmselect,
172: mmmmap, eno_strat, eno_getc, eno_putc, 0
173: },
174: {
175: ptsopen, ptsclose, ptsread, ptswrite, /* 4*/
176: ptyioctl, ptsstop, nulldev, pt_tty, ttselect,
177: eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
178: },
179: {
180: ptcopen, ptcclose, ptcread, ptcwrite, /* 5*/
181: ptyioctl, nulldev, nulldev, 0, ptcselect,
182: eno_mmap, eno_strat, eno_getc, eno_putc, D_TTY
183: },
184: {
185: logopen, logclose, logread, eno_rdwrt, /* 6*/
186: logioctl, eno_stop, nulldev, 0, logselect,
187: eno_mmap, eno_strat, eno_getc, eno_putc, 0
188: },
189: {
190: bpfopen, bpfclose, bpfread, bpfwrite, /* 7 */
191: bpfioctl, nulldev, nulldev, NULL, bpfpoll,
192: eno_mmap, eno_strat, eno_getc, eno_putc, 0
193: },
194: NO_CDEVICE, /* 8*/
195: NO_CDEVICE, /* 9*/
196: NO_CDEVICE, /*10*/
197: NO_CDEVICE, /*11*/
198: {
199: kmopen, kmclose, kmread, kmwrite, /*12*/
200: kmioctl, nulldev, nulldev, km_tty, ttselect,
201: eno_mmap, eno_strat, kmgetc, kmputc, 0
202: },
203: NO_CDEVICE, /*13*/
204: NO_CDEVICE, /*14*/
205: NO_CDEVICE, /*15*/
206:
207: /* 16 - 31 are reserved to the user */
208: NO_CDEVICE, /*16*/
209: NO_CDEVICE, /*17*/
210: NO_CDEVICE, /*18*/
211: NO_CDEVICE, /*19*/
212: NO_CDEVICE, /*20*/
213: NO_CDEVICE, /*21*/
214: NO_CDEVICE, /*22*/
215: NO_CDEVICE, /*23*/
216: NO_CDEVICE, /*24*/
217: NO_CDEVICE, /*25*/
218: NO_CDEVICE, /*26*/
219: NO_CDEVICE, /*27*/
220: NO_CDEVICE, /*28*/
221: NO_CDEVICE, /*29*/
222: NO_CDEVICE, /*30*/
223: NO_CDEVICE, /*31*/
224:
225: /* 32 - 47 are reserved to NeXT */
226: {
227: fdesc_open, eno_opcl, fdesc_read, fdesc_write, /*32*/
228: fdesc_ioctl, eno_stop, eno_reset, 0, fdesc_select,
229: eno_mmap, eno_strat, eno_getc, eno_putc, 0
230: },
231: #if 1
232: NO_CDEVICE,
233: #else
234: {
235: sgopen, sgclose, eno_rdwrt, eno_rdwrt, /*33*/
236: sgioctl, eno_stop, eno_reset, 0, eno_select,
237: eno_mmap, eno_strat, eno_getc, eno_putc, D_TAPE
238: },
239: #endif
240: NO_CDEVICE, /*34*/
241: NO_CDEVICE, /*35*/
242: NO_CDEVICE, /*36*/
243: NO_CDEVICE, /*37*/
244: NO_CDEVICE, /*38*/
245: NO_CDEVICE, /*39*/
246: NO_CDEVICE, /*40*/
247: NO_CDEVICE, /*41*/
248: {
249: volopen, volclose, eno_rdwrt, eno_rdwrt, /*42*/
250: volioctl, eno_stop, eno_reset, 0, seltrue,
251: eno_mmap, eno_strat, eno_getc, eno_putc, 0
252: },
253: };
254: int nchrdev = sizeof (cdevsw) / sizeof (cdevsw[0]);
255:
256:
257: #import <sys/vnode.h> /* for VCHR and VBLK */
258: /*
259: * return true if a disk
260: */
261: int
262: isdisk(dev, type)
263: dev_t dev;
264: int type;
265: {
266: switch (major(dev)) {
267: case 1: /* fd: floppy */
268: case 6: /* sd: scsi disk */
269: case 3: /* ide: */
270: if (type == VBLK)
271: return(1);
272: break;
273: case 14: /* sd: scsi disk */
274: case 41: /* fd: floppy */
275: if (type == VCHR)
276: return(1);
277: break;
278: }
279: return(0);
280: }
281:
282: static int chrtoblktab[] = {
283: /* CHR*/ /* BLK*/ /* CHR*/ /* BLK*/
284: /* 0 */ NODEV, /* 1 */ NODEV,
285: /* 2 */ NODEV, /* 3 */ NODEV,
286: /* 4 */ NODEV, /* 5 */ NODEV,
287: /* 6 */ NODEV, /* 7 */ NODEV,
288: /* 8 */ NODEV, /* 9 */ NODEV,
289: /* 10 */ NODEV, /* 11 */ NODEV,
290: /* 12 */ NODEV, /* 13 */ NODEV,
291: /* 14 */ 6, /* 15 */ NODEV,
292: /* 16 */ NODEV, /* 17 */ NODEV,
293: /* 18 */ NODEV, /* 19 */ NODEV,
294: /* 20 */ NODEV, /* 21 */ NODEV,
295: /* 22 */ NODEV, /* 23 */ NODEV,
296: /* 24 */ NODEV, /* 25 */ NODEV,
297: /* 26 */ NODEV, /* 27 */ NODEV,
298: /* 28 */ NODEV, /* 29 */ NODEV,
299: /* 30 */ NODEV, /* 31 */ NODEV,
300: /* 32 */ NODEV, /* 33 */ NODEV,
301: /* 34 */ NODEV, /* 35 */ NODEV,
302: /* 36 */ NODEV, /* 37 */ NODEV,
303: /* 38 */ NODEV, /* 39 */ NODEV,
304: /* 40 */ NODEV, /* 41 */ 1,
305: /* 42 */ NODEV, /* 43 */ NODEV,
306: /* 44 */ NODEV,
307: };
308:
309: /*
310: * convert chr dev to blk dev
311: */
312: dev_t
313: chrtoblk(dev)
314: dev_t dev;
315: {
316: int blkmaj;
317:
318: if (major(dev) >= nchrdev)
319: return(NODEV);
320: blkmaj = chrtoblktab[major(dev)];
321: if (blkmaj == NODEV)
322: return(NODEV);
323: return(makedev(blkmaj, minor(dev)));
324: }
325:
326: /*
327: * Returns true if dev is /dev/mem or /dev/kmem.
328: */
329: int iskmemdev(dev)
330: dev_t dev;
331: {
332:
333: return (major(dev) == 3 && minor(dev) < 2);
334: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.