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