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