MAKEDEV.tmpl revision 1.92
1#!/bin/sh -
2#	$NetBSD: MAKEDEV.tmpl,v 1.92 2007/12/08 17:31:12 apb Exp $
3#
4# Copyright (c) 2003,2007 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# 3. All advertising materials mentioning features or use of this software
16#    must display the following acknowledgement:
17#        This product includes software developed by the NetBSD
18#        Foundation, Inc. and its contributors.
19# 4. Neither the name of The NetBSD Foundation nor the names of its
20#    contributors may be used to endorse or promote products derived
21#    from this software without specific prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33# POSSIBILITY OF SUCH DAMAGE.
34#
35#
36###########################################################################
37#
38#   PLEASE RUN "cd ../share/man/man8 ; make makedevs"
39#   AFTER CHANGING THIS FILE, AND COMMIT THE UPDATED MANPAGE!
40#
41###########################################################################
42#
43# Device "make" file.  Valid special arguments:
44#	all	makes all known devices, including local devices.
45#		Tries to make the 'standard' number of each type.
46#	init	A set of devices that is used for MFS /dev by init.
47#		May be equal to "all".
48#	floppy	devices to be put on install floppies
49#	ramdisk	devices to be put into INSTALL kernel ramdisks.
50#	std	standard devices
51#	local	configuration specific devices
52#	wscons	make wscons devices
53#	usbs	make USB devices
54#	isdns	make ISDN devices
55#
56# Tapes:
57#	st*	SCSI tapes
58#	wt*	QIC-interfaced (e.g. not SCSI) 3M cartridge tape
59#	ht*	MASSBUS TM03 and TU??
60#	mt*	MSCP tapes (e.g. TU81, TK50)
61#	tm*	UNIBUS TM11 and TE10 emulations (e.g. Emulex TC-11)
62#	ts*	UNIBUS TS11
63#	ut*	UNIBUS TU45 emulations (e.g. si 9700)
64#	uu*	TU58 cassettes on DL11 controller
65#
66# Disks:
67#	ccd*	concatenated disk devices
68#	cd*	SCSI or ATAPI CD-ROM
69#	cgd*	cryptographic disk devices
70#	raid*	RAIDframe disk devices
71#	sd*	SCSI disks
72#	wd*	"winchester" disk drives (ST506,IDE,ESDI,RLL,...)
73#	bmd*	Nereid bank memory disks
74#	ed*	IBM PS/2 ESDI disk devices
75#	fd*	"floppy" disk drives (3 1/2", 5 1/4")
76#	fss*	Files system snapshot devices
77#	gdrom*	Dreamcast "gigadisc" CD-ROM drive
78#	hk*	UNIBUS RK06 and RK07
79#	hp*	MASSBUS RM??
80#	ld*	Logical disk devices (e.g., hardware RAID)
81#	mcd*	Mitsumi CD-ROM
82#	md*	memory pseudo-disk devices
83#	ofdisk*	OpenFirmware disk devices
84#	ra*	MSCP disks (RA??, RD??)
85#	rb*	730 IDC w/ RB80 and/or RB02
86#	rd*	HDC9224 RD disks on VS2000
87#	rl*	UNIBUS RL02
88#	rx*	MSCP floppy disk (RX33/50/...)
89#	up*	other UNIBUS devices (e.g. on Emulex SC-21V controller)
90#	vnd*	"file" pseudo-disks
91#	xbd*	Xen virtual disks
92#	xd*	Xylogic 753/7053 disks
93#	xy*	Xylogic 450/451 disks
94#
95# Pointing devices:
96#	wsmouse* wscons mouse events
97#	lms*	Logitech bus mouse
98#	mms*	Microsoft bus mouse
99#	qms*	"quadrature mouse"
100#	pms*	PS/2 mouse
101#	mouse	mouse (provides events, for X11)
102#
103# Keyboard devices:
104#	wskbd*	wscons keyboard events
105#	kbd	raw keyboard (provides events, for X11)
106#	kbdctl	keyboard control
107#
108# Terminals/Console ports:
109#	tty[01]*	standard serial ports
110#	tty0*	SB1250 ("sbscn") serial ports (sbmips)
111#	ttyE*	wscons - Workstation console ("wscons") glass-tty emulators
112#	ttyCZ?	Cyclades-Z multiport serial boards.  Each "unit"
113#		makes 64 ports.
114#	ttyCY?	Cyclom-Y multiport serial boards. Each "unit" makes
115#		32 ports.
116#	ttye*	ITE bitmapped consoles
117#	ttyv0	pccons
118#	ttyC?	NS16550 ("com") serial ports
119#	ttyS*	SA1110 serial port (hpcarm)
120#	ttyTX?	TX39 internal serial ports (hpcmips)
121#	ttyB?	DEC 3000 ZS8530 ("scc") serial ports (alpha)
122#	ttyA*	mfc serial ports (amiga)
123#	ttyB*	msc serial ports (amiga)
124#	ttyC*	com style serial ports (DraCo, HyperCom) (amiga)
125#		On the DraCo, units 0 and 1 are the built-in "modem" and
126#		"mouse" ports, if configured.
127#	ttyA0   8530 Channel A (formerly ser02) (atari)
128#	ttyA1	8530 Channel B (formerly mdm02) (atari)
129#	ttyB0	UART on first 68901 (formerly mdm01) (atari)
130#	ixpcom	IXP12x0 COM ports
131#	epcom	EP93xx COM ports
132#	ttyM?	HP200/300 4 port serial mux interface (hp300)
133#	ttya	"ttya" system console (luna68k)
134#	ttyb	second system serial port (luna68k)
135#	tty*	Onboard serial ports (mvme68k)
136#		On the mvme147 these are: ttyZ1, ttyZ2 and ttyZ3.
137#		On the mvme167, and '177: ttyC1, ttyC2 and ttyC3.
138#		Note that tty[CZ]0 is grabbed by the console device
139#		so is not created by default
140#	dc*	PMAX 4 channel serial interface (kbd, mouse, modem, printer)
141#	scc*	82530 serial interface (pmax)
142#	ttyZ*	Zilog 8530 ("zstty") serial ports
143#	tty[abcd]	Built-in serial ports (sparc)
144#	tty*	Z88530 serial controllers (sparc64)
145#	ttyh*	SAB82532 serial controllers (sparc64)
146#	tty[a-j]	Built-in serial ports (sun2, sun3)
147#	ttyC?	pccons (arc)
148#	dz*	UNIBUS DZ11 and DZ32 (vax)
149#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11) (vax)
150#	dmf*	UNIBUS DMF32 (vax)
151#	dhu*    UNIBUS DHU11 (vax)
152#	dmz*    UNIBUS DMZ32 (vax)
153#	dl*	UNIBUS DL11 (vax)
154#	xencons	Xen virtual console
155#
156# Terminal multiplexors:
157#	dc*	4 channel serial interface (keyboard, mouse, modem, printer)
158#	dh*	UNIBUS DH11 and emulations (e.g. Able DMAX, Emulex CS-11)
159#	dhu*	UNIBUS DHU11
160#	dl*	UNIBUS DL11
161#	dmf*	UNIBUS DMF32
162#	dmz*	UNIBUS DMZ32
163#	dz*	UNIBUS DZ11 and DZ32
164#	scc*	82530 serial interface
165#
166# Call units:
167#	dn*	UNIBUS DN11 and emulations (e.g. Able Quadracall)
168#
169# Pseudo terminals:
170#	ptm	pty multiplexor device.
171#	pty*	set of 16 master and slave pseudo terminals
172#	opty	first 16 ptys, to save inodes on install media
173#	ipty	first 2 ptys, for install media use only
174#
175# Printers:
176#	arcpp*	Archimedes parallel port
177#	lpt*	stock lp
178#	lpa*	interruptless lp
179#	par*	Amiga motherboard parallel port
180#
181# USB devices:
182#	usb*	USB control devices
183#	uhid*	USB generic HID devices
184#	ulpt*	USB printer devices
185#	ugen*	USB generic devices
186#	urio*	USB Diamond Rio 500 devices
187#	uscanner*	USB scanners
188#	ttyU*	USB modems
189#	ttyY*	USB serial adapters
190#
191# ISDN devices:
192#	isdn	communication between userland isdnd and kernel
193#	isdnctl	control device
194#	isdnbchan* raw b-channel access
195#	isdntel*	telephony device
196#	isdnteld*	telephony dialout device
197#	isdntrc*	trace device
198#
199# Video devices:
200#	bwtwo*	monochromatic frame buffer
201#	cgtwo*	8-bit color frame buffer
202#	cgthree*	8-bit color frame buffer
203#	cgfour*	8-bit color frame buffer
204#	cgsix*	accelerated 8-bit color frame buffer
205#	cgeight*	24-bit color frame buffer
206#	etvme	Tseng et-compatible cards on VME (atari)
207#	ik*	UNIBUS interface to Ikonas frame buffer
208#	leo	Circad Leonardo VME-bus true color (atari)
209#	ps*	UNIBUS interface to Picture System 2
210#	qv*	QVSS (MicroVAX) display
211#	tcx*	accelerated 8/24-bit color frame buffer
212#
213# Maple bus devices:
214#	maple	Maple bus control devices
215#	mlcd*	Maple bus LCD devices
216#	mmem*	Maple bus storage devices
217#
218# IEEE1394 bus devices:
219#	fw*	IEEE1394 bus generic node access devices
220#	fwmem*	IEEE1394 bus physical memory of the remote node access devices
221#
222# Special purpose devices:
223#	ad*	UNIBUS interface to Data Translation A/D converter
224#	agp*	AGP GART devices
225#	altq	ALTQ control interface
226#	amr*	AMI MegaRaid control device
227#	apm	power management device
228#	audio*	audio devices
229#	bell*	OPM bell device (x68k)
230#	bktr	Brooktree 848/849/878/879 based TV cards
231#	bpf	packet filter
232#	bthub	Bluetooth Device Hub control interface
233#	cfs*	Coda file system device
234#	ch*	SCSI media changer
235#	cir*	Consumer IR
236#	clockctl clock control for non root users
237#	cpuctl	CPU control
238#	crypto	hardware crypto access driver
239#	dmoverio hardware-assisted data movers
240#	dpt*	DPT/Adaptec EATA RAID management interface
241#	dpti*	DPT/Adaptec I2O RAID management interface
242#	fb*	PMAX generic framebuffer pseudo-device
243#	fd	file descriptors
244#	grf*	graphics frame buffer device
245#	hil	HP300 HIL input devices
246#	icp	ICP-Vortex/Intel RAID control interface
247#	iic*	IIC bus device
248#	io	x86 IOPL access for COMPAT_10, COMPAT_FREEBSD
249#	iop*	I2O IOP control interface
250#	ipl	IP Filter
251#	irframe* IrDA physical frame
252#	ite*	terminal emulator interface to HP300 graphics devices
253#	joy*	joystick device
254#	kttcp	kernel ttcp helper device
255#	lkm	loadable kernel modules interface
256#	lockstat kernel locking statistics
257#	magma*	Magma multiport serial/parallel cards
258#	midi*	MIDI
259#	mlx*	Mylex DAC960 control interface
260#	mly*	Mylex AcceleRAID/eXtremeRAID control interface
261#	np*	UNIBUS Ethernet co-processor interface, for downloading.
262#	nsmb*	SMB requester
263#	openfirm OpenFirmware accessor
264#	pad*	Pseudo-audio device driver
265#	pci*	PCI bus access devices
266#	pf	PF packet filter
267#	pow*	power management device (x68k)
268#	putter	Pass-to-Userspace Transporter
269#	px*	PixelStamp Xserver access
270#	radio*	radio devices
271#	random	Random number generator
272#	rtc*	RealTimeClock
273#	satlink* PlanetConnect satellite receiver driver
274#	scsibus* SCSI busses
275#	se*	SCSI Ethernet
276#	ses*	SES/SAF-TE SCSI Devices
277#	speaker	PC speaker		(XXX - installed)
278#	sram	battery backuped memory (x68k)
279#	ss*	SCSI scanner
280#	stic*	PixelStamp interface chip
281#	sysmon	System Monitoring hardware
282#	systrace syscall tracer
283#	tap*	virtual Ethernet device
284#	tun*	network tunnel driver
285#	twa	3ware Apache control interface
286#	twe	3ware Escalade control interface
287#	uk*	unknown SCSI device
288#	veriexec verified executable fingerprint loader
289#	vmegen*	generic VME access
290#	view*	generic interface to graphic displays (Amiga)
291#	wsfont*	console font control
292#	wsmux*	wscons event multiplexor
293#	xenevt	Xen event interface
294
295
296#
297# Apart from a few lines right at the end, this file should consist
298# entirely of function definitions.
299#
300# This file is used both as a standalone script (via "sh ./MAKEDEV all"
301# or similar), and as a function library (via "MAKEDEV_AS_LIBRARY=1 .
302# MAKEDEV" from MAKEDEV.local).
303#
304
305usage()
306{
307	cat 1>&2 << _USAGE_
308Usage: ${0##*/} [-f] [-m mknod] [-s]  special [...]
309	Create listed special devices.  Options:
310	-f		Force permissions to be updated on existing devices.
311	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
312	-s		Generate mtree(8) specfile instead of creating devices.
313
314_USAGE_
315	exit 1
316}
317
318# zeropad width number
319#	display number with a zero (`0') padding of width digits.
320#
321zeropad()
322{
323	case $(($1 - ${#2})) in
324	5)	echo 00000$2;;
325	4)	echo 0000$2;;
326	3)	echo 000$2;;
327	2)	echo 00$2;;
328	1)	echo 0$2;;
329	0)	echo $2;;
330	*)	echo "$0: bad padding" 1>&2; exit 1;;
331	esac
332}
333
334# hexprint number
335#	display (base10) number as hexadecimal
336#
337hexprint()
338{
339	val="$(($1 + 0))"
340	hex=
341	set -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
342	while [ "$val" -gt 0 ]; do
343		eval hex=\$$(($val % 16 + 1))\$hex
344		val="$(($val / 16))"
345	done
346	echo "${hex:-0}"
347}
348
349# linecount multiline_string
350#	count the number of lines in the string
351#
352linecount()
353{
354	local IFS='
355' # just a newline, no other white space between the quotes
356	set -- $1
357	echo $#
358}
359
360setup()
361{
362	PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
363
364	do_create_mfs=false
365	do_force=false
366	do_pax=false
367	do_redirect=false
368	do_specfile=false
369	opts=
370	while getopts Mfm:p:s ch; do
371		# Options that should not be passed through to
372		# MAKEDEV.local are not added to $opts.
373		case ${ch} in
374		M)
375			# "-M" sets do_create_mfs;
376			# "-M -M" also sets do_redirect
377			do_redirect=$do_create_mfs
378			do_create_mfs=true
379			;;
380		f)	do_force=true
381			opts="${opts} -f"
382			;;
383		m)	TOOL_MKNOD=${OPTARG}
384			opts="${opts} -m ${OPTARG}"
385			;;
386		p)	TOOL_PAX="${OPTARG}"
387			if ( echo "" | "${TOOL_PAX}" -w -M ); then
388				do_pax=true
389			else
390				warn "Ignored -p option:" \
391					"${TOOL_PAX} is missing or broken"
392			fi
393			;;
394		s)	do_specfile=true
395			opts="${opts} -s"
396			;;
397		*)	usage ;;
398		esac
399	done
400
401	shift $((${OPTIND} - 1))
402	[ $# -gt 0 ] || usage
403
404	MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
405	if $do_force; then
406		MKNOD="${MKNOD} -R"
407	else
408		MKNOD="${MKNOD} -r"
409	fi
410
411	u_root="%uid_root%"
412	u_uucp="%uid_uucp%"
413	g_kmem="%gid_kmem%"
414	g_ntpd="%gid_ntpd%"
415	g_operator="%gid_operator%"
416	g_wheel="%gid_wheel%"
417	dialin=0
418	dialout=524288
419	callunit=262144
420
421	# only allow read&write for owner by default
422	umask 077
423
424	# Check if we have fdesc mounted
425	if [ -d fd ]; then
426		case "$(df fd)" in
427		*fdesc*)	nofdesc=false;;
428		*)		nofdesc=true;;
429		esac
430	else
431		nofdesc=true
432	fi
433
434	if $do_pax && ! $do_specfile; then
435		do_specfile=true
436		opts="${opts} -s"
437	fi
438}
439
440#
441# functions available to create nodes:
442#
443# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
444#	create device node `name' with the appropriate permissions
445#
446# lndev src target
447#	create a symlink from src to target
448#
449# makedir dir mode
450#	create directory with appropriate mode
451#
452
453mkdev()
454{
455	if [ -n "$count_nodes" ]; then
456		count_nodes=$((count_nodes + 1))
457		return
458	fi
459	if $do_specfile; then
460		case $2 in
461		b)	type=block ;;
462		c)	type=char ;;
463		esac
464		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
465	else
466		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
467	fi
468}
469
470lndev()
471{
472	if [ -n "$count_nodes" ]; then
473		count_nodes=$((count_nodes + 1))
474		return
475	fi
476	if $do_specfile; then
477		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
478	else
479		ln -f -s $1 $2
480	fi
481}
482
483makedir()
484{
485	if [ -n "$count_nodes" ]; then
486		count_nodes=$((count_nodes + 1))
487		return
488	fi
489	if $do_specfile; then
490		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
491	else
492		mkdir $1 2>/dev/null
493		chmod $2 $1
494	fi
495}
496
497warn()
498{
499	echo 1>&2 "$0: $*"
500}
501
502# wrap_makedev makedev ...
503wrap_makedev()
504{
505	if $do_specfile; then
506		# "optional" tells pax(1) not to create the directory itself.
507		echo ". type=dir optional"
508	fi
509	eval "$@"
510}
511
512# makedev special [...]
513#	the main loop
514#
515makedev()
516{
517
518for i
519do
520
521case $i in
522
523%MD_DEVICES%
524
525all)
526	makedev all_md
527	makedev std fd ptm pty0 pty1 pty2 pty3
528	makedev ccd0 ccd1 ccd2 ccd3
529	makedev cgd0 cgd1 cgd2 cgd3
530	makedev fss0 fss1 fss2 fss3
531	makedev md0 md1
532	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
533	makedev vnd0 vnd1 vnd2 vnd3
534	makedev bpf
535	makedev tun0 tun1 tun2 tun3
536	makedev ipl pf crypto random systrace
537	makedev lkm lockstat clockctl cpuctl
538	makedev atabus0 atabus1 atabus2 atabus3
539	makedev tap tap0 tap1 tap2 tap3
540	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
541	makedev pad pad0 pad1 pad2 pad3
542	makedev bthub
543	makedev cfs
544	makedev putter
545	makedev local # do this last
546	;;
547
548init)
549	# unless overridden by MD entry, this is equal to 'all'
550	makedev all
551	;;
552
553%MI_DEVICES_BEGIN%
554audio)
555	makedev audio0 audio1 audio2 audio3
556	lndev sound0 sound
557	lndev audio0 audio
558	lndev mixer0 mixer
559	lndev audioctl0 audioctl
560	;;
561
562gpio)
563	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
564	lndev gpio0 gpio
565	;;
566
567pad)
568	makedev pad0 pad1 pad2 pad3
569	lndev pad0 pad
570	;;
571
572radio)
573	makedev radio0 radio1
574	lndev radio0 radio
575	;;
576
577ramdisk)
578	makedev floppy md0
579	;;
580
581usbs)
582	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
583	makedev uhid0 uhid1 uhid2 uhid3
584	makedev ulpt0 ulpt1
585	makedev ttyU0 ttyU1
586	makedev ttyY0 ttyY1
587	makedev urio0
588	makedev uscanner0 uscanner1
589	makedev utoppy0 utoppy1
590	makedev ugen0
591	;;
592
593isdns)
594	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
595	;;
596
597std)
598	mkdev		console	c %cons_chr% 0	600
599	mkdev		constty	c %cons_chr% 1	600
600	mkdev		drum	c %swap_chr% 0	640 $g_kmem
601	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
602	mkdev		mem	c %mem_chr% 0	640 $g_kmem
603	mkdev		null	c %mem_chr% 2	666
604	mkdev		zero	c %mem_chr% 12	666
605	mkdev		klog	c %log_chr% 0	600
606	mkdev		ksyms	c %ksyms_chr% 0	444
607	if $nofdesc; then
608		mkdev	tty	c %ctty_chr% 0		666
609		mkdev	stdin	c %filedesc_chr% 0	666
610		mkdev	stdout	c %filedesc_chr% 1	666
611		mkdev	stderr	c %filedesc_chr% 2	666
612	fi
613	;;
614
615usb)
616	mkdev usb c %usb_chr% 255 444
617	;;
618
619usb*)
620	unit=${i#usb}
621	usb=usb$unit
622	mkdev usb$unit c %usb_chr% $unit
623	;;
624
625uhid*)
626	unit=${i#uhid}
627	mkdev uhid$unit c %uhid_chr% $unit 666
628	;;
629
630ulpt*)
631	unit=${i#ulpt}
632	mkdev ulpt$unit c %ulpt_chr% $unit
633	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
634	;;
635
636urio*)
637	unit=${i#urio}
638	mkdev urio$unit c %urio_chr% $unit 666
639	;;
640
641uscanner*)
642	unit=${i#uscanner}
643	mkdev uscanner$unit c %uscanner_chr% $unit
644	;;
645
646utoppy*)
647	unit=${i#utoppy}
648	mkdev utoppy$unit c %utoppy_chr% $unit
649	;;
650
651ttyY*)
652	unit=${i#ttyY}
653	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
654	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
655	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
656	;;
657
658ttyU*)
659	unit=${i#ttyU}
660	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin  )) "" "" $u_uucp
661	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
662	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
663	;;
664
665ugen*)
666	unit=${i#ugen}
667	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
668	do
669		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
670	done
671	;;
672
673wscons)
674	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
675	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
676	makedev wskbd0 wskbd1 wskbd2 wskbd3
677	makedev wsmux0 wsmux1 wsmux2 wsmux3
678	makedev wsmouse wskbd
679	makedev ttyEcfg ttyEstat
680	makedev wsfont
681	;;
682
683wsmouse)
684	mkdev wsmouse c %wsmux_chr% 0
685	;;
686
687wskbd)
688	mkdev wskbd c %wsmux_chr% 1
689	;;
690
691wsmux*)
692	unit=${i#wsmux}
693	mkdev wsmux$unit    c %wsmux_chr% $unit
694	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
695	;;
696
697xenevt)
698	mkdev xenevt c %xenevt_chr% 0
699	;;
700
701xsd_kva)
702	mkdev xsd_kva c %xenevt_chr% 1
703	;;
704
705xencons)
706	mkdev xencons c %xencons_chr% 0
707	;;
708
709ttyEstat)
710	mkdev ttyEstat c %wsdisplay_chr% 254
711	;;
712
713ttyEcfg)
714	mkdev ttyEcfg c %wsdisplay_chr% 255
715	;;
716
717ttyE*)
718	unit=${i#ttyE}
719	mkdev ttyE$unit c %wsdisplay_chr% $unit
720	;;
721
722wsmouse*)
723	unit=${i#wsmouse}
724	mkdev wsmouse$unit c %wsmouse_chr% $unit
725	;;
726
727wskbd*)
728	unit=${i#wskbd}
729	mkdev wskbd$unit c %wskbd_chr% $unit
730	;;
731
732fd)
733	if $nofdesc; then
734		makedir fd 755
735		n=0
736		while [ $n -lt 64 ]
737		do
738			mkdev fd/$n c %filedesc_chr% $n 666
739			n=$(($n + 1))
740		done
741	fi
742	;;
743
744wt*)
745	case $i in
746	wt*) name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%;;
747	esac
748	for sub in $unit $(($unit+8)) $(($unit+16))
749	do
750		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
751		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
752		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
753		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
754	done
755	;;
756
757md*)
758	makedisk_minimal md ${i#md} %md_blk% %md_chr%
759	;;
760
761fss*)
762	case $i in
763	fss*) name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
764	esac
765	mkdev $name$unit	b $blk $unit 660 $g_operator
766	mkdev r$name$unit	c $chr $unit 660 $g_operator
767	;;
768
769ss*)
770	case $i in
771	ss*) name=ss;	unit=${i#ss};	chr=%ss_chr%;;
772	esac
773	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
774	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
775	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
776	;;
777
778ccd*|cgd*|raid*|vnd*)
779	case $i in
780	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
781	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
782	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
783	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
784	esac
785	%MKDISK% $name $unit $blk $chr
786	;;
787
788sd*)
789	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
790	%MKDISK% $name $unit $blk $chr
791	;;
792
793wd*)
794	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
795	%MKDISK% $name $unit $blk $chr
796	;;
797
798fd*)
799	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
800	%MKDISK% $name $unit $blk $chr
801	;;
802
803ld*)
804	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
805	%MKDISK% $name $unit $blk $chr
806	;;
807
808bio)
809	mkdev bio c %bio_chr% 0
810	;;
811
812ed*)
813	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
814	%MKDISK% $name $unit $blk $chr
815	;;
816
817ofdisk*)
818	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
819	%MKDISK% $name $unit $blk $chr
820	;;
821
822xbd*)
823	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
824	%MKDISK% $name $unit $blk $chr
825	;;
826
827dk*)
828	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
829	minor=0
830	while [ $minor -le ${i#dk} ]
831	do
832		mkdev r$name$minor c $chr $minor 0640 $g_operator
833		mkdev $name$minor b $blk  $minor 0640 $g_operator
834		minor=$(($minor + 1))
835	done
836	;;
837
838ttyCY*)
839	name=tyCY; chr=%cy_chr%; off=32
840	unit=${i#t${name}}
841	minor=$(($unit * $off))
842	eminor=$(($minor + $off))
843	while [ $minor -lt $eminor ]
844	do
845		nminor=000$minor
846		nminor=${nminor#${nminor%???}}
847		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
848		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
849		minor=$(($minor + 1))
850	done
851	;;
852
853ttyCZ*)
854	name=tyCZ; chr=%cz_chr%; off=64
855	unit=${i#t${name}}
856	minor=$(($unit * $off))
857	eminor=$(($minor + $off))
858	while [ $minor -lt $eminor ]
859	do
860		nminor=0000$minor
861		nminor=${nminor#${nminor%????}}
862		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
863		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
864		minor=$(($minor + 1))
865	done
866	;;
867
868
869tty[0-9]|tty0[0-9])
870	# some archs have built-in zstty (major %zstty_chr%) instead
871	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
872	# needs to be before com entry, for archs which have both
873	unit=${i#tty}
874	unit=$(($unit + 0))
875	makedev ttyZ${unit}
876	lndev ttyZ$unit tty0${unit}
877	lndev dtyZ$unit dty0${unit}
878	;;
879
880tty0*|tty1*|tty[0-9])
881	unit=${i#tty}
882	ounit=00$unit
883	ounit=${ounit#${ounit%??}}
884	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
885	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
886	;;
887
888ttyC*)
889		# some archs call com_chr ttyC traditionally
890	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
891	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
892	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
893	;;
894
895ttyh*)
896	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
897	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
898	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
899	;;
900
901ttyTX*)
902	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
903	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
904	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
905	;;
906
907ttyZ*)
908	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
909	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
910	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
911	;;
912
913opty)
914	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
915	do
916		case $j in
917		[0-9])	jn=$j ;;
918		a)	jn=10 ;;
919		b)	jn=11 ;;
920		c)	jn=12 ;;
921		d)	jn=13 ;;
922		e)	jn=14 ;;
923		f)	jn=15 ;;
924		esac
925		mkdev ttyp$j c %pts_chr% $jn 666
926		mkdev ptyp$j c %ptc_chr% $jn 666
927	done
928	;;
929
930pty*)
931	class=${i#pty}
932	d1="p q r s t u v w x y z P Q R S T"
933	if [ "$class" -ge 64 ]
934	then
935		warn "$i: pty unit must be between 0 and 63"
936		continue
937	elif [ "$class" -lt 16 ]
938	then
939		offset=0
940		mult=0
941		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
942	else
943		class=$(($class - 16))
944		offset=256
945		mult=2
946		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"
947	fi
948	start=$(($class * 16))
949	set -- $d2
950	nt=$#
951	s1=$(($start / $nt))
952	set -- $d1
953	shift $s1
954	t1=$1
955	if [ "$t1" = v ]; then
956		warn "$i: pty unit conflicts with console ttyv0 device"
957		continue
958	fi
959	s2=$(($start % ($nt - $s1 * $mult)))
960	set -- $d2
961	shift $s2
962	t2=$1
963	unit=$(($start + $offset - $s1 * $mult))
964	end=$(($unit + 16))
965	while [ "$unit" -lt "$end" ]
966	do
967		mkdev tty$t1$t2 c %pts_chr% $unit 666
968		mkdev pty$t1$t2 c %ptc_chr% $unit 666
969		shift
970		t2=$1
971		if [ -z "$t2" ]
972		then
973			break
974		fi
975		unit=$(($unit + 1))
976	done
977	;;
978
979stic*)
980	unit=${i#stic}
981	mkdev stic$unit c %stic_chr% $unit
982	;;
983
984st*)
985	case $i in
986	st*) name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%;;
987	esac
988	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
989	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
990	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
991	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
992	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
993	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
994	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
995	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
996	;;
997
998ses*|ch*|uk*)
999	case $i in
1000	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
1001	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
1002	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
1003	esac
1004	mkdev $name$unit c $chr $unit 640 $g_operator
1005	;;
1006
1007cd*)
1008	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% %
1009	;;
1010
1011mcd*)
1012	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
1013	;;
1014
1015gdrom*)
1016	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
1017	;;
1018
1019lpt*|lpa*)
1020	case $i in
1021	lpt*) name=lpt;	unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
1022	lpa*) name=lpa;	unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
1023	esac
1024	mkdev $name$unit c $chr $(($unit + $flags))
1025	mkdev lpt${unit}ctl c $chr $(($unit + 256))
1026	;;
1027
1028bpf)
1029	mkdev bpf	c %bpf_chr% 0
1030	lndev bpf bpf0
1031	;;
1032
1033bthub)
1034	mkdev bthub c %bthub_chr% 0
1035	;;
1036
1037tun*)
1038	unit=${i#tun}
1039	mkdev tun$unit c %tun_chr% $unit
1040	;;
1041
1042joy*)
1043	unit=${i#joy}
1044	mkdev joy$unit c %joy_chr% $unit
1045	;;
1046
1047ipl)
1048	mkdev ipl	c %ipl_chr% 0
1049	mkdev ipnat	c %ipl_chr% 1
1050	mkdev ipstate	c %ipl_chr% 2
1051	mkdev ipauth	c %ipl_chr% 3
1052	mkdev ipsync	c %ipl_chr% 4
1053	mkdev ipscan	c %ipl_chr% 5
1054	mkdev iplookup	c %ipl_chr% 6
1055	;;
1056
1057pf)
1058	mkdev pf c %pf_chr% 0
1059	;;
1060
1061crypto)
1062	mkdev crypto c %crypto_chr% 0 666
1063	;;
1064
1065cmos)
1066	mkdev cmos c %cmos_chr% 0 644
1067	;;
1068
1069speaker)
1070	mkdev speaker c %spkr_chr% 0
1071	;;
1072
1073lkm)
1074	mkdev lkm c %lkm_chr% 0 640 $g_kmem
1075	;;
1076
1077lockstat)
1078	mkdev lockstat c %lockstat_chr% 0
1079	;;
1080
1081cpuctl)
1082	mkdev cpuctl c %cpuctl_chr% 0 666
1083	;;
1084
1085audio*)
1086	unit=${i#audio}
1087	audio=audio$unit
1088	sound=sound$unit
1089	mixer=mixer$unit
1090	audioctl=audioctl$unit
1091	: ${unit:-0}
1092	mkdev $sound    c %audio_chr% $(($unit + 0))	666
1093	mkdev $audio    c %audio_chr% $(($unit + 128))	666
1094	mkdev $mixer    c %audio_chr% $(($unit + 16))	666
1095	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
1096	;;
1097
1098gpio*)
1099	unit=${i#gpio}
1100	mkdev gpio$unit c %gpio_chr% $unit 644
1101	;;
1102
1103rmidi*)
1104	unit=${i#rmidi}
1105	mkdev rmidi$unit c %midi_chr% $unit 666
1106	;;
1107
1108music*)
1109	unit=${i#music}
1110	: ${unit:-0}
1111	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
1112	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128))	666
1113	;;
1114
1115radio*)
1116	unit=${i#radio}
1117	: ${unit:-0}
1118	mkdev radio$unit c %radio_chr% $unit 666
1119	;;
1120
1121amr*)
1122	unit=${i#amr}
1123	mkdev amr$unit c %amr_chr% $unit
1124	;;
1125
1126apm)
1127	mkdev apm	c %apm_chr% 0 644
1128	mkdev apmctl	c %apm_chr% 8 644
1129	;;
1130
1131apm)
1132		# hpcmips uses `apmdev_chr' instead of `apm_chr'
1133	mkdev apm	c %apmdev_chr% 0 644
1134	mkdev apmctl	c %apmdev_chr% 8 644
1135	;;
1136
1137satlink*)
1138	unit=${i#satlink}
1139	mkdev satlink$unit c %satlink_chr% $unit 444
1140	;;
1141
1142random)
1143	mkdev random	c %rnd_chr% 0 444
1144	mkdev urandom	c %rnd_chr% 1 644
1145	;;
1146
1147cfs)
1148	makedev cfs0
1149	;;
1150
1151cfs*)
1152	unit=${i#cfs}
1153	mkdev cfs$unit c %vcoda_chr% $unit
1154	;;
1155
1156sysmon)
1157	mkdev sysmon	c %sysmon_chr% 0 644
1158	mkdev watchdog	c %sysmon_chr% 1 644
1159	mkdev power	c %sysmon_chr% 2 640
1160	;;
1161
1162scsibus*)
1163	unit=${i#scsibus}
1164	mkdev scsibus$unit c %scsibus_chr% $unit 644
1165	;;
1166
1167bktr)
1168	makedev bktr0 bktr1
1169	lndev	bktr0	bktr
1170	lndev	tuner0	tuner
1171	lndev	vbi0	vbi
1172	;;
1173
1174bktr*)
1175	unit=${i#bktr}
1176	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
1177	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
1178	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
1179	;;
1180
1181io)
1182	mkdev		io	c %mem_chr% 14	600
1183	;;
1184
1185iop*)
1186	unit=${i#iop}
1187	mkdev iop$unit c %iop_chr% $unit
1188	;;
1189
1190mlx*)
1191	unit=${i#mlx}
1192	mkdev mlx$unit c %mlx_chr% $unit
1193	;;
1194
1195mly*)
1196	unit=${i#mly}
1197	mkdev mly$unit c %mly_chr% $unit
1198	;;
1199
1200twa*)
1201	unit=${i#twa}
1202	mkdev twa$unit c %twa_chr% $unit
1203	;;
1204
1205twe*)
1206	unit=${i#twe}
1207	mkdev twe$unit c %twe_chr% $unit
1208	;;
1209
1210icp*)
1211	unit=${i#icp}
1212	mkdev icp$unit c %icp_chr% $unit
1213	;;
1214
1215agp*)
1216	unit=${i#agp}
1217	mkdev agp$unit c %agp_chr% $unit 644
1218	if [ "$unit" = "0" ]; then
1219		lndev agp$unit agpgart
1220	fi
1221	;;
1222
1223pci*)
1224	unit=${i#pci}
1225	mkdev pci$unit c %pci_chr% $unit 644
1226	;;
1227
1228dpti*)
1229	unit=${i#dpti}
1230	mkdev dpti$unit c %dpti_chr% $unit
1231	;;
1232
1233dpt*)
1234	unit=${i#dpt}
1235	mkdev dpt$unit c %dpt_chr% $unit
1236	;;
1237
1238altq)
1239	makedir altq 755
1240	unit=0
1241	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq
1242	do
1243		mkdev altq/$dev c %altq_chr% $unit 644
1244		unit=$(($unit + 1))
1245	done
1246	;;
1247
1248isdn)
1249	mkdev isdn c %isdn_chr% 0
1250	;;
1251
1252isdnctl)
1253	mkdev isdnctl c %isdnctl_chr% 0
1254	;;
1255
1256isdnbchan*)
1257	unit=${i#isdnbchan}
1258	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
1259	;;
1260
1261isdnteld*)
1262	unit=${i#isdnteld}
1263	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
1264	;;
1265
1266isdntel*)
1267	unit=${i#isdntel}
1268	mkdev isdntel$unit c %isdntel_chr% $unit
1269	;;
1270
1271isdntrc*)
1272	unit=${i#isdntrc}
1273	mkdev isdntrc$unit c %isdntrc_chr% $unit
1274	;;
1275
1276vmegen)
1277	makedev vmegen0 vmegen1 vmegen2 vmegen3
1278	;;
1279
1280vmegen*)
1281	unit=${i#vmegen}
1282	mkdev vmegen$unit c %vmegeneric_chr% $(($unit * 16 + 0))
1283	;;
1284
1285wsfont)
1286	mkdev wsfont c %wsfont_chr% 0
1287	;;
1288
1289cir*)
1290	unit=${i#cir}
1291	mkdev cir$unit c %cir_chr% $unit 666
1292	;;
1293
1294irframe*)
1295	unit=${i#irframe}
1296	mkdev irframe$unit c %irframe_chr% $unit
1297	;;
1298
1299fcom*)
1300	unit=${i#fcom}
1301	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1302	;;
1303
1304openfirm)
1305	mkdev openfirm c %openfirm_chr% 0 444
1306	;;
1307
1308pad*)
1309	unit=${i#pad}
1310	mkdev pad$unit c %pad_chr% $unit 444
1311	;;
1312
1313nvram)
1314	mkdev nvram c %nvram_chr% 0 644
1315	;;
1316
1317rtc)
1318	mkdev rtc c %rtc_chr% 0 644
1319	;;
1320
1321clockctl)
1322	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1323	;;
1324
1325nsmb)
1326	makedev nsmb0 nsmb1 nsmb2 nsmb3
1327	;;
1328
1329nsmb*)
1330	unit=${i#nsmb}
1331	mkdev nsmb$unit c %nsmb_chr% $unit 644
1332	;;
1333
1334systrace)
1335	mkdev systrace c %systrace_chr% 0 644
1336	;;
1337
1338kttcp)
1339	mkdev kttcp c %kttcp_chr% 0
1340	;;
1341
1342dmoverio)
1343	mkdev dmoverio c %dmoverio_chr% 0 644
1344	;;
1345
1346veriexec)
1347	mkdev veriexec c %veriexec_chr% 0 600
1348	;;
1349
1350ttyv*)
1351	unit=${i#ttyv}
1352	mkdev ttyv$unit c %pc_chr% $unit
1353	;;
1354
1355# arm, acorn32
1356ttyv*)
1357	unit=${i#ttyv}
1358	mkdev ttyv$unit c %physcon_chr% $unit
1359	;;
1360
1361arcpp*)
1362	unit=${i#arcpp}
1363	mkdev arcpp$unit c %arcpp_chr% $unit
1364	;;
1365
1366par*)
1367	unit=${i#par}
1368	case $unit in
1369	0)
1370		mkdev par$unit c %par_chr% $unit
1371		;;
1372	*)
1373		warn "bad unit for par in: $i"
1374		;;
1375	esac
1376	;;
1377
1378ite*|ttye*)
1379	case $i in
1380	ite*)	unit=${i#ite};;
1381	ttye*)	unit=${i#ttye};;
1382	esac
1383	mkdev ttye$unit	c %ite_chr% $unit
1384	;;
1385
1386pms*)
1387	unit=${i#pms}
1388	mkdev pms$unit c %opms_chr% $unit
1389	;;
1390
1391qms*)
1392	unit=${i#qms}
1393	mkdev qms$unit c %qms_chr% $unit
1394	;;
1395
1396lms*)
1397	unit=${i#lms}
1398	mkdev lms$unit c %lms_chr% $unit
1399	;;
1400
1401mms*)
1402	unit=${i#mms}
1403	mkdev mms$unit c %mms_chr% $unit
1404	;;
1405
1406mouse-*)
1407	case $i in
1408	mouse-pms*) name=pms ;;
1409	mouse-qms*) name=qms ;;
1410	esac
1411	unit=${i#mouse-${name}}
1412	lndev $name$unit mouse
1413	;;
1414
1415kbd)
1416	mkdev kbd c %kbd_chr% 0
1417	;;
1418
1419kbdctl)
1420	mkdev kbdctl c %kbd_chr% 1
1421	;;
1422
1423vidcconsole0)
1424	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1425	;;
1426
1427view*)
1428	unit=${i#view}
1429	mkdev view$unit	c %view_chr% $unit 666
1430	;;
1431
1432mouse*)
1433	unit=${i#mouse}
1434	case $unit in
1435	0|1)
1436		mkdev mouse$unit c %ms_chr% $unit 666
1437		if [ $unit = 0 ]; then
1438			lndev mouse$unit mouse
1439		fi
1440		;;
1441	*)
1442		warn "bad unit for mouse in: $i"
1443		;;
1444	esac
1445	;;
1446
1447panel)
1448	mkdev panel0 c %panel_chr% 0 660
1449	;;
1450
1451tslcd)
1452	mkdev tslcd0 c %tslcd_chr% 0 660
1453	;;
1454
1455ipty)
1456	mkdev ttyp0 c %pts_chr% 0 666
1457	mkdev ttyp1 c %pts_chr% 1 666
1458	mkdev ptyp0 c %ptc_chr% 0 666
1459	mkdev ptyp1 c %ptc_chr% 1 666
1460	;;
1461
1462ptm)
1463	mkdev ptmx c %ptm_chr% 0 666
1464	mkdev ptm c %ptm_chr% 1 666
1465	;;
1466
1467grf*)
1468	unit=${i#grf}
1469	mkdev grf$unit c %grf_chr% $unit 666
1470	;;
1471
1472etvme)
1473	mkdev etvme c %et_chr% 0
1474	;;
1475
1476leo*)
1477	unit=${i#leo}
1478	mkdev leo$unit c %leo_chr% $unit
1479	;;
1480
1481scif*)
1482	unit=${i#scif}
1483	mkdev scif$unit c %scif_chr% $unit "" "" $u_uucp
1484	;;
1485
1486sci*)
1487	unit=${i#sci}
1488	mkdev sci$unit c %sci_chr% $unit "" "" $u_uucp
1489	;;
1490
1491maple*)
1492	case $i in
1493	mapleA*) name="mapleA"; unit=0;;
1494	mapleB*) name="mapleB"; unit=1;;
1495	mapleC*) name="mapleC"; unit=2;;
1496	mapleD*) name="mapleD"; unit=3;;
1497	esac
1498	subunit=${i#$name}
1499	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
1500	;;
1501
1502mmem*)
1503	unit=${i#mmem}
1504	for pt in 0	# 1 2 3 4 ... 255
1505	do
1506#		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1507		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1508#		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1509		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1510	done
1511	;;
1512
1513mlcd*)
1514	unit=${i#mlcd}
1515	for pt in 0	# 1 2 3 4 ... 255
1516	do
1517		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
1518	done
1519	;;
1520
1521ixpcom*)
1522	unit=${i#ixpcom}
1523	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
1524	;;
1525
1526epcom*)
1527	unit=${i#epcom}
1528	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
1529	;;
1530
1531ucbsnd)
1532	mkdev ucbsnd c %ucbsnd_chr% 0 666
1533	;;
1534
1535adb)
1536	mkdev adb c %aed_chr% 0 666
1537	;;
1538
1539asc*)
1540	unit=${i#asc}
1541	mkdev asc$unit c %asc_chr% $unit 666
1542	;;
1543
1544bwtwo*)
1545	unit=${i#bwtwo}
1546	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
1547	;;
1548
1549cgtwo*)
1550	unit=${i#cgtwo}
1551	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
1552	;;
1553
1554cgthree*)
1555	unit=${i#cgthree}
1556	mkdev cgthree$unit c %cgthree_chr% $unit 666
1557	;;
1558
1559cgfour*)
1560	unit=${i#cgfour}
1561	mkdev cgfour$unit c %cgfour_chr% $unit 666
1562	;;
1563
1564cgsix*)
1565	unit=${i#cgsix}
1566	mkdev cgsix$unit c %cgsix_chr% $unit 666
1567	;;
1568
1569cgeight*)
1570	unit=${i#cgeight}
1571	mkdev cgeight$unit c %cgeight_chr% $unit 666
1572	;;
1573
1574tcx*)
1575	unit=${i#tcx}
1576	mkdev tcx$unit c %tcx_chr% $unit 666
1577	;;
1578
1579xd*|xy*)
1580	case $i in
1581	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
1582	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
1583	esac
1584	%MKDISK% $name $unit $blk $chr
1585	;;
1586
1587magma*)
1588	unit=${i#magma}
1589	if [ 0$unit -gt 3 ]; then
1590		warn "bad unit for $i: $unit"
1591		break
1592	fi
1593	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
1594	do
1595		case $j in
1596		[0-9])	jn=$j ;;
1597		a)	jn=10 ;;
1598		b)	jn=11 ;;
1599		c)	jn=12 ;;
1600		d)	jn=13 ;;
1601		e)	jn=14 ;;
1602		f)	jn=15 ;;
1603		esac
1604		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
1605	done
1606	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
1607	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
1608	;;
1609
1610clcd*)
1611	unit=${i#clcd}
1612	if [ 0$unit -gt 7 ]; then
1613		warn "bad unit for $i: $unit"
1614		break
1615	fi
1616	for j in 0 1 2 3 4 5 6 7
1617	do
1618		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
1619		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
1620	done
1621	;;
1622
1623spif*)
1624	unit=${i#spif}
1625	if [ 0$unit -gt 3 ]; then
1626		warn "bad unit for $i: $unit"
1627		break
1628	fi
1629	for j in 0 1 2 3 4 5 6 7; do
1630		mkdev ttyS$unit$j c 102 $(($unit * 64 + $j)) "" "" $u_uucp
1631	done
1632	mkdev bppS${unit}0 c 103 $(($unit * 64 + 0))
1633	mkdev bppS${unit}1 c 103 $(($unit * 64 + 1))
1634	;;
1635
1636bpp*)
1637	unit=${i#bpp}
1638	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
1639	;;
1640
1641tctrl*)
1642	unit=${i#tctrl}
1643	mkdev tctrl$unit c %tctrl_chr% $unit 666
1644	;;
1645
1646bmd*)
1647	unit=${i#bmd}
1648	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
1649	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
1650	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
1651	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
1652	;;
1653
1654sram)
1655	mkdev sram c %sram_chr% 0 644
1656	;;
1657
1658pow*)
1659	unit=${i#pow}
1660	case $unit in
1661	0|1)
1662		mkdev pow${unit} c %pow_chr% ${unit} 644
1663		if [ $unit = 0 ]; then
1664			lndev pow${unit} pow
1665		fi
1666		;;
1667	*)
1668		warn "bad unit for pow in: $i"
1669		;;
1670	esac
1671	;;
1672
1673ttyS*)
1674	unit=${i#ttyS}
1675	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
1676	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
1677	;;
1678
1679atabus*)
1680	unit=${i#atabus}
1681	mkdev atabus$unit c %atabus_chr% $unit 644
1682	;;
1683
1684drvctl)
1685	mkdev drvctl c %drvctl_chr% 0 644
1686	;;
1687
1688tap*)
1689	unit=${i#tap}
1690	case "$unit" in
1691	[0-9]*)
1692		mkdev tap${unit} c %tap_chr% ${unit} 600
1693		;;
1694	*)
1695		mkdev tap c %tap_chr% 0xfffff 600
1696		;;
1697	esac
1698	;;
1699
1700fw*)
1701	unit=${i#fw}
1702	for j in 0 1 2 3
1703	do
1704		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
1705		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
1706	done
1707	;;
1708
1709# create putter device and symlinks for all subsystems using it
1710putter)
1711	mkdev putter c %putter_chr% 0 600
1712	mkdev pud c %putter_chr% 1 600
1713	lndev putter puffs 
1714	;;
1715
1716midevend)
1717%MI_DEVICES_END%
1718local)
1719	if [ -f "$0.local" ]; then
1720		umask 0
1721		if [ -n "$count_nodes" ]; then
1722			count_nodes=$((count_nodes + \
1723			    $(linecount "$(sh "$0.local" $opts -s all)") ))
1724		else
1725			sh "$0.local" $opts all
1726		fi
1727		umask 077
1728	else
1729		warn "missing $0.local"
1730	fi
1731	;;
1732
1733*)
1734	warn "$i: unknown device"
1735	;;
1736
1737esac
1738done
1739
1740}
1741
1742
1743# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
1744# hack; only the one used by port is retained in final MAKEDEV script
1745# routine is called as:
1746# makedisk name unit blk chr
1747makedisk_p8()
1748{
1749	name="$1"; unit="$2"; blk="$3"; chr="$4"
1750
1751	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1752	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1753	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1754	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1755	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1756	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1757	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1758	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1759	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1760	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1761	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1762	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1763	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1764	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1765	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1766	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1767}
1768
1769makedisk_p16()
1770{
1771	name="$1"; unit="$2"; blk="$3"; chr="$4"
1772
1773	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
1774	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
1775	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
1776	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
1777	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
1778	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
1779	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
1780	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
1781	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
1782	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
1783	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
1784	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
1785	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
1786	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
1787	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
1788	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
1789	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
1790	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
1791	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
1792	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
1793	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
1794	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
1795	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
1796	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
1797	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
1798	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
1799	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
1800	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
1801	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
1802	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
1803	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
1804	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
1805}
1806
1807makedisk_p16high()
1808{
1809	ho=524280	# offset for partition 9 to 16
1810	name="$1"; unit="$2"; blk="$3"; chr="$4"
1811
1812	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1813	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1814	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1815	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1816	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1817	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1818	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1819	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1820	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8))	640 $g_operator
1821	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9))	640 $g_operator
1822	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
1823	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
1824	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
1825	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
1826	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
1827	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
1828	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1829	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1830	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1831	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1832	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1833	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1834	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1835	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1836	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8))	640 $g_operator
1837	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9))	640 $g_operator
1838	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
1839	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
1840	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
1841	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
1842	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
1843	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
1844}
1845
1846# make only the very few basic disk device nodes - 'a' partition
1847# and raw partition
1848makedisk_minimal()
1849{
1850	name=$1; unit=$2; blk=$3; chr=$4
1851	doff=%DISKMINOROFFSET%
1852	ro=%RAWDISK_OFF%
1853	rn=%RAWDISK_NAME%
1854
1855	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
1856	mkdev ${name}${unit}$rn	b $blk $(($unit * $doff + $ro))	640 $g_operator
1857	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
1858	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
1859}
1860
1861create_mfs_dev()
1862{
1863	ninode=$((${1-1200} * 11 / 10))
1864	fs_size=$((8192 + 2 * 8192 + 4096 + ninode*(128+18) + 8192))
1865	fs_size=$((fs_size/512))
1866	[ "$fs_size" -lt 80 ] && fs_size=80
1867
1868	dev_mountpoint=${PWD:-/dev}
1869	mount_mfs -b 4096 -f 512 -s $fs_size -n $ninode -p 07555 -o union swap $dev_mountpoint
1870
1871	cd $dev_mountpoint
1872	if $do_redirect; then
1873		# Redirect stdout and stderr to console
1874		mknod -m 600 -g 0 -u 0 temp_console c 0 0
1875		exec >temp_console 2>&1
1876		rm temp_console
1877	fi
1878	echo "Created mfs $dev_mountpoint ($fs_size blocks, $ninode inodes)"
1879}
1880
1881#
1882# MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a
1883# function library, so just return.  Otherwise, call the setup function
1884# to parse command line args and set some other variables; then call the
1885# makedev function to create requested devices.
1886#
1887[ -n "${MAKEDEV_AS_LIBRARY}" ] && return
1888
1889setup ${1+"$@"}
1890shift $((${OPTIND}-1))
1891
1892if $do_create_mfs; then
1893	# Count inodes and create mfs file system
1894	count_nodes=0
1895	makedev ${1+"$@"}
1896	create_mfs_dev $count_nodes
1897	unset count_nodes
1898fi
1899
1900if $do_pax ; then
1901	# wrap_makedev will print an mtree specification;
1902	# pax will create device nodes.
1903	wrap_makedev makedev ${1+"$@"} | ${TOOL_PAX} -r -w -M .
1904else
1905	wrap_makedev makedev ${1+"$@"}
1906fi
1907