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