Home | History | Annotate | Line # | Download | only in etc
      1 #!/bin/sh -
      2 #	$NetBSD: MAKEDEV.tmpl,v 1.183 2016/09/08 15:00:08 nonaka Exp $
      3 #
      4 # Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
      5 # All rights reserved.
      6 #
      7 # Redistribution and use in source and binary forms, with or without
      8 # modification, are permitted provided that the following conditions
      9 # are met:
     10 # 1. Redistributions of source code must retain the above copyright
     11 #    notice, this list of conditions and the following disclaimer.
     12 # 2. Redistributions in binary form must reproduce the above copyright
     13 #    notice, this list of conditions and the following disclaimer in the
     14 #    documentation and/or other materials provided with the distribution.
     15 #
     16 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26 # POSSIBILITY OF SUCH DAMAGE.
     27 #
     28 #
     29 ###########################################################################
     30 #
     31 #   PLEASE RUN "cd ../share/man/man8 ; make makedevs"
     32 #   AFTER CHANGING THIS FILE, AND COMMIT THE UPDATED MANPAGE!
     33 #
     34 ###########################################################################
     35 #
     36 # Device "make" file.  Valid special arguments:
     37 #	all	makes all known devices, including local devices.
     38 #		Tries to make the 'standard' number of each type.
     39 #	init	A set of devices that is used for MFS /dev by init.
     40 #		May be equal to "all".
     41 #	floppy	devices to be put on install floppies
     42 #	ramdisk	devices to be put into INSTALL kernel ramdisks.
     43 #	std	standard devices
     44 #	local	configuration specific devices
     45 #	lua	Lua device
     46 #	wscons	make wscons devices
     47 #	usbs	make USB devices
     48 #	isdns	make ISDN devices
     49 #
     50 # Tapes:
     51 #	st*	SCSI tapes
     52 #	wt*	QIC-interfaced (e.g. not SCSI) 3M cartridge tape
     53 #	ht*	MASSBUS TM03 and TU??
     54 #	mt*	MSCP tapes (e.g. TU81, TK50)
     55 #	tm*	UNIBUS TM11 and TE10 emulations (e.g. Emulex TC-11)
     56 #	ts*	UNIBUS TS11
     57 #	ut*	UNIBUS TU45 emulations (e.g. si 9700)
     58 #	uu*	TU58 cassettes on DL11 controller
     59 #
     60 # Disks:
     61 #	dk*	wedge disk slices
     62 #	ccd*	concatenated disk devices
     63 #	cd*	SCSI or ATAPI CD-ROM
     64 #	cgd*	cryptographic disk devices
     65 #	raid*	RAIDframe disk devices
     66 #	sd*	SCSI disks
     67 #	wd*	"winchester" disk drives (ST506,IDE,ESDI,RLL,...)
     68 #	bmd*	Nereid bank memory disks
     69 #	ed*	IBM PS/2 ESDI disk devices
     70 #	fd*	"floppy" disk drives (3 1/2", 5 1/4")
     71 #	fss*	Files system snapshot devices
     72 #	gdrom*	Dreamcast "gigadisc" CD-ROM drive
     73 #	hk*	UNIBUS RK06 and RK07
     74 #	hp*	MASSBUS RM??
     75 #	ld*	Logical disk devices (e.g., hardware RAID)
     76 #	mcd*	Mitsumi CD-ROM
     77 #	md*	memory pseudo-disk devices
     78 #	ofdisk*	OpenFirmware disk devices
     79 #	ra*	MSCP disks (RA??, RD??)
     80 #	rb*	730 IDC w/ RB80 and/or RB02
     81 #	rd*	HDC9224 RD disks on VS2000
     82 #	rl*	UNIBUS RL02
     83 #	rx*	MSCP floppy disk (RX33/50/...)
     84 #	up*	other UNIBUS devices (e.g. on Emulex SC-21V controller)
     85 #	vnd*	"file" pseudo-disks
     86 #	xbd*	Xen virtual disks
     87 #	xd*	Xylogic 753/7053 disks
     88 #	xy*	Xylogic 450/451 disks
     89 #
     90 # Pointing devices:
     91 #	wsmouse* wscons mouse events
     92 #	lms*	Logitech bus mouse
     93 #	mms*	Microsoft bus mouse
     94 #	qms*	"quadrature mouse"
     95 #	pms*	PS/2 mouse
     96 #	mouse	mouse (provides events, for X11)
     97 #
     98 # Keyboard devices:
     99 #	wskbd*	wscons keyboard events
    100 #	kbd	raw keyboard (provides events, for X11)
    101 #	kbdctl	keyboard control
    102 #
    103 # Terminals/Console ports:
    104 #	tty[01]*	standard serial ports
    105 #	tty0*	SB1250 ("sbscn") serial ports (sbmips)
    106 #	ttyE*	wscons - Workstation console ("wscons") glass-tty emulators
    107 #	ttyCZ?	Cyclades-Z multiport serial boards.  Each "unit"
    108 #		makes 64 ports.
    109 #	ttyCY?	Cyclom-Y multiport serial boards. Each "unit" makes
    110 #		32 ports.
    111 #	ttye*	ITE bitmapped consoles
    112 #	ttyv0	pccons
    113 #	ttyC?	NS16550 ("com") serial ports
    114 #	ttyS*	SA1110 serial port (hpcarm)
    115 #	ttyTX?	TX39 internal serial ports (hpcmips)
    116 #	ttyB?	DEC 3000 ZS8530 ("scc") serial ports (alpha)
    117 #	ttyA*	mfc serial ports (amiga)
    118 #	ttyB*	msc serial ports (amiga)
    119 #	ttyC*	com style serial ports (DraCo, HyperCom) (amiga)
    120 #		On the DraCo, units 0 and 1 are the built-in "modem" and
    121 #		"mouse" ports, if configured.
    122 #	ttyA0   8530 Channel A (formerly ser02) (atari)
    123 #	ttyA1	8530 Channel B (formerly mdm02) (atari)
    124 #	ttyB0	UART on first 68901 (formerly mdm01) (atari)
    125 #	ixpcom	IXP12x0 COM ports
    126 #	epcom	EP93xx COM ports
    127 #	plcom	ARM PL01[01] serial ports
    128 #	wmcom	EPOC Windermere COM ports
    129 #	ttyM?	HP200/300 4 port serial mux interface (hp300)
    130 #	ttya	"ttya" system console (luna68k)
    131 #	ttyb	second system serial port (luna68k)
    132 #	tty*	Onboard serial ports (mvme68k)
    133 #		On the mvme147 these are: ttyZ1, ttyZ2 and ttyZ3.
    134 #		On the mvme167, and '177: ttyC1, ttyC2 and ttyC3.
    135 #		Note that tty[CZ]0 is grabbed by the console device
    136 #		so is not created by default
    137 #	dc*	PMAX 4 channel serial interface (kbd, mouse, modem, printer)
    138 #	scc*	82530 serial interface (pmax)
    139 #	ttyZ*	Zilog 8530 ("zstty") serial ports
    140 #	tty[abcd]	Built-in serial ports (sparc)
    141 #	tty*	Z88530 serial controllers (sparc64)
    142 #	ttyh*	SAB82532 serial controllers (sparc64)
    143 #	tty[a-j]	Built-in serial ports (sun2, sun3)
    144 #	ttyC?	pccons (arc)
    145 #	dz*	UNIBUS DZ11 and DZ32 (vax)
    146 #	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) (vax)
    147 #	dmf*	UNIBUS DMF32 (vax)
    148 #	dhu*    UNIBUS DHU11 (vax)
    149 #	dmz*    UNIBUS DMZ32 (vax)
    150 #	dl*	UNIBUS DL11 (vax)
    151 #	xencons	Xen virtual console
    152 #
    153 # Terminal multiplexors:
    154 #	dc*	4 channel serial interface (keyboard, mouse, modem, printer)
    155 #	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11)
    156 #	dhu*	UNIBUS DHU11
    157 #	dl*	UNIBUS DL11
    158 #	dmf*	UNIBUS DMF32
    159 #	dmz*	UNIBUS DMZ32
    160 #	dz*	UNIBUS DZ11 and DZ32
    161 #	scc*	82530 serial interface
    162 #
    163 # Call units:
    164 #	dn*	UNIBUS DN11 and emulations (e.g. Able Quadracall)
    165 #
    166 # Pseudo terminals:
    167 #	ptm	pty multiplexor device, and pts directory
    168 #	pty*	set of 16 master and slave pseudo terminals
    169 #	opty	first 16 ptys, to save inodes on install media
    170 #	ipty	first 2 ptys, for install media use only
    171 #
    172 # Printers:
    173 #	arcpp*	Archimedes parallel port
    174 #	lpt*	stock lp
    175 #	lpa*	interruptless lp
    176 #	par*	Amiga motherboard parallel port
    177 #	cpi*	Macintosh Nubus CSI parallel printer card
    178 #
    179 # USB devices:
    180 #	usb*	USB control devices
    181 #	uhid*	USB generic HID devices
    182 #	ulpt*	USB printer devices
    183 #	ugen*	USB generic devices
    184 #	urio*	USB Diamond Rio 500 devices
    185 #	uscanner*	USB scanners
    186 #	ttyHS*	USB Option N.V. modems
    187 #	ttyU*	USB modems
    188 #	ttyY*	USB serial adapters
    189 #
    190 # ISDN devices:
    191 #	isdn	communication between userland isdnd and kernel
    192 #	isdnctl	control device
    193 #	isdnbchan* raw b-channel access
    194 #	isdntel*	telephony device
    195 #	isdnteld*	telephony dialout device
    196 #	isdntrc*	trace device
    197 #
    198 # Video devices:
    199 #	bwtwo*	monochromatic frame buffer
    200 #	cgtwo*	8-bit color frame buffer
    201 #	cgthree*	8-bit color frame buffer
    202 #	cgfour*	8-bit color frame buffer
    203 #	cgsix*	accelerated 8-bit color frame buffer
    204 #	cgeight*	24-bit color frame buffer
    205 #	etvme	Tseng et-compatible cards on VME (atari)
    206 #	ik*	UNIBUS interface to Ikonas frame buffer
    207 #	leo	Circad Leonardo VME-bus true color (atari)
    208 #	ps*	UNIBUS interface to Picture System 2
    209 #	qv*	QVSS (MicroVAX) display
    210 #	tcx*	accelerated 8/24-bit color frame buffer
    211 #
    212 # Maple bus devices:
    213 #	maple	Maple bus control devices
    214 #	mlcd*	Maple bus LCD devices
    215 #	mmem*	Maple bus storage devices
    216 #
    217 # IEEE1394 bus devices:
    218 #	fw*	IEEE1394 bus generic node access devices
    219 #	fwmem*	IEEE1394 bus physical memory of the remote node access devices
    220 #
    221 # Special purpose devices:
    222 #	ad*	UNIBUS interface to Data Translation A/D converter
    223 #	agp*	AGP GART devices
    224 #	altq	ALTQ control interface
    225 #	amr*	AMI MegaRaid control device
    226 #	apm	power management device
    227 #	audio*	audio devices
    228 #	bell*	OPM bell device (x68k)
    229 #	bktr	Brooktree 848/849/878/879 based TV cards
    230 #	bpf	packet filter
    231 #	bthub	Bluetooth Device Hub control interface
    232 #	cfs*	Coda file system device
    233 #	ch*	SCSI media changer
    234 #	cir*	Consumer IR
    235 #	clockctl clock control for non root users
    236 #	cpuctl	CPU control
    237 #	crypto	hardware crypto access driver
    238 #	dmoverio hardware-assisted data movers
    239 #	dpt*	DPT/Adaptec EATA RAID management interface
    240 #	dpti*	DPT/Adaptec I2O RAID management interface
    241 #	drm*	Direct Rendering Manager interface
    242 #	dtv*	Digital TV interface
    243 #	fb*	PMAX generic framebuffer pseudo-device
    244 #	fd	file descriptors
    245 #	grf*	graphics frame buffer device
    246 #	hdaudio* High Definition audio control device
    247 #	hdmicec* HDMI CEC devices
    248 #	hil	HP300 HIL input devices
    249 #	icp	ICP-Vortex/Intel RAID control interface
    250 #	iic*	IIC bus device
    251 #	io	x86 IOPL access for COMPAT_10, COMPAT_FREEBSD
    252 #	iop*	I2O IOP control interface
    253 #	ipl	IP Filter
    254 #	irframe* IrDA physical frame
    255 #	ite*	terminal emulator interface to HP300 graphics devices
    256 #	joy*	joystick device
    257 #	kttcp	kernel ttcp helper device
    258 #	lockstat kernel locking statistics
    259 #	magma*	Magma multiport serial/parallel cards
    260 #	midi*	MIDI
    261 #	mfi*	LSI MegaRAID/MegaSAS control interface
    262 #	mlx*	Mylex DAC960 control interface
    263 #	mly*	Mylex AcceleRAID/eXtremeRAID control interface
    264 #	np*	UNIBUS Ethernet co-processor interface, for downloading.
    265 #	npf	NPF packet filter
    266 #	nsmb*	SMB requester
    267 #	nvme*	Non-Volatile Memory Host Controller Interface device driver
    268 #	nvme*ns* Non-Volatile Memory namespace
    269 #	openfirm OpenFirmware accessor
    270 #	pad*	Pseudo-audio device driver
    271 #	pci*	PCI bus access devices
    272 #	pf	PF packet filter
    273 #	putter	Pass-to-Userspace Transporter
    274 #	px*	PixelStamp Xserver access
    275 #	radio*	radio devices
    276 #	random	Random number generator
    277 #	rtc*	RealTimeClock
    278 #	satlink* PlanetConnect satellite receiver driver
    279 #	scsibus* SCSI busses
    280 #	se*	SCSI Ethernet
    281 #	ses*	SES/SAF-TE SCSI Devices
    282 #	speaker	PC speaker		(XXX - installed)
    283 #	sram	battery backuped memory (x68k)
    284 #	ss*	SCSI scanner
    285 #	stic*	PixelStamp interface chip
    286 #	sysmon	System Monitoring hardware
    287 #	tap*	virtual Ethernet device
    288 #	tun*	network tunnel driver
    289 #	twa	3ware Apache control interface
    290 #	twe	3ware Escalade control interface
    291 #	uk*	unknown SCSI device
    292 #	veriexec Veriexec fingerprint loader
    293 #	video*	video capture devices
    294 #	view*	generic interface to graphic displays (Amiga)
    295 #	wsfont*	console font control
    296 #	wsmux*	wscons event multiplexor
    297 #	xenevt	Xen event interface
    298 #
    299 # iSCSI communication devices
    300 #	iscsi*	iSCSI driver and /sbin/iscsid communication
    301 #
    302 # Trusted Computing devices
    303 #	tpm	Trusted Platform Module
    304 #
    305 # Debugging and tracing
    306 #	dtrace	Dynamic tracing framework
    307 
    308 
    309 #
    310 # NOTE:
    311 #
    312 # * MAKEDEV is used both as a standalone script (via "sh ./MAKEDEV
    313 #   all" or similar), and as a function library for MAKEDEV.local (via
    314 #   "MAKEDEV_AS_LIBRARY=1 . MAKEDEV").  Because of this, the script
    315 #   should consist almost entirely of function definitions, apart from a
    316 #   few lines right at the end.
    317 #
    318 # * MAKEDEV may be executed in an environment that is missing some
    319 #   common commands.  For example, it may be executed from a minimal
    320 #   system used during installation, or it may be executed early in the
    321 #   boot sequence before most file systems have been mounted.  It may
    322 #   also be executed in a cross-build environment on a non-NetBSD host.
    323 #
    324 
    325 usage()
    326 {
    327 	cat 1>&2 << _USAGE_
    328 Usage: ${0##*/} [-fMsu] [-m mknod] [-p pax] [-t mtree] special [...]
    329 	Create listed special devices.  Options:
    330 	-f		Force permissions to be updated on existing devices.
    331 	-M		Create memory file system.
    332 	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
    333 	-p pax  	Name of pax(1) program.  [\$TOOL_PAX or pax]
    334 	-s		Generate mtree(8) specfile instead of creating devices.
    335 	-t mtree	Name of mtree(8) program.  [\$TOOL_MTREE or mtree]
    336 	-u		Don't re-create devices that already exist.
    337 
    338 _USAGE_
    339 	exit 1
    340 }
    341 
    342 # zeropad width number
    343 #	display number with a zero (`0') padding of width digits.
    344 #
    345 zeropad()
    346 {
    347 	case $(($1 - ${#2})) in
    348 	5)	echo 00000$2;;
    349 	4)	echo 0000$2;;
    350 	3)	echo 000$2;;
    351 	2)	echo 00$2;;
    352 	1)	echo 0$2;;
    353 	0)	echo $2;;
    354 	*)	die "bad padding" ;;
    355 	esac
    356 }
    357 
    358 # hexprint number
    359 #	display (base10) number as hexadecimal
    360 #
    361 hexprint()
    362 {
    363 	val="$(($1 + 0))"
    364 	hex=
    365 	set -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
    366 	while [ "$val" -gt 0 ]; do
    367 		eval hex=\$$(($val % 16 + 1))\$hex
    368 		val="$(($val / 16))"
    369 	done
    370 	echo "${hex:-0}"
    371 }
    372 
    373 # linecount multiline_string
    374 #	count the number of lines in the string
    375 #
    376 linecount()
    377 {
    378 	local IFS='
    379 ' # just a newline, no other white space between the quotes
    380 	set -- $1
    381 	echo $#
    382 }
    383 
    384 # nooutput -12 cmd [args...]
    385 #	run a command with stdout and/or stderr ignored.
    386 #	"nooutput -1 cmd" is like "cmd >/dev/null";
    387 #	"nooutput -2 cmd" is like "{ cmd ; } 2>/dev/null";
    388 #	"nooutput -12 cmd" is like "{ cmd ; } >/dev/null 2>&1";
    389 #	except they should work even if /dev/null doesn't [yet] exist.
    390 #
    391 #	The "{...}" wrapper used in cases where stderr is redirected
    392 #	serves to capture shell error messages such as "cmd: not found".
    393 #
    394 nooutput()
    395 {
    396 	local flags="$1" ; shift
    397 	local junk
    398 	case "$flags" in
    399 	"-1")	junk="$( "$@" )" ;;
    400 	"-2")	( exec 4>&1 ; junk="$( { "$@" ; } 2>&1 1>&4 )" ) ;;
    401 	"-12")	junk="$( { "$@" ; } 2>&1 )" ;;
    402 	*)	warn "Incorrect use of nooutput" ;;
    403 	esac
    404 }
    405 
    406 # check_pax path_to_pax
    407 #	Check whether pax exists and supports the command line options
    408 #	and input format that we will want to use.
    409 #
    410 check_pax()
    411 {
    412 	local pax="$1"
    413 	echo ". type=dir optional" | nooutput -12 "${pax}" -r -w -M -pe .
    414 }
    415 
    416 # check_mtree path_to_mtree
    417 #	Check whether mtree exists and supports the command line options
    418 #	and input format that we will want to use.
    419 #
    420 check_mtree()
    421 {
    422 	local mtree="$1"
    423 	echo ". type=dir optional" | nooutput -12 "${mtree}" -e -U
    424 }
    425 
    426 # setup args...
    427 #	Parse command line arguments, exit on error.
    428 #	Callers should shift $((OPTIND - 1)) afterwards.
    429 #
    430 setup()
    431 {
    432 	PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
    433 
    434 	: ${HOST_SH:=sh}
    435 	: ${TOOL_MKNOD:=mknod}
    436 	: ${TOOL_MTREE:=mtree}
    437 	: ${TOOL_PAX:=pax}
    438 	status=0
    439 	do_create_mfs=false
    440 	do_force=false
    441 	do_mknod=false
    442 	do_pax=false
    443 	do_mtree=false
    444 	do_redirect=false
    445 	do_specfile=false
    446 	do_update=false
    447 	opts=
    448 	while getopts Mfm:p:st:u ch; do
    449 		# Note that $opts is only for options pased through to
    450 		# MAKEDEV.local, not for all options.
    451 		case ${ch} in
    452 		M)
    453 			# "-M" sets do_create_mfs;
    454 			# "-M -M" is for use from init(8), and sets do_redirect
    455 			do_redirect=$do_create_mfs
    456 			do_create_mfs=true
    457 			;;
    458 		f)	do_force=true
    459 			opts="${opts} -f"
    460 			;;
    461 		m)	TOOL_MKNOD=${OPTARG}
    462 			do_mknod=true
    463 			opts="${opts} -m ${OPTARG}"
    464 			;;
    465 		p)	TOOL_PAX="${OPTARG}"
    466 			if check_pax "${TOOL_PAX}"; then
    467 				do_pax=true
    468 				# do not add this to $opts; we will later
    469 				# add "-s" instead.
    470 			else
    471 				warn "Ignored -p option:" \
    472 					"${TOOL_PAX} is missing or broken"
    473 				do_mknod=true
    474 			fi
    475 			;;
    476 		s)	do_specfile=true
    477 			opts="${opts} -s"
    478 			;;
    479 		t)	TOOL_MTREE="${OPTARG}"
    480 			if check_mtree "${TOOL_MTREE}"; then
    481 				do_mtree=true
    482 				# do not add this to $opts; we will later
    483 				# add "-s" instead.
    484 			else
    485 				warn "Ignored -t option:" \
    486 					"${TOOL_MTREE} is missing or broken"
    487 				do_mknod=true
    488 			fi
    489 			;;
    490 		u)
    491 			do_update=true
    492 			opts="${opts} -u"
    493 			;;
    494 		*)	usage ;;
    495 		esac
    496 	done
    497 
    498 	shift $((${OPTIND} - 1))
    499 	[ $# -gt 0 ] || usage
    500 
    501 	u_root="%uid_root%"
    502 	u_uucp="%uid_uucp%"
    503 	g_gpio="%gid__gpio%"
    504 	g_kmem="%gid_kmem%"
    505 	g_ntpd="%gid_ntpd%"
    506 	g_operator="%gid_operator%"
    507 	g_wheel="%gid_wheel%"
    508 	dialin=0
    509 	dialout=524288
    510 	callunit=262144
    511 
    512 	# only allow read&write for owner by default
    513 	umask 077
    514 
    515 	# Set fdesc_mounted=true if the fdesc file system is mounted
    516 	# on the current directory (typically "/dev").
    517 	# Later, this will be used to suppress creation of device nodes
    518 	# that are supplied by the fdesc file system.
    519 	#
    520 	fdesc_mounted=false
    521 	if [ -d fd ]; then
    522 		# Parse the output from "mount -u -o nosuchoption .".
    523 		# We don't parse the output from df(1) because that's
    524 		# less likely to be available on install media.
    525 		#
    526 		# If the current directory is a mount point for the
    527 		# fdesc file system, then the expected output (whether
    528 		# or not the current user is root) is:
    529 		#	mount_fdesc: -o suchoption: option not supported.
    530 		#
    531 		# If the current directory is not a mount point, then
    532 		# the expected output is:
    533 		#	mount: .: unknown special file or file system.
    534 		#
    535 		# If we are not running on NetBSD, or mount(8) is not
    536 		# found, then we should get some other error message.
    537 		#
    538 		case "$({ LC_ALL=C mount -u -o nosuchoption . ; } 2>&1)" in
    539 		*mount_fdesc*)	fdesc_mounted=true ;;
    540 		esac
    541 	fi
    542 
    543 	# do_force requires mknod
    544 	if $do_force; then
    545 		if $do_mtree || $do_pax || $do_specfile; then
    546 			die "-f option works only with mknod"
    547 		fi
    548 		do_mknod=true
    549 	fi
    550 
    551 	# do_force and do_update do not work together
    552 	if $do_force && $do_update; then
    553 		die "-f and -u options do not work together"
    554 	fi
    555 
    556 	# If no explicit method was specified on the command line or
    557 	# forced above, then use one of mtree, pax, or mknod, in that
    558 	# order of preference.
    559 	#
    560 	# mtree is preferred because it's fast and designed for the
    561 	# purpose.  However, it's unlikely to be available early in the
    562 	# boot sequence, when init(8) may invoke MAKEDEV(8).
    563 	#
    564 	# pax is usually acceptable, and it's likely to be available
    565 	# early in the boot sequence.  However, it's much slower than mtree.
    566 	#
    567 	# mknod is just very slow, because the shell has to fork for
    568 	# each device node.
    569 	#
    570 
    571 	case ",${do_mtree},,${do_pax},,${do_mknod},,${do_specfile}," in
    572 	( ,false,,false,,false,,false, )
    573 		if check_mtree "${TOOL_MTREE}"; then
    574 			do_mtree=true
    575 		elif check_pax "${TOOL_PAX}"; then
    576 			do_pax=true
    577 		else
    578 			do_mknod=true
    579 		fi
    580 		;;
    581 	( *,true,*,true,* )
    582 		die "-m, -p, -s, and -t options are mutually exclusive"
    583 		;;
    584 	esac
    585 
    586 	# If we are using mknod, then decide what options to pass it.
    587 	MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
    588 	if $do_mknod; then
    589 		if $do_force; then
    590 			MKNOD="${MKNOD} -R"
    591 		else
    592 			MKNOD="${MKNOD} -r"
    593 		fi
    594 	fi
    595 
    596 	# do_mtree or do_pax internally implies do_specfile.
    597 	# This happens after checking for mutually-exclusive options.
    598 	if $do_mtree || $do_pax && ! $do_specfile; then
    599 		do_specfile=true
    600 		opts="${opts} -s"
    601 	fi
    602 }
    603 
    604 # specfile_before
    605 #	This is called before the bulk of the makedev processing,
    606 #	if do_specfile is set.
    607 #
    608 #	It simply prints ". type=dir optional", which must be the
    609 #	first line of the specfile.
    610 #
    611 specfile_before()
    612 {
    613 	echo ". type=dir optional"
    614 }
    615 
    616 # mtree_after
    617 #	Output in specfile format is piped into this function.
    618 #
    619 #	It uses mtree to create the devices defined in the specfile.
    620 #
    621 mtree_after()
    622 {
    623 	nooutput -1 "${TOOL_MTREE}" -e -U
    624 }
    625 
    626 # pax_after
    627 #	Output in specfile format is piped into this function.
    628 #
    629 #	It uses pax to create the devices defined in the specfile.
    630 #
    631 pax_after()
    632 {
    633 	# Run pax in an empty directory, so it pays
    634 	# attention only to the specfile, without being
    635 	# confused by the existing contents of the target
    636 	# directory.  Without this, pax would complain "file
    637 	# would overwrite itself" for already-existing
    638 	# device nodes.
    639 	tmpdir=./tmp.$$
    640 	mkdir "${tmpdir}" || die "can't create temporary directory"
    641 	cd "${tmpdir}" || die "can't cd to temporary directory"
    642 	"${TOOL_PAX}" -r -w -M -pe ..
    643 	pax_status=$?
    644 	cd .. # back to where we started
    645 	rmdir "${tmpdir}"
    646 	return $pax_status
    647 }
    648 
    649 # makedev_main makedev_name args...
    650 #	Perform most of the work of the main program.  makedev_name
    651 #	is typically "makedev", but may be the name of some other
    652 #	makedev-like function (if we are invoked from MAKEDEV.local or
    653 #	some other script).  The other args to this function are the
    654 #	command line args with which the MAKEDEV (or MAKEDEV.local)
    655 #	script was invoked.
    656 #
    657 makedev_main()
    658 {
    659 	local makedev="$1" ; shift
    660 
    661 	# Parse command line args
    662 	setup ${1+"$@"}
    663 	shift $((${OPTIND}-1))
    664 
    665 	if $do_create_mfs; then
    666 		# Count inodes and create mfs file system.
    667 		# The makedev call merely updates $count_nodes.
    668 		count_nodes=0
    669 		$makedev ${1+"$@"}
    670 		create_mfs_dev $count_nodes
    671 		unset count_nodes
    672 	fi
    673 
    674 	# Set before, middle, and after variables, so we can do
    675 	# something like "( $before && $middle ) | $after",
    676 	# except it will have to be more complex so we can capture
    677 	# the exit status from both sides of the pipe.
    678 	#
    679 	if $do_specfile; then
    680 		before=specfile_before
    681 	else
    682 		before=:
    683 	fi
    684 	middle='$makedev ${1+"$@"} && (exit $status)'
    685 	if $do_mtree; then
    686 		after=mtree_after
    687 	elif $do_pax ; then
    688 		after=pax_after
    689 	else
    690 		after=cat
    691 	fi
    692 
    693 	# Actually perform the "{ $before && $middle } | $after" commands.
    694 	#
    695 	# We go to some trouble to ensure that, if any of
    696 	# $before, $middle, or $after fails, then we also
    697 	# exit with a non-zero status.
    698 	#
    699 	# In the block below, fd 3 is a copy of the original stdout,
    700 	# and fd 4 goes to a subshell that analyses the exit status
    701 	# status from the other commands.
    702 	#
    703 	{
    704 		exec 3>&1;
    705 		{
    706 			{ eval "$before" && eval "$middle"; echo $? >&4; } \
    707 			| { eval "$after"; echo $? >&4; } \
    708 		} 4>&1 1>&3 \
    709 		| (
    710 			read status1;
    711 			read status2; 
    712 			case "$status1,$status2" in
    713 			0,0) exit 0;;
    714 			0,*) exit $status2;;
    715 			*,*) exit $status1;;
    716 			esac
    717 		)
    718 	}
    719 }
    720 
    721 #
    722 # functions available to create nodes:
    723 #
    724 # mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
    725 #	create device node `name' with the appropriate permissions
    726 #
    727 # lndev src target
    728 #	create a symlink from src to target
    729 #
    730 # makedir dir mode
    731 #	create directory with appropriate mode
    732 #
    733 
    734 mkdev()
    735 {
    736 	if [ -n "$count_nodes" ]; then
    737 		count_nodes=$((count_nodes + 1))
    738 		return
    739 	fi
    740 	if $do_update && test -e $1; then
    741 		return
    742 	fi
    743 	if $do_specfile; then
    744 		case $2 in
    745 		b)	type=block ;;
    746 		c)	type=char ;;
    747 		esac
    748 		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
    749 	else
    750 		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
    751 	fi
    752 }
    753 
    754 lndev()
    755 {
    756 	if [ -n "$count_nodes" ]; then
    757 		count_nodes=$((count_nodes + 1))
    758 		return
    759 	fi
    760 	if $do_update && test -e $2; then
    761 		return
    762 	fi
    763 	if $do_specfile; then
    764 		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
    765 	else
    766 		ln -f -s $1 $2
    767 	fi
    768 }
    769 
    770 makedir()
    771 {
    772 	if [ -n "$count_nodes" ]; then
    773 		count_nodes=$((count_nodes + 1))
    774 		return
    775 	fi
    776 	if $do_update && test -e $1; then
    777 		return
    778 	fi
    779 	if $do_specfile; then
    780 		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
    781 	else
    782 		nooutput -2 mkdir $1
    783 		chmod $2 $1
    784 	fi
    785 }
    786 
    787 warn()
    788 {
    789 	echo 1>&2 "$0: $*"
    790 	status=1
    791 }
    792 
    793 die()
    794 {
    795 	echo 1>&2 "$0: $*"
    796 	exit 1
    797 }
    798 
    799 # makedev special [...]
    800 #	the main loop
    801 #
    802 makedev()
    803 {
    804 
    805 for i
    806 do
    807 
    808 case $i in
    809 
    810 %MD_DEVICES%
    811 
    812 all)
    813 	makedev all_md
    814 	makedev std fd ptm
    815 	makedev dk0 dk1 dk2 dk3 dk4 dk5 dk6 dk7
    816 	makedev dk8 dk9 dk10 dk11 dk12 dk13 dk14 dk15
    817 	makedev ccd0 ccd1 ccd2 ccd3
    818 	makedev cgd0 cgd1 cgd2 cgd3
    819 	makedev filemon
    820 	makedev fss0 fss1 fss2 fss3
    821 	makedev md0 md1
    822 	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
    823 	makedev vnd0 vnd1 vnd2 vnd3
    824 	makedev iscsi0
    825 	makedev bpf npf
    826 	makedev tun0 tun1 tun2 tun3
    827 	makedev ipl pf crypto random
    828 	makedev lockstat clockctl cpuctl
    829 	makedev atabus0 atabus1 atabus2 atabus3 atabus4 atabus5 atabus6 atabus7
    830 	makedev tap tap0 tap1 tap2 tap3
    831 	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
    832 	makedev pad pad0 pad1 pad2 pad3
    833 	makedev bthub
    834 	makedev putter
    835 	makedev drvctl
    836 	makedev video
    837 	makedev dtv
    838 	makedev drm0
    839 	makedev altmem
    840 	makedev zfs
    841 	makedev lua
    842 	makedev hdmicec0
    843 	makedev dtrace
    844 	makedev local # do this last
    845 	;;
    846 
    847 init)
    848 	# unless overridden by MD entry, this is equal to 'all'
    849 	makedev all opty
    850 	;;
    851 
    852 %MI_DEVICES_BEGIN%
    853 audio)
    854 	makedev audio0 audio1 audio2 audio3
    855 	makedev hdaudio0 hdaudio1 hdaudio2 hdaudio3
    856 	lndev sound0 sound
    857 	lndev audio0 audio
    858 	lndev mixer0 mixer
    859 	lndev audioctl0 audioctl
    860 	;;
    861 
    862 gpio)
    863 	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
    864 	lndev gpio0 gpio
    865 	;;
    866 
    867 lua)
    868 	makedev lua0
    869 	lndev lua0 lua
    870 	;;
    871 
    872 pad)
    873 	makedev pad0 pad1 pad2 pad3
    874 	lndev pad0 pad
    875 	;;
    876 
    877 radio)
    878 	makedev radio0 radio1
    879 	lndev radio0 radio
    880 	;;
    881 
    882 video)
    883 	makedev video0 video1 video2 video3
    884 	;;
    885 
    886 dtv)
    887 	makedev dtv0 dtv1 dtv2 dtv3
    888 	;;
    889 
    890 iic)
    891 	makedev iic0 iic1 iic2 iic3
    892 	;;
    893 
    894 altmem)
    895 	makedev altmem0 altmem1
    896 	;;
    897 
    898 ramdisk)
    899 	makedev floppy md0
    900 	;;
    901 
    902 usbs)
    903 	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
    904 	makedev uhid0 uhid1 uhid2 uhid3
    905 	makedev ulpt0 ulpt1
    906 	makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7
    907 	makedev ttyY0 ttyY1
    908 	makedev ttyHS0
    909 	makedev urio0
    910 	makedev uscanner0 uscanner1
    911 	makedev utoppy0 utoppy1
    912 	makedev ugen0 ugen1 ugen2 ugen3
    913 	;;
    914 
    915 isdns)
    916 	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
    917 	;;
    918 
    919 std)
    920 	mkdev		console c %cons_chr% 0	600
    921 	mkdev		constty c %cons_chr% 1	600
    922 	mkdev		drum	c %swap_chr% 0	640 $g_kmem
    923 	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
    924 	mkdev		mem	c %mem_chr% 0	640 $g_kmem
    925 	mkdev		null	c %mem_chr% 2	666
    926 	mkdev		full	c %mem_chr% 11	666
    927 	mkdev		zero	c %mem_chr% 12	666
    928 	mkdev		klog	c %log_chr% 0	600
    929 	mkdev		ksyms	c %ksyms_chr% 0 444
    930 	mkdev		random	c %rnd_chr% 0	444
    931 	mkdev		urandom	c %rnd_chr% 1	644
    932 	if ! $fdesc_mounted; then
    933 		mkdev	tty	c %ctty_chr% 0		666
    934 		mkdev	stdin	c %filedesc_chr% 0	666
    935 		mkdev	stdout	c %filedesc_chr% 1	666
    936 		mkdev	stderr	c %filedesc_chr% 2	666
    937 	fi
    938 	;;
    939 
    940 usb)
    941 	mkdev usb c %usb_chr% 255 444
    942 	;;
    943 
    944 usb[0-9]*)
    945 	unit=${i#usb}
    946 	usb=usb$unit
    947 	mkdev usb$unit c %usb_chr% $unit
    948 	;;
    949 
    950 uhid[0-9]*)
    951 	unit=${i#uhid}
    952 	mkdev uhid$unit c %uhid_chr% $unit 666
    953 	;;
    954 
    955 ulpt[0-9]*)
    956 	unit=${i#ulpt}
    957 	mkdev ulpt$unit c %ulpt_chr% $unit
    958 	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
    959 	;;
    960 
    961 urio[0-9]*)
    962 	unit=${i#urio}
    963 	mkdev urio$unit c %urio_chr% $unit 666
    964 	;;
    965 
    966 uscanner[0-9]*)
    967 	unit=${i#uscanner}
    968 	mkdev uscanner$unit c %uscanner_chr% $unit
    969 	;;
    970 
    971 utoppy[0-9]*)
    972 	unit=${i#utoppy}
    973 	mkdev utoppy$unit c %utoppy_chr% $unit
    974 	;;
    975 
    976 ttyHS[0-9]*)
    977 	unit=${i#ttyHS}
    978 	for j in 00 01 02 03 04 05 06 07 08 09 10
    979 	do
    980 		base=$(($unit * 16 + ${j#0}))
    981 		mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin  )) "" "" $u_uucp
    982 		mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp
    983 		mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp
    984 	done
    985 	;;
    986 
    987 ttyY[0-9]*)
    988 	unit=${i#ttyY}
    989 	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
    990 	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
    991 	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
    992 	;;
    993 
    994 ucom[0-9]*)
    995 	makedev ttyU${i#ucom}
    996 	;;
    997 
    998 ttyU[0-9]*)
    999 	unit=${i#ttyU}
   1000 	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin	 )) "" "" $u_uucp
   1001 	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
   1002 	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
   1003 	;;
   1004 
   1005 ugen[0-9]*)
   1006 	unit=${i#ugen}
   1007 	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
   1008 	do
   1009 		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
   1010 	done
   1011 	;;
   1012 
   1013 wscons)
   1014 	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
   1015 	makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7
   1016 	makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7
   1017 	makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7
   1018 	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
   1019 	makedev wskbd0 wskbd1 wskbd2 wskbd3
   1020 	makedev wsmux0 wsmux1 wsmux2 wsmux3
   1021 	makedev wsmouse wskbd
   1022 	makedev ttyEcfg ttyEstat
   1023 	makedev ttyFcfg ttyFstat
   1024 	makedev ttyGcfg ttyGstat
   1025 	makedev ttyHcfg ttyHstat
   1026 	makedev wsfont
   1027 	;;
   1028 
   1029 wsmouse)
   1030 	mkdev wsmouse c %wsmux_chr% 0
   1031 	;;
   1032 
   1033 wskbd)
   1034 	mkdev wskbd c %wsmux_chr% 1
   1035 	;;
   1036 
   1037 wsmux[0-9]*)
   1038 	unit=${i#wsmux}
   1039 	mkdev wsmux$unit    c %wsmux_chr% $unit
   1040 	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
   1041 	;;
   1042 
   1043 xenevt)
   1044 	mkdev xenevt c %xenevt_chr% 0
   1045 	;;
   1046 
   1047 xsd_kva)
   1048 	mkdev xsd_kva c %xenevt_chr% 1
   1049 	;;
   1050 
   1051 xencons)
   1052 	mkdev xencons c %xencons_chr% 0
   1053 	;;
   1054 
   1055 ttyEstat)
   1056 	mkdev ttyEstat c %wsdisplay_chr% 254
   1057 	;;
   1058 
   1059 ttyEcfg)
   1060 	mkdev ttyEcfg c %wsdisplay_chr% 255
   1061 	;;
   1062 
   1063 ttyE[0-9]*)
   1064 	unit=${i#ttyE}
   1065 	mkdev ttyE$unit c %wsdisplay_chr% $unit
   1066 	;;
   1067 
   1068 ttyFstat)
   1069 	mkdev ttyFstat c %wsdisplay_chr% 510
   1070 	;;
   1071 
   1072 ttyFcfg)
   1073 	mkdev ttyFcfg c %wsdisplay_chr% 511
   1074 	;;
   1075 
   1076 ttyF[0-9]*)
   1077 	unit=${i#ttyF}
   1078 	mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256))
   1079 	;;
   1080 
   1081 ttyGstat)
   1082 	mkdev ttyGstat c %wsdisplay_chr% 766
   1083 	;;
   1084 
   1085 ttyGcfg)
   1086 	mkdev ttyGcfg c %wsdisplay_chr% 767
   1087 	;;
   1088 
   1089 ttyG[0-9]*)
   1090 	unit=${i#ttyG}
   1091 	mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512))
   1092 	;;
   1093 
   1094 ttyHstat)
   1095 	mkdev ttyHstat c %wsdisplay_chr% 1022
   1096 	;;
   1097 
   1098 ttyHcfg)
   1099 	mkdev ttyHcfg c %wsdisplay_chr% 1023
   1100 	;;
   1101 
   1102 ttyH[0-9]*)
   1103 	unit=${i#ttyH}
   1104 	mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768))
   1105 	;;
   1106 
   1107 wsmouse[0-9]*)
   1108 	unit=${i#wsmouse}
   1109 	mkdev wsmouse$unit c %wsmouse_chr% $unit
   1110 	;;
   1111 
   1112 wskbd[0-9]*)
   1113 	unit=${i#wskbd}
   1114 	mkdev wskbd$unit c %wskbd_chr% $unit
   1115 	;;
   1116 
   1117 fd)
   1118 	if ! $fdesc_mounted; then
   1119 		# Create the "fd" subdirectory, and devices "fd/0" to "fd/63"
   1120 		makedir fd 755
   1121 		n=0
   1122 		while [ $n -lt 64 ]
   1123 		do
   1124 			mkdev fd/$n c %filedesc_chr% $n 666
   1125 			n=$(($n + 1))
   1126 		done
   1127 	fi
   1128 	;;
   1129 
   1130 wt[0-9]*)
   1131 	name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%
   1132 	for sub in $unit $(($unit+8)) $(($unit+16))
   1133 	do
   1134 		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
   1135 		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
   1136 		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
   1137 		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
   1138 	done
   1139 	;;
   1140 
   1141 md[0-9]*)
   1142 	makedisk_minimal md ${i#md} %md_blk% %md_chr%
   1143 	;;
   1144 
   1145 fss[0-9]*)
   1146 	name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
   1147 	mkdev $name$unit	b $blk $unit 660 $g_operator
   1148 	mkdev r$name$unit	c $chr $unit 660 $g_operator
   1149 	;;
   1150 
   1151 ss[0-9]*)
   1152 	name=ss;	unit=${i#ss};	chr=%ss_chr%
   1153 	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
   1154 	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
   1155 	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
   1156 	;;
   1157 
   1158 ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*)
   1159 	case $i in
   1160 	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
   1161 	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
   1162 	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
   1163 	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
   1164 	esac
   1165 	%MKDISK% $name $unit $blk $chr
   1166 	;;
   1167 
   1168 sd[0-9]*)
   1169 	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
   1170 	%MKDISK% $name $unit $blk $chr
   1171 	;;
   1172 
   1173 ace[0-9]*)
   1174 	name=ace; unit=${i#ace};	blk=%ace_blk%;		chr=%ace_chr%
   1175 	%MKDISK% $name $unit $blk $chr
   1176 	;;
   1177 
   1178 eflash[0-9]*)
   1179 	name=eflash; unit=${i#eflash};	blk=%eflash_blk%;	chr=%eflash_chr%
   1180 	%MKDISK% $name $unit $blk $chr
   1181 	;;
   1182 
   1183 wd[0-9]*)
   1184 	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
   1185 	%MKDISK% $name $unit $blk $chr
   1186 	;;
   1187 
   1188 fd[0-9]*)
   1189 	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
   1190 	%MKDISK% $name $unit $blk $chr
   1191 	;;
   1192 
   1193 ld[0-9]*)
   1194 	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
   1195 	%MKDISK% $name $unit $blk $chr
   1196 	;;
   1197 
   1198 flash[0-9]*)
   1199 	unit=${i#flash}
   1200 	flash=flash$unit
   1201 	mkdev flash$unit b %flash_blk% $unit
   1202 	mkdev rflash$unit c %flash_chr% $unit
   1203 	;;
   1204 
   1205 spiflash[0-9]*)
   1206 	unit=${i#spiflash}
   1207 	spiflash=spiflash$unit
   1208 	mkdev spiflash$unit b %spiflash_blk% $unit
   1209 	;;
   1210 
   1211 altmem[0-9]*)
   1212 	name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr%
   1213 	%MKDISK% $name $unit $blk $chr
   1214 	;;
   1215 
   1216 bio)
   1217 	mkdev bio c %bio_chr% 0
   1218 	;;
   1219 
   1220 ed[0-9]*)
   1221 	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
   1222 	%MKDISK% $name $unit $blk $chr
   1223 	;;
   1224 
   1225 ofdisk[0-9]*)
   1226 	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
   1227 	%MKDISK% $name $unit $blk $chr
   1228 	;;
   1229 
   1230 xbd[0-9]*)
   1231 	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
   1232 	%MKDISK% $name $unit $blk $chr
   1233 	;;
   1234 
   1235 dk[0-9]*)
   1236 	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
   1237 	mkdev r$name$unit c $chr $unit 0640 $g_operator
   1238 	mkdev $name$unit b $blk  $unit 0640 $g_operator
   1239 	;;
   1240 
   1241 ttyCY[0-9]*)
   1242 	# Each unit number creates 32 pairs of {tty,dty} device nodes:
   1243 	# ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031;
   1244 	# ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063;
   1245 	name=tyCY; chr=%cy_chr%; off=32
   1246 	unit=${i#t${name}}
   1247 	minor=$(($unit * $off))
   1248 	eminor=$(($minor + $off))
   1249 	while [ $minor -lt $eminor ]
   1250 	do
   1251 		nminor=000$minor
   1252 		nminor=${nminor#${nminor%???}}
   1253 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1254 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1255 		minor=$(($minor + 1))
   1256 	done
   1257 	;;
   1258 
   1259 ttyCZ[0-9]*)
   1260 	# Each unit number creates 64 pairs of {tty,dty} device nodes:
   1261 	# ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063;
   1262 	# ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127;
   1263 	name=tyCZ; chr=%cz_chr%; off=64
   1264 	unit=${i#t${name}}
   1265 	minor=$(($unit * $off))
   1266 	eminor=$(($minor + $off))
   1267 	while [ $minor -lt $eminor ]
   1268 	do
   1269 		nminor=0000$minor
   1270 		nminor=${nminor#${nminor%????}}
   1271 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1272 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1273 		minor=$(($minor + 1))
   1274 	done
   1275 	;;
   1276 
   1277 
   1278 tty[0-9]|tty0[0-9])
   1279 	# some archs have built-in zstty (major %zstty_chr%) instead
   1280 	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
   1281 	# needs to be before com entry, for archs which have both
   1282 	unit=${i#tty}
   1283 	unit=$(($unit + 0))
   1284 	makedev ttyZ${unit}
   1285 	lndev ttyZ$unit tty0${unit}
   1286 	lndev dtyZ$unit dty0${unit}
   1287 	;;
   1288 
   1289 tty[0-9]*)
   1290 	unit=${i#tty}
   1291 	ounit=00$unit
   1292 	ounit=${ounit#${ounit%??}}
   1293 	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
   1294 	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
   1295 	;;
   1296 
   1297 ttyC[0-9]*)
   1298 		# some archs call com_chr ttyC traditionally
   1299 	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
   1300 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1301 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1302 	;;
   1303 
   1304 ttyh[0-9]*)
   1305 	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
   1306 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1307 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1308 	;;
   1309 
   1310 ttyTX[0-9]*)
   1311 	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
   1312 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1313 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1314 	;;
   1315 
   1316 ttyZ[0-9]*)
   1317 	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
   1318 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1319 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1320 	;;
   1321 
   1322 opty)
   1323 	# Create 16 device nodes, [pt]typ0 to [pt]typf,
   1324 	# same as "MAKEDEV pty0".
   1325 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   1326 	do
   1327 		case $j in
   1328 		[0-9])	jn=$j ;;
   1329 		a)	jn=10 ;;
   1330 		b)	jn=11 ;;
   1331 		c)	jn=12 ;;
   1332 		d)	jn=13 ;;
   1333 		e)	jn=14 ;;
   1334 		f)	jn=15 ;;
   1335 		esac
   1336 		mkdev ttyp$j c %pts_chr% $jn 666
   1337 		mkdev ptyp$j c %ptc_chr% $jn 666
   1338 	done
   1339 	;;
   1340 
   1341 pty[0-9]*)
   1342 	# Each unit number creates up to 16 pairs of {tty,pty} device nodes:
   1343 	# pty0 => 16 pairs, [tp]typ0 to [tp]typf
   1344 	# pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf
   1345 	# pty16 => 16 pairs, [tp]typg to [tp]typv
   1346 	# pty17 => 16 pairs, [tp]typw to [tp]typL
   1347 	# pty18 => 14 pairs, [tp]typM to [tp]typZ
   1348 	warn "$i: creating BSD style tty nodes with ptyfs is a security issue"
   1349 	class=${i#pty}
   1350 	d1="p q r s t u v w x y z P Q R S T"
   1351 	if [ "$class" -ge 64 ]
   1352 	then
   1353 		warn "$i: pty unit must be between 0 and 63"
   1354 		continue
   1355 	elif [ "$class" -lt 16 ]
   1356 	then
   1357 		# pty[p-zP-T][0-9a-f]
   1358 		offset=0
   1359 		mult=0
   1360 		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
   1361 	else
   1362 		# pty[p-zP-T][g-zA-Z]
   1363 		class=$(($class - 16))
   1364 		offset=256
   1365 		mult=2
   1366 		d2="g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
   1367 	fi
   1368 	start=$(($class * 16))
   1369 	set -- $d2
   1370 	nt=$#
   1371 	s1=$(($start / $nt))
   1372 	set -- $d1
   1373 	shift $s1
   1374 	t1=$1
   1375 	if [ "$t1" = v ]; then
   1376 		warn "$i: pty unit conflicts with console ttyv0 device"
   1377 		continue
   1378 	fi
   1379 	s2=$(($start % ($nt - $s1 * $mult)))
   1380 	set -- $d2
   1381 	shift $s2
   1382 	t2=$1
   1383 	unit=$(($start + $offset - $s1 * $mult))
   1384 	end=$(($unit + 16))
   1385 	while [ "$unit" -lt "$end" ]
   1386 	do
   1387 		mkdev tty$t1$t2 c %pts_chr% $unit 666
   1388 		mkdev pty$t1$t2 c %ptc_chr% $unit 666
   1389 		shift
   1390 		t2=$1
   1391 		if [ -z "$t2" ]
   1392 		then
   1393 			break
   1394 		fi
   1395 		unit=$(($unit + 1))
   1396 	done
   1397 	;;
   1398 
   1399 stic[0-9]*)
   1400 	unit=${i#stic}
   1401 	mkdev stic$unit c %stic_chr% $unit
   1402 	;;
   1403 
   1404 st[0-9]*)
   1405 	name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%
   1406 	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
   1407 	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
   1408 	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
   1409 	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
   1410 	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
   1411 	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
   1412 	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
   1413 	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
   1414 	;;
   1415 
   1416 ses[0-9]*|ch[0-9]*|uk[0-9]*)
   1417 	case $i in
   1418 	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
   1419 	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
   1420 	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
   1421 	esac
   1422 	mkdev $name$unit c $chr $unit 640 $g_operator
   1423 	;;
   1424 
   1425 cd[0-9]*)
   1426 	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr%
   1427 	;;
   1428 
   1429 mcd[0-9]*)
   1430 	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
   1431 	;;
   1432 
   1433 gdrom[0-9]*)
   1434 	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
   1435 	;;
   1436 
   1437 lpt[0-9]*|lpa[0-9]*)
   1438 	case $i in
   1439 	lpt*) name=lpt; unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
   1440 	lpa*) name=lpa; unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
   1441 	esac
   1442 	mkdev $name$unit c $chr $(($unit + $flags))
   1443 	mkdev lpt${unit}ctl c $chr $(($unit + 256))
   1444 	;;
   1445 
   1446 bpf)
   1447 	mkdev bpf	c %bpf_chr% 0
   1448 	lndev bpf bpf0
   1449 	;;
   1450 
   1451 npf)
   1452 	mkdev npf	c %npf_chr% 0
   1453 	;;
   1454 
   1455 bthub)
   1456 	mkdev bthub c %bthub_chr% 0
   1457 	;;
   1458 
   1459 tun[0-9]*)
   1460 	unit=${i#tun}
   1461 	mkdev tun$unit c %tun_chr% $unit
   1462 	;;
   1463 
   1464 joy[0-9]*)
   1465 	unit=${i#joy}
   1466 	mkdev joy$unit c %joy_chr% $unit
   1467 	;;
   1468 
   1469 ipl)
   1470 	mkdev ipl	c %ipl_chr% 0
   1471 	mkdev ipnat	c %ipl_chr% 1
   1472 	mkdev ipstate	c %ipl_chr% 2
   1473 	mkdev ipauth	c %ipl_chr% 3
   1474 	mkdev ipsync	c %ipl_chr% 4
   1475 	mkdev ipscan	c %ipl_chr% 5
   1476 	mkdev iplookup	c %ipl_chr% 6
   1477 	;;
   1478 
   1479 pf)
   1480 	mkdev pf c %pf_chr% 0
   1481 	;;
   1482 
   1483 crypto)
   1484 	mkdev crypto c %crypto_chr% 0 666
   1485 	;;
   1486 
   1487 cmos)
   1488 	mkdev cmos c %cmos_chr% 0 644
   1489 	;;
   1490 
   1491 speaker)
   1492 	mkdev speaker c %spkr_chr% 0
   1493 	;;
   1494 
   1495 lockstat)
   1496 	mkdev lockstat c %lockstat_chr% 0
   1497 	;;
   1498 
   1499 cpuctl)
   1500 	mkdev cpuctl c %cpuctl_chr% 0 666
   1501 	;;
   1502 
   1503 audio|audio[0-9]*)
   1504 	unit=${i#audio}
   1505 	audio=audio$unit
   1506 	sound=sound$unit
   1507 	mixer=mixer$unit
   1508 	audioctl=audioctl$unit
   1509 	: ${unit:-0}
   1510 	mkdev $sound	c %audio_chr% $(($unit + 0))	666
   1511 	mkdev $audio	c %audio_chr% $(($unit + 128))	666
   1512 	mkdev $mixer	c %audio_chr% $(($unit + 16))	666
   1513 	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
   1514 	;;
   1515 
   1516 hdaudio[0-9]*)
   1517 	unit=${i#hdaudio}
   1518 	mkdev hdaudio$unit c %hdaudio_chr% $unit 644
   1519 	;;
   1520 
   1521 hdmicec[0-9]*)
   1522 	uint=${i#hdmicec}
   1523 	mkdev hdmicec$unit c %hdmicec_chr% $unit 644
   1524 	;;
   1525 
   1526 gpio[0-9]*)
   1527 	unit=${i#gpio}
   1528 	mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio
   1529 	;;
   1530 
   1531 lua[0-9]*)
   1532 	unit=${i#lua}
   1533 	mkdev lua$unit c %lua_chr% $unit 664
   1534 	;;
   1535 
   1536 rmidi[0-9]*)
   1537 	unit=${i#rmidi}
   1538 	mkdev rmidi$unit c %midi_chr% $unit 666
   1539 	;;
   1540 
   1541 music|music[0-9]*)
   1542 	unit=${i#music}
   1543 	: ${unit:-0}
   1544 	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
   1545 	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666
   1546 	;;
   1547 
   1548 radio|radio[0-9]*)
   1549 	unit=${i#radio}
   1550 	: ${unit:-0}
   1551 	mkdev radio$unit c %radio_chr% $unit 666
   1552 	;;
   1553 
   1554 video|video[0-9]*)
   1555 	unit=${i#video}
   1556 	: ${unit:-0}
   1557 	mkdev video$unit c %video_chr% $unit 666
   1558 	;;
   1559 
   1560 dtv[0-9]*)
   1561 	unit=${i#dtv}
   1562 	makedir dvb 755
   1563 	makedir dvb/adapter$unit 755
   1564 	mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666
   1565 	mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666
   1566 	mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666
   1567 	;;
   1568 
   1569 iic[0-9]*)
   1570 	unit=${i#iic}
   1571 	: ${unit:-0}
   1572 	mkdev iic$unit c %iic_chr% $unit 600
   1573 	;;
   1574 
   1575 amr[0-9]*)
   1576 	unit=${i#amr}
   1577 	mkdev amr$unit c %amr_chr% $unit
   1578 	;;
   1579 
   1580 apm)
   1581 	mkdev apm	c %apm_chr% 0 644
   1582 	mkdev apmctl	c %apm_chr% 8 644
   1583 	;;
   1584 
   1585 apm)
   1586 		# hpcmips uses `apmdev_chr' instead of `apm_chr'
   1587 	mkdev apm	c %apmdev_chr% 0 644
   1588 	mkdev apmctl	c %apmdev_chr% 8 644
   1589 	;;
   1590 
   1591 satlink[0-9]*)
   1592 	unit=${i#satlink}
   1593 	mkdev satlink$unit c %satlink_chr% $unit 444
   1594 	;;
   1595 
   1596 random)
   1597 	mkdev random	c %rnd_chr% 0 444
   1598 	mkdev urandom	c %rnd_chr% 1 644
   1599 	;;
   1600 
   1601 cfs)
   1602 	makedev cfs0
   1603 	;;
   1604 
   1605 cfs[0-9]*)
   1606 	unit=${i#cfs}
   1607 	mkdev cfs$unit c %vcoda_chr% $unit
   1608 	;;
   1609 
   1610 sysmon)
   1611 	mkdev sysmon	c %sysmon_chr% 0 644
   1612 	mkdev watchdog	c %sysmon_chr% 1 644
   1613 	mkdev power	c %sysmon_chr% 2 640
   1614 	;;
   1615 
   1616 scsibus[0-9]*)
   1617 	unit=${i#scsibus}
   1618 	mkdev scsibus$unit c %scsibus_chr% $unit 644
   1619 	;;
   1620 
   1621 bktr)
   1622 	makedev bktr0 bktr1
   1623 	lndev	bktr0	bktr
   1624 	lndev	tuner0	tuner
   1625 	lndev	vbi0	vbi
   1626 	;;
   1627 
   1628 bktr[0-9]*)
   1629 	unit=${i#bktr}
   1630 	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
   1631 	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
   1632 	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
   1633 	;;
   1634 
   1635 io)
   1636 	mkdev		io	c %mem_chr% 14	600
   1637 	;;
   1638 
   1639 iop[0-9]*)
   1640 	unit=${i#iop}
   1641 	mkdev iop$unit c %iop_chr% $unit
   1642 	;;
   1643 
   1644 mfi[0-9]*)
   1645 	unit=${i#mfi}
   1646 	mkdev mfi$unit c %mfi_chr% $unit
   1647 	;;
   1648 
   1649 mlx[0-9]*)
   1650 	unit=${i#mlx}
   1651 	mkdev mlx$unit c %mlx_chr% $unit
   1652 	;;
   1653 
   1654 mly[0-9]*)
   1655 	unit=${i#mly}
   1656 	mkdev mly$unit c %mly_chr% $unit
   1657 	;;
   1658 
   1659 twa[0-9]*)
   1660 	unit=${i#twa}
   1661 	mkdev twa$unit c %twa_chr% $unit
   1662 	;;
   1663 
   1664 twe[0-9]*)
   1665 	unit=${i#twe}
   1666 	mkdev twe$unit c %twe_chr% $unit
   1667 	;;
   1668 
   1669 icp[0-9]*)
   1670 	unit=${i#icp}
   1671 	mkdev icp$unit c %icp_chr% $unit
   1672 	;;
   1673 
   1674 agp[0-9]*)
   1675 	unit=${i#agp}
   1676 	mkdev agp$unit c %agp_chr% $unit 644
   1677 	if [ "$unit" = "0" ]; then
   1678 		lndev agp$unit agpgart
   1679 	fi
   1680 	;;
   1681 
   1682 pci[0-9]*)
   1683 	unit=${i#pci}
   1684 	mkdev pci$unit c %pci_chr% $unit 640
   1685 	;;
   1686 
   1687 dpti[0-9]*)
   1688 	unit=${i#dpti}
   1689 	mkdev dpti$unit c %dpti_chr% $unit
   1690 	;;
   1691 
   1692 dpt[0-9]*)
   1693 	unit=${i#dpt}
   1694 	mkdev dpt$unit c %dpt_chr% $unit
   1695 	;;
   1696 
   1697 altq)
   1698 	makedir altq 755
   1699 	unit=0
   1700 	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs
   1701 	do
   1702 		mkdev altq/$dev c %altq_chr% $unit 644
   1703 		unit=$(($unit + 1))
   1704 	done
   1705 	;;
   1706 
   1707 isdn)
   1708 	mkdev isdn c %isdn_chr% 0
   1709 	;;
   1710 
   1711 isdnctl)
   1712 	mkdev isdnctl c %isdnctl_chr% 0
   1713 	;;
   1714 
   1715 isdnbchan[0-9]*)
   1716 	unit=${i#isdnbchan}
   1717 	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
   1718 	;;
   1719 
   1720 isdnteld[0-9]*)
   1721 	unit=${i#isdnteld}
   1722 	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
   1723 	;;
   1724 
   1725 isdntel[0-9]*)
   1726 	unit=${i#isdntel}
   1727 	mkdev isdntel$unit c %isdntel_chr% $unit
   1728 	;;
   1729 
   1730 isdntrc[0-9]*)
   1731 	unit=${i#isdntrc}
   1732 	mkdev isdntrc$unit c %isdntrc_chr% $unit
   1733 	;;
   1734 
   1735 wsfont)
   1736 	mkdev wsfont c %wsfont_chr% 0
   1737 	;;
   1738 
   1739 cir[0-9]*)
   1740 	unit=${i#cir}
   1741 	mkdev cir$unit c %cir_chr% $unit 666
   1742 	;;
   1743 
   1744 irframe[0-9]*)
   1745 	unit=${i#irframe}
   1746 	mkdev irframe$unit c %irframe_chr% $unit
   1747 	;;
   1748 
   1749 fcom[0-9]*)
   1750 	unit=${i#fcom}
   1751 	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
   1752 	;;
   1753 
   1754 openfirm)
   1755 	mkdev openfirm c %openfirm_chr% 0 444
   1756 	;;
   1757 
   1758 pad[0-9]*)
   1759 	unit=${i#pad}
   1760 	mkdev pad$unit c %pad_chr% $unit 444
   1761 	;;
   1762 
   1763 nvram)
   1764 	mkdev nvram c %nvram_chr% 0 644
   1765 	;;
   1766 
   1767 rtc)
   1768 	mkdev rtc c %rtc_chr% 0 644
   1769 	;;
   1770 
   1771 clockctl)
   1772 	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
   1773 	;;
   1774 
   1775 nsmb)
   1776 	makedev nsmb0 nsmb1 nsmb2 nsmb3
   1777 	;;
   1778 
   1779 nsmb[0-9]*)
   1780 	unit=${i#nsmb}
   1781 	mkdev nsmb$unit c %nsmb_chr% $unit 644
   1782 	;;
   1783 
   1784 kttcp)
   1785 	mkdev kttcp c %kttcp_chr% 0
   1786 	;;
   1787 
   1788 dmoverio)
   1789 	mkdev dmoverio c %dmoverio_chr% 0 644
   1790 	;;
   1791 
   1792 veriexec)
   1793 	mkdev veriexec c %veriexec_chr% 0 600
   1794 	;;
   1795 
   1796 ttyv[0-9]*)
   1797 	unit=${i#ttyv}
   1798 	mkdev ttyv$unit c %pc_chr% $unit
   1799 	;;
   1800 
   1801 # arm, acorn32
   1802 ttyv[0-9]*)
   1803 	unit=${i#ttyv}
   1804 	mkdev ttyv$unit c %physcon_chr% $unit
   1805 	;;
   1806 
   1807 arcpp[0-9]*)
   1808 	unit=${i#arcpp}
   1809 	mkdev arcpp$unit c %arcpp_chr% $unit
   1810 	;;
   1811 
   1812 par[0-9]*)
   1813 	unit=${i#par}
   1814 	case $unit in
   1815 	0)
   1816 		mkdev par$unit c %par_chr% $unit
   1817 		;;
   1818 	*)
   1819 		warn "bad unit for par in: $i"
   1820 		;;
   1821 	esac
   1822 	;;
   1823 
   1824 cpi[0-9]*)
   1825 	unit=${i#cpi}
   1826 	mkdev cpi$unit c %cpi_chr% $unit
   1827 	;;
   1828 
   1829 ite[0-9]*|ttye[0-9]*)
   1830 	case $i in
   1831 	ite*)	unit=${i#ite};;
   1832 	ttye*)	unit=${i#ttye};;
   1833 	esac
   1834 	mkdev ttye$unit c %ite_chr% $unit
   1835 	;;
   1836 
   1837 pms[0-9]*)
   1838 	unit=${i#pms}
   1839 	mkdev pms$unit c %opms_chr% $unit
   1840 	;;
   1841 
   1842 qms[0-9]*)
   1843 	unit=${i#qms}
   1844 	mkdev qms$unit c %qms_chr% $unit
   1845 	;;
   1846 
   1847 lms[0-9]*)
   1848 	unit=${i#lms}
   1849 	mkdev lms$unit c %lms_chr% $unit
   1850 	;;
   1851 
   1852 mms[0-9]*)
   1853 	unit=${i#mms}
   1854 	mkdev mms$unit c %mms_chr% $unit
   1855 	;;
   1856 
   1857 mouse-pms[0-9]*|mouse-qms[0-9]*)
   1858 	case $i in
   1859 	mouse-pms*) name=pms ;;
   1860 	mouse-qms*) name=qms ;;
   1861 	esac
   1862 	unit=${i#mouse-${name}}
   1863 	lndev $name$unit mouse
   1864 	;;
   1865 
   1866 kbd)
   1867 	mkdev kbd c %kbd_chr% 0
   1868 	;;
   1869 
   1870 kbdctl)
   1871 	mkdev kbdctl c %kbd_chr% 1
   1872 	;;
   1873 
   1874 vidcconsole0)
   1875 	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
   1876 	;;
   1877 
   1878 view[0-9]*)
   1879 	unit=${i#view}
   1880 	mkdev view$unit c %view_chr% $unit 666
   1881 	;;
   1882 
   1883 mouse[0-9]*)
   1884 	unit=${i#mouse}
   1885 	case $unit in
   1886 	0|1)
   1887 		mkdev mouse$unit c %ms_chr% $unit 666
   1888 		if [ $unit = 0 ]; then
   1889 			lndev mouse$unit mouse
   1890 		fi
   1891 		;;
   1892 	*)
   1893 		warn "bad unit for mouse in: $i"
   1894 		;;
   1895 	esac
   1896 	;;
   1897 
   1898 panel)
   1899 	mkdev panel0 c %panel_chr% 0 660
   1900 	;;
   1901 
   1902 tslcd)
   1903 	mkdev tslcd0 c %tslcd_chr% 0 660
   1904 	;;
   1905 
   1906 ipty)
   1907 	mkdev ttyp0 c %pts_chr% 0 666
   1908 	mkdev ttyp1 c %pts_chr% 1 666
   1909 	mkdev ptyp0 c %ptc_chr% 0 666
   1910 	mkdev ptyp1 c %ptc_chr% 1 666
   1911 	;;
   1912 
   1913 ptm)
   1914 	makedir pts 755
   1915 	mkdev ptmx c %ptm_chr% 0 666
   1916 	mkdev ptm c %ptm_chr% 1 666
   1917 	;;
   1918 
   1919 grf[0-9]*)
   1920 	unit=${i#grf}
   1921 	mkdev grf$unit c %grf_chr% $unit 666
   1922 	;;
   1923 
   1924 etvme)
   1925 	mkdev etvme c %et_chr% 0
   1926 	;;
   1927 
   1928 leo[0-9]*)
   1929 	unit=${i#leo}
   1930 	mkdev leo$unit c %leo_chr% $unit
   1931 	;;
   1932 
   1933 scif[0-9]*)
   1934 	unit=${i#scif}
   1935 	mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp
   1936 	mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp
   1937 	;;
   1938 
   1939 sci[0-9]*)
   1940 	unit=${i#sci}
   1941 	mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp
   1942 	mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp
   1943 	;;
   1944 
   1945 maple[ABCD]|maple[ABCD][0-9]*)
   1946 	case $i in
   1947 	mapleA*) name="mapleA"; unit=0;;
   1948 	mapleB*) name="mapleB"; unit=1;;
   1949 	mapleC*) name="mapleC"; unit=2;;
   1950 	mapleD*) name="mapleD"; unit=3;;
   1951 	esac
   1952 	subunit=${i#$name}
   1953 	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
   1954 	;;
   1955 
   1956 mmem[0-9]*)
   1957 	unit=${i#mmem}
   1958 	for pt in 0	# 1 2 3 4 ... 255
   1959 	do
   1960 #		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   1961 		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   1962 #		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   1963 		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   1964 	done
   1965 	;;
   1966 
   1967 mlcd[0-9]*)
   1968 	unit=${i#mlcd}
   1969 	for pt in 0	# 1 2 3 4 ... 255
   1970 	do
   1971 		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
   1972 	done
   1973 	;;
   1974 
   1975 ixpcom[0-9]*)
   1976 	unit=${i#ixpcom}
   1977 	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
   1978 	;;
   1979 
   1980 epcom[0-9]*)
   1981 	unit=${i#epcom}
   1982 	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
   1983 	;;
   1984 
   1985 plcom[0-9]*)
   1986 	unit=${i#plcom}
   1987 	mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp
   1988 	;;
   1989 
   1990 wmcom[0-9]*)
   1991 	unit=${i#wmcom}
   1992 	mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp
   1993 	;;
   1994 
   1995 ucbsnd)
   1996 	mkdev ucbsnd c %ucbsnd_chr% 0 666
   1997 	;;
   1998 
   1999 adb)
   2000 	mkdev adb c %aed_chr% 0 666
   2001 	;;
   2002 
   2003 asc[0-9]*)
   2004 	unit=${i#asc}
   2005 	mkdev asc$unit c %asc_chr% $unit 666
   2006 	;;
   2007 
   2008 bwtwo[0-9]*)
   2009 	unit=${i#bwtwo}
   2010 	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
   2011 	;;
   2012 
   2013 cgtwo[0-9]*)
   2014 	unit=${i#cgtwo}
   2015 	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
   2016 	;;
   2017 
   2018 cgthree[0-9]*)
   2019 	unit=${i#cgthree}
   2020 	mkdev cgthree$unit c %cgthree_chr% $unit 666
   2021 	;;
   2022 
   2023 cgfour[0-9]*)
   2024 	unit=${i#cgfour}
   2025 	mkdev cgfour$unit c %cgfour_chr% $unit 666
   2026 	;;
   2027 
   2028 cgsix[0-9]*)
   2029 	unit=${i#cgsix}
   2030 	mkdev cgsix$unit c %cgsix_chr% $unit 666
   2031 	;;
   2032 
   2033 cgeight[0-9]*)
   2034 	unit=${i#cgeight}
   2035 	mkdev cgeight$unit c %cgeight_chr% $unit 666
   2036 	;;
   2037 
   2038 tcx[0-9]*)
   2039 	unit=${i#tcx}
   2040 	mkdev tcx$unit c %tcx_chr% $unit 666
   2041 	;;
   2042 
   2043 xd[0-9]*|xy[0-9]*)
   2044 	case $i in
   2045 	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
   2046 	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
   2047 	esac
   2048 	%MKDISK% $name $unit $blk $chr
   2049 	;;
   2050 
   2051 magma[0-9]*)
   2052 	unit=${i#magma}
   2053 	if [ 0$unit -gt 3 ]; then
   2054 		warn "bad unit for $i: $unit"
   2055 		break
   2056 	fi
   2057 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   2058 	do
   2059 		case $j in
   2060 		[0-9])	jn=$j ;;
   2061 		a)	jn=10 ;;
   2062 		b)	jn=11 ;;
   2063 		c)	jn=12 ;;
   2064 		d)	jn=13 ;;
   2065 		e)	jn=14 ;;
   2066 		f)	jn=15 ;;
   2067 		esac
   2068 		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
   2069 	done
   2070 	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
   2071 	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
   2072 	;;
   2073 
   2074 clcd[0-9]*)
   2075 	unit=${i#clcd}
   2076 	if [ 0$unit -gt 7 ]; then
   2077 		warn "bad unit for $i: $unit"
   2078 		break
   2079 	fi
   2080 	for j in 0 1 2 3 4 5 6 7
   2081 	do
   2082 		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
   2083 		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
   2084 	done
   2085 	;;
   2086 
   2087 spif[0-9]*)
   2088 	unit=${i#spif}
   2089 	if [ 0$unit -gt 3 ]; then
   2090 		warn "bad unit for $i: $unit"
   2091 		break
   2092 	fi
   2093 	for j in 0 1 2 3 4 5 6 7; do
   2094 		mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp
   2095 	done
   2096 	mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0))
   2097 	mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1))
   2098 	;;
   2099 
   2100 bpp|bpp[0-9]*)
   2101 	unit=${i#bpp}
   2102 	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
   2103 	;;
   2104 
   2105 tctrl[0-9]*)
   2106 	unit=${i#tctrl}
   2107 	mkdev tctrl$unit c %tctrl_chr% $unit 666
   2108 	;;
   2109 
   2110 bmd[0-9]*)
   2111 	unit=${i#bmd}
   2112 	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
   2113 	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
   2114 	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
   2115 	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
   2116 	;;
   2117 
   2118 sram)
   2119 	mkdev sram c %sram_chr% 0 644
   2120 	;;
   2121 
   2122 ttyS[0-9]*)
   2123 	unit=${i#ttyS}
   2124 	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
   2125 	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
   2126 	;;
   2127 
   2128 atabus[0-9]*)
   2129 	unit=${i#atabus}
   2130 	mkdev atabus$unit c %atabus_chr% $unit 644
   2131 	;;
   2132 
   2133 drm[0-9]*)
   2134 	unit=${i#drm}
   2135 	makedir dri 755
   2136 	mkdev dri/card$unit c %drm_chr% $unit 660
   2137 	;;
   2138 
   2139 drvctl)
   2140 	mkdev drvctl c %drvctl_chr% 0 644
   2141 	;;
   2142 
   2143 isv)
   2144 	mkdev isv c %isv_chr% 0 644
   2145 	;;
   2146 
   2147 tap|tap[0-9]*)
   2148 	unit=${i#tap}
   2149 	case "$unit" in
   2150 	[0-9]*)
   2151 		mkdev tap${unit} c %tap_chr% ${unit} 600
   2152 		;;
   2153 	"")
   2154 		mkdev tap c %tap_chr% 0xfffff 600
   2155 		;;
   2156 	esac
   2157 	;;
   2158 
   2159 tpm)
   2160 	mkdev tpm c %tpm_chr% 0 600
   2161 	;;
   2162 
   2163 dtrace)
   2164 	makedir dtrace 755
   2165 	mkdev dtrace/dtrace c %dtrace_chr% 0 600
   2166 	;;
   2167 
   2168 filemon)
   2169 	mkdev filemon c %filemon_chr% 0 666
   2170 	;;
   2171 
   2172 fw[0-9]*)
   2173 	unit=${i#fw}
   2174 	for j in 0 1 2 3
   2175 	do
   2176 		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
   2177 		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
   2178 	done
   2179 	;;
   2180 
   2181 # create putter device and symlinks for all subsystems using it
   2182 putter)
   2183 	mkdev putter c %putter_chr% 0 600
   2184 	mkdev pud c %putter_chr% 1 600
   2185 	lndev putter puffs
   2186 	;;
   2187 
   2188 zfs)
   2189 	mkdev zfs c %zfs_chr% 0 600
   2190 	makedir zpool 755
   2191 	;;
   2192 
   2193 iscsi[0-9]*)
   2194 	unit=${i#iscsi}
   2195 	mkdev iscsi${unit} c %iscsi_chr% 0 600
   2196 	;;
   2197 
   2198 vchiq)
   2199 	mkdev vchiq c %vchiq_chr% 0 600
   2200 	;;
   2201 
   2202 nvme[0-9]*ns[0-9]*)
   2203 	unit=${i#nvme}
   2204 	unit=${unit%ns*}
   2205 	subunit=${i#nvme${unit}ns}
   2206 	if [ 0$subunit -le 0 -o 0$subunit -ge 65536 ]; then
   2207 		warn "bad nsid for $i: $subunit"
   2208 		break
   2209 	fi
   2210 	mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit))
   2211 	;;
   2212 
   2213 nvme[0-9]*)
   2214 	unit=${i#nvme}
   2215 	mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
   2216 	;;
   2217 
   2218 midevend)
   2219 %MI_DEVICES_END%
   2220 local)
   2221 	if [ -f "$0.local" ]; then
   2222 		umask 0
   2223 		if [ -n "$count_nodes" ]; then
   2224 			count_nodes=$((count_nodes + \
   2225 			    $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") ))
   2226 		else
   2227 			"$HOST_SH" "$0.local" $opts all
   2228 		fi
   2229 		umask 077
   2230 	fi
   2231 	;;
   2232 
   2233 *)
   2234 	warn "$i: unknown device"
   2235 	;;
   2236 
   2237 esac
   2238 done
   2239 
   2240 }
   2241 
   2242 
   2243 # three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
   2244 # hack; only the one used by port is retained in final MAKEDEV script
   2245 # routine is called as:
   2246 # makedisk name unit blk chr
   2247 makedisk_p8()
   2248 {
   2249 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2250 
   2251 	ro=%RAWDISK_OFF%
   2252 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2253 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2254 
   2255 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2256 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2257 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2258 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2259 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2260 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2261 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2262 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2263 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2264 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2265 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2266 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2267 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2268 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2269 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2270 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2271 }
   2272 
   2273 makedisk_p12high()
   2274 {
   2275 	ho=524280	# offset for partition 9 to 11 (same as ...p16high)
   2276 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2277 
   2278 	ro=%RAWDISK_OFF%
   2279 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2280 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2281 
   2282 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2283 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2284 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2285 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2286 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2287 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2288 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2289 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2290 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2291 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2292 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2293 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2294 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2295 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2296 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2297 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2298 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2299 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2300 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2301 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2302 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2303 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2304 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2305 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2306 }
   2307 
   2308 makedisk_p16()
   2309 {
   2310 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2311 
   2312 	ro=%RAWDISK_OFF%
   2313 	mkdev ${name}${unit}	b $blk $(($unit * 16 + $ro))	640 $g_operator
   2314 	mkdev r${name}${unit}	c $chr $(($unit * 16 + $ro))	640 $g_operator
   2315 
   2316 	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
   2317 	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
   2318 	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
   2319 	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
   2320 	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
   2321 	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
   2322 	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
   2323 	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
   2324 	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
   2325 	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
   2326 	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
   2327 	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
   2328 	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
   2329 	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
   2330 	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
   2331 	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
   2332 	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
   2333 	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
   2334 	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
   2335 	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
   2336 	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
   2337 	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
   2338 	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
   2339 	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
   2340 	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
   2341 	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
   2342 	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
   2343 	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
   2344 	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
   2345 	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
   2346 	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
   2347 	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
   2348 }
   2349 
   2350 makedisk_p16high()
   2351 {
   2352 	ho=524280	# offset for partition 9 to 16
   2353 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2354 
   2355 	ro=%RAWDISK_OFF%
   2356 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2357 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2358 
   2359 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2360 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2361 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2362 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2363 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2364 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2365 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2366 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2367 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2368 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2369 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2370 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2371 	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
   2372 	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
   2373 	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
   2374 	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
   2375 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2376 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2377 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2378 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2379 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2380 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2381 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2382 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2383 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2384 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2385 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2386 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2387 	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
   2388 	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
   2389 	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
   2390 	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
   2391 }
   2392 
   2393 # make only the very few basic disk device nodes - 'a' partition
   2394 # and raw partition
   2395 makedisk_minimal()
   2396 {
   2397 	name=$1; unit=$2; blk=$3; chr=$4
   2398 	doff=%DISKMINOROFFSET%
   2399 	ro=%RAWDISK_OFF%
   2400 	rn=%RAWDISK_NAME%
   2401 
   2402 	mkdev ${name}${unit}	b $blk $(($unit * $doff + $ro))	640 $g_operator
   2403 	mkdev r${name}${unit}	c $chr $(($unit * $doff + $ro))	640 $g_operator
   2404 
   2405 	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
   2406 	mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator
   2407 	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
   2408 	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
   2409 }
   2410 
   2411 # create_mfs_dev nodes
   2412 #	Create a memory file system for a given number of device nodes,
   2413 #	and mount it.  Attempts to use mount_tmpfs, or falls back to
   2414 #	mount_mfs.
   2415 #
   2416 #	If do_redirect, then also redirect output to the console.
   2417 #
   2418 create_mfs_dev()
   2419 {
   2420 	ndevnodes=${1-1200}
   2421 	dev_mountpoint=${PWD:-/dev}
   2422 
   2423 	# Number of inodes is the specified number of device nodes, plus
   2424 	# a margin to allow for extra device nodes created later.
   2425 	ninode=$((ndevnodes * 11 / 10))
   2426 	# Add 2 reserved inodes (needed for both mfs and tmpfs), and round
   2427 	# up to a multiple of 32 (needed for mfs, not needed for tmpfs).
   2428 	ninode=$(( (ninode + 2 + 31) / 32 * 32 ))
   2429 	# Try tmpfs; if that fails try mfs.
   2430 	#
   2431 	# For tmpfs, allocate 16KB and 512 byte per node.
   2432 	# Actual requirements are much lower, but the size limit
   2433 	# is only intended to avoid accidental writing to /dev.
   2434 	fs_bytes=$((16384 + ninode * 512))
   2435 	if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \
   2436 		-o union tmpfs "$dev_mountpoint"
   2437 	then
   2438 		fstype=tmpfs
   2439 	else
   2440 		# This file system size calculation is exact for mount_mfs(8)
   2441 		# with 512-byte sectors.  40960 bytes (80 blocks) is the
   2442 		# minimum size allowed by mount_mfs.
   2443 		fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192))
   2444 		[ "$fs_bytes" -lt 40960 ] && fs_bytes=40960
   2445 		fs_blocks=$((fs_bytes/512))
   2446 		if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \
   2447 		    -o union swap "$dev_mountpoint"
   2448 		then
   2449 			fstype=mfs
   2450 		else
   2451 			die "Failed to create memory file system"
   2452 		fi
   2453 	fi
   2454 
   2455 	# Our current directory was in the lower file system; change it to
   2456 	# the newly mounted upper file system.
   2457 	cd "$dev_mountpoint"
   2458 
   2459 	if $do_redirect; then
   2460 		# Redirect stdout and stderr to console
   2461 		${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0
   2462 		exec >temp_console 2>&1
   2463 		rm temp_console
   2464 	fi
   2465 
   2466 	echo "Created $fstype $dev_mountpoint" \
   2467 		"($fs_bytes byte, $ninode inodes)"
   2468 }
   2469 
   2470 #
   2471 # MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a
   2472 # function library, so just return.  Otherwise, do all the real work.
   2473 #
   2474 [ -n "${MAKEDEV_AS_LIBRARY}" ] && return
   2475 makedev_main makedev ${1+"$@"}
   2476