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