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