Home | History | Annotate | Line # | Download | only in etc
      1 #!/bin/sh -
      2 #	$NetBSD: MAKEDEV.tmpl,v 1.237 2025/03/28 18:41:25 riastradh 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 #	virtio	virtio(4)-related 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 #	ttyVI??	viocon(4)
    153 #
    154 # Terminal multiplexors:
    155 #	dc*	4 channel serial interface (keyboard, mouse, modem, printer)
    156 #	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11)
    157 #	dhu*	UNIBUS DHU11
    158 #	dl*	UNIBUS DL11
    159 #	dmf*	UNIBUS DMF32
    160 #	dmz*	UNIBUS DMZ32
    161 #	dz*	UNIBUS DZ11 and DZ32
    162 #	scc*	82530 serial interface
    163 #
    164 # Call units:
    165 #	dn*	UNIBUS DN11 and emulations (e.g. Able Quadracall)
    166 #
    167 # Pseudo terminals:
    168 #	ptm	pty multiplexor device, and pts directory
    169 #	pty*	set of 16 master and slave pseudo terminals
    170 #	opty	first 16 ptys, to save inodes on install media
    171 #	ipty	first 2 ptys, for install media use only
    172 #
    173 # Printers:
    174 #	arcpp*	Archimedes parallel port
    175 #	lpt*	stock lp
    176 #	lpa*	interruptless lp
    177 #	par*	Amiga motherboard parallel port
    178 #	cpi*	Macintosh Nubus CSI parallel printer card
    179 #
    180 # USB devices:
    181 #	usb*	USB control devices
    182 #	uhid*	USB generic HID devices
    183 #	ulpt*	USB printer devices
    184 #	ugen*	USB generic devices
    185 #	ttyHS*	USB Option N.V. modems
    186 #	ttyU*	USB modems
    187 #	ttyY*	USB serial adapters
    188 #
    189 # Video devices:
    190 #	bwtwo*	monochromatic frame buffer
    191 #	cgtwo*	8-bit color frame buffer
    192 #	cgthree*	8-bit color frame buffer
    193 #	cgfour*	8-bit color frame buffer
    194 #	cgsix*	accelerated 8-bit color frame buffer
    195 #	cgeight*	24-bit color frame buffer
    196 #	etvme	Tseng et-compatible cards on VME (atari)
    197 #	ik*	UNIBUS interface to Ikonas frame buffer
    198 #	leo	Circad Leonardo VME-bus true color (atari)
    199 #	ps*	UNIBUS interface to Picture System 2
    200 #	qv*	QVSS (MicroVAX) display
    201 #	tcx*	accelerated 8/24-bit color frame buffer
    202 #
    203 # Maple bus devices:
    204 #	maple	Maple bus control devices
    205 #	mlcd*	Maple bus LCD devices
    206 #	mmem*	Maple bus storage devices
    207 #
    208 # IEEE1394 bus devices:
    209 #	fw*	IEEE1394 bus generic node access devices
    210 #	fwmem*	IEEE1394 bus physical memory of the remote node access devices
    211 #
    212 # Special purpose devices:
    213 #	ad*	UNIBUS interface to Data Translation A/D converter
    214 #	agp*	AGP GART devices
    215 #	altq	ALTQ control interface
    216 #	amr*	AMI MegaRaid control device
    217 #	apm	power management device
    218 #	audio*	audio devices
    219 #	bell*	OPM bell device (x68k)
    220 #	bktr	Brooktree 848/849/878/879 based TV cards
    221 #	bpf	packet filter
    222 #	bthub	Bluetooth Device Hub control interface
    223 #	cfs*	Coda file system device
    224 #	ch*	SCSI media changer
    225 #	cir*	Consumer IR
    226 #	clockctl clock control for non root users
    227 #	cpuctl	CPU control
    228 #	crypto	hardware crypto access driver
    229 #	dmoverio hardware-assisted data movers
    230 #	dpt*	DPT/Adaptec EATA RAID management interface
    231 #	dpti*	DPT/Adaptec I2O RAID management interface
    232 #	drm*	Direct Rendering Manager interface
    233 #	dtv*	Digital TV interface
    234 #	fb*	PMAX generic framebuffer pseudo-device
    235 #	fd	file descriptors
    236 #	gpioirq* Interrupts on GPIO pins
    237 #	gpiopps* 1PPS signals on GPIO pins
    238 #	grf*	graphics frame buffer device
    239 #	hdaudio* High Definition audio control device
    240 #	hdmicec* HDMI CEC devices
    241 #	hil	HP300 HIL input devices
    242 #	icp	ICP-Vortex/Intel RAID control interface
    243 #	iic*	IIC bus device
    244 #	io	x86 IOPL access for COMPAT_10, COMPAT_FREEBSD
    245 #	iop*	I2O IOP control interface
    246 #	ipmi*	OpenIPMI compatible interface
    247 #	ipl	IP Filter
    248 #	irframe* IrDA physical frame
    249 #	ite*	terminal emulator interface to HP300 graphics devices
    250 #	joy*	joystick device
    251 #	kttcp	kernel ttcp helper device
    252 #	lockstat kernel locking statistics
    253 #	magma*	Magma multiport serial/parallel cards
    254 #	midi*	MIDI
    255 #	mfi*	LSI MegaRAID/MegaSAS control interface
    256 #	mlx*	Mylex DAC960 control interface
    257 #	mly*	Mylex AcceleRAID/eXtremeRAID control interface
    258 #	np*	UNIBUS Ethernet co-processor interface, for downloading.
    259 #	npf	NPF packet filter
    260 #	nvme*	Non-Volatile Memory Host Controller Interface device driver
    261 #	nvme*ns* Non-Volatile Memory namespace
    262 #	nvmm	NetBSD Virtual Machine Monitor
    263 #	openfirm OpenFirmware accessor
    264 #	pad*	Pseudo-audio device driver
    265 #	pci*	PCI bus access devices
    266 #	pf	PF packet filter
    267 #	putter	Pass-to-Userspace Transporter
    268 #	px*	PixelStamp Xserver access
    269 #	qemufwcfg* QEMU Firmware Configuration
    270 #	radio*	radio devices
    271 #	random	Random number generator
    272 #	rtc*	RealTimeClock
    273 #	scmd*	Sparkfun Serial Controlled Motor Driver
    274 #	scsibus* SCSI busses
    275 #	se*	SCSI Ethernet
    276 #	ses*	SES/SAF-TE SCSI Devices
    277 #	sht3xtemp*	Sensirion SHT3X temperature and humidity device driver
    278 #	speaker	PC speaker		(XXX - installed)
    279 #	spi*	SPI bus device
    280 #	sram	battery backuped memory (x68k)
    281 #	srt*	source-address based routing
    282 #	ss*	SCSI scanner
    283 #	stic*	PixelStamp interface chip
    284 #	sysmon	System Monitoring hardware
    285 #	tap*	virtual Ethernet device
    286 #	tprof	task profiler
    287 #	tun*	network tunnel driver
    288 #	twa	3ware Apache control interface
    289 #	twe	3ware Escalade control interface
    290 #	uk*	unknown SCSI device
    291 #	veriexec Veriexec fingerprint loader
    292 #	vhci	virtual host controller interface
    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 passed 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_nvmm="%gid_nvmm%"
    507 	g_operator="%gid_operator%"
    508 	g_wheel="%gid_wheel%"
    509 	dialin=0
    510 	dialout=524288
    511 	callunit=262144
    512 
    513 	# only allow read&write for owner by default
    514 	umask 077
    515 
    516 	# Set fdesc_mounted=true if the fdesc file system is mounted
    517 	# on the current directory (typically "/dev").
    518 	# Later, this will be used to suppress creation of device nodes
    519 	# that are supplied by the fdesc file system.
    520 	#
    521 	fdesc_mounted=false
    522 	if [ -d fd ]; then
    523 		# Parse the output from "mount -u -o nosuchoption .".
    524 		# We don't parse the output from df(1) because that's
    525 		# less likely to be available on install media.
    526 		#
    527 		# If the current directory is a mount point for the
    528 		# fdesc file system, then the expected output (whether
    529 		# or not the current user is root) is:
    530 		#	mount_fdesc: -o suchoption: option not supported.
    531 		#
    532 		# If the current directory is not a mount point, then
    533 		# the expected output is:
    534 		#	mount: .: unknown special file or file system.
    535 		#
    536 		# If we are not running on NetBSD, or mount(8) is not
    537 		# found, then we should get some other error message.
    538 		#
    539 		case "$({ LC_ALL=C mount -u -o nosuchoption . ; } 2>&1)" in
    540 		*mount_fdesc*)	fdesc_mounted=true ;;
    541 		esac
    542 	fi
    543 
    544 	# do_force requires mknod
    545 	if $do_force; then
    546 		if $do_mtree || $do_pax || $do_specfile; then
    547 			die "-f option works only with mknod"
    548 		fi
    549 		do_mknod=true
    550 	fi
    551 
    552 	# do_force and do_update do not work together
    553 	if $do_force && $do_update; then
    554 		die "-f and -u options do not work together"
    555 	fi
    556 
    557 	# If no explicit method was specified on the command line or
    558 	# forced above, then use one of mtree, pax, or mknod, in that
    559 	# order of preference.
    560 	#
    561 	# mtree is preferred because it's fast and designed for the
    562 	# purpose.  However, it's unlikely to be available early in the
    563 	# boot sequence, when init(8) may invoke MAKEDEV(8).
    564 	#
    565 	# pax is usually acceptable, and it's likely to be available
    566 	# early in the boot sequence.  However, it's much slower than mtree.
    567 	#
    568 	# mknod is just very slow, because the shell has to fork for
    569 	# each device node.
    570 	#
    571 
    572 	case ",${do_mtree},,${do_pax},,${do_mknod},,${do_specfile}," in
    573 	( ,false,,false,,false,,false, )
    574 		if check_mtree "${TOOL_MTREE}"; then
    575 			do_mtree=true
    576 		elif check_pax "${TOOL_PAX}"; then
    577 			do_pax=true
    578 		else
    579 			do_mknod=true
    580 		fi
    581 		;;
    582 	( *,true,*,true,* )
    583 		die "-m, -p, -s, and -t options are mutually exclusive"
    584 		;;
    585 	esac
    586 
    587 	# If we are using mknod, then decide what options to pass it.
    588 	MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
    589 	if $do_mknod; then
    590 		if $do_force; then
    591 			MKNOD="${MKNOD} -R"
    592 		else
    593 			MKNOD="${MKNOD} -r"
    594 		fi
    595 	fi
    596 
    597 	# do_mtree or do_pax internally implies do_specfile.
    598 	# This happens after checking for mutually-exclusive options.
    599 	if $do_mtree || $do_pax && ! $do_specfile; then
    600 		do_specfile=true
    601 		opts="${opts} -s"
    602 	fi
    603 }
    604 
    605 # specfile_before
    606 #	This is called before the bulk of the makedev processing,
    607 #	if do_specfile is set.
    608 #
    609 #	It simply prints ". type=dir optional", which must be the
    610 #	first line of the specfile.
    611 #
    612 specfile_before()
    613 {
    614 	echo ". type=dir optional"
    615 }
    616 
    617 # mtree_after
    618 #	Output in specfile format is piped into this function.
    619 #
    620 #	It uses mtree to create the devices defined in the specfile.
    621 #
    622 mtree_after()
    623 {
    624 	nooutput -1 "${TOOL_MTREE}" -e -U
    625 }
    626 
    627 # pax_after
    628 #	Output in specfile format is piped into this function.
    629 #
    630 #	It uses pax to create the devices defined in the specfile.
    631 #
    632 pax_after()
    633 {
    634 	# Run pax in an empty directory, so it pays
    635 	# attention only to the specfile, without being
    636 	# confused by the existing contents of the target
    637 	# directory.  Without this, pax would complain "file
    638 	# would overwrite itself" for already-existing
    639 	# device nodes.
    640 	tmpdir=./tmp.$$
    641 	mkdir "${tmpdir}" || die "can't create temporary directory"
    642 	cd "${tmpdir}" || die "can't cd to temporary directory"
    643 	"${TOOL_PAX}" -r -w -M -pe ..
    644 	pax_status=$?
    645 	cd .. # back to where we started
    646 	rmdir "${tmpdir}"
    647 	return $pax_status
    648 }
    649 
    650 # makedev_main makedev_name args...
    651 #	Perform most of the work of the main program.  makedev_name
    652 #	is typically "makedev", but may be the name of some other
    653 #	makedev-like function (if we are invoked from MAKEDEV.local or
    654 #	some other script).  The other args to this function are the
    655 #	command line args with which the MAKEDEV (or MAKEDEV.local)
    656 #	script was invoked.
    657 #
    658 makedev_main()
    659 {
    660 	local makedev="$1" ; shift
    661 
    662 	# Parse command line args
    663 	setup ${1+"$@"}
    664 	shift $((${OPTIND}-1))
    665 
    666 	if $do_create_mfs; then
    667 		# Count inodes and create mfs file system.
    668 		# The makedev call merely updates $count_nodes.
    669 		count_nodes=0
    670 		$makedev ${1+"$@"}
    671 		create_mfs_dev $count_nodes
    672 		unset count_nodes
    673 	fi
    674 
    675 	# Set before, middle, and after variables, so we can do
    676 	# something like "( $before && $middle ) | $after",
    677 	# except it will have to be more complex so we can capture
    678 	# the exit status from both sides of the pipe.
    679 	#
    680 	if $do_specfile; then
    681 		before=specfile_before
    682 	else
    683 		before=:
    684 	fi
    685 	middle='$makedev ${1+"$@"} && (exit $status)'
    686 	if $do_mtree; then
    687 		after=mtree_after
    688 	elif $do_pax ; then
    689 		after=pax_after
    690 	else
    691 		after=cat
    692 	fi
    693 
    694 	# Actually perform the "{ $before && $middle } | $after" commands.
    695 	#
    696 	# We go to some trouble to ensure that, if any of
    697 	# $before, $middle, or $after fails, then we also
    698 	# exit with a non-zero status.
    699 	#
    700 	# In the block below, fd 3 is a copy of the original stdout,
    701 	# and fd 4 goes to a subshell that analyses the exit status
    702 	# status from the other commands.
    703 	#
    704 	{
    705 		exec 3>&1;
    706 		{
    707 			{ eval "$before" && eval "$middle"; echo $? >&4; } \
    708 			| { eval "$after"; echo $? >&4; } \
    709 		} 4>&1 1>&3 \
    710 		| (
    711 			read status1;
    712 			read status2; 
    713 			case "$status1,$status2" in
    714 			0,0) exit 0;;
    715 			0,*) exit $status2;;
    716 			*,*) exit $status1;;
    717 			esac
    718 		)
    719 	}
    720 }
    721 
    722 #
    723 # functions available to create nodes:
    724 #
    725 # mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
    726 #	create device node `name' with the appropriate permissions
    727 #
    728 # lndev src target
    729 #	create a symlink from src to target
    730 #
    731 # makedir dir mode
    732 #	create directory with appropriate mode
    733 #
    734 
    735 mkdev()
    736 {
    737 	if [ -n "$count_nodes" ]; then
    738 		count_nodes=$((count_nodes + 1))
    739 		return
    740 	fi
    741 	if $do_update && test -e $1; then
    742 		return
    743 	fi
    744 	if $do_specfile; then
    745 		case $2 in
    746 		b)	type=block ;;
    747 		c)	type=char ;;
    748 		esac
    749 		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
    750 	else
    751 		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
    752 	fi
    753 }
    754 
    755 lndev()
    756 {
    757 	if [ -n "$count_nodes" ]; then
    758 		count_nodes=$((count_nodes + 1))
    759 		return
    760 	fi
    761 	if $do_update && test -e $2; then
    762 		return
    763 	fi
    764 	if $do_specfile; then
    765 		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
    766 	else
    767 		ln -f -s $1 $2
    768 	fi
    769 }
    770 
    771 makedir()
    772 {
    773 	if [ -n "$count_nodes" ]; then
    774 		count_nodes=$((count_nodes + 1))
    775 		return
    776 	fi
    777 	if $do_update && test -e $1; then
    778 		return
    779 	fi
    780 	if $do_specfile; then
    781 		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
    782 	else
    783 		nooutput -2 mkdir $1
    784 		chmod $2 $1
    785 	fi
    786 }
    787 
    788 warn()
    789 {
    790 	echo 1>&2 "$0: $*"
    791 	status=1
    792 }
    793 
    794 die()
    795 {
    796 	echo 1>&2 "$0: $*"
    797 	exit 1
    798 }
    799 
    800 # makedev special [...]
    801 #	the main loop
    802 #
    803 makedev()
    804 {
    805 
    806 for i
    807 do
    808 
    809 case $i in
    810 
    811 %MD_DEVICES%
    812 
    813 all)
    814 	makedev all_md
    815 	makedev std fd ptm
    816 	makedev dk0 dk1 dk2 dk3 dk4 dk5 dk6 dk7
    817 	makedev dk8 dk9 dk10 dk11 dk12 dk13 dk14 dk15
    818 	makedev dk16 dk17 dk18 dk19 dk20 dk21 dk22 dk23
    819 	makedev dk24 dk25 dk26 dk27 dk28 dk29 dk30 dk31
    820 	makedev ccd0 ccd1 ccd2 ccd3
    821 	makedev cgd0 cgd1 cgd2 cgd3 cgd4 cgd5 cgd6 cgd7
    822 	makedev fss0 fss1 fss2 fss3
    823 	makedev md0 md1
    824 	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
    825 	makedev vnd0 vnd1 vnd2 vnd3
    826 	makedev iscsi0
    827 	makedev bpf npf
    828 	makedev tun0 tun1 tun2 tun3
    829 	makedev ipl pf crypto random
    830 	makedev lockstat clockctl cpuctl
    831 	makedev atabus0 atabus1 atabus2 atabus3 atabus4 atabus5 atabus6 atabus7
    832 	makedev srt0 srt1 srt2 srt3
    833 	makedev tap tap0 tap1 tap2 tap3
    834 	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
    835 	makedev gpioirq0 gpiopps0
    836 	makedev pad pad0 pad1 pad2 pad3
    837 	makedev bthub
    838 	makedev putter
    839 	makedev drvctl
    840 	makedev video
    841 	makedev dtv
    842 	makedev drm0 drm1 drm2 drm3
    843 	makedev altmem
    844 	makedev zfs
    845 	makedev lua
    846 	makedev hdmicec0
    847 	makedev dtrace
    848 	makedev veriexec
    849 	makedev autofs
    850 	makedev fw0 fw1 fw2 fw3
    851 	makedev ipmi0
    852 	makedev qemufwcfg
    853 	makedev sht3xtemp0
    854 	makedev scmd0
    855 	makedev local # do this last
    856 	;;
    857 
    858 init)
    859 	# unless overridden by MD entry, this is equal to 'all'
    860 	makedev all opty
    861 	;;
    862 
    863 %MI_DEVICES_BEGIN%
    864 audio)
    865 	makedev audio0 audio1 audio2 audio3
    866 	makedev hdaudio0 hdaudio1 hdaudio2 hdaudio3
    867 	lndev sound0 sound
    868 	lndev audio0 audio
    869 	lndev mixer0 mixer
    870 	lndev audioctl0 audioctl
    871 	;;
    872 
    873 emcfan[0-9]*)
    874 	unit=${i#emcfan}
    875 	mkdev emcfan$unit c %emcfan_chr% $unit 660
    876 	;;
    877 
    878 gpio)
    879 	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
    880 	lndev gpio0 gpio
    881 	;;
    882 
    883 gpioirq)
    884 	makedev gpioirq0
    885 	;;
    886 
    887 gpiopps)
    888 	makedev gpiopps0
    889 	lndev gpiopps0 gpiopps
    890 	;;
    891 
    892 lua)
    893 	makedev lua0
    894 	lndev lua0 lua
    895 	;;
    896 
    897 pad)
    898 	makedev pad0 pad1 pad2 pad3
    899 	lndev pad0 pad
    900 	;;
    901 
    902 qemufwcfg)
    903 	makedev qemufwcfg0
    904 	lndev qemufwcfg0 qemufwcfg
    905 	;;
    906 
    907 radio)
    908 	makedev radio0 radio1
    909 	lndev radio0 radio
    910 	;;
    911 
    912 video)
    913 	makedev video0 video1 video2 video3
    914 	;;
    915 
    916 dtv)
    917 	makedev dtv0 dtv1 dtv2 dtv3
    918 	;;
    919 
    920 iic)
    921 	makedev iic0 iic1 iic2 iic3
    922 	;;
    923 
    924 altmem)
    925 	makedev altmem0 altmem1
    926 	;;
    927 
    928 ramdisk)
    929 	makedev floppy md0
    930 	;;
    931 
    932 sht3xtemp)
    933     	makedev sht3xtemp0
    934     	;;
    935 
    936 scmd)
    937     	makedev scmd0
    938     	;;
    939 
    940 usbs)
    941 	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
    942 	makedev usb8 usb9 usb10 usb11 usb12 usb13 usb14 usb15
    943 	makedev uhid0 uhid1 uhid2 uhid3 uhid4 uhid5
    944 	makedev uhid6 uhid7 uhid8 uhid9 uhid10 uhid11
    945 	makedev uhid12 uhid13 uhid14 uhid15
    946 	makedev ulpt0 ulpt1
    947 	makedev ttyU0 ttyU1 ttyU2 ttyU3 ttyU4 ttyU5 ttyU6 ttyU7
    948 	makedev ttyY0 ttyY1
    949 	makedev ttyHS0
    950 	makedev utoppy0 utoppy1
    951 	makedev ugen0 ugen1 ugen2 ugen3
    952 	;;
    953 
    954 virtio)
    955 	makedev ttyVI
    956 	makedev vio9p0 vio9p1 vio9p2 vio9p3
    957 	makedev vio9p4 vio9p5 vio9p6 vio9p7
    958 	;;
    959 
    960 std)
    961 	mkdev		console c %cons_chr% 0	600
    962 	mkdev		constty c %cons_chr% 1	600
    963 	mkdev		drum	c %swap_chr% 0	640 $g_kmem
    964 	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
    965 	mkdev		mem	c %mem_chr% 0	640 $g_kmem
    966 	mkdev		null	c %mem_chr% 2	666
    967 	mkdev		full	c %mem_chr% 11	666
    968 	mkdev		zero	c %mem_chr% 12	666
    969 	mkdev		klog	c %log_chr% 0	600
    970 	mkdev		ksyms	c %ksyms_chr% 0 440 $g_kmem
    971 	mkdev		random	c %rnd_chr% 0	444
    972 	mkdev		urandom	c %rnd_chr% 1	644
    973 	if ! $fdesc_mounted; then
    974 		mkdev	tty	c %ctty_chr% 0		666
    975 		mkdev	stdin	c %filedesc_chr% 0	666
    976 		mkdev	stdout	c %filedesc_chr% 1	666
    977 		mkdev	stderr	c %filedesc_chr% 2	666
    978 	fi
    979 	;;
    980 
    981 usb)
    982 	mkdev usb c %usb_chr% 255 444
    983 	;;
    984 
    985 usb[0-9]*)
    986 	unit=${i#usb}
    987 	usb=usb$unit
    988 	mkdev usb$unit c %usb_chr% $unit
    989 	;;
    990 
    991 uhid[0-9]*)
    992 	unit=${i#uhid}
    993 	mkdev uhid$unit c %uhid_chr% $unit 666
    994 	;;
    995 
    996 ulpt[0-9]*)
    997 	unit=${i#ulpt}
    998 	mkdev ulpt$unit c %ulpt_chr% $unit
    999 	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
   1000 	;;
   1001 
   1002 utoppy[0-9]*)
   1003 	unit=${i#utoppy}
   1004 	mkdev utoppy$unit c %utoppy_chr% $unit
   1005 	;;
   1006 
   1007 ttyHS[0-9]*)
   1008 	unit=${i#ttyHS}
   1009 	for j in 00 01 02 03 04 05 06 07 08 09 10
   1010 	do
   1011 		base=$(($unit * 16 + ${j#0}))
   1012 		mkdev ttyHS$unit.$j c %uhso_chr% $(($base + $dialin  )) "" "" $u_uucp
   1013 		mkdev dtyHS$unit.$j c %uhso_chr% $(($base + $dialout )) "" "" $u_uucp
   1014 		mkdev ctyHS$unit.$j c %uhso_chr% $(($base + $callunit)) "" "" $u_uucp
   1015 	done
   1016 	;;
   1017 
   1018 ttyY[0-9]*)
   1019 	unit=${i#ttyY}
   1020 	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
   1021 	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
   1022 	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
   1023 	;;
   1024 
   1025 ucom[0-9]*)
   1026 	makedev ttyU${i#ucom}
   1027 	;;
   1028 
   1029 ttyU[0-9]*)
   1030 	unit=${i#ttyU}
   1031 	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin	 )) "" "" $u_uucp
   1032 	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
   1033 	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
   1034 	;;
   1035 
   1036 ugen[0-9]*)
   1037 	unit=${i#ugen}
   1038 	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
   1039 	do
   1040 		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
   1041 	done
   1042 	;;
   1043 
   1044 umcpmio[0-9]*)
   1045         unit=${i#umcpmio}
   1046         mkdev umcpmio${unit}ctl c %umcpmio_chr% $unit 660
   1047         for j in 0 1 2
   1048         do
   1049                 mkdev umcpmio${unit}GP$(($j + 1)) c %umcpmio_chr% $(($unit * 3 + 128 + ${j#})) 666
   1050         done
   1051         ;;
   1052 
   1053 wscons)
   1054 	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
   1055 	makedev ttyF0 ttyF1 ttyF2 ttyF3 ttyF4 ttyF5 ttyF6 ttyF7
   1056 	makedev ttyG0 ttyG1 ttyG2 ttyG3 ttyG4 ttyG5 ttyG6 ttyG7
   1057 	makedev ttyH0 ttyH1 ttyH2 ttyH3 ttyH4 ttyH5 ttyH6 ttyH7
   1058 	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
   1059 	makedev wskbd0 wskbd1 wskbd2 wskbd3
   1060 	makedev wsmux0 wsmux1 wsmux2 wsmux3
   1061 	makedev wsmouse wskbd
   1062 	makedev ttyEcfg ttyEstat
   1063 	makedev ttyFcfg ttyFstat
   1064 	makedev ttyGcfg ttyGstat
   1065 	makedev ttyHcfg ttyHstat
   1066 	makedev wsfont
   1067 	;;
   1068 
   1069 wsmouse)
   1070 	mkdev wsmouse c %wsmux_chr% 0
   1071 	;;
   1072 
   1073 wskbd)
   1074 	mkdev wskbd c %wsmux_chr% 1
   1075 	;;
   1076 
   1077 wsmux[0-9]*)
   1078 	unit=${i#wsmux}
   1079 	mkdev wsmux$unit    c %wsmux_chr% $unit
   1080 	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
   1081 	;;
   1082 
   1083 xenevt)
   1084 	mkdev xenevt c %xenevt_chr% 0
   1085 	;;
   1086 
   1087 xsd_kva)
   1088 	mkdev xsd_kva c %xenevt_chr% 1
   1089 	;;
   1090 
   1091 xencons)
   1092 	mkdev xencons c %xencons_chr% 0
   1093 	;;
   1094 
   1095 ttyEstat)
   1096 	mkdev ttyEstat c %wsdisplay_chr% 254
   1097 	;;
   1098 
   1099 ttyEcfg)
   1100 	mkdev ttyEcfg c %wsdisplay_chr% 255
   1101 	;;
   1102 
   1103 ttyE[0-9]*)
   1104 	unit=${i#ttyE}
   1105 	mkdev ttyE$unit c %wsdisplay_chr% $unit
   1106 	;;
   1107 
   1108 ttyFstat)
   1109 	mkdev ttyFstat c %wsdisplay_chr% 510
   1110 	;;
   1111 
   1112 ttyFcfg)
   1113 	mkdev ttyFcfg c %wsdisplay_chr% 511
   1114 	;;
   1115 
   1116 ttyF[0-9]*)
   1117 	unit=${i#ttyF}
   1118 	mkdev ttyF$unit c %wsdisplay_chr% $(($unit + 256))
   1119 	;;
   1120 
   1121 ttyGstat)
   1122 	mkdev ttyGstat c %wsdisplay_chr% 766
   1123 	;;
   1124 
   1125 ttyGcfg)
   1126 	mkdev ttyGcfg c %wsdisplay_chr% 767
   1127 	;;
   1128 
   1129 ttyG[0-9]*)
   1130 	unit=${i#ttyG}
   1131 	mkdev ttyG$unit c %wsdisplay_chr% $(($unit + 512))
   1132 	;;
   1133 
   1134 ttyHstat)
   1135 	mkdev ttyHstat c %wsdisplay_chr% 1022
   1136 	;;
   1137 
   1138 ttyHcfg)
   1139 	mkdev ttyHcfg c %wsdisplay_chr% 1023
   1140 	;;
   1141 
   1142 ttyH[0-9]*)
   1143 	unit=${i#ttyH}
   1144 	mkdev ttyH$unit c %wsdisplay_chr% $(($unit + 768))
   1145 	;;
   1146 
   1147 wsmouse[0-9]*)
   1148 	unit=${i#wsmouse}
   1149 	mkdev wsmouse$unit c %wsmouse_chr% $unit
   1150 	;;
   1151 
   1152 wskbd[0-9]*)
   1153 	unit=${i#wskbd}
   1154 	mkdev wskbd$unit c %wskbd_chr% $unit
   1155 	;;
   1156 
   1157 fd)
   1158 	if ! $fdesc_mounted; then
   1159 		# Create the "fd" subdirectory, and devices "fd/0" to "fd/63"
   1160 		makedir fd 755
   1161 		n=0
   1162 		while [ $n -lt 64 ]
   1163 		do
   1164 			mkdev fd/$n c %filedesc_chr% $n 666
   1165 			n=$(($n + 1))
   1166 		done
   1167 	fi
   1168 	;;
   1169 
   1170 wt[0-9]*)
   1171 	name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%
   1172 	for sub in $unit $(($unit+8)) $(($unit+16))
   1173 	do
   1174 		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
   1175 		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
   1176 		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
   1177 		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
   1178 	done
   1179 	;;
   1180 
   1181 md[0-9]*)
   1182 	makedisk_minimal md ${i#md} %md_blk% %md_chr%
   1183 	;;
   1184 
   1185 fss[0-9]*)
   1186 	name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
   1187 	mkdev $name$unit	b $blk $unit 660 $g_operator
   1188 	mkdev r$name$unit	c $chr $unit 660 $g_operator
   1189 	;;
   1190 
   1191 ss[0-9]*)
   1192 	name=ss;	unit=${i#ss};	chr=%ss_chr%
   1193 	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
   1194 	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
   1195 	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
   1196 	;;
   1197 
   1198 ccd[0-9]*|cgd[0-9]*|raid[0-9]*|vnd[0-9]*)
   1199 	case $i in
   1200 	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
   1201 	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
   1202 	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
   1203 	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
   1204 	esac
   1205 	%MKDISK% $name $unit $blk $chr
   1206 	;;
   1207 
   1208 sd[0-9]*)
   1209 	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
   1210 	%MKDISK% $name $unit $blk $chr
   1211 	;;
   1212 
   1213 ace[0-9]*)
   1214 	name=ace; unit=${i#ace};	blk=%ace_blk%;		chr=%ace_chr%
   1215 	%MKDISK% $name $unit $blk $chr
   1216 	;;
   1217 
   1218 eflash[0-9]*)
   1219 	name=eflash; unit=${i#eflash};	blk=%eflash_blk%;	chr=%eflash_chr%
   1220 	%MKDISK% $name $unit $blk $chr
   1221 	;;
   1222 
   1223 wd[0-9]*)
   1224 	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
   1225 	%MKDISK% $name $unit $blk $chr
   1226 	;;
   1227 
   1228 fd[0-9]*)
   1229 	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
   1230 	%MKDISK% $name $unit $blk $chr
   1231 	;;
   1232 
   1233 ld[0-9]*)
   1234 	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
   1235 	%MKDISK% $name $unit $blk $chr
   1236 	;;
   1237 
   1238 flash[0-9]*)
   1239 	unit=${i#flash}
   1240 	flash=flash$unit
   1241 	mkdev flash$unit b %flash_blk% $unit
   1242 	mkdev rflash$unit c %flash_chr% $unit
   1243 	;;
   1244 
   1245 spiflash[0-9]*)
   1246 	unit=${i#spiflash}
   1247 	spiflash=spiflash$unit
   1248 	mkdev spiflash$unit b %spiflash_blk% $unit
   1249 	mkdev rspiflash$unit c %spiflash_chr% $unit
   1250 	;;
   1251 
   1252 altmem[0-9]*)
   1253 	name=altmem; unit=${i#altmem}; blk=%altmem_blk%; chr=%altmem_chr%
   1254 	%MKDISK% $name $unit $blk $chr
   1255 	;;
   1256 
   1257 bio)
   1258 	mkdev bio c %bio_chr% 0
   1259 	;;
   1260 
   1261 ed[0-9]*)
   1262 	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
   1263 	%MKDISK% $name $unit $blk $chr
   1264 	;;
   1265 
   1266 ofdisk[0-9]*)
   1267 	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
   1268 	%MKDISK% $name $unit $blk $chr
   1269 	;;
   1270 
   1271 xbd[0-9]*)
   1272 	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
   1273 	%MKDISK% $name $unit $blk $chr
   1274 	;;
   1275 
   1276 dk[0-9]*)
   1277 	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
   1278 	mkdev r$name$unit c $chr $unit 0640 $g_operator
   1279 	mkdev $name$unit b $blk  $unit 0640 $g_operator
   1280 	;;
   1281 
   1282 tprof)
   1283 	mkdev tprof c %tprof_chr% 0
   1284 	;;
   1285 
   1286 ttyCY[0-9]*)
   1287 	# Each unit number creates 32 pairs of {tty,dty} device nodes:
   1288 	# ttyCY0 => device nodes [td]tyCY000 to [td]tyCY031;
   1289 	# ttyCY1 => device nodes [td]tyCY032 to [td]tyCY063;
   1290 	name=tyCY; chr=%cy_chr%; off=32
   1291 	unit=${i#t${name}}
   1292 	minor=$(($unit * $off))
   1293 	eminor=$(($minor + $off))
   1294 	while [ $minor -lt $eminor ]
   1295 	do
   1296 		nminor=000$minor
   1297 		nminor=${nminor#${nminor%???}}
   1298 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1299 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1300 		minor=$(($minor + 1))
   1301 	done
   1302 	;;
   1303 
   1304 ttyCZ[0-9]*)
   1305 	# Each unit number creates 64 pairs of {tty,dty} device nodes:
   1306 	# ttyCZ0 => device nodes [td]tyCZ0000 to [td]tyCZ0063;
   1307 	# ttyCZ1 => device nodes [td]tyCZ0064 to [td]tyCZ0127;
   1308 	name=tyCZ; chr=%cz_chr%; off=64
   1309 	unit=${i#t${name}}
   1310 	minor=$(($unit * $off))
   1311 	eminor=$(($minor + $off))
   1312 	while [ $minor -lt $eminor ]
   1313 	do
   1314 		nminor=0000$minor
   1315 		nminor=${nminor#${nminor%????}}
   1316 		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
   1317 		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
   1318 		minor=$(($minor + 1))
   1319 	done
   1320 	;;
   1321 
   1322 
   1323 tty[0-9]|tty0[0-9])
   1324 	# some archs have built-in zstty (major %zstty_chr%) instead
   1325 	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
   1326 	# needs to be before com entry, for archs which have both
   1327 	unit=${i#tty}
   1328 	unit=$(($unit + 0))
   1329 	makedev ttyZ${unit}
   1330 	lndev ttyZ$unit tty0${unit}
   1331 	lndev dtyZ$unit dty0${unit}
   1332 	;;
   1333 
   1334 tty[0-9]*)
   1335 	unit=${i#tty}
   1336 	ounit=00$unit
   1337 	ounit=${ounit#${ounit%??}}
   1338 	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
   1339 	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
   1340 	;;
   1341 
   1342 ttyC[0-9]*)
   1343 		# some archs call com_chr ttyC traditionally
   1344 	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
   1345 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1346 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1347 	;;
   1348 
   1349 ttyh[0-9]*)
   1350 	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
   1351 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1352 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1353 	;;
   1354 
   1355 ttyTX[0-9]*)
   1356 	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
   1357 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1358 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1359 	;;
   1360 
   1361 ttyZ[0-9]*)
   1362 	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
   1363 	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
   1364 	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
   1365 	;;
   1366 
   1367 opty)
   1368 	# Create 16 device nodes, [pt]typ0 to [pt]typf,
   1369 	# same as "MAKEDEV pty0".
   1370 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   1371 	do
   1372 		case $j in
   1373 		[0-9])	jn=$j ;;
   1374 		a)	jn=10 ;;
   1375 		b)	jn=11 ;;
   1376 		c)	jn=12 ;;
   1377 		d)	jn=13 ;;
   1378 		e)	jn=14 ;;
   1379 		f)	jn=15 ;;
   1380 		esac
   1381 		mkdev ttyp$j c %pts_chr% $jn 666
   1382 		mkdev ptyp$j c %ptc_chr% $jn 666
   1383 	done
   1384 	;;
   1385 
   1386 pty[0-9]*)
   1387 	# Each unit number creates up to 16 pairs of {tty,pty} device nodes:
   1388 	# pty0 => 16 pairs, [tp]typ0 to [tp]typf
   1389 	# pty1 => 16 pairs, [tp]tyq0 to [tp]tyqf
   1390 	# pty16 => 16 pairs, [tp]typg to [tp]typv
   1391 	# pty17 => 16 pairs, [tp]typw to [tp]typL
   1392 	# pty18 => 14 pairs, [tp]typM to [tp]typZ
   1393 	warn "$i: creating BSD style tty nodes with ptyfs is a security issue"
   1394 	class=${i#pty}
   1395 	d1="p q r s t u v w x y z P Q R S T"
   1396 	if [ "$class" -ge 64 ]
   1397 	then
   1398 		warn "$i: pty unit must be between 0 and 63"
   1399 		continue
   1400 	elif [ "$class" -lt 16 ]
   1401 	then
   1402 		# pty[p-zP-T][0-9a-f]
   1403 		offset=0
   1404 		mult=0
   1405 		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
   1406 	else
   1407 		# pty[p-zP-T][g-zA-Z]
   1408 		class=$(($class - 16))
   1409 		offset=256
   1410 		mult=2
   1411 		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"
   1412 	fi
   1413 	start=$(($class * 16))
   1414 	set -- $d2
   1415 	nt=$#
   1416 	s1=$(($start / $nt))
   1417 	set -- $d1
   1418 	shift $s1
   1419 	t1=$1
   1420 	if [ "$t1" = v ]; then
   1421 		warn "$i: pty unit conflicts with console ttyv0 device"
   1422 		continue
   1423 	fi
   1424 	s2=$(($start % ($nt - $s1 * $mult)))
   1425 	set -- $d2
   1426 	shift $s2
   1427 	t2=$1
   1428 	unit=$(($start + $offset - $s1 * $mult))
   1429 	end=$(($unit + 16))
   1430 	while [ "$unit" -lt "$end" ]
   1431 	do
   1432 		mkdev tty$t1$t2 c %pts_chr% $unit 666
   1433 		mkdev pty$t1$t2 c %ptc_chr% $unit 666
   1434 		shift
   1435 		t2=$1
   1436 		if [ -z "$t2" ]
   1437 		then
   1438 			break
   1439 		fi
   1440 		unit=$(($unit + 1))
   1441 	done
   1442 	;;
   1443 
   1444 stic[0-9]*)
   1445 	unit=${i#stic}
   1446 	mkdev stic$unit c %stic_chr% $unit
   1447 	;;
   1448 
   1449 st[0-9]*)
   1450 	name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%
   1451 	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
   1452 	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
   1453 	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
   1454 	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
   1455 	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
   1456 	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
   1457 	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
   1458 	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
   1459 	;;
   1460 
   1461 ses[0-9]*|ch[0-9]*|uk[0-9]*)
   1462 	case $i in
   1463 	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
   1464 	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
   1465 	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
   1466 	esac
   1467 	mkdev $name$unit c $chr $unit 640 $g_operator
   1468 	;;
   1469 
   1470 cd[0-9]*)
   1471 	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr%
   1472 	;;
   1473 
   1474 mcd[0-9]*)
   1475 	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
   1476 	;;
   1477 
   1478 gdrom[0-9]*)
   1479 	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
   1480 	;;
   1481 
   1482 lpt[0-9]*|lpa[0-9]*)
   1483 	case $i in
   1484 	lpt*) name=lpt; unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
   1485 	lpa*) name=lpa; unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
   1486 	esac
   1487 	mkdev $name$unit c $chr $(($unit + $flags))
   1488 	mkdev lpt${unit}ctl c $chr $(($unit + 256))
   1489 	;;
   1490 
   1491 bpf)
   1492 	mkdev bpf	c %bpf_chr% 0
   1493 	lndev bpf bpf0
   1494 	;;
   1495 
   1496 npf)
   1497 	mkdev npf	c %npf_chr% 0
   1498 	;;
   1499 
   1500 bthub)
   1501 	mkdev bthub c %bthub_chr% 0
   1502 	;;
   1503 
   1504 tun[0-9]*)
   1505 	unit=${i#tun}
   1506 	mkdev tun$unit c %tun_chr% $unit
   1507 	;;
   1508 
   1509 joy[0-9]*)
   1510 	unit=${i#joy}
   1511 	mkdev joy$unit c %joy_chr% $unit
   1512 	;;
   1513 
   1514 ipl)
   1515 	mkdev ipl	c %ipl_chr% 0
   1516 	mkdev ipnat	c %ipl_chr% 1
   1517 	mkdev ipstate	c %ipl_chr% 2
   1518 	mkdev ipauth	c %ipl_chr% 3
   1519 	mkdev ipsync	c %ipl_chr% 4
   1520 	mkdev ipscan	c %ipl_chr% 5
   1521 	mkdev iplookup	c %ipl_chr% 6
   1522 	;;
   1523 
   1524 pf)
   1525 	mkdev pf c %pf_chr% 0
   1526 	;;
   1527 
   1528 crypto)
   1529 	mkdev crypto c %crypto_chr% 0 666
   1530 	;;
   1531 
   1532 cmos)
   1533 	mkdev cmos c %cmos_chr% 0 644
   1534 	;;
   1535 
   1536 speaker)
   1537 	mkdev speaker c %spkr_chr% 0
   1538 	;;
   1539 
   1540 lockstat)
   1541 	mkdev lockstat c %lockstat_chr% 0
   1542 	;;
   1543 
   1544 cpuctl)
   1545 	mkdev cpuctl c %cpuctl_chr% 0 666
   1546 	;;
   1547 
   1548 audio|audio[0-9]*)
   1549 	unit=${i#audio}
   1550 	audio=audio$unit
   1551 	sound=sound$unit
   1552 	mixer=mixer$unit
   1553 	audioctl=audioctl$unit
   1554 	: ${unit:-0}
   1555 	mkdev $sound	c %audio_chr% $(($unit + 0))	666
   1556 	mkdev $audio	c %audio_chr% $(($unit + 128))	666
   1557 	mkdev $mixer	c %audio_chr% $(($unit + 16))	666
   1558 	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
   1559 	;;
   1560 
   1561 hdaudio[0-9]*)
   1562 	unit=${i#hdaudio}
   1563 	mkdev hdaudio$unit c %hdaudio_chr% $unit 644
   1564 	;;
   1565 
   1566 hdmicec[0-9]*)
   1567 	uint=${i#hdmicec}
   1568 	mkdev hdmicec$unit c %hdmicec_chr% $unit 644
   1569 	;;
   1570 
   1571 gpio[0-9]*)
   1572 	unit=${i#gpio}
   1573 	mkdev gpio$unit c %gpio_chr% $unit 664 $g_gpio
   1574 	;;
   1575 
   1576 gpioirq[0-9]*)
   1577 	unit=${i#gpioirq}
   1578 	mkdev gpioirq$unit c %gpioirq_chr% $unit 444 $g_gpio
   1579 	;;
   1580 
   1581 gpiopps[0-9]*)
   1582 	unit=${i#gpiopps}
   1583 	mkdev gpiopps$unit c %gpiopps_chr% $unit 664 $g_gpio
   1584 	;;
   1585 
   1586 lua[0-9]*)
   1587 	unit=${i#lua}
   1588 	mkdev lua$unit c %lua_chr% $unit 664
   1589 	;;
   1590 
   1591 rmidi[0-9]*)
   1592 	unit=${i#rmidi}
   1593 	mkdev rmidi$unit c %midi_chr% $unit 666
   1594 	;;
   1595 
   1596 music|music[0-9]*)
   1597 	unit=${i#music}
   1598 	: ${unit:-0}
   1599 	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
   1600 	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128)) 666
   1601 	;;
   1602 
   1603 radio|radio[0-9]*)
   1604 	unit=${i#radio}
   1605 	: ${unit:-0}
   1606 	mkdev radio$unit c %radio_chr% $unit 666
   1607 	;;
   1608 
   1609 video|video[0-9]*)
   1610 	unit=${i#video}
   1611 	: ${unit:-0}
   1612 	mkdev video$unit c %video_chr% $unit 666
   1613 	;;
   1614 
   1615 dtv[0-9]*)
   1616 	unit=${i#dtv}
   1617 	makedir dvb 755
   1618 	makedir dvb/adapter$unit 755
   1619 	mkdev dvb/adapter$unit/frontend0 c %dtv_chr% $(($unit + 0)) 666
   1620 	mkdev dvb/adapter$unit/demux0 c %dtv_chr% $(($unit + 16)) 666
   1621 	mkdev dvb/adapter$unit/dvr0 c %dtv_chr% $(($unit + 32)) 666
   1622 	;;
   1623 
   1624 iic[0-9]*)
   1625 	unit=${i#iic}
   1626 	: ${unit:-0}
   1627 	mkdev iic$unit c %iic_chr% $unit 600
   1628 	;;
   1629 
   1630 spi[0-9]*)
   1631 	unit=${i#spi}
   1632 	: ${unit:-0}
   1633 	mkdev spi$unit c %spi_chr% $unit 600
   1634 	;;
   1635 
   1636 amr[0-9]*)
   1637 	unit=${i#amr}
   1638 	mkdev amr$unit c %amr_chr% $unit
   1639 	;;
   1640 
   1641 apm)
   1642 	mkdev apm	c %apm_chr% 0 644
   1643 	mkdev apmctl	c %apm_chr% 8 644
   1644 	;;
   1645 
   1646 apm)
   1647 		# hpcmips uses `apmdev_chr' instead of `apm_chr'
   1648 	mkdev apm	c %apmdev_chr% 0 644
   1649 	mkdev apmctl	c %apmdev_chr% 8 644
   1650 	;;
   1651 
   1652 random)
   1653 	mkdev random	c %rnd_chr% 0 444
   1654 	mkdev urandom	c %rnd_chr% 1 644
   1655 	;;
   1656 
   1657 cfs)
   1658 	makedev cfs0
   1659 	;;
   1660 
   1661 cfs[0-9]*)
   1662 	unit=${i#cfs}
   1663 	mkdev cfs$unit c %vcoda_chr% $unit
   1664 	;;
   1665 
   1666 sysmon)
   1667 	mkdev sysmon	c %sysmon_chr% 0 644
   1668 	mkdev watchdog	c %sysmon_chr% 1 644
   1669 	mkdev power	c %sysmon_chr% 2 640
   1670 	;;
   1671 
   1672 scsibus[0-9]*)
   1673 	unit=${i#scsibus}
   1674 	mkdev scsibus$unit c %scsibus_chr% $unit 644
   1675 	;;
   1676 
   1677 bktr)
   1678 	makedev bktr0 bktr1
   1679 	lndev	bktr0	bktr
   1680 	lndev	tuner0	tuner
   1681 	lndev	vbi0	vbi
   1682 	;;
   1683 
   1684 bktr[0-9]*)
   1685 	unit=${i#bktr}
   1686 	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
   1687 	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
   1688 	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
   1689 	;;
   1690 
   1691 io)
   1692 	mkdev		io	c %mem_chr% 14	600
   1693 	;;
   1694 
   1695 iop[0-9]*)
   1696 	unit=${i#iop}
   1697 	mkdev iop$unit c %iop_chr% $unit
   1698 	;;
   1699 
   1700 mfi[0-9]*)
   1701 	unit=${i#mfi}
   1702 	mkdev mfi$unit c %mfi_chr% $unit
   1703 	;;
   1704 
   1705 mlx[0-9]*)
   1706 	unit=${i#mlx}
   1707 	mkdev mlx$unit c %mlx_chr% $unit
   1708 	;;
   1709 
   1710 mly[0-9]*)
   1711 	unit=${i#mly}
   1712 	mkdev mly$unit c %mly_chr% $unit
   1713 	;;
   1714 
   1715 twa[0-9]*)
   1716 	unit=${i#twa}
   1717 	mkdev twa$unit c %twa_chr% $unit
   1718 	;;
   1719 
   1720 twe[0-9]*)
   1721 	unit=${i#twe}
   1722 	mkdev twe$unit c %twe_chr% $unit
   1723 	;;
   1724 
   1725 icp[0-9]*)
   1726 	unit=${i#icp}
   1727 	mkdev icp$unit c %icp_chr% $unit
   1728 	;;
   1729 
   1730 agp[0-9]*)
   1731 	unit=${i#agp}
   1732 	mkdev agp$unit c %agp_chr% $unit 644
   1733 	if [ "$unit" = "0" ]; then
   1734 		lndev agp$unit agpgart
   1735 	fi
   1736 	;;
   1737 
   1738 pci[0-9]*)
   1739 	unit=${i#pci}
   1740 	mkdev pci$unit c %pci_chr% $unit 640
   1741 	;;
   1742 
   1743 dpti[0-9]*)
   1744 	unit=${i#dpti}
   1745 	mkdev dpti$unit c %dpti_chr% $unit
   1746 	;;
   1747 
   1748 dpt[0-9]*)
   1749 	unit=${i#dpt}
   1750 	mkdev dpt$unit c %dpt_chr% $unit
   1751 	;;
   1752 
   1753 altq)
   1754 	makedir altq 755
   1755 	unit=0
   1756 	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq jobs
   1757 	do
   1758 		mkdev altq/$dev c %altq_chr% $unit 644
   1759 		unit=$(($unit + 1))
   1760 	done
   1761 	;;
   1762 
   1763 wsfont)
   1764 	mkdev wsfont c %wsfont_chr% 0 644
   1765 	;;
   1766 
   1767 cir[0-9]*)
   1768 	unit=${i#cir}
   1769 	mkdev cir$unit c %cir_chr% $unit 666
   1770 	;;
   1771 
   1772 irframe[0-9]*)
   1773 	unit=${i#irframe}
   1774 	mkdev irframe$unit c %irframe_chr% $unit
   1775 	;;
   1776 
   1777 fcom[0-9]*)
   1778 	unit=${i#fcom}
   1779 	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
   1780 	;;
   1781 
   1782 openfirm)
   1783 	mkdev openfirm c %openfirm_chr% 0 444
   1784 	;;
   1785 
   1786 pad[0-9]*)
   1787 	unit=${i#pad}
   1788 	mkdev pad$unit c %pad_chr% $unit 444
   1789 	;;
   1790 
   1791 qemufwcfg[0-9]*)
   1792 	unit=${i#qemufwcfg}
   1793 	mkdev qemufwcfg$unit c %qemufwcfg_chr% $unit 660
   1794 	;;
   1795 
   1796 vio9p[0-9]*)
   1797 	unit=${i#vio9p}
   1798 	mkdev vio9p$unit c %vio9p_chr% $unit 660
   1799 	;;
   1800 
   1801 fault)
   1802 	mkdev fault c %fault_chr% 0
   1803 	;;
   1804 
   1805 nvram)
   1806 	mkdev nvram c %nvram_chr% 0 644
   1807 	;;
   1808 
   1809 rtc)
   1810 	mkdev rtc c %rtc_chr% 0 644
   1811 	;;
   1812 
   1813 clockctl)
   1814 	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
   1815 	;;
   1816 
   1817 kttcp)
   1818 	mkdev kttcp c %kttcp_chr% 0
   1819 	;;
   1820 
   1821 dmoverio)
   1822 	mkdev dmoverio c %dmoverio_chr% 0 644
   1823 	;;
   1824 
   1825 veriexec)
   1826 	mkdev veriexec c %veriexec_chr% 0 600
   1827 	;;
   1828 
   1829 vhci[0-7]*)
   1830 	unit=${i#vhci}
   1831 	mkdev vhci$unit c %vhci_chr% $unit
   1832 	;;
   1833 
   1834 ttyv[0-9]*)
   1835 	unit=${i#ttyv}
   1836 	mkdev ttyv$unit c %pc_chr% $unit
   1837 	;;
   1838 
   1839 # arm, acorn32
   1840 ttyv[0-9]*)
   1841 	unit=${i#ttyv}
   1842 	mkdev ttyv$unit c %physcon_chr% $unit
   1843 	;;
   1844 
   1845 arcpp[0-9]*)
   1846 	unit=${i#arcpp}
   1847 	mkdev arcpp$unit c %arcpp_chr% $unit
   1848 	;;
   1849 
   1850 par[0-9]*)
   1851 	unit=${i#par}
   1852 	case $unit in
   1853 	0)
   1854 		mkdev par$unit c %par_chr% $unit
   1855 		;;
   1856 	*)
   1857 		warn "bad unit for par in: $i"
   1858 		;;
   1859 	esac
   1860 	;;
   1861 
   1862 cpi[0-9]*)
   1863 	unit=${i#cpi}
   1864 	mkdev cpi$unit c %cpi_chr% $unit
   1865 	;;
   1866 
   1867 ite[0-9]*|ttye[0-9]*)
   1868 	case $i in
   1869 	ite*)	unit=${i#ite};;
   1870 	ttye*)	unit=${i#ttye};;
   1871 	esac
   1872 	mkdev ttye$unit c %ite_chr% $unit
   1873 	;;
   1874 
   1875 pms[0-9]*)
   1876 	unit=${i#pms}
   1877 	mkdev pms$unit c %opms_chr% $unit
   1878 	;;
   1879 
   1880 qms[0-9]*)
   1881 	unit=${i#qms}
   1882 	mkdev qms$unit c %qms_chr% $unit
   1883 	;;
   1884 
   1885 lms[0-9]*)
   1886 	unit=${i#lms}
   1887 	mkdev lms$unit c %lms_chr% $unit
   1888 	;;
   1889 
   1890 mms[0-9]*)
   1891 	unit=${i#mms}
   1892 	mkdev mms$unit c %mms_chr% $unit
   1893 	;;
   1894 
   1895 mouse-pms[0-9]*|mouse-qms[0-9]*)
   1896 	case $i in
   1897 	mouse-pms*) name=pms ;;
   1898 	mouse-qms*) name=qms ;;
   1899 	esac
   1900 	unit=${i#mouse-${name}}
   1901 	lndev $name$unit mouse
   1902 	;;
   1903 
   1904 kbd)
   1905 	mkdev kbd c %kbd_chr% 0
   1906 	;;
   1907 
   1908 kbdctl)
   1909 	mkdev kbdctl c %kbd_chr% 1
   1910 	;;
   1911 
   1912 vidcconsole0)
   1913 	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
   1914 	;;
   1915 
   1916 view[0-9]*)
   1917 	unit=${i#view}
   1918 	mkdev view$unit c %view_chr% $unit 666
   1919 	;;
   1920 
   1921 mouse[0-9]*)
   1922 	unit=${i#mouse}
   1923 	case $unit in
   1924 	0|1)
   1925 		mkdev mouse$unit c %ms_chr% $unit 666
   1926 		if [ $unit = 0 ]; then
   1927 			lndev mouse$unit mouse
   1928 		fi
   1929 		;;
   1930 	*)
   1931 		warn "bad unit for mouse in: $i"
   1932 		;;
   1933 	esac
   1934 	;;
   1935 
   1936 panel)
   1937 	mkdev panel0 c %panel_chr% 0 660
   1938 	;;
   1939 
   1940 tslcd)
   1941 	mkdev tslcd0 c %tslcd_chr% 0 660
   1942 	;;
   1943 
   1944 ipty)
   1945 	mkdev ttyp0 c %pts_chr% 0 666
   1946 	mkdev ttyp1 c %pts_chr% 1 666
   1947 	mkdev ptyp0 c %ptc_chr% 0 666
   1948 	mkdev ptyp1 c %ptc_chr% 1 666
   1949 	;;
   1950 
   1951 ptm)
   1952 	makedir pts 755
   1953 	mkdev ptmx c %ptm_chr% 0 666
   1954 	mkdev ptm c %ptm_chr% 1 666
   1955 	;;
   1956 
   1957 grf[0-9]*)
   1958 	unit=${i#grf}
   1959 	mkdev grf$unit c %grf_chr% $unit 666
   1960 	;;
   1961 
   1962 etvme)
   1963 	mkdev etvme c %et_chr% 0
   1964 	;;
   1965 
   1966 leo[0-9]*)
   1967 	unit=${i#leo}
   1968 	mkdev leo$unit c %leo_chr% $unit
   1969 	;;
   1970 
   1971 scif[0-9]*)
   1972 	unit=${i#scif}
   1973 	mkdev scif$unit c %scif_chr% $(($unit + $dialin )) "" "" $u_uucp
   1974 	mkdev dscif$unit c %scif_chr% $(($unit + $dialout)) "" "" $u_uucp
   1975 	;;
   1976 
   1977 sci[0-9]*)
   1978 	unit=${i#sci}
   1979 	mkdev sci$unit c %sci_chr% $(($unit + $dialin )) "" "" $u_uucp
   1980 	mkdev dsci$unit c %sci_chr% $(($unit + $dialout)) "" "" $u_uucp
   1981 	;;
   1982 
   1983 maple[ABCD]|maple[ABCD][0-9]*)
   1984 	case $i in
   1985 	mapleA*) name="mapleA"; unit=0;;
   1986 	mapleB*) name="mapleB"; unit=1;;
   1987 	mapleC*) name="mapleC"; unit=2;;
   1988 	mapleD*) name="mapleD"; unit=3;;
   1989 	esac
   1990 	subunit=${i#$name}
   1991 	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
   1992 	;;
   1993 
   1994 mmem[0-9]*)
   1995 	unit=${i#mmem}
   1996 	for pt in 0	# 1 2 3 4 ... 255
   1997 	do
   1998 #		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   1999 		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   2000 #		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
   2001 		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
   2002 	done
   2003 	;;
   2004 
   2005 mlcd[0-9]*)
   2006 	unit=${i#mlcd}
   2007 	for pt in 0	# 1 2 3 4 ... 255
   2008 	do
   2009 		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
   2010 	done
   2011 	;;
   2012 
   2013 ixpcom[0-9]*)
   2014 	unit=${i#ixpcom}
   2015 	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
   2016 	;;
   2017 
   2018 epcom[0-9]*)
   2019 	unit=${i#epcom}
   2020 	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
   2021 	;;
   2022 
   2023 plcom[0-9]*)
   2024 	unit=${i#plcom}
   2025 	mkdev plcom$unit c %plcom_chr% $unit "" "" $u_uucp
   2026 	mkdev dplcom$unit c %plcom_chr% $(($unit + $dialout)) "" "" $u_uucp
   2027 	;;
   2028 
   2029 wmcom[0-9]*)
   2030 	unit=${i#wmcom}
   2031 	mkdev wmcom$unit c %wmcom_chr% $unit "" "" $u_uucp
   2032 	;;
   2033 
   2034 ucbsnd)
   2035 	mkdev ucbsnd c %ucbsnd_chr% 0 666
   2036 	;;
   2037 
   2038 adb)
   2039 	mkdev adb c %aed_chr% 0 666
   2040 	;;
   2041 
   2042 asc[0-9]*)
   2043 	unit=${i#asc}
   2044 	mkdev asc$unit c %asc_chr% $unit 666
   2045 	;;
   2046 
   2047 bwtwo[0-9]*)
   2048 	unit=${i#bwtwo}
   2049 	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
   2050 	;;
   2051 
   2052 cgtwo[0-9]*)
   2053 	unit=${i#cgtwo}
   2054 	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
   2055 	;;
   2056 
   2057 cgthree[0-9]*)
   2058 	unit=${i#cgthree}
   2059 	mkdev cgthree$unit c %cgthree_chr% $unit 666
   2060 	;;
   2061 
   2062 cgfour[0-9]*)
   2063 	unit=${i#cgfour}
   2064 	mkdev cgfour$unit c %cgfour_chr% $unit 666
   2065 	;;
   2066 
   2067 cgsix[0-9]*)
   2068 	unit=${i#cgsix}
   2069 	mkdev cgsix$unit c %cgsix_chr% $unit 666
   2070 	;;
   2071 
   2072 cgeight[0-9]*)
   2073 	unit=${i#cgeight}
   2074 	mkdev cgeight$unit c %cgeight_chr% $unit 666
   2075 	;;
   2076 
   2077 tcx[0-9]*)
   2078 	unit=${i#tcx}
   2079 	mkdev tcx$unit c %tcx_chr% $unit 666
   2080 	;;
   2081 
   2082 xd[0-9]*|xy[0-9]*)
   2083 	case $i in
   2084 	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
   2085 	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
   2086 	esac
   2087 	%MKDISK% $name $unit $blk $chr
   2088 	;;
   2089 
   2090 magma[0-9]*)
   2091 	unit=${i#magma}
   2092 	if [ 0$unit -gt 3 ]; then
   2093 		warn "bad unit for $i: $unit"
   2094 		break
   2095 	fi
   2096 	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
   2097 	do
   2098 		case $j in
   2099 		[0-9])	jn=$j ;;
   2100 		a)	jn=10 ;;
   2101 		b)	jn=11 ;;
   2102 		c)	jn=12 ;;
   2103 		d)	jn=13 ;;
   2104 		e)	jn=14 ;;
   2105 		f)	jn=15 ;;
   2106 		esac
   2107 		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
   2108 	done
   2109 	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
   2110 	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
   2111 	;;
   2112 
   2113 clcd[0-9]*)
   2114 	unit=${i#clcd}
   2115 	if [ 0$unit -gt 7 ]; then
   2116 		warn "bad unit for $i: $unit"
   2117 		break
   2118 	fi
   2119 	for j in 0 1 2 3 4 5 6 7
   2120 	do
   2121 		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
   2122 		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
   2123 	done
   2124 	;;
   2125 
   2126 spif[0-9]*)
   2127 	unit=${i#spif}
   2128 	if [ 0$unit -gt 3 ]; then
   2129 		warn "bad unit for $i: $unit"
   2130 		break
   2131 	fi
   2132 	for j in 0 1 2 3 4 5 6 7; do
   2133 		mkdev ttyS$unit$j c %stty_chr% $(($unit * 64 + $j)) "" "" $u_uucp
   2134 	done
   2135 	mkdev bppS${unit}0 c %sbpp_chr% $(($unit * 64 + 0))
   2136 	mkdev bppS${unit}1 c %sbpp_chr% $(($unit * 64 + 1))
   2137 	;;
   2138 
   2139 bpp|bpp[0-9]*)
   2140 	unit=${i#bpp}
   2141 	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
   2142 	;;
   2143 
   2144 tctrl[0-9]*)
   2145 	unit=${i#tctrl}
   2146 	mkdev tctrl$unit c %tctrl_chr% $unit 666
   2147 	;;
   2148 
   2149 bmd[0-9]*)
   2150 	unit=${i#bmd}
   2151 	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
   2152 	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
   2153 	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
   2154 	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
   2155 	;;
   2156 
   2157 sram)
   2158 	mkdev sram c %sram_chr% 0 644
   2159 	;;
   2160 
   2161 ttyS[0-9]*)
   2162 	unit=${i#ttyS}
   2163 	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
   2164 	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
   2165 	;;
   2166 
   2167 atabus[0-9]*)
   2168 	unit=${i#atabus}
   2169 	mkdev atabus$unit c %atabus_chr% $unit 644
   2170 	;;
   2171 
   2172 drm[0-9]*)
   2173 	unit=${i#drm}
   2174 	unit2=$((unit + 128))
   2175 	makedir dri 755
   2176 	mkdev dri/card$unit c %drm_chr% $unit 660
   2177 	mkdev dri/renderD${unit2} c %drm_chr% ${unit2} 660
   2178 	;;
   2179 
   2180 drvctl)
   2181 	mkdev drvctl c %drvctl_chr% 0 644
   2182 	;;
   2183 
   2184 isv)
   2185 	mkdev isv c %isv_chr% 0 644
   2186 	;;
   2187 
   2188 tap|tap[0-9]*)
   2189 	unit=${i#tap}
   2190 	case "$unit" in
   2191 	[0-9]*)
   2192 		mkdev tap${unit} c %tap_chr% ${unit} 600
   2193 		;;
   2194 	"")
   2195 		mkdev tap c %tap_chr% 0xfffff 600
   2196 		;;
   2197 	esac
   2198 	;;
   2199 
   2200 srt[0-9]*)
   2201 	unit=${i#srt}
   2202 	mkdev srt$unit c %srt_chr% $unit 600
   2203 	;;
   2204 
   2205 tpm)
   2206 	mkdev tpm c %tpm_chr% 0 600
   2207 	;;
   2208 
   2209 dtrace)
   2210 	makedir dtrace 755
   2211 	mkdev dtrace/dtrace c %dtrace_chr% 0 600
   2212 	;;
   2213 
   2214 fw[0-9]*)
   2215 	unit=${i#fw}
   2216 	for j in 0 1 2 3
   2217 	do
   2218 		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
   2219 		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
   2220 	done
   2221 	;;
   2222 
   2223 # create putter device and symlinks for all subsystems using it
   2224 putter)
   2225 	mkdev putter c %putter_chr% 0 600
   2226 	mkdev pud c %putter_chr% 1 600
   2227 	lndev putter puffs
   2228 	;;
   2229 
   2230 zfs)
   2231 	mkdev zfs c %zfs_chr% 0 600
   2232 	makedir zpool 755
   2233 	;;
   2234 
   2235 iscsi[0-9]*)
   2236 	unit=${i#iscsi}
   2237 	mkdev iscsi${unit} c %iscsi_chr% $unit 600
   2238 	;;
   2239 
   2240 vchiq)
   2241 	mkdev vchiq c %vchiq_chr% 0 600
   2242 	;;
   2243 
   2244 nvme[0-9]*ns[0-9]*)
   2245 	unit=${i#nvme}
   2246 	unit=${unit%ns*}
   2247 	subunit=${i#nvme${unit}ns}
   2248 	if [ 0$subunit -le 0 ] || [ 0$subunit -ge 65536 ]; then
   2249 		warn "bad nsid for $i: $subunit"
   2250 		break
   2251 	fi
   2252 	mkdev nvme${unit}ns$subunit c %nvme_chr% $(($unit * 65536 + $subunit))
   2253 	;;
   2254 
   2255 nvme[0-9]*)
   2256 	unit=${i#nvme}
   2257 	mkdev nvme$unit c %nvme_chr% $(($unit * 65536))
   2258 	;;
   2259 
   2260 nvmm)
   2261 	mkdev nvmm c %nvmm_chr% 0 660 $g_nvmm
   2262 	;;
   2263 
   2264 autofs)
   2265 	mkdev autofs c %autofs_chr% 0 600
   2266 	;;
   2267 
   2268 kcov)
   2269         mkdev kcov c %kcov_chr% 0
   2270         ;;
   2271 
   2272 ipmi[0-9]*)
   2273 	unit=${i#ipmi}
   2274 	mkdev ipmi${unit} c %ipmi_chr% $unit 600
   2275 	;;
   2276 
   2277 xmm[0-9])
   2278 	unit=${i#xmm}
   2279 	makedir xmm${unit} 755
   2280 	mkdev xmm${unit}/rpc c %wwanc_chr% $(($unit * 65536 + 1))
   2281 	mkdev ttyXMM${unit}0 c %wwanc_chr% $(($unit * 65536 + 2))
   2282 	mkdev ttyXMM${unit}1 c %wwanc_chr% $(($unit * 65536 + 4))
   2283 	;;
   2284 
   2285 acpi)
   2286 	mkdev acpi c %acpi_chr% 0
   2287 	;;
   2288 
   2289 smbios)
   2290 	mkdev smbios c %smbios_chr% 0
   2291 	;;
   2292 
   2293 efi)
   2294 	mkdev efi c %efi_chr% 0 660
   2295 	;;
   2296 
   2297 sht3xtemp[0-9]*)
   2298 	unit=${i#sht3xtemp}
   2299 	mkdev sht3xtemp$unit c %sht3xtemp_chr% $unit 664
   2300 	;;
   2301 
   2302 scmd[0-9]*)
   2303 	unit=${i#scmd}
   2304 	mkdev scmd$unit c %scmd_chr% $unit 666
   2305 	;;
   2306 
   2307 ttyVI[0-9][0-9])
   2308 	port=${i#ttyVI?}
   2309 	devunit=${i%$port}
   2310 	unit=${devunit#ttyVI}
   2311 	mkdev ttyVI$unit$port c %viocon_chr% $((16*$unit + $port))
   2312 	;;
   2313 
   2314 ttyVI)
   2315 	makedev ttyVI00 ttyVI10 ttyVI20 ttyVI30
   2316 	;;
   2317 
   2318 midevend)
   2319 %MI_DEVICES_END%
   2320 local)
   2321 	if [ -f "$0.local" ]; then
   2322 		umask 0
   2323 		if [ -n "$count_nodes" ]; then
   2324 			count_nodes=$((count_nodes + \
   2325 			    $(linecount "$("$HOST_SH" "$0.local" $opts -s all)") ))
   2326 		else
   2327 			"$HOST_SH" "$0.local" $opts all
   2328 		fi
   2329 		umask 077
   2330 	fi
   2331 	;;
   2332 
   2333 *)
   2334 	warn "$i: unknown device"
   2335 	;;
   2336 
   2337 esac
   2338 done
   2339 
   2340 }
   2341 
   2342 
   2343 # three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
   2344 # hack; only the one used by port is retained in final MAKEDEV script
   2345 # routine is called as:
   2346 # makedisk name unit blk chr
   2347 makedisk_p8()
   2348 {
   2349 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2350 
   2351 	ro=%RAWDISK_OFF%
   2352 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2353 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2354 
   2355 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2356 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2357 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2358 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2359 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2360 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2361 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2362 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2363 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2364 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2365 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2366 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2367 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2368 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2369 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2370 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2371 }
   2372 
   2373 makedisk_p12high()
   2374 {
   2375 	ho=524280	# offset for partition 9 to 11 (same as ...p16high)
   2376 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2377 
   2378 	ro=%RAWDISK_OFF%
   2379 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2380 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2381 
   2382 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2383 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2384 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2385 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2386 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2387 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2388 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2389 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2390 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2391 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2392 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2393 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2394 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2395 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2396 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2397 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2398 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2399 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2400 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2401 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2402 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2403 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2404 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2405 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2406 }
   2407 
   2408 makedisk_p16()
   2409 {
   2410 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2411 
   2412 	ro=%RAWDISK_OFF%
   2413 	mkdev ${name}${unit}	b $blk $(($unit * 16 + $ro))	640 $g_operator
   2414 	mkdev r${name}${unit}	c $chr $(($unit * 16 + $ro))	640 $g_operator
   2415 
   2416 	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
   2417 	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
   2418 	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
   2419 	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
   2420 	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
   2421 	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
   2422 	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
   2423 	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
   2424 	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
   2425 	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
   2426 	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
   2427 	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
   2428 	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
   2429 	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
   2430 	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
   2431 	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
   2432 	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
   2433 	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
   2434 	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
   2435 	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
   2436 	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
   2437 	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
   2438 	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
   2439 	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
   2440 	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
   2441 	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
   2442 	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
   2443 	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
   2444 	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
   2445 	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
   2446 	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
   2447 	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
   2448 }
   2449 
   2450 makedisk_p16high()
   2451 {
   2452 	ho=524280	# offset for partition 9 to 16
   2453 	name="$1"; unit="$2"; blk="$3"; chr="$4"
   2454 
   2455 	ro=%RAWDISK_OFF%
   2456 	mkdev ${name}${unit}	b $blk $(($unit * 8 + $ro))	640 $g_operator
   2457 	mkdev r${name}${unit}	c $chr $(($unit * 8 + $ro))	640 $g_operator
   2458 
   2459 	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
   2460 	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
   2461 	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
   2462 	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
   2463 	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
   2464 	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
   2465 	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
   2466 	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
   2467 	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8)) 640 $g_operator
   2468 	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9)) 640 $g_operator
   2469 	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
   2470 	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
   2471 	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
   2472 	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
   2473 	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
   2474 	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
   2475 	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
   2476 	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
   2477 	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
   2478 	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
   2479 	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
   2480 	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
   2481 	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
   2482 	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
   2483 	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8)) 640 $g_operator
   2484 	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9)) 640 $g_operator
   2485 	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
   2486 	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
   2487 	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
   2488 	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
   2489 	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
   2490 	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
   2491 }
   2492 
   2493 # make only the very few basic disk device nodes - 'a' partition
   2494 # and raw partition
   2495 makedisk_minimal()
   2496 {
   2497 	name=$1; unit=$2; blk=$3; chr=$4
   2498 	doff=%DISKMINOROFFSET%
   2499 	ro=%RAWDISK_OFF%
   2500 	rn=%RAWDISK_NAME%
   2501 
   2502 	mkdev ${name}${unit}	b $blk $(($unit * $doff + $ro))	640 $g_operator
   2503 	mkdev r${name}${unit}	c $chr $(($unit * $doff + $ro))	640 $g_operator
   2504 
   2505 	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
   2506 	mkdev ${name}${unit}$rn b $blk $(($unit * $doff + $ro)) 640 $g_operator
   2507 	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
   2508 	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
   2509 }
   2510 
   2511 # create_mfs_dev nodes
   2512 #	Create a memory file system for a given number of device nodes,
   2513 #	and mount it.  Attempts to use mount_tmpfs, or falls back to
   2514 #	mount_mfs.
   2515 #
   2516 #	If do_redirect, then also redirect output to the console.
   2517 #
   2518 create_mfs_dev()
   2519 {
   2520 	ndevnodes=${1-1200}
   2521 	dev_mountpoint=${PWD:-/dev}
   2522 
   2523 	# Number of inodes is the specified number of device nodes, plus
   2524 	# a margin to allow for extra device nodes created later.
   2525 	ninode=$((ndevnodes * 11 / 10))
   2526 	# Add 2 reserved inodes (needed for both mfs and tmpfs), and round
   2527 	# up to a multiple of 32 (needed for mfs, not needed for tmpfs).
   2528 	ninode=$(( (ninode + 2 + 31) / 32 * 32 ))
   2529 	# Try tmpfs; if that fails try mfs.
   2530 	#
   2531 	# For tmpfs, allocate 16KB and 512 byte per node.
   2532 	# Actual requirements are much lower, but the size limit
   2533 	# is only intended to avoid accidental writing to /dev.
   2534 	fs_bytes=$((16384 + ninode * 512))
   2535 	if mount_tmpfs -s $fs_bytes -n $ninode -m 0755 \
   2536 		-o union tmpfs "$dev_mountpoint"
   2537 	then
   2538 		fstype=tmpfs
   2539 	else
   2540 		# This file system size calculation is exact for mount_mfs(8)
   2541 		# with 512-byte sectors.  40960 bytes (80 blocks) is the
   2542 		# minimum size allowed by mount_mfs.
   2543 		fs_bytes=$((8192 + 2 * 8192 + 4096 + ninode*512 + 8192))
   2544 		[ "$fs_bytes" -lt 40960 ] && fs_bytes=40960
   2545 		fs_blocks=$((fs_bytes/512))
   2546 		if mount_mfs -b 4096 -f 512 -s $fs_blocks -n $ninode -p 0755 \
   2547 		    -o union swap "$dev_mountpoint"
   2548 		then
   2549 			fstype=mfs
   2550 		else
   2551 			die "Failed to create memory file system"
   2552 		fi
   2553 	fi
   2554 
   2555 	# Our current directory was in the lower file system; change it to
   2556 	# the newly mounted upper file system.
   2557 	cd "$dev_mountpoint"
   2558 
   2559 	if $do_redirect; then
   2560 		# Redirect stdout and stderr to console
   2561 		${MKNOD} -m 600 -g 0 -u 0 temp_console c %CONSOLE_CMAJOR% 0
   2562 		exec >temp_console 2>&1
   2563 		rm temp_console
   2564 	fi
   2565 
   2566 	echo "Created $fstype $dev_mountpoint" \
   2567 		"($fs_bytes byte, $ninode inodes)"
   2568 }
   2569 
   2570 #
   2571 # MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a
   2572 # function library, so just return.  Otherwise, do all the real work.
   2573 #
   2574 [ -n "${MAKEDEV_AS_LIBRARY}" ] && return
   2575 makedev_main makedev ${1+"$@"}
   2576