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