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