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