/* * Copyright (c) 1986 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. * * @(#)conf.c 3.2 (2.11BSD GTE) 1997/11/12 */ #include "param.h" #include "conf.h" #include "buf.h" #include "time.h" #include "ioctl.h" #include "resource.h" #include "inode.h" #include "proc.h" #include "clist.h" #include "tty.h" int nulldev(); int nodev(); int rawrw(); #include "rk.h" #if NRK > 0 int rkopen(), rkstrategy(); daddr_t rksize(); #define rkclose nulldev #else #define rkopen nodev #define rkclose nodev #define rkstrategy nodev #define rksize NULL #endif #include "tm.h" #if NTM > 0 int tmopen(), tmclose(), tmioctl(), tmstrategy(); #else #define tmopen nodev #define tmclose nodev #define tmioctl nodev #define tmstrategy nodev #endif #include "hk.h" #if NHK > 0 int hkopen(), hkstrategy(), hkroot(), hkclose(); daddr_t hksize(); #else #define hkopen nodev #define hkclose nodev #define hkroot nulldev #define hkstrategy nodev #define hksize NULL #endif #include "xp.h" #if NXPD > 0 int xpopen(), xpstrategy(), xproot(), xpclose(), xpioctl(); daddr_t xpsize(); #else #define xpopen nodev #define xpclose nodev #define xpioctl nodev #define xproot nulldev #define xpstrategy nodev #define xpsize NULL #endif #include "br.h" #if NBR > 0 int bropen(), brstrategy(), brroot(); daddr_t brsize(); #define brclose nulldev #else #define bropen nodev #define brclose nodev #define brroot nulldev #define brstrategy nodev #define brsize NULL #endif #include "ht.h" #if NHT > 0 int htopen(), htclose(), htstrategy(), htioctl(); #else #define htopen nodev #define htclose nodev #define htioctl nodev #define htstrategy nodev #endif #include "rl.h" #if NRL > 0 int rlopen(), rlstrategy(), rlroot(), rlclose(), rlioctl(); daddr_t rlsize(); #else #define rlroot nulldev #define rlopen nodev #define rlclose nodev #define rlioctl nodev #define rlstrategy nodev #define rlsize NULL #endif #include "ts.h" #if NTS > 0 int tsopen(), tsclose(), tsstrategy(), tsioctl(); #else #define tsopen nodev #define tsclose nodev #define tsioctl nodev #define tsstrategy nodev #endif #include "tms.h" #if NTMS > 0 int tmscpopen(), tmscpclose(), tmscpstrategy(), tmscpioctl(); #else #define tmscpopen nodev #define tmscpclose nodev #define tmscpioctl nodev #define tmscpstrategy nodev #endif #include "si.h" #if NSI > 0 int siopen(), sistrategy(), siroot(); daddr_t sisize(); #define siclose nulldev #else #define siopen nodev #define siclose nodev #define siroot nulldev #define sistrategy nodev #define sisize NULL #endif #include "ra.h" #if NRAC > 0 int rastrategy(), raroot(), raopen(), raclose(), raioctl(); daddr_t rasize(); #else #define raopen nodev #define raclose nodev #define raioctl nodev #define raroot nulldev #define rastrategy nodev #define rasize nodev #endif #include "rx.h" #if NRX > 0 int rxopen(), rxstrategy(), rxioctl(); #define rxclose nulldev #else #define rxopen nodev #define rxclose nodev #define rxstrategy nodev #define rxioctl nodev #endif #include "ram.h" #if NRAM > 0 int ramopen(), ramstrategy(); #define ramclose nulldev #else #define ramopen nodev #define ramclose nodev #define ramstrategy nodev #endif struct bdevsw bdevsw[] = { /* ht = 0 */ htopen, htclose, htstrategy, nulldev, NULL, B_TAPE, /* tm = 1 */ tmopen, tmclose, tmstrategy, nulldev, NULL, B_TAPE, /* ts = 2 */ tsopen, tsclose, tsstrategy, nulldev, NULL, B_TAPE, /* ram = 3 */ ramopen, ramclose, ramstrategy, nulldev, NULL, 0, /* hk = 4 */ hkopen, hkclose, hkstrategy, hkroot, hksize, 0, /* ra = 5 */ raopen, raclose, rastrategy, raroot, rasize, 0, /* rk = 6 */ rkopen, rkclose, rkstrategy, nulldev, rksize, 0, /* rl = 7 */ rlopen, rlclose, rlstrategy, rlroot, rlsize, 0, /* rx = 8 */ rxopen, rxclose, rxstrategy, nulldev, NULL, 0, /* si = 9 */ siopen, siclose, sistrategy, siroot, sisize, 0, /* xp = 10 */ xpopen, xpclose, xpstrategy, xproot, xpsize, 0, /* br = 11 */ bropen, brclose, brstrategy, brroot, brsize, 0, /* tmscp = 12 (tu81/tk50) */ tmscpopen, tmscpclose, tmscpstrategy, nulldev, NULL, B_TAPE, }; int nblkdev = sizeof(bdevsw) / sizeof(bdevsw[0]); int cnopen(), cnclose(), cnread(), cnwrite(), cnioctl(); extern struct tty cons[]; #include "lp.h" #if NLP > 0 int lpopen(), lpclose(), lpwrite(); #else #define lpopen nodev #define lpclose nodev #define lpwrite nodev #endif #include "dh.h" #if NDH > 0 int dhopen(), dhclose(), dhread(), dhwrite(), dhioctl(), dhstop(); int dhselect(); extern struct tty dh11[]; #else #define dhopen nodev #define dhclose nodev #define dhread nodev #define dhwrite nodev #define dhioctl nodev #define dhstop nodev #define dhselect nodev #define dh11 ((struct tty *) NULL) #endif #include "dz.h" #if NDZ > 0 int dzopen(), dzclose(), dzread(), dzwrite(), dzioctl(); int dzstop(); extern struct tty dz_tty[]; #else #define dzopen nodev #define dzclose nodev #define dzread nodev #define dzwrite nodev #define dzioctl nodev #define dzstop nodev #define dz_tty ((struct tty *) NULL) #endif #include "pty.h" #if NPTY > 0 int ptsopen(), ptsclose(), ptsread(), ptswrite(), ptsstop(); int ptcopen(), ptcclose(), ptcread(), ptcwrite(), ptyioctl(); int ptcselect(); extern struct tty pt_tty[]; #else #define ptsopen nodev #define ptsclose nodev #define ptsread nodev #define ptswrite nodev #define ptsstop nodev #define ptcopen nodev #define ptcclose nodev #define ptcread nodev #define ptcwrite nodev #define ptyioctl nodev #define ptcselect nodev #define pt_tty ((struct tty *)NULL) #endif #include "dr.h" #if NDR > 0 int dropen(), drclose(), drioctl(), drstrategy(); #else #define dropen nodev #define drclose nodev #define drioctl nodev #define drstrategy nodev #endif #include "dhu.h" #if NDHU > 0 int dhuopen(), dhuclose(), dhuread(), dhuwrite(), dhuioctl(), dhustop(); int dhuselect(); extern struct tty dhu_tty[]; #else #define dhuopen nodev #define dhuclose nodev #define dhuread nodev #define dhuwrite nodev #define dhuioctl nodev #define dhustop nodev #define dhuselect nodev #define dhu_tty ((struct tty *) NULL) #endif #include "dhv.h" #if NDHV > 0 int dhvopen(), dhvclose(), dhvread(), dhvwrite(), dhvioctl(), dhvstop(); int dhvselect(); extern struct tty dhv_tty[]; #else #define dhvopen nodev #define dhvclose nodev #define dhvread nodev #define dhvwrite nodev #define dhvioctl nodev #define dhvstop nodev #define dhvselect nodev #define dhv_tty ((struct tty *) NULL) #endif #include "dn.h" #if NDN > 0 int dnopen(), dnclose(), dnwrite(); #define dnread nodev #define dnioctl nodev #else #define dnopen nodev #define dnclose nodev #define dnread nodev #define dnwrite nodev #define dnioctl nodev #endif int logopen(), logclose(), logread(), logioctl(), logselect(); int syopen(), syread(), sywrite(), syioctl(), syselect(); int mmrw(); #define mmselect seltrue #include "ingres.h" #if NINGRES > 0 int ingres_open(), ingres_write(); #define ingres_read nodev #define ingres_ioctl nodev #define ingres_close nulldev #else #define ingres_open nodev #define ingres_close nodev #define ingres_read nodev #define ingres_write nodev #define ingres_ioctl nodev #endif int fdopen(); int ttselect(), seltrue(); struct cdevsw cdevsw[] = { /* cn = 0 */ cnopen, cnclose, cnread, cnwrite, cnioctl, nulldev, cons, ttselect, nulldev, /* mem = 1 */ nulldev, nulldev, mmrw, mmrw, nodev, nulldev, 0, mmselect, nulldev, /* dz = 2 */ dzopen, dzclose, dzread, dzwrite, dzioctl, dzstop, dz_tty, ttselect, nulldev, /* dh = 3 */ dhopen, dhclose, dhread, dhwrite, dhioctl, dhstop, dh11, dhselect, nulldev, /* dhu = 4 */ dhuopen, dhuclose, dhuread, dhuwrite, dhuioctl, dhustop, dhu_tty, dhuselect, nulldev, /* lp = 5 */ lpopen, lpclose, nodev, lpwrite, nodev, nulldev, 0, nodev, nulldev, /* ht = 6 */ htopen, htclose, rawrw, rawrw, htioctl, nulldev, 0, seltrue, htstrategy, /* tm = 7 */ tmopen, tmclose, rawrw, rawrw, tmioctl, nulldev, 0, seltrue, tmstrategy, /* ts = 8 */ tsopen, tsclose, rawrw, rawrw, tsioctl, nulldev, 0, seltrue, tsstrategy, /* tty = 9 */ syopen, nulldev, syread, sywrite, syioctl, nulldev, 0, syselect, nulldev, /* ptc = 10 */ ptcopen, ptcclose, ptcread, ptcwrite, ptyioctl, nulldev, pt_tty, ptcselect, nulldev, /* pts = 11 */ ptsopen, ptsclose, ptsread, ptswrite, ptyioctl, ptsstop, pt_tty, ttselect, nulldev, /* dr = 12 */ dropen, drclose, rawrw, rawrw, drioctl, nulldev, 0, seltrue, drstrategy, /* hk = 13 */ hkopen, hkclose, rawrw, rawrw, nodev, nulldev, 0, seltrue, hkstrategy, /* ra = 14 */ raopen, raclose, rawrw, rawrw, raioctl, nulldev, 0, seltrue, rastrategy, /* rk = 15 */ rkopen, rkclose, rawrw, rawrw, nodev, nulldev, 0, seltrue, rkstrategy, /* rl = 16 */ rlopen, rlclose, rawrw, rawrw, rlioctl, nulldev, 0, seltrue, rlstrategy, /* rx = 17 */ rxopen, rxclose, rawrw, rawrw, rxioctl, nulldev, 0, seltrue, rxstrategy, /* si = 18 */ siopen, siclose, rawrw, rawrw, nodev, nulldev, 0, seltrue, sistrategy, /* xp = 19 */ xpopen, xpclose, rawrw, rawrw, xpioctl, nulldev, 0, seltrue, xpstrategy, /* br = 20 */ bropen, brclose, rawrw, rawrw, nodev, nulldev, 0, seltrue, brstrategy, /* dn = 21 */ dnopen, dnclose, dnread, dnwrite, dnioctl, nulldev, 0, seltrue, nulldev, /* log = 22 */ logopen, logclose, logread, nodev, logioctl, nulldev, 0, logselect, nulldev, /* tmscp = 23 (tu81/tk50) */ tmscpopen, tmscpclose, rawrw, rawrw, tmscpioctl, nulldev, 0, seltrue, tmscpstrategy, /* dhv = 24 */ dhvopen, dhvclose, dhvread, dhvwrite, dhvioctl, dhvstop, dhv_tty, dhvselect, nulldev, /* ingres = 25 */ ingres_open, ingres_close, ingres_read, ingres_write, ingres_ioctl, nulldev, 0, seltrue, nulldev, /* fd = 26 */ fdopen, nodev, nodev, nodev, nodev, nodev, 0, nodev, nodev, }; int nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]); /* * Routine that identifies /dev/mem and /dev/kmem. * * A minimal stub routine can always return 0. */ iskmemdev(dev) register dev_t dev; { if (major(dev) == 1 && (minor(dev) == 0 || minor(dev) == 1)) return (1); return (0); } /* * Routine to determine if a device is a disk. * * A minimal stub routine can always return 0. */ isdisk(dev, type) dev_t dev; register int type; { switch (major(dev)) { case 3: /* ram */ case 4: /* hk */ case 5: /* ra */ case 6: /* rk */ case 7: /* rl */ case 8: /* rx */ case 9: /* si */ case 10: /* xp */ case 11: /* br */ if (type == IFBLK) return (1); return (0); case 13: /* rhk */ case 14: /* rra */ case 15: /* rrk */ case 16: /* rrl */ case 17: /* rrx */ case 18: /* rsi */ case 19: /* rxp */ case 20: /* rbr */ if (type == IFCHR) return (1); /* fall through */ default: return (0); } /* NOTREACHED */ } #define MAXDEV 27 static char chrtoblktbl[MAXDEV] = { /* CHR */ /* BLK */ /* 0 */ NODEV, /* 1 */ NODEV, /* 2 */ NODEV, /* 3 */ NODEV, /* 4 */ NODEV, /* 5 */ NODEV, /* 6 */ 0, /* ht */ /* 7 */ 1, /* tm */ /* 8 */ 2, /* ts */ /* 9 */ NODEV, /* 10 */ NODEV, /* 11 */ NODEV, /* 12 */ NODEV, /* 13 */ 4, /* hk */ /* 14 */ 5, /* ra */ /* 15 */ 6, /* rk */ /* 16 */ 7, /* rl */ /* 17 */ 8, /* rx */ /* 18 */ 9, /* si */ /* 19 */ 10, /* xp */ /* 20 */ 11, /* br */ /* 21 */ NODEV, /* 22 */ NODEV, /* 23 */ 12, /* tmscp */ /* 24 */ NODEV, /* 25 */ NODEV, /* 26 */ NODEV }; /* * Routine to convert from character to block device number. * * A minimal stub routine can always return NODEV. */ chrtoblk(dev) register dev_t dev; { register int blkmaj; if (major(dev) >= MAXDEV || (blkmaj = chrtoblktbl[major(dev)]) == NODEV) return (NODEV); return (makedev(blkmaj, minor(dev))); } /* * This routine returns the cdevsw[] index of the block device * specified by the input parameter. Used by init_main and ufs_mount to * find the diskdriver's ioctl entry point so that the label and partition * information can be obtained for 'block' (instead of 'character') disks. * * Rather than create a whole separate table 'chrtoblktbl' is scanned * looking for a match. This routine is only called a half dozen times during * a system's life so efficiency isn't a big concern. */ blktochr(dev) register dev_t dev; { register int maj = major(dev); register int i; for (i = 0; i < MAXDEV; i++) { if (maj == chrtoblktbl[i]) return(i); } return(NODEV); }