Home | History | Annotate | Line # | Download | only in etc
      1 #!/bin/sh -
      2 #	$NetBSD: MAKEDEV.tmpl,v 1.185 2017/08/12 11:41:21 jmcneill 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 veriexec
    845 	makedev local # do this last
    846 	;;
    847 
    848 init)
    849 	# unless overridden by MD entry, this is equal to 'all'
    850 	makedev all opty
    851 	;;
    852 
    853 %MI_DEVICES_BEGIN%
    854 audio)
    855 	makedev audio0 audio1 audio2 audio3
    856 	makedev hdaudio0 hdaudio1 hdaudio2 hdaudio3
    857 	lndev sound0 sound
    858 	lndev audio0 audio
    859 	lndev mixer0 mixer
    860 	lndev audioctl0 audioctl
    861 	;;
    862 
    863 gpio)
    864 	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
    865 	lndev gpio0 gpio
    866 	;;
    867 
    868 lua)
    869 	makedev lua0
    870 	lndev lua0 lua
    871 	;;
    872 
    873 pad)
    874 	makedev pad0 pad1 pad2 pad3
    875 	lndev pad0 pad
    876 	;;
    877 
    878 radio)
    879 	makedev radio0 radio1
    880 	lndev radio0 radio
    881 	;;
    882 
    883 video)
    884 	makedev video0 video1 video2 video3
    885 	;;
    886 
    887 dtv)
    888 	makedev dtv0 dtv1 dtv2 dtv3
    889 	;;
    890 
    891 iic)
    892 	makedev iic0 iic1 iic2 iic3
    893 	;;
    894 
    895 altmem)
    896 	makedev altmem0 altmem1
    897 	;;
    898 
    899 ramdisk)
    900 	makedev floppy md0
    901 	;;
    902 
    903 usbs)
    904 	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
    905 	makedev uhid0 uhid1 uhid2 uhid3
    906 	makedev ulpt0 ulpt1
    907 	makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7
    908 	makedev ttyY0 ttyY1
    909 	makedev ttyHS0
    910 	makedev urio0
    911 	makedev uscanner0 uscanner1
    912 	makedev utoppy0 utoppy1
    913 	makedev ugen0 ugen1 ugen2 ugen3
    914 	;;
    915 
    916 isdns)
    917 	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
    918 	;;
    919 
    920 std)
    921 	mkdev		console c %cons_chr% 0	600
    922 	mkdev		constty c %cons_chr% 1	600
    923 	mkdev		drum	c %swap_chr% 0	640 $g_kmem
    924 	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
    925 	mkdev		mem	c %mem_chr% 0	640 $g_kmem
    926 	mkdev		null	c %mem_chr% 2	666
    927 	mkdev		full	c %mem_chr% 11	666
    928 	mkdev		zero	c %mem_chr% 12	666
    929 	mkdev		klog	c %log_chr% 0	600
    930 	mkdev		ksyms	c %ksyms_chr% 0 444
    931 	mkdev		random	c %rnd_chr% 0	444
    932 	mkdev		urandom	c %rnd_chr% 1	644
    933 	if ! $fdesc_mounted; then
    934 		mkdev	tty	c %ctty_chr% 0		666
    935 		mkdev	stdin	c %filedesc_chr% 0	666
    936 		mkdev	stdout	c %filedesc_chr% 1	666
    937 		mkdev	stderr	c %filedesc_chr% 2	666
    938 	fi
    939 	;;
    940 
    941 usb)
    942 	mkdev usb c %usb_chr% 255 444
    943 	;;
    944 
    945 usb[0-9]*)
    946 	unit=${i#usb}
    947 	usb=usb$unit
    948 	mkdev usb$unit c %usb_chr% $unit
    949 	;;
    950 
    951 uhid[0-9]*)
    952 	unit=${i#uhid}
    953 	mkdev uhid$unit c %uhid_chr% $unit 666
    954 	;;
    955 
    956 ulpt[0-9]*)
    957 	unit=${i#ulpt}
    958 	mkdev ulpt$unit c %ulpt_chr% $unit
    959 	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
    960 	;;
    961 
    962 urio[0-9]*)
    963 	unit=${i#urio}
    964 	mkdev urio$unit c %urio_chr% $unit 666
    965 	;;
    966 
    967 uscanner[0-9]*)
    968 	unit=${i#uscanner}
    969 	mkdev uscanner$unit c %uscanner_chr% $unit
    970 	;;
    971 
    972 utoppy[0-9]*)
    973 	unit=${i#utoppy}
    974 	mkdev utoppy$unit c %utoppy_chr% $unit
    975 	;;
    976 
    977 ttyHS[0-9]*)
    978 	unit=${i#ttyHS}
    979 	for j in 00 01 02 03 04 05 06 07 08 09 10
    980 	do
    981 		base=$(($unit * 16 + ${j#0}))
    982 		mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin  )) "" "" $u_uucp
    983 		mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp
    984 		mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp
    985 	done
    986 	;;
    987 
    988 ttyY[0-9]*)
    989 	unit=${i#ttyY}
    990 	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
    991 	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
    992 	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
    993 	;;
    994 
    995 ucom[0-9]*)
    996 	makedev ttyU${i#ucom}
    997 	;;
    998 
    999 ttyU[0-9]*)
   1000 	unit=${i#ttyU}
   1001 	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin	 )) "" "" $u_uucp
   1002 	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
   1003 	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
   1004 	;;
   1005 
   1006 ugen[0-9]*)
   1007 	unit=${i#ugen}
   1008 	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
   1009 	do
   1010 		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
   1011 	done
   1012 	;;
   1013 
   1014 wscons)
   1015 	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
   1016 	makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7
   1017 	makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7
   1018 	makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7
   1019 	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
   1020 	makedev wskbd0 wskbd1 wskbd2 wskbd3
   1021 	makedev wsmux0 wsmux1 wsmux2 wsmux3
   1022 	makedev wsmouse wskbd
   1023 	makedev ttyEcfg ttyEstat
   1024 	makedev ttyFcfg ttyFstat
   1025 	makedev ttyGcfg ttyGstat
   1026 	makedev ttyHcfg ttyHstat
   1027 	makedev wsfont
   1028 	;;
   1029 
   1030 wsmouse)
   1031 	mkdev wsmouse c %wsmux_chr% 0
   1032 	;;
   1033 
   1034 wskbd)
   1035 	mkdev wskbd c %wsmux_chr% 1
   1036 	;;
   1037 
   1038 wsmux[0-9]*)
   1039 	unit=${i#wsmux}
   1040 	mkdev wsmux$unit    c %wsmux_chr% $unit
   1041 	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
   1042 	;;
   1043 
   1044 xenevt)
   1045 	mkdev xenevt c %xenevt_chr% 0
   1046 	;;
   1047 
   1048 xsd_kva)
   1049 	mkdev xsd_kva c %xenevt_chr% 1
   1050 	;;
   1051 
   1052 xencons)
   1053 	mkdev xencons c %xencons_chr% 0
   1054 	;;
   1055 
   1056 ttyEstat)
   1057 	mkdev ttyEstat c %wsdisplay_chr% 254
   1058 	;;
   1059 
   1060 ttyEcfg)
   1061 	mkdev ttyEcfg c %wsdisplay_chr% 255
   1062 	;;
   1063 
   1064 ttyE[0-9]*)
   1065 	unit=${i#ttyE}
   1066 	mkdev ttyE$unit c %wsdisplay_chr% $unit
   1067 	;;
   1068 
   1069 ttyFstat)
   1070 	mkdev ttyFstat c %wsdisplay_chr% 510
   1071 	;;
   1072 
   1073 ttyFcfg)
   1074 	mkdev ttyFcfg c %wsdisplay_chr% 511
   1075 	;;
   1076 
   1077 ttyF[0-9]*)
   1078 	unit=${i#ttyF}
   1079 	mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256))
   1080 	;;
   1081 
   1082 ttyGstat)
   1083 	mkdev ttyGstat c %wsdisplay_chr% 766
   1084 	;;
   1085 
   1086 ttyGcfg)
   1087 	mkdev ttyGcfg c %wsdisplay_chr% 767
   1088 	;;
   1089 
   1090 ttyG[0-9]*)
   1091 	unit=${i#ttyG}
   1092 	mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512))
   1093 	;;
   1094 
   1095 ttyHstat)
   1096 	mkdev ttyHstat c %wsdisplay_chr% 1022
   1097 	;;
   1098 
   1099 ttyHcfg)
   1100 	mkdev ttyHcfg c %wsdisplay_chr% 1023
   1101 	;;
   1102 
   1103 ttyH[0-9]*)
   1104 	unit=${i#ttyH}
   1105 	mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768))
   1106 	;;
   1107 
   1108 wsmouse[0-9]*)
   1109 	unit=${i#wsmouse}
   1110 	mkdev wsmouse$unit c %wsmouse_chr% $unit
   1111 	;;
   1112 
   1113 wskbd[0-9]*)
   1114 	unit=${i#wskbd}
   1115 	mkdev wskbd$unit c %wskbd_chr% $unit
   1116 	;;
   1117 
   1118 fd)
   1119 	if ! $fdesc_mounted; then
   1120 		# Create the "fd" subdirectory, and devices "fd/0" to "fd/63"
   1121 		makedir fd 755
   1122 		n=0
   1123 		while [ $n -lt 64 ]
   1124 		do
   1125 			mkdev fd/$n c %filedesc_chr% $n 666
   1126 			n=$(($n + 1))
   1127 		done
   1128 	fi
   1129 	;;
   1130 
   1131 wt[0-9]*)
   1132 	name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%
   1133 	for sub in $unit $(($unit+8)) $(($unit+16))
   1134 	do
   1135 		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
   1136 		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
   1137 		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
   1138 		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
   1139 	done
   1140 	;;
   1141 
   1142 md[0-9]*)
   1143 	makedisk_minimal md ${i#md} %md_blk% %md_chr%
   1144 	;;
   1145 
   1146 fss[0-9]*)
   1147 	name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
   1148 	mkdev $name$unit	b $blk $unit 660 $g_operator
   1149 	mkdev r$name$unit	c $chr $unit 660 $g_operator
   1150 	;;
   1151 
   1152 ss[0-9]*)
   1153 	name=ss;	unit=${i#ss};	chr=%ss_chr%
   1154 	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
   1155 	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
   1156 	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
   1157 	;;
   1158 
   1159 ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*)
   1160 	case $i in
   1161 	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
   1162 	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
   1163 	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
   1164 	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
   1165 	esac
   1166 	%MKDISK% $name $unit $blk $chr
   1167 	;;
   1168 
   1169 sd[0-9]*)
   1170 	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
   1171 	%MKDISK% $name $unit $blk $chr
   1172 	;;
   1173 
   1174 ace[0-9]*)
   1175 	name=ace; unit=${i#ace};	blk=%ace_blk%;		chr=%ace_chr%
   1176 	%MKDISK% $name $unit $blk $chr
   1177 	;;
   1178 
   1179 eflash[0-9]*)
   1180 	name=eflash; unit=${i#eflash};	blk=%eflash_blk%;	chr=%eflash_chr%
   1181 	%MKDISK% $name $unit $blk $chr
   1182 	;;
   1183 
   1184 wd[0-9]*)
   1185 	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
   1186 	%MKDISK% $name $unit $blk $chr
   1187 	;;
   1188 
   1189 fd[0-9]*)
   1190 	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
   1191 	%MKDISK% $name $unit $blk $chr
   1192 	;;
   1193 
   1194 ld[0-9]*)
   1195 	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
   1196 	%MKDISK% $name $unit $blk $chr
   1197 	;;
   1198 
   1199 flash[0-9]*)
   1200 	unit=${i#flash}
   1201 	flash=flash$unit
   1202 	mkdev flash$unit b %flash_blk% $unit
   1203 	mkdev rflash$unit c %flash_chr% $unit
   1204 	;;
   1205 
   1206 spiflash[0-9]*)
   1207 	unit=${i#spiflash}
   1208 	spiflash=spiflash$unit
   1209 	mkdev spiflash$unit b %spiflash_blk% $unit
   1210 	;;
   1211 
   1212 altmem[0-9]*)
   1213 	name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr%
   1214 	%MKDISK% $name $unit $blk $chr
   1215 	;;
   1216 
   1217 bio)
   1218 	mkdev bio c %bio_chr% 0
   1219 	;;
   1220 
   1221 ed[0-9]*)
   1222 	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
   1223 	%MKDISK% $name $unit $blk $chr
   1224 	;;
   1225 
   1226 ofdisk[0-9]*)
   1227 	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
   1228 	%MKDISK% $name $unit $blk $chr
   1229 	;;
   1230 
   1231 xbd[0-9]*)
   1232 	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
   1233 	%MKDISK% $name $unit $blk $chr
   1234 	;;
   1235 
   1236 dk[0-9]*)
   1237 	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
   1238 	mkdev r$name$unit c $chr $unit 0640 $g_operator
   1239 	mkdev $name$unit b $blk  $unit 0640 $g_operator
   1240 	;;
   1241 
   1242 ttyCY[0-9]*)
   1243 	# Each unit number creates 32 pairs of {tty,dty} device nodes:
   1244 	# ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031;
   1245 	# ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063;
   1246 	name=tyCY; chr=%cy_chr%; off=32
   1247 	unit=${i#t${name}}
   1248 	minor=$(($unit * $off))
   1249 	eminor=$(($minor + $off))
   1250 	while [ $minor -lt $eminor ]
   1251 	do
   1252 		nminor=000$minor
   1253 		nminor=${nminor#${nminor%???}}
   1254 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1255 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1256 		minor=$(($minor + 1))
   1257 	done
   1258 	;;
   1259 
   1260 ttyCZ[0-9]*)
   1261 	# Each unit number creates 64 pairs of {tty,dty} device nodes:
   1262 	# ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063;
   1263 	# ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127;
   1264 	name=tyCZ; chr=%cz_chr%; off=64
   1265 	unit=${i#t${name}}
   1266 	minor=$(($unit * $off))
   1267 	eminor=$(($minor + $off))
   1268 	while [ $minor -lt $eminor ]
   1269 	do
   1270 		nminor=0000$minor
   1271 		nminor=${nminor#${nminor%????}}
   1272 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1273 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1274 		minor=$(($minor + 1))
   1275 	done
   1276 	;;
   1277 
   1278 
   1279 tty[0-9]|tty0[0-9])
   1280 	# some archs have built-in zstty (major %zstty_chr%) instead
   1281 	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
   1282 	# needs to be before com entry, for archs which have both
   1283 	unit=${i#tty}
   1284 	unit=$(($unit + 0))
   1285 	makedev ttyZ${unit}
   1286 	lndev ttyZ$unit tty0${unit}
   1287 	lndev dtyZ$unit dty0${unit}
   1288 	;;
   1289 
   1290 tty[0-9]*)
   1291 	unit=${i#tty}
   1292 	ounit=00$unit
   1293 	ounit=${ounit#${ounit%??}}
   1294 	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
   1295 	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
   1296 	;;
   1297 
   1298 ttyC[0-9]*)
   1299 		# some archs call com_chr ttyC traditionally
   1300 	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
   1301 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1302 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1303 	;;
   1304 
   1305 ttyh[0-9]*)
   1306 	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
   1307 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1308 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1309 	;;
   1310 
   1311 ttyTX[0-9]*)
   1312 	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
   1313 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1314 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1315 	;;
   1316 
   1317 ttyZ[0-9]*)
   1318 	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
   1319 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1320 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1321 	;;
   1322 
   1323 opty)
   1324 	# Create 16 device nodes, [pt]typ0 to [pt]typf,
   1325 	# same as "MAKEDEV pty0".
   1326 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   1327 	do
   1328 		case $j in
   1329 		[0-9])	jn=$j ;;
   1330 		a)	jn=10 ;;
   1331 		b)	jn=11 ;;
   1332 		c)	jn=12 ;;
   1333 		d)	jn=13 ;;
   1334 		e)	jn=14 ;;
   1335 		f)	jn=15 ;;
   1336 		esac
   1337 		mkdev ttyp$j c %pts_chr% $jn 666
   1338 		mkdev ptyp$j c %ptc_chr% $jn 666
   1339 	done
   1340 	;;
   1341 
   1342 pty[0-9]*)
   1343 	# Each unit number creates up to 16 pairs of {tty,pty} device nodes:
   1344 	# pty0 => 16 pairs, [tp]typ0 to [tp]typf
   1345 	# pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf
   1346 	# pty16 => 16 pairs, [tp]typg to [tp]typv
   1347 	# pty17 => 16 pairs, [tp]typw to [tp]typL
   1348 	# pty18 => 14 pairs, [tp]typM to [tp]typZ
   1349 	warn "$i: creating BSD style tty nodes with ptyfs is a security issue"
   1350 	class=${i#pty}
   1351 	d1="p q r s t u v w x y z P Q R S T"
   1352 	if [ "$class" -ge 64 ]
   1353 	then
   1354 		warn "$i: pty unit must be between 0 and 63"
   1355 		continue
   1356 	elif [ "$class" -lt 16 ]
   1357 	then
   1358 		# pty[p-zP-T][0-9a-f]
   1359 		offset=0
   1360 		mult=0
   1361 		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
   1362 	else
   1363 		# pty[p-zP-T][g-zA-Z]
   1364 		class=$(($class - 16))
   1365 		offset=256
   1366 		mult=2
   1367 		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"
   1368 	fi
   1369 	start=$(($class * 16))
   1370 	set -- $d2
   1371 	nt=$#
   1372 	s1=$(($start / $nt))
   1373 	set -- $d1
   1374 	shift $s1
   1375 	t1=$1
   1376 	if [ "$t1" = v ]; then
   1377 		warn "$i: pty unit conflicts with console ttyv0 device"
   1378 		continue
   1379 	fi
   1380 	s2=$(($start % ($nt - $s1 * $mult)))
   1381 	set -- $d2
   1382 	shift $s2
   1383 	t2=$1
   1384 	unit=$(($start + $offset - $s1 * $mult))
   1385 	end=$(($unit + 16))
   1386 	while [ "$unit" -lt "$end" ]
   1387 	do
   1388 		mkdev tty$t1$t2 c %pts_chr% $unit 666
   1389 		mkdev pty$t1$t2 c %ptc_chr% $unit 666
   1390 		shift
   1391 		t2=$1
   1392 		if [ -z "$t2" ]
   1393 		then
   1394 			break
   1395 		fi
   1396 		unit=$(($unit + 1))
   1397 	done
   1398 	;;
   1399 
   1400 stic[0-9]*)
   1401 	unit=${i#stic}
   1402 	mkdev stic$unit c %stic_chr% $unit
   1403 	;;
   1404 
   1405 st[0-9]*)
   1406 	name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%
   1407 	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
   1408 	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
   1409 	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
   1410 	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
   1411 	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
   1412 	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
   1413 	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
   1414 	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
   1415 	;;
   1416 
   1417 ses[0-9]*|ch[0-9]*|uk[0-9]*)
   1418 	case $i in
   1419 	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
   1420 	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
   1421 	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
   1422 	esac
   1423 	mkdev $name$unit c $chr $unit 640 $g_operator
   1424 	;;
   1425 
   1426 cd[0-9]*)
   1427 	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr%
   1428 	;;
   1429 
   1430 mcd[0-9]*)
   1431 	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
   1432 	;;
   1433 
   1434 gdrom[0-9]*)
   1435 	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
   1436 	;;
   1437 
   1438 lpt[0-9]*|lpa[0-9]*)
   1439 	case $i in
   1440 	lpt*) name=lpt; unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
   1441 	lpa*) name=lpa; unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
   1442 	esac
   1443 	mkdev $name$unit c $chr $(($unit + $flags))
   1444 	mkdev lpt${unit}ctl c $chr $(($unit + 256))
   1445 	;;
   1446 
   1447 bpf)
   1448 	mkdev bpf	c %bpf_chr% 0
   1449 	lndev bpf bpf0
   1450 	;;
   1451 
   1452 npf)
   1453 	mkdev npf	c %npf_chr% 0
   1454 	;;
   1455 
   1456 bthub)
   1457 	mkdev bthub c %bthub_chr% 0
   1458 	;;
   1459 
   1460 tun[0-9]*)
   1461 	unit=${i#tun}
   1462 	mkdev tun$unit c %tun_chr% $unit
   1463 	;;
   1464 
   1465 joy[0-9]*)
   1466 	unit=${i#joy}
   1467 	mkdev joy$unit c %joy_chr% $unit
   1468 	;;
   1469 
   1470 ipl)
   1471 	mkdev ipl	c %ipl_chr% 0
   1472 	mkdev ipnat	c %ipl_chr% 1
   1473 	mkdev ipstate	c %ipl_chr% 2
   1474 	mkdev ipauth	c %ipl_chr% 3
   1475 	mkdev ipsync	c %ipl_chr% 4
   1476 	mkdev ipscan	c %ipl_chr% 5
   1477 	mkdev iplookup	c %ipl_chr% 6
   1478 	;;
   1479 
   1480 pf)
   1481 	mkdev pf c %pf_chr% 0
   1482 	;;
   1483 
   1484 crypto)
   1485 	mkdev crypto c %crypto_chr% 0 666
   1486 	;;
   1487 
   1488 cmos)
   1489 	mkdev cmos c %cmos_chr% 0 644
   1490 	;;
   1491 
   1492 speaker)
   1493 	mkdev speaker c %spkr_chr% 0
   1494 	;;
   1495 
   1496 lockstat)
   1497 	mkdev lockstat c %lockstat_chr% 0
   1498 	;;
   1499 
   1500 cpuctl)
   1501 	mkdev cpuctl c %cpuctl_chr% 0 666
   1502 	;;
   1503 
   1504 audio|audio[0-9]*)
   1505 	unit=${i#audio}
   1506 	audio=audio$unit
   1507 	sound=sound$unit
   1508 	mixer=mixer$unit
   1509 	audioctl=audioctl$unit
   1510 	: ${unit:-0}
   1511 	mkdev $sound	c %audio_chr% $(($unit + 0))	666
   1512 	mkdev $audio	c %audio_chr% $(($unit + 128))	666
   1513 	mkdev $mixer	c %audio_chr% $(($unit + 16))	666
   1514 	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
   1515 	;;
   1516 
   1517 hdaudio[0-9]*)
   1518 	unit=${i#hdaudio}
   1519 	mkdev hdaudio$unit c %hdaudio_chr% $unit 644
   1520 	;;
   1521 
   1522 hdmicec[0-9]*)
   1523 	uint=${i#hdmicec}
   1524 	mkdev hdmicec$unit c %hdmicec_chr% $unit 644
   1525 	;;
   1526 
   1527 gpio[0-9]*)
   1528 	unit=${i#gpio}
   1529 	mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio
   1530 	;;
   1531 
   1532 lua[0-9]*)
   1533 	unit=${i#lua}
   1534 	mkdev lua$unit c %lua_chr% $unit 664
   1535 	;;
   1536 
   1537 rmidi[0-9]*)
   1538 	unit=${i#rmidi}
   1539 	mkdev rmidi$unit c %midi_chr% $unit 666
   1540 	;;
   1541 
   1542 music|music[0-9]*)
   1543 	unit=${i#music}
   1544 	: ${unit:-0}
   1545 	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
   1546 	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666
   1547 	;;
   1548 
   1549 radio|radio[0-9]*)
   1550 	unit=${i#radio}
   1551 	: ${unit:-0}
   1552 	mkdev radio$unit c %radio_chr% $unit 666
   1553 	;;
   1554 
   1555 video|video[0-9]*)
   1556 	unit=${i#video}
   1557 	: ${unit:-0}
   1558 	mkdev video$unit c %video_chr% $unit 666
   1559 	;;
   1560 
   1561 dtv[0-9]*)
   1562 	unit=${i#dtv}
   1563 	makedir dvb 755
   1564 	makedir dvb/adapter$unit 755
   1565 	mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666
   1566 	mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666
   1567 	mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666
   1568 	;;
   1569 
   1570 iic[0-9]*)
   1571 	unit=${i#iic}
   1572 	: ${unit:-0}
   1573 	mkdev iic$unit c %iic_chr% $unit 600
   1574 	;;
   1575 
   1576 amr[0-9]*)
   1577 	unit=${i#amr}
   1578 	mkdev amr$unit c %amr_chr% $unit
   1579 	;;
   1580 
   1581 apm)
   1582 	mkdev apm	c %apm_chr% 0 644
   1583 	mkdev apmctl	c %apm_chr% 8 644
   1584 	;;
   1585 
   1586 apm)
   1587 		# hpcmips uses `apmdev_chr' instead of `apm_chr'
   1588 	mkdev apm	c %apmdev_chr% 0 644
   1589 	mkdev apmctl	c %apmdev_chr% 8 644
   1590 	;;
   1591 
   1592 satlink[0-9]*)
   1593 	unit=${i#satlink}
   1594 	mkdev satlink$unit c %satlink_chr% $unit 444
   1595 	;;
   1596 
   1597 random)
   1598 	mkdev random	c %rnd_chr% 0 444
   1599 	mkdev urandom	c %rnd_chr% 1 644
   1600 	;;
   1601 
   1602 cfs)
   1603 	makedev cfs0
   1604 	;;
   1605 
   1606 cfs[0-9]*)
   1607 	unit=${i#cfs}
   1608 	mkdev cfs$unit c %vcoda_chr% $unit
   1609 	;;
   1610 
   1611 sysmon)
   1612 	mkdev sysmon	c %sysmon_chr% 0 644
   1613 	mkdev watchdog	c %sysmon_chr% 1 644
   1614 	mkdev power	c %sysmon_chr% 2 640
   1615 	;;
   1616 
   1617 scsibus[0-9]*)
   1618 	unit=${i#scsibus}
   1619 	mkdev scsibus$unit c %scsibus_chr% $unit 644
   1620 	;;
   1621 
   1622 bktr)
   1623 	makedev bktr0 bktr1
   1624 	lndev	bktr0	bktr
   1625 	lndev	tuner0	tuner
   1626 	lndev	vbi0	vbi
   1627 	;;
   1628 
   1629 bktr[0-9]*)
   1630 	unit=${i#bktr}
   1631 	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
   1632 	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
   1633 	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
   1634 	;;
   1635 
   1636 io)
   1637 	mkdev		io	c %mem_chr% 14	600
   1638 	;;
   1639 
   1640 iop[0-9]*)
   1641 	unit=${i#iop}
   1642 	mkdev iop$unit c %iop_chr% $unit
   1643 	;;
   1644 
   1645 mfi[0-9]*)
   1646 	unit=${i#mfi}
   1647 	mkdev mfi$unit c %mfi_chr% $unit
   1648 	;;
   1649 
   1650 mlx[0-9]*)
   1651 	unit=${i#mlx}
   1652 	mkdev mlx$unit c %mlx_chr% $unit
   1653 	;;
   1654 
   1655 mly[0-9]*)
   1656 	unit=${i#mly}
   1657 	mkdev mly$unit c %mly_chr% $unit
   1658 	;;
   1659 
   1660 twa[0-9]*)
   1661 	unit=${i#twa}
   1662 	mkdev twa$unit c %twa_chr% $unit
   1663 	;;
   1664 
   1665 twe[0-9]*)
   1666 	unit=${i#twe}
   1667 	mkdev twe$unit c %twe_chr% $unit
   1668 	;;
   1669 
   1670 icp[0-9]*)
   1671 	unit=${i#icp}
   1672 	mkdev icp$unit c %icp_chr% $unit
   1673 	;;
   1674 
   1675 agp[0-9]*)
   1676 	unit=${i#agp}
   1677 	mkdev agp$unit c %agp_chr% $unit 644
   1678 	if [ "$unit" = "0" ]; then
   1679 		lndev agp$unit agpgart
   1680 	fi
   1681 	;;
   1682 
   1683 pci[0-9]*)
   1684 	unit=${i#pci}
   1685 	mkdev pci$unit c %pci_chr% $unit 640
   1686 	;;
   1687 
   1688 dpti[0-9]*)
   1689 	unit=${i#dpti}
   1690 	mkdev dpti$unit c %dpti_chr% $unit
   1691 	;;
   1692 
   1693 dpt[0-9]*)
   1694 	unit=${i#dpt}
   1695 	mkdev dpt$unit c %dpt_chr% $unit
   1696 	;;
   1697 
   1698 altq)
   1699 	makedir altq 755
   1700 	unit=0
   1701 	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs
   1702 	do
   1703 		mkdev altq/$dev c %altq_chr% $unit 644
   1704 		unit=$(($unit + 1))
   1705 	done
   1706 	;;
   1707 
   1708 isdn)
   1709 	mkdev isdn c %isdn_chr% 0
   1710 	;;
   1711 
   1712 isdnctl)
   1713 	mkdev isdnctl c %isdnctl_chr% 0
   1714 	;;
   1715 
   1716 isdnbchan[0-9]*)
   1717 	unit=${i#isdnbchan}
   1718 	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
   1719 	;;
   1720 
   1721 isdnteld[0-9]*)
   1722 	unit=${i#isdnteld}
   1723 	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
   1724 	;;
   1725 
   1726 isdntel[0-9]*)
   1727 	unit=${i#isdntel}
   1728 	mkdev isdntel$unit c %isdntel_chr% $unit
   1729 	;;
   1730 
   1731 isdntrc[0-9]*)
   1732 	unit=${i#isdntrc}
   1733 	mkdev isdntrc$unit c %isdntrc_chr% $unit
   1734 	;;
   1735 
   1736 wsfont)
   1737 	mkdev wsfont c %wsfont_chr% 0
   1738 	;;
   1739 
   1740 cir[0-9]*)
   1741 	unit=${i#cir}
   1742 	mkdev cir$unit c %cir_chr% $unit 666
   1743 	;;
   1744 
   1745 irframe[0-9]*)
   1746 	unit=${i#irframe}
   1747 	mkdev irframe$unit c %irframe_chr% $unit
   1748 	;;
   1749 
   1750 fcom[0-9]*)
   1751 	unit=${i#fcom}
   1752 	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
   1753 	;;
   1754 
   1755 openfirm)
   1756 	mkdev openfirm c %openfirm_chr% 0 444
   1757 	;;
   1758 
   1759 pad[0-9]*)
   1760 	unit=${i#pad}
   1761 	mkdev pad$unit c %pad_chr% $unit 444
   1762 	;;
   1763 
   1764 nvram)
   1765 	mkdev nvram c %nvram_chr% 0 644
   1766 	;;
   1767 
   1768 rtc)
   1769 	mkdev rtc c %rtc_chr% 0 644
   1770 	;;
   1771 
   1772 clockctl)
   1773 	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
   1774 	;;
   1775 
   1776 nsmb)
   1777 	makedev nsmb0 nsmb1 nsmb2 nsmb3
   1778 	;;
   1779 
   1780 nsmb[0-9]*)
   1781 	unit=${i#nsmb}
   1782 	mkdev nsmb$unit c %nsmb_chr% $unit 644
   1783 	;;
   1784 
   1785 kttcp)
   1786 	mkdev kttcp c %kttcp_chr% 0
   1787 	;;
   1788 
   1789 dmoverio)
   1790 	mkdev dmoverio c %dmoverio_chr% 0 644
   1791 	;;
   1792 
   1793 veriexec)
   1794 	mkdev veriexec c %veriexec_chr% 0 600
   1795 	;;
   1796 
   1797 ttyv[0-9]*)
   1798 	unit=${i#ttyv}
   1799 	mkdev ttyv$unit c %pc_chr% $unit
   1800 	;;
   1801 
   1802 # arm, acorn32
   1803 ttyv[0-9]*)
   1804 	unit=${i#ttyv}
   1805 	mkdev ttyv$unit c %physcon_chr% $unit
   1806 	;;
   1807 
   1808 arcpp[0-9]*)
   1809 	unit=${i#arcpp}
   1810 	mkdev arcpp$unit c %arcpp_chr% $unit
   1811 	;;
   1812 
   1813 par[0-9]*)
   1814 	unit=${i#par}
   1815 	case $unit in
   1816 	0)
   1817 		mkdev par$unit c %par_chr% $unit
   1818 		;;
   1819 	*)
   1820 		warn "bad unit for par in: $i"
   1821 		;;
   1822 	esac
   1823 	;;
   1824 
   1825 cpi[0-9]*)
   1826 	unit=${i#cpi}
   1827 	mkdev cpi$unit c %cpi_chr% $unit
   1828 	;;
   1829 
   1830 ite[0-9]*|ttye[0-9]*)
   1831 	case $i in
   1832 	ite*)	unit=${i#ite};;
   1833 	ttye*)	unit=${i#ttye};;
   1834 	esac
   1835 	mkdev ttye$unit c %ite_chr% $unit
   1836 	;;
   1837 
   1838 pms[0-9]*)
   1839 	unit=${i#pms}
   1840 	mkdev pms$unit c %opms_chr% $unit
   1841 	;;
   1842 
   1843 qms[0-9]*)
   1844 	unit=${i#qms}
   1845 	mkdev qms$unit c %qms_chr% $unit
   1846 	;;
   1847 
   1848 lms[0-9]*)
   1849 	unit=${i#lms}
   1850 	mkdev lms$unit c %lms_chr% $unit
   1851 	;;
   1852 
   1853 mms[0-9]*)
   1854 	unit=${i#mms}
   1855 	mkdev mms$unit c %mms_chr% $unit
   1856 	;;
   1857 
   1858 mouse-pms[0-9]*|mouse-qms[0-9]*)
   1859 	case $i in
   1860 	mouse-pms*) name=pms ;;
   1861 	mouse-qms*) name=qms ;;
   1862 	esac
   1863 	unit=${i#mouse-${name}}
   1864 	lndev $name$unit mouse
   1865 	;;
   1866 
   1867 kbd)
   1868 	mkdev kbd c %kbd_chr% 0
   1869 	;;
   1870 
   1871 kbdctl)
   1872 	mkdev kbdctl c %kbd_chr% 1
   1873 	;;
   1874 
   1875 vidcconsole0)
   1876 	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
   1877 	;;
   1878 
   1879 view[0-9]*)
   1880 	unit=${i#view}
   1881 	mkdev view$unit c %view_chr% $unit 666
   1882 	;;
   1883 
   1884 mouse[0-9]*)
   1885 	unit=${i#mouse}
   1886 	case $unit in
   1887 	0|1)
   1888 		mkdev mouse$unit c %ms_chr% $unit 666
   1889 		if [ $unit = 0 ]; then
   1890 			lndev mouse$unit mouse
   1891 		fi
   1892 		;;
   1893 	*)
   1894 		warn "bad unit for mouse in: $i"
   1895 		;;
   1896 	esac
   1897 	;;
   1898 
   1899 panel)
   1900 	mkdev panel0 c %panel_chr% 0 660
   1901 	;;
   1902 
   1903 tslcd)
   1904 	mkdev tslcd0 c %tslcd_chr% 0 660
   1905 	;;
   1906 
   1907 ipty)
   1908 	mkdev ttyp0 c %pts_chr% 0 666
   1909 	mkdev ttyp1 c %pts_chr% 1 666
   1910 	mkdev ptyp0 c %ptc_chr% 0 666
   1911 	mkdev ptyp1 c %ptc_chr% 1 666
   1912 	;;
   1913 
   1914 ptm)
   1915 	makedir pts 755
   1916 	mkdev ptmx c %ptm_chr% 0 666
   1917 	mkdev ptm c %ptm_chr% 1 666
   1918 	;;
   1919 
   1920 grf[0-9]*)
   1921 	unit=${i#grf}
   1922 	mkdev grf$unit c %grf_chr% $unit 666
   1923 	;;
   1924 
   1925 etvme)
   1926 	mkdev etvme c %et_chr% 0
   1927 	;;
   1928 
   1929 leo[0-9]*)
   1930 	unit=${i#leo}
   1931 	mkdev leo$unit c %leo_chr% $unit
   1932 	;;
   1933 
   1934 scif[0-9]*)
   1935 	unit=${i#scif}
   1936 	mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp
   1937 	mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp
   1938 	;;
   1939 
   1940 sci[0-9]*)
   1941 	unit=${i#sci}
   1942 	mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp
   1943 	mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp
   1944 	;;
   1945 
   1946 maple[ABCD]|maple[ABCD][0-9]*)
   1947 	case $i in
   1948 	mapleA*) name="mapleA"; unit=0;;
   1949 	mapleB*) name="mapleB"; unit=1;;
   1950 	mapleC*) name="mapleC"; unit=2;;
   1951 	mapleD*) name="mapleD"; unit=3;;
   1952 	esac
   1953 	subunit=${i#$name}
   1954 	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
   1955 	;;
   1956 
   1957 mmem[0-9]*)
   1958 	unit=${i#mmem}
   1959 	for pt in 0	# 1 2 3 4 ... 255
   1960 	do
   1961 #		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   1962 		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   1963 #		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   1964 		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   1965 	done
   1966 	;;
   1967 
   1968 mlcd[0-9]*)
   1969 	unit=${i#mlcd}
   1970 	for pt in 0	# 1 2 3 4 ... 255
   1971 	do
   1972 		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
   1973 	done
   1974 	;;
   1975 
   1976 ixpcom[0-9]*)
   1977 	unit=${i#ixpcom}
   1978 	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
   1979 	;;
   1980 
   1981 epcom[0-9]*)
   1982 	unit=${i#epcom}
   1983 	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
   1984 	;;
   1985 
   1986 plcom[0-9]*)
   1987 	unit=${i#plcom}
   1988 	mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp
   1989 	mkdev dplcom$unit c %plcom_chr% $(($unit + $dialout)) "" "" $u_uucp
   1990 	;;
   1991 
   1992 wmcom[0-9]*)
   1993 	unit=${i#wmcom}
   1994 	mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp
   1995 	;;
   1996 
   1997 ucbsnd)
   1998 	mkdev ucbsnd c %ucbsnd_chr% 0 666
   1999 	;;
   2000 
   2001 adb)
   2002 	mkdev adb c %aed_chr% 0 666
   2003 	;;
   2004 
   2005 asc[0-9]*)
   2006 	unit=${i#asc}
   2007 	mkdev asc$unit c %asc_chr% $unit 666
   2008 	;;
   2009 
   2010 bwtwo[0-9]*)
   2011 	unit=${i#bwtwo}
   2012 	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
   2013 	;;
   2014 
   2015 cgtwo[0-9]*)
   2016 	unit=${i#cgtwo}
   2017 	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
   2018 	;;
   2019 
   2020 cgthree[0-9]*)
   2021 	unit=${i#cgthree}
   2022 	mkdev cgthree$unit c %cgthree_chr% $unit 666
   2023 	;;
   2024 
   2025 cgfour[0-9]*)
   2026 	unit=${i#cgfour}
   2027 	mkdev cgfour$unit c %cgfour_chr% $unit 666
   2028 	;;
   2029 
   2030 cgsix[0-9]*)
   2031 	unit=${i#cgsix}
   2032 	mkdev cgsix$unit c %cgsix_chr% $unit 666
   2033 	;;
   2034 
   2035 cgeight[0-9]*)
   2036 	unit=${i#cgeight}
   2037 	mkdev cgeight$unit c %cgeight_chr% $unit 666
   2038 	;;
   2039 
   2040 tcx[0-9]*)
   2041 	unit=${i#tcx}
   2042 	mkdev tcx$unit c %tcx_chr% $unit 666
   2043 	;;
   2044 
   2045 xd[0-9]*|xy[0-9]*)
   2046 	case $i in
   2047 	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
   2048 	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
   2049 	esac
   2050 	%MKDISK% $name $unit $blk $chr
   2051 	;;
   2052 
   2053 magma[0-9]*)
   2054 	unit=${i#magma}
   2055 	if [ 0$unit -gt 3 ]; then
   2056 		warn "bad unit for $i: $unit"
   2057 		break
   2058 	fi
   2059 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   2060 	do
   2061 		case $j in
   2062 		[0-9])	jn=$j ;;
   2063 		a)	jn=10 ;;
   2064 		b)	jn=11 ;;
   2065 		c)	jn=12 ;;
   2066 		d)	jn=13 ;;
   2067 		e)	jn=14 ;;
   2068 		f)	jn=15 ;;
   2069 		esac
   2070 		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
   2071 	done
   2072 	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
   2073 	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
   2074 	;;
   2075 
   2076 clcd[0-9]*)
   2077 	unit=${i#clcd}
   2078 	if [ 0$unit -gt 7 ]; then
   2079 		warn "bad unit for $i: $unit"
   2080 		break
   2081 	fi
   2082 	for j in 0 1 2 3 4 5 6 7
   2083 	do
   2084 		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
   2085 		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
   2086 	done
   2087 	;;
   2088 
   2089 spif[0-9]*)
   2090 	unit=${i#spif}
   2091 	if [ 0$unit -gt 3 ]; then
   2092 		warn "bad unit for $i: $unit"
   2093 		break
   2094 	fi
   2095 	for j in 0 1 2 3 4 5 6 7; do
   2096 		mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp
   2097 	done
   2098 	mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0))
   2099 	mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1))
   2100 	;;
   2101 
   2102 bpp|bpp[0-9]*)
   2103 	unit=${i#bpp}
   2104 	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
   2105 	;;
   2106 
   2107 tctrl[0-9]*)
   2108 	unit=${i#tctrl}
   2109 	mkdev tctrl$unit c %tctrl_chr% $unit 666
   2110 	;;
   2111 
   2112 bmd[0-9]*)
   2113 	unit=${i#bmd}
   2114 	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
   2115 	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
   2116 	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
   2117 	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
   2118 	;;
   2119 
   2120 sram)
   2121 	mkdev sram c %sram_chr% 0 644
   2122 	;;
   2123 
   2124 ttyS[0-9]*)
   2125 	unit=${i#ttyS}
   2126 	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
   2127 	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
   2128 	;;
   2129 
   2130 atabus[0-9]*)
   2131 	unit=${i#atabus}
   2132 	mkdev atabus$unit c %atabus_chr% $unit 644
   2133 	;;
   2134 
   2135 drm[0-9]*)
   2136 	unit=${i#drm}
   2137 	makedir dri 755
   2138 	mkdev dri/card$unit c %drm_chr% $unit 660
   2139 	;;
   2140 
   2141 drvctl)
   2142 	mkdev drvctl c %drvctl_chr% 0 644
   2143 	;;
   2144 
   2145 isv)
   2146 	mkdev isv c %isv_chr% 0 644
   2147 	;;
   2148 
   2149 tap|tap[0-9]*)
   2150 	unit=${i#tap}
   2151 	case "$unit" in
   2152 	[0-9]*)
   2153 		mkdev tap${unit} c %tap_chr% ${unit} 600
   2154 		;;
   2155 	"")
   2156 		mkdev tap c %tap_chr% 0xfffff 600
   2157 		;;
   2158 	esac
   2159 	;;
   2160 
   2161 tpm)
   2162 	mkdev tpm c %tpm_chr% 0 600
   2163 	;;
   2164 
   2165 dtrace)
   2166 	makedir dtrace 755
   2167 	mkdev dtrace/dtrace c %dtrace_chr% 0 600
   2168 	;;
   2169 
   2170 filemon)
   2171 	mkdev filemon c %filemon_chr% 0 666
   2172 	;;
   2173 
   2174 fw[0-9]*)
   2175 	unit=${i#fw}
   2176 	for j in 0 1 2 3
   2177 	do
   2178 		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
   2179 		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
   2180 	done
   2181 	;;
   2182 
   2183 # create putter device and symlinks for all subsystems using it
   2184 putter)
   2185 	mkdev putter c %putter_chr% 0 600
   2186 	mkdev pud c %putter_chr% 1 600
   2187 	lndev putter puffs
   2188 	;;
   2189 
   2190 zfs)
   2191 	mkdev zfs c %zfs_chr% 0 600
   2192 	makedir zpool 755
   2193 	;;
   2194 
   2195 iscsi[0-9]*)
   2196 	unit=${i#iscsi}
   2197 	mkdev iscsi${unit} c %iscsi_chr% 0 600
   2198 	;;
   2199 
   2200 vchiq)
   2201 	mkdev vchiq c %vchiq_chr% 0 600
   2202 	;;
   2203 
   2204 nvme[0-9]*ns[0-9]*)
   2205 	unit=${i#nvme}
   2206 	unit=${unit%ns*}
   2207 	subunit=${i#nvme${unit}ns}
   2208 	if [ 0$subunit -le 0 -o 0$subunit -ge 65536 ]; then
   2209 		warn "bad nsid for $i: $subunit"
   2210 		break
   2211 	fi
   2212 	mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit))
   2213 	;;
   2214 
   2215 nvme[0-9]*)
   2216 	unit=${i#nvme}
   2217 	mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
   2218 	;;
   2219 
   2220 midevend)
   2221 %MI_DEVICES_END%
   2222 local)
   2223 	if [ -f "$0.local" ]; then
   2224 		umask 0
   2225 		if [ -n "$count_nodes" ]; then
   2226 			count_nodes=$((count_nodes + \
   2227 			    $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") ))
   2228 		else
   2229 			"$HOST_SH" "$0.local" $opts all
   2230 		fi
   2231 		umask 077
   2232 	fi
   2233 	;;
   2234 
   2235 *)
   2236 	warn "$i: unknown device"
   2237 	;;
   2238 
   2239 esac
   2240 done
   2241 
   2242 }
   2243 
   2244 
   2245 # three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
   2246 # hack; only the one used by port is retained in final MAKEDEV script
   2247 # routine is called as:
   2248 # makedisk name unit blk chr
   2249 makedisk_p8()
   2250 {
   2251 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2252 
   2253 	ro=%RAWDISK_OFF%
   2254 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2255 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2256 
   2257 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2258 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2259 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2260 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2261 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2262 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2263 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2264 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2265 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2266 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2267 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2268 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2269 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2270 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2271 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2272 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2273 }
   2274 
   2275 makedisk_p12high()
   2276 {
   2277 	ho=524280	# offset for partition 9 to 11 (same as ...p16high)
   2278 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2279 
   2280 	ro=%RAWDISK_OFF%
   2281 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2282 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2283 
   2284 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2285 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2286 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2287 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2288 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2289 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2290 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2291 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2292 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2293 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2294 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2295 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2296 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2297 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2298 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2299 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2300 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2301 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2302 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2303 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2304 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2305 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2306 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2307 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2308 }
   2309 
   2310 makedisk_p16()
   2311 {
   2312 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2313 
   2314 	ro=%RAWDISK_OFF%
   2315 	mkdev ${name}${unit}	b $blk $(($unit * 16 + $ro))	640 $g_operator
   2316 	mkdev r${name}${unit}	c $chr $(($unit * 16 + $ro))	640 $g_operator
   2317 
   2318 	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
   2319 	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
   2320 	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
   2321 	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
   2322 	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
   2323 	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
   2324 	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
   2325 	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
   2326 	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
   2327 	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
   2328 	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
   2329 	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
   2330 	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
   2331 	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
   2332 	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
   2333 	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
   2334 	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
   2335 	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
   2336 	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
   2337 	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
   2338 	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
   2339 	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
   2340 	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
   2341 	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
   2342 	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
   2343 	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
   2344 	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
   2345 	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
   2346 	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
   2347 	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
   2348 	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
   2349 	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
   2350 }
   2351 
   2352 makedisk_p16high()
   2353 {
   2354 	ho=524280	# offset for partition 9 to 16
   2355 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2356 
   2357 	ro=%RAWDISK_OFF%
   2358 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2359 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2360 
   2361 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2362 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2363 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2364 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2365 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2366 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2367 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2368 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2369 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2370 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2371 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2372 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2373 	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
   2374 	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
   2375 	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
   2376 	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
   2377 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2378 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2379 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2380 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2381 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2382 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2383 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2384 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2385 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2386 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2387 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2388 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2389 	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
   2390 	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
   2391 	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
   2392 	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
   2393 }
   2394 
   2395 # make only the very few basic disk device nodes - 'a' partition
   2396 # and raw partition
   2397 makedisk_minimal()
   2398 {
   2399 	name=$1; unit=$2; blk=$3; chr=$4
   2400 	doff=%DISKMINOROFFSET%
   2401 	ro=%RAWDISK_OFF%
   2402 	rn=%RAWDISK_NAME%
   2403 
   2404 	mkdev ${name}${unit}	b $blk $(($unit * $doff + $ro))	640 $g_operator
   2405 	mkdev r${name}${unit}	c $chr $(($unit * $doff + $ro))	640 $g_operator
   2406 
   2407 	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
   2408 	mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator
   2409 	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
   2410 	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
   2411 }
   2412 
   2413 # create_mfs_dev nodes
   2414 #	Create a memory file system for a given number of device nodes,
   2415 #	and mount it.  Attempts to use mount_tmpfs, or falls back to
   2416 #	mount_mfs.
   2417 #
   2418 #	If do_redirect, then also redirect output to the console.
   2419 #
   2420 create_mfs_dev()
   2421 {
   2422 	ndevnodes=${1-1200}
   2423 	dev_mountpoint=${PWD:-/dev}
   2424 
   2425 	# Number of inodes is the specified number of device nodes, plus
   2426 	# a margin to allow for extra device nodes created later.
   2427 	ninode=$((ndevnodes * 11 / 10))
   2428 	# Add 2 reserved inodes (needed for both mfs and tmpfs), and round
   2429 	# up to a multiple of 32 (needed for mfs, not needed for tmpfs).
   2430 	ninode=$(( (ninode + 2 + 31) / 32 * 32 ))
   2431 	# Try tmpfs; if that fails try mfs.
   2432 	#
   2433 	# For tmpfs, allocate 16KB and 512 byte per node.
   2434 	# Actual requirements are much lower, but the size limit
   2435 	# is only intended to avoid accidental writing to /dev.
   2436 	fs_bytes=$((16384 + ninode * 512))
   2437 	if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \
   2438 		-o union tmpfs "$dev_mountpoint"
   2439 	then
   2440 		fstype=tmpfs
   2441 	else
   2442 		# This file system size calculation is exact for mount_mfs(8)
   2443 		# with 512-byte sectors.  40960 bytes (80 blocks) is the
   2444 		# minimum size allowed by mount_mfs.
   2445 		fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192))
   2446 		[ "$fs_bytes" -lt 40960 ] && fs_bytes=40960
   2447 		fs_blocks=$((fs_bytes/512))
   2448 		if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \
   2449 		    -o union swap "$dev_mountpoint"
   2450 		then
   2451 			fstype=mfs
   2452 		else
   2453 			die "Failed to create memory file system"
   2454 		fi
   2455 	fi
   2456 
   2457 	# Our current directory was in the lower file system; change it to
   2458 	# the newly mounted upper file system.
   2459 	cd "$dev_mountpoint"
   2460 
   2461 	if $do_redirect; then
   2462 		# Redirect stdout and stderr to console
   2463 		${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0
   2464 		exec >temp_console 2>&1
   2465 		rm temp_console
   2466 	fi
   2467 
   2468 	echo "Created $fstype $dev_mountpoint" \
   2469 		"($fs_bytes byte, $ninode inodes)"
   2470 }
   2471 
   2472 #
   2473 # MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a
   2474 # function library, so just return.  Otherwise, do all the real work.
   2475 #
   2476 [ -n "${MAKEDEV_AS_LIBRARY}" ] && return
   2477 makedev_main makedev ${1+"$@"}
   2478