MAKEDEV.tmpl revision 1.88
1#!/bin/sh -
2#	$NetBSD: MAKEDEV.tmpl,v 1.88 2007/11/03 19:33:36 gdt 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#	pci*	PCI bus access devices
265#	pf	PF packet filter
266#	pow*	power management device (x68k)
267#	puffs	Pass-to-Userspace Framework File System
268#	px*	PixelStamp Xserver access
269#	radio*	radio devices
270#	random	Random number generator
271#	rtc*	RealTimeClock
272#	satlink* PlanetConnect satellite receiver driver
273#	scsibus* SCSI busses
274#	se*	SCSI Ethernet
275#	ses*	SES/SAF-TE SCSI Devices
276#	speaker	PC speaker		(XXX - installed)
277#	sram	battery backuped memory (x68k)
278#	ss*	SCSI scanner
279#	stic*	PixelStamp interface chip
280#	sysmon	System Monitoring hardware
281#	systrace syscall tracer
282#	tap*	virtual Ethernet device
283#	tun*	network tunnel driver
284#	twa	3ware Apache control interface
285#	twe	3ware Escalade control interface
286#	uk*	unknown SCSI device
287#	veriexec verified executable fingerprint loader
288#	vmegen*	generic VME access
289#	view*	generic interface to graphic displays (Amiga)
290#	wsfont*	console font control
291#	wsmux*	wscons event multiplexor
292#	xenevt	Xen event interface
293
294
295#
296# Apart from a few lines right at the end, this file should consist
297# entirely of function definitions.
298#
299# This file is used both as a standalone script (via "sh ./MAKEDEV all"
300# or similar), and as a function library (via "MAKEDEV_AS_LIBRARY=1 .
301# MAKEDEV" from MAKEDEV.local).
302#
303
304usage()
305{
306	cat 1>&2 << _USAGE_
307Usage: ${0##*/} [-f] [-m mknod] [-s]  special [...]
308	Create listed special devices.  Options:
309	-f		Force permissions to be updated on existing devices.
310	-m mknod	Name of mknod(8) program.  [\$TOOL_MKNOD or mknod]
311	-s		Generate mtree(8) specfile instead of creating devices.
312
313_USAGE_
314	exit 1
315}
316
317# zeropad width number
318#	display number with a zero (`0') padding of width digits.
319#
320zeropad()
321{
322	case $(($1 - ${#2})) in
323	5)	echo 00000$2;;
324	4)	echo 0000$2;;
325	3)	echo 000$2;;
326	2)	echo 00$2;;
327	1)	echo 0$2;;
328	0)	echo $2;;
329	*)	echo "$0: bad padding" 1>&2; exit 1;;
330	esac
331}
332
333# hexprint number
334#	display (base10) number as hexadecimal
335#
336hexprint()
337{
338	val="$(($1 + 0))"
339	hex=
340	set -- 0 1 2 3 4 5 6 7 8 9 a b c d e f
341	while [ "$val" -gt 0 ]; do
342		eval hex=\$$(($val % 16 + 1))\$hex
343		val="$(($val / 16))"
344	done
345	echo "${hex:-0}"
346}
347
348setup()
349{
350	PATH=/sbin:/usr/sbin:/bin:/usr/bin:/rescue
351
352	do_create_mfs=false
353	do_force=false
354	do_pax=false
355	do_redirect=false
356	do_specfile=false
357	opts=
358	while getopts Mfm:p:s ch; do
359		# Options that should not be passed through to
360		# MAKEDEV.local are not added to $opts.
361		case ${ch} in
362		M)
363			# "-M" sets do_create_mfs;
364			# "-M -M" also sets do_redirect
365			do_redirect=$do_create_mfs
366			do_create_mfs=true
367			;;
368		f)	do_force=true
369			opts="${opts} -f"
370			;;
371		m)	TOOL_MKNOD=${OPTARG}
372			opts="${opts} -m ${OPTARG}"
373			;;
374		p)	TOOL_PAX="${OPTARG}"
375			if ( echo "" | "${TOOL_PAX}" -w -M ); then
376				do_pax=true
377			else
378				warn "Ignored -p option:" \
379					"${TOOL_PAX} is missing or broken"
380			fi
381			;;
382		s)	do_specfile=true
383			opts="${opts} -s"
384			;;
385		*)	usage ;;
386		esac
387	done
388
389	shift $((${OPTIND} - 1))
390	[ $# -gt 0 ] || usage
391
392	MKNOD="${TOOL_MKNOD:-mknod} -F netbsd"
393	if $do_force; then
394		MKNOD="${MKNOD} -R"
395	else
396		MKNOD="${MKNOD} -r"
397	fi
398
399	u_root="%uid_root%"
400	u_uucp="%uid_uucp%"
401	g_kmem="%gid_kmem%"
402	g_ntpd="%gid_ntpd%"
403	g_operator="%gid_operator%"
404	g_wheel="%gid_wheel%"
405	dialin=0
406	dialout=524288
407	callunit=262144
408
409	# only allow read&write for owner by default
410	umask 077
411
412	# Check if we have fdesc mounted
413	if [ -d fd ]; then
414		case "$(df fd)" in
415		*fdesc*)	nofdesc=false;;
416		*)		nofdesc=true;;
417		esac
418	else
419		nofdesc=true
420	fi
421
422	if $do_pax && ! $do_specfile; then
423		do_specfile=true
424		opts="${opts} -s"
425	fi
426}
427
428#
429# functions available to create nodes:
430#
431# mkdev name [b|c] major minor [mode{=600} [gid{=0} [uid{=0}]]]
432#	create device node `name' with the appropriate permissions
433#
434# lndev src target
435#	create a symlink from src to target
436#
437# makedir dir mode
438#	create directory with appropriate mode
439#
440
441mkdev()
442{
443	if [ -n "$count_nodes" ]; then
444		count_nodes=$((count_nodes + 1))
445		return
446	fi
447	if $do_specfile; then
448		case $2 in
449		b)	type=block ;;
450		c)	type=char ;;
451		esac
452		echo "./$1 type=${type} device=netbsd,$3,$4 mode=${5:-600} gid=${6:-$g_wheel} uid=${7:-$u_root}"
453	else
454		${MKNOD} -m ${5:-600} -g \#${6:-$g_wheel} -u \#${7:-$u_root} $1 $2 $3 $4
455	fi
456}
457
458lndev()
459{
460	if [ -n "$count_nodes" ]; then
461		count_nodes=$((count_nodes + 1))
462		return
463	fi
464	if $do_specfile; then
465		echo "./$2 type=link link=$1 mode=0700 gid=$g_wheel uid=$u_root"
466	else
467		ln -f -s $1 $2
468	fi
469}
470
471makedir()
472{
473	if [ -n "$count_nodes" ]; then
474		count_nodes=$((count_nodes + 1))
475		return
476	fi
477	if $do_specfile; then
478		echo "./$1 type=dir mode=$2 gid=$g_wheel uid=$u_root"
479	else
480		mkdir $1 2>/dev/null
481		chmod $2 $1
482	fi
483}
484
485warn()
486{
487	echo 1>&2 "$0: $*"
488}
489
490# wrap_makedev makedev ...
491wrap_makedev()
492{
493	if $do_specfile; then
494		# "optional" tells pax(1) not to create the directory itself.
495		echo ". type=dir optional"
496	fi
497	eval "$@"
498}
499
500# makedev special [...]
501#	the main loop
502#
503makedev()
504{
505
506for i
507do
508
509case $i in
510
511%MD_DEVICES%
512
513all)
514	makedev all_md
515	makedev std fd ptm pty0 pty1 pty2 pty3
516	makedev ccd0 ccd1 ccd2 ccd3
517	makedev cgd0 cgd1 cgd2 cgd3
518	makedev fss0 fss1 fss2 fss3
519	makedev md0 md1
520	makedev raid0 raid1 raid2 raid3 raid4 raid5 raid6 raid7
521	makedev vnd0 vnd1 vnd2 vnd3
522	makedev bpf
523	makedev tun0 tun1 tun2 tun3
524	makedev ipl pf crypto random systrace
525	makedev lkm lockstat clockctl cpuctl
526	makedev atabus0 atabus1 atabus2 atabus3
527	makedev tap tap0 tap1 tap2 tap3
528	makedev gpio gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
529	makedev bthub
530	makedev cfs
531	makedev puffs
532	makedev local # do this last
533	;;
534
535init)
536	# unless overridden by MD entry, this is equal to 'all'
537	makedev all
538	;;
539
540%MI_DEVICES_BEGIN%
541audio)
542	makedev audio0 audio1 audio2 audio3
543	lndev sound0 sound
544	lndev audio0 audio
545	lndev mixer0 mixer
546	lndev audioctl0 audioctl
547	;;
548
549gpio)
550	makedev gpio0 gpio1 gpio2 gpio3 gpio4 gpio5 gpio6 gpio7
551	lndev gpio0 gpio
552	;;
553
554radio)
555	makedev radio0 radio1
556	lndev radio0 radio
557	;;
558
559ramdisk)
560	makedev floppy md0
561	;;
562
563usbs)
564	makedev usb usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
565	makedev uhid0 uhid1 uhid2 uhid3
566	makedev ulpt0 ulpt1
567	makedev ttyU0 ttyU1
568	makedev ttyY0 ttyY1
569	makedev urio0
570	makedev uscanner0 uscanner1
571	makedev utoppy0 utoppy1
572	makedev ugen0
573	;;
574
575isdns)
576	makedev isdn isdnctl isdnbchan0 isdnbchan1 isdntel0 isdntel1 isdnteld0 isdnteld1 isdntrc0 isdntrc1
577	;;
578
579std)
580	mkdev		console	c %cons_chr% 0	600
581	mkdev		constty	c %cons_chr% 1	600
582	mkdev		drum	c %swap_chr% 0	640 $g_kmem
583	mkdev		kmem	c %mem_chr% 1	640 $g_kmem
584	mkdev		mem	c %mem_chr% 0	640 $g_kmem
585	mkdev		null	c %mem_chr% 2	666
586	mkdev		zero	c %mem_chr% 12	666
587	mkdev		klog	c %log_chr% 0	600
588	mkdev		ksyms	c %ksyms_chr% 0	444
589	if $nofdesc; then
590		mkdev	tty	c %ctty_chr% 0		666
591		mkdev	stdin	c %filedesc_chr% 0	666
592		mkdev	stdout	c %filedesc_chr% 1	666
593		mkdev	stderr	c %filedesc_chr% 2	666
594	fi
595	;;
596
597usb)
598	mkdev usb c %usb_chr% 255 444
599	;;
600
601usb*)
602	unit=${i#usb}
603	usb=usb$unit
604	mkdev usb$unit c %usb_chr% $unit
605	;;
606
607uhid*)
608	unit=${i#uhid}
609	mkdev uhid$unit c %uhid_chr% $unit 666
610	;;
611
612ulpt*)
613	unit=${i#ulpt}
614	mkdev ulpt$unit c %ulpt_chr% $unit
615	mkdev ulpn$unit c %ulpt_chr% $(($unit + 64))
616	;;
617
618urio*)
619	unit=${i#urio}
620	mkdev urio$unit c %urio_chr% $unit 666
621	;;
622
623uscanner*)
624	unit=${i#uscanner}
625	mkdev uscanner$unit c %uscanner_chr% $unit
626	;;
627
628utoppy*)
629	unit=${i#utoppy}
630	mkdev utoppy$unit c %utoppy_chr% $unit
631	;;
632
633ttyY*)
634	unit=${i#ttyY}
635	mkdev ttyY$unit c %ucycom_chr% $(($unit + $dialin  )) "" "" $u_uucp
636	mkdev dtyY$unit c %ucycom_chr% $(($unit + $dialout )) "" "" $u_uucp
637	mkdev ctyY$unit c %ucycom_chr% $(($unit + $callunit)) "" "" $u_uucp
638	;;
639
640ttyU*)
641	unit=${i#ttyU}
642	mkdev ttyU$unit c %ucom_chr% $(($unit + $dialin  )) "" "" $u_uucp
643	mkdev dtyU$unit c %ucom_chr% $(($unit + $dialout )) "" "" $u_uucp
644	mkdev ctyU$unit c %ucom_chr% $(($unit + $callunit)) "" "" $u_uucp
645	;;
646
647ugen*)
648	unit=${i#ugen}
649	for j in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
650	do
651		mkdev ugen$unit.$j c %ugen_chr% $(($unit * 16 + ${j#0}))
652	done
653	;;
654
655wscons)
656	makedev ttyE0 ttyE1 ttyE2 ttyE3 ttyE4 ttyE5 ttyE6 ttyE7
657	makedev wsmouse0 wsmouse1 wsmouse2 wsmouse3
658	makedev wskbd0 wskbd1 wskbd2 wskbd3
659	makedev wsmux0 wsmux1 wsmux2 wsmux3
660	makedev wsmouse wskbd
661	makedev ttyEcfg ttyEstat
662	makedev wsfont
663	;;
664
665wsmouse)
666	mkdev wsmouse c %wsmux_chr% 0
667	;;
668
669wskbd)
670	mkdev wskbd c %wsmux_chr% 1
671	;;
672
673wsmux*)
674	unit=${i#wsmux}
675	mkdev wsmux$unit    c %wsmux_chr% $unit
676	mkdev wsmuxctl$unit c %wsmux_chr% $(($unit + 128)) 200
677	;;
678
679xenevt)
680	mkdev xenevt c %xenevt_chr% 0
681	;;
682
683xsd_kva)
684	mkdev xsd_kva c %xenevt_chr% 1
685	;;
686
687xencons)
688	mkdev xencons c %xencons_chr% 0
689	;;
690
691ttyEstat)
692	mkdev ttyEstat c %wsdisplay_chr% 254
693	;;
694
695ttyEcfg)
696	mkdev ttyEcfg c %wsdisplay_chr% 255
697	;;
698
699ttyE*)
700	unit=${i#ttyE}
701	mkdev ttyE$unit c %wsdisplay_chr% $unit
702	;;
703
704wsmouse*)
705	unit=${i#wsmouse}
706	mkdev wsmouse$unit c %wsmouse_chr% $unit
707	;;
708
709wskbd*)
710	unit=${i#wskbd}
711	mkdev wskbd$unit c %wskbd_chr% $unit
712	;;
713
714fd)
715	if $nofdesc; then
716		makedir fd 755
717		n=0
718		while [ $n -lt 64 ]
719		do
720			mkdev fd/$n c %filedesc_chr% $n 666
721			n=$(($n + 1))
722		done
723	fi
724	;;
725
726wt*)
727	case $i in
728	wt*) name=wt;  unit=${i#wt};	chr=%wt_chr%;	blk=%wt_blk%;;
729	esac
730	for sub in $unit $(($unit+8)) $(($unit+16))
731	do
732		mkdev $name$sub		b $blk $(($sub + 0)) 660 $g_operator
733		mkdev n$name$sub	b $blk $(($sub + 4)) 660 $g_operator
734		mkdev r$name$sub	c $chr $(($sub + 0)) 660 $g_operator
735		mkdev nr$name$sub	c $chr $(($sub + 4)) 660 $g_operator
736	done
737	;;
738
739md*)
740	makedisk_minimal md ${i#md} %md_blk% %md_chr%
741	;;
742
743fss*)
744	case $i in
745	fss*) name=fss; unit=${i#fss};	blk=%fss_blk%;	chr=%fss_chr%
746	esac
747	mkdev $name$unit	b $blk $unit 660 $g_operator
748	mkdev r$name$unit	c $chr $unit 660 $g_operator
749	;;
750
751ss*)
752	case $i in
753	ss*) name=ss;	unit=${i#ss};	chr=%ss_chr%;;
754	esac
755	mkdev $name$unit	c $chr $(($unit * 16 + 0)) 640 $g_operator
756	mkdev n$name$unit	c $chr $(($unit * 16 + 1)) 640 $g_operator
757	mkdev en$name$unit	c $chr $(($unit * 16 + 3)) 640 $g_operator
758	;;
759
760ccd*|cgd*|raid*|vnd*)
761	case $i in
762	ccd*)	name=ccd;	unit=${i#ccd};	blk=%ccd_blk%;	chr=%ccd_chr%;;
763	cgd*)	name=cgd;	unit=${i#cgd};	blk=%cgd_blk%;	chr=%cgd_chr%;;
764	raid*)	name=raid;	unit=${i#raid}; blk=%raid_blk%; chr=%raid_chr%;;
765	vnd*)	name=vnd;	unit=${i#vnd};	blk=%vnd_blk%;	chr=%vnd_chr%;;
766	esac
767	%MKDISK% $name $unit $blk $chr
768	;;
769
770sd*)
771	name=sd; unit=${i#sd};	blk=%sd_blk%;	chr=%sd_chr%
772	%MKDISK% $name $unit $blk $chr
773	;;
774
775wd*)
776	name=wd; unit=${i#wd}; blk=%wd_blk%; chr=%wd_chr%
777	%MKDISK% $name $unit $blk $chr
778	;;
779
780fd*)
781	name=fd; unit=${i#fd}; blk=%fd_blk%; chr=%fd_chr%
782	%MKDISK% $name $unit $blk $chr
783	;;
784
785ld*)
786	name=ld; unit=${i#ld}; blk=%ld_blk%; chr=%ld_chr%
787	%MKDISK% $name $unit $blk $chr
788	;;
789
790bio)
791	mkdev bio c %bio_chr% 0
792	;;
793
794ed*)
795	name=ed; unit=${i#ed}; blk=%ed_blk%; chr=%ed_chr%
796	%MKDISK% $name $unit $blk $chr
797	;;
798
799ofdisk*)
800	name=ofdisk; unit=${i#ofdisk}; blk=%ofdisk_blk%; chr=%ofdisk_chr%
801	%MKDISK% $name $unit $blk $chr
802	;;
803
804xbd*)
805	name=xbd; unit=${i#xbd}; blk=%xbd_blk%; chr=%xbd_chr%
806	%MKDISK% $name $unit $blk $chr
807	;;
808
809dk*)
810	name=dk; unit=${i#dk}; blk=%dk_blk%; chr=%dk_chr%
811	minor=0
812	while [ $minor -le ${i#dk} ]
813	do
814		mkdev r$name$minor c $chr $minor 0640 $g_operator
815		mkdev $name$minor b $blk  $minor 0640 $g_operator
816		minor=$(($minor + 1))
817	done
818	;;
819
820ttyCY*)
821	name=tyCY; chr=%cy_chr%; off=32
822	unit=${i#t${name}}
823	minor=$(($unit * $off))
824	eminor=$(($minor + $off))
825	while [ $minor -lt $eminor ]
826	do
827		nminor=000$minor
828		nminor=${nminor#${nminor%???}}
829		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
830		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
831		minor=$(($minor + 1))
832	done
833	;;
834
835ttyCZ*)
836	name=tyCZ; chr=%cz_chr%; off=64
837	unit=${i#t${name}}
838	minor=$(($unit * $off))
839	eminor=$(($minor + $off))
840	while [ $minor -lt $eminor ]
841	do
842		nminor=0000$minor
843		nminor=${nminor#${nminor%????}}
844		mkdev t$name$nminor c $chr $(($minor + $dialin )) "" "" $u_uucp
845		mkdev d$name$nminor c $chr $(($minor + $dialout)) "" "" $u_uucp
846		minor=$(($minor + 1))
847	done
848	;;
849
850
851tty[0-9]|tty0[0-9])
852	# some archs have built-in zstty (major %zstty_chr%) instead
853	# of NS16550; create ttyZ* and hardlink as [dt]ty0*; this
854	# needs to be before com entry, for archs which have both
855	unit=${i#tty}
856	unit=$(($unit + 0))
857	makedev ttyZ${unit}
858	lndev ttyZ$unit tty0${unit}
859	lndev dtyZ$unit dty0${unit}
860	;;
861
862tty0*|tty1*|tty[0-9])
863	unit=${i#tty}
864	ounit=00$unit
865	ounit=${ounit#${ounit%??}}
866	mkdev tty$ounit c %com_chr% $(($unit + $dialin )) "" "" $u_uucp
867	mkdev dty$ounit c %com_chr% $(($unit + $dialout)) "" "" $u_uucp
868	;;
869
870ttyC*)
871		# some archs call com_chr ttyC traditionally
872	unit=${i#ttyC}; name=ttyC; dname=dtyC; chr=%com_chr%
873	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
874	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
875	;;
876
877ttyh*)
878	unit=${i#ttyh}; name=ttyh; dname=dtyh; chr=%sabtty_chr%
879	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
880	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
881	;;
882
883ttyTX*)
884	unit=${i#ttyTX}; name=ttyTX0; dname=dtyTX0; chr=%txcom_chr%
885	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
886	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
887	;;
888
889ttyZ*)
890	unit=${i#ttyZ}; name=ttyZ; dname=dtyZ; chr=%zstty_chr%
891	mkdev  $name$unit c $chr $(($unit + $dialin )) "" "" $u_uucp
892	mkdev $dname$unit c $chr $(($unit + $dialout)) "" "" $u_uucp
893	;;
894
895opty)
896	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
897	do
898		case $j in
899		[0-9])	jn=$j ;;
900		a)	jn=10 ;;
901		b)	jn=11 ;;
902		c)	jn=12 ;;
903		d)	jn=13 ;;
904		e)	jn=14 ;;
905		f)	jn=15 ;;
906		esac
907		mkdev ttyp$j c %pts_chr% $jn 666
908		mkdev ptyp$j c %ptc_chr% $jn 666
909	done
910	;;
911
912pty*)
913	class=${i#pty}
914	d1="p q r s t u v w x y z P Q R S T"
915	if [ "$class" -ge 64 ]
916	then
917		warn "$i: pty unit must be between 0 and 63"
918		continue
919	elif [ "$class" -lt 16 ]
920	then
921		offset=0
922		mult=0
923		d2="0 1 2 3 4 5 6 7 8 9 a b c d e f"
924	else
925		class=$(($class - 16))
926		offset=256
927		mult=2
928		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"
929	fi
930	start=$(($class * 16))
931	set -- $d2
932	nt=$#
933	s1=$(($start / $nt))
934	set -- $d1
935	shift $s1
936	t1=$1
937	if [ "$t1" = v ]; then
938		warn "$i: pty unit conflicts with console ttyv0 device"
939		continue
940	fi
941	s2=$(($start % ($nt - $s1 * $mult)))
942	set -- $d2
943	shift $s2
944	t2=$1
945	unit=$(($start + $offset - $s1 * $mult))
946	end=$(($unit + 16))
947	while [ "$unit" -lt "$end" ]
948	do
949		mkdev tty$t1$t2 c %pts_chr% $unit 666
950		mkdev pty$t1$t2 c %ptc_chr% $unit 666
951		shift
952		t2=$1
953		if [ -z "$t2" ]
954		then
955			break
956		fi
957		unit=$(($unit + 1))
958	done
959	;;
960
961stic*)
962	unit=${i#stic}
963	mkdev stic$unit c %stic_chr% $unit
964	;;
965
966st*)
967	case $i in
968	st*) name=st;	unit=${i#st};	chr=%st_chr%;	blk=%st_blk%;;
969	esac
970	mkdev $name$unit	b $blk $(($unit * 16 + 0)) 660 $g_operator
971	mkdev n$name$unit	b $blk $(($unit * 16 + 1)) 660 $g_operator
972	mkdev e$name$unit	b $blk $(($unit * 16 + 2)) 660 $g_operator
973	mkdev en$name$unit	b $blk $(($unit * 16 + 3)) 660 $g_operator
974	mkdev r$name$unit	c $chr $(($unit * 16 + 0)) 660 $g_operator
975	mkdev nr$name$unit	c $chr $(($unit * 16 + 1)) 660 $g_operator
976	mkdev er$name$unit	c $chr $(($unit * 16 + 2)) 660 $g_operator
977	mkdev enr$name$unit	c $chr $(($unit * 16 + 3)) 660 $g_operator
978	;;
979
980ses*|ch*|uk*)
981	case $i in
982	ch*)	name=ch;	unit=${i#ch};	chr=%ch_chr%;;
983	uk*)	name=uk;	unit=${i#uk};	chr=%uk_chr%;;
984	ses*)	name=ses;	unit=${i#ses};	chr=%ses_chr%;;
985	esac
986	mkdev $name$unit c $chr $unit 640 $g_operator
987	;;
988
989cd*)
990	makedisk_minimal cd ${i#cd} %cd_blk% %cd_chr% %
991	;;
992
993mcd*)
994	makedisk_minimal mcd ${i#mcd} %mcd_blk% %mcd_chr%
995	;;
996
997gdrom*)
998	makedisk_minimal gdrom ${i#gdrom} %gdrom_blk% %gdrom_chr%
999	;;
1000
1001lpt*|lpa*)
1002	case $i in
1003	lpt*) name=lpt;	unit=${i#lpt};	chr=%lpt_chr%;	flags=0;;
1004	lpa*) name=lpa;	unit=${i#lpa};	chr=%lpt_chr%;	flags=128;;
1005	esac
1006	mkdev $name$unit c $chr $(($unit + $flags))
1007	mkdev lpt${unit}ctl c $chr $(($unit + 256))
1008	;;
1009
1010bpf)
1011	mkdev bpf	c %bpf_chr% 0
1012	lndev bpf bpf0
1013	;;
1014
1015bthub)
1016	mkdev bthub c %bthub_chr% 0
1017	;;
1018
1019tun*)
1020	unit=${i#tun}
1021	mkdev tun$unit c %tun_chr% $unit
1022	;;
1023
1024joy*)
1025	unit=${i#joy}
1026	mkdev joy$unit c %joy_chr% $unit
1027	;;
1028
1029ipl)
1030	mkdev ipl	c %ipl_chr% 0
1031	mkdev ipnat	c %ipl_chr% 1
1032	mkdev ipstate	c %ipl_chr% 2
1033	mkdev ipauth	c %ipl_chr% 3
1034	mkdev ipsync	c %ipl_chr% 4
1035	mkdev ipscan	c %ipl_chr% 5
1036	mkdev iplookup	c %ipl_chr% 6
1037	;;
1038
1039pf)
1040	mkdev pf c %pf_chr% 0
1041	;;
1042
1043crypto)
1044	mkdev crypto c %crypto_chr% 0 666
1045	;;
1046
1047cmos)
1048	mkdev cmos c %cmos_chr% 0 644
1049	;;
1050
1051speaker)
1052	mkdev speaker c %spkr_chr% 0
1053	;;
1054
1055lkm)
1056	mkdev lkm c %lkm_chr% 0 640 $g_kmem
1057	;;
1058
1059lockstat)
1060	mkdev lockstat c %lockstat_chr% 0
1061	;;
1062
1063cpuctl)
1064	mkdev cpuctl c %cpuctl_chr% 0 666
1065	;;
1066
1067audio*)
1068	unit=${i#audio}
1069	audio=audio$unit
1070	sound=sound$unit
1071	mixer=mixer$unit
1072	audioctl=audioctl$unit
1073	: ${unit:-0}
1074	mkdev $sound    c %audio_chr% $(($unit + 0))	666
1075	mkdev $audio    c %audio_chr% $(($unit + 128))	666
1076	mkdev $mixer    c %audio_chr% $(($unit + 16))	666
1077	mkdev $audioctl c %audio_chr% $(($unit + 192))	666
1078	;;
1079
1080gpio*)
1081	unit=${i#gpio}
1082	mkdev gpio$unit c %gpio_chr% $unit 644
1083	;;
1084
1085rmidi*)
1086	unit=${i#rmidi}
1087	mkdev rmidi$unit c %midi_chr% $unit 666
1088	;;
1089
1090music*)
1091	unit=${i#music}
1092	: ${unit:-0}
1093	mkdev music$unit     c %sequencer_chr% $(($unit + 0))	666
1094	mkdev sequencer$unit c %sequencer_chr% $(($unit + 128))	666
1095	;;
1096
1097radio*)
1098	unit=${i#radio}
1099	: ${unit:-0}
1100	mkdev radio$unit c %radio_chr% $unit 666
1101	;;
1102
1103amr*)
1104	unit=${i#amr}
1105	mkdev amr$unit c %amr_chr% $unit
1106	;;
1107
1108apm)
1109	mkdev apm	c %apm_chr% 0 644
1110	mkdev apmctl	c %apm_chr% 8 644
1111	;;
1112
1113apm)
1114		# hpcmips uses `apmdev_chr' instead of `apm_chr'
1115	mkdev apm	c %apmdev_chr% 0 644
1116	mkdev apmctl	c %apmdev_chr% 8 644
1117	;;
1118
1119satlink*)
1120	unit=${i#satlink}
1121	mkdev satlink$unit c %satlink_chr% $unit 444
1122	;;
1123
1124random)
1125	mkdev random	c %rnd_chr% 0 444
1126	mkdev urandom	c %rnd_chr% 1 644
1127	;;
1128
1129cfs)
1130	makedev cfs0
1131	;;
1132
1133cfs*)
1134	unit=${i#cfs}
1135	mkdev cfs$unit c %vcoda_chr% $unit
1136	;;
1137
1138sysmon)
1139	mkdev sysmon	c %sysmon_chr% 0 644
1140	mkdev watchdog	c %sysmon_chr% 1 644
1141	mkdev power	c %sysmon_chr% 2 640
1142	;;
1143
1144scsibus*)
1145	unit=${i#scsibus}
1146	mkdev scsibus$unit c %scsibus_chr% $unit 644
1147	;;
1148
1149bktr)
1150	makedev bktr0 bktr1
1151	lndev	bktr0	bktr
1152	lndev	tuner0	tuner
1153	lndev	vbi0	vbi
1154	;;
1155
1156bktr*)
1157	unit=${i#bktr}
1158	mkdev bktr$unit		c %bktr_chr% $(($unit + 0))	444
1159	mkdev tuner$unit	c %bktr_chr% $(($unit + 16))	444
1160	mkdev vbi$unit		c %bktr_chr% $(($unit + 32))	444
1161	;;
1162
1163io)
1164	mkdev		io	c %mem_chr% 14	600
1165	;;
1166
1167iop*)
1168	unit=${i#iop}
1169	mkdev iop$unit c %iop_chr% $unit
1170	;;
1171
1172mlx*)
1173	unit=${i#mlx}
1174	mkdev mlx$unit c %mlx_chr% $unit
1175	;;
1176
1177mly*)
1178	unit=${i#mly}
1179	mkdev mly$unit c %mly_chr% $unit
1180	;;
1181
1182twa*)
1183	unit=${i#twa}
1184	mkdev twa$unit c %twa_chr% $unit
1185	;;
1186
1187twe*)
1188	unit=${i#twe}
1189	mkdev twe$unit c %twe_chr% $unit
1190	;;
1191
1192icp*)
1193	unit=${i#icp}
1194	mkdev icp$unit c %icp_chr% $unit
1195	;;
1196
1197agp*)
1198	unit=${i#agp}
1199	mkdev agp$unit c %agp_chr% $unit 644
1200	if [ "$unit" = "0" ]; then
1201		lndev agp$unit agpgart
1202	fi
1203	;;
1204
1205pci*)
1206	unit=${i#pci}
1207	mkdev pci$unit c %pci_chr% $unit 644
1208	;;
1209
1210dpti*)
1211	unit=${i#dpti}
1212	mkdev dpti$unit c %dpti_chr% $unit
1213	;;
1214
1215dpt*)
1216	unit=${i#dpt}
1217	mkdev dpt$unit c %dpt_chr% $unit
1218	;;
1219
1220altq)
1221	makedir altq 755
1222	unit=0
1223	for dev in altq cbq wfq afm fifoq red rio localq hfsc cdnr blue priq
1224	do
1225		mkdev altq/$dev c %altq_chr% $unit 644
1226		unit=$(($unit + 1))
1227	done
1228	;;
1229
1230isdn)
1231	mkdev isdn c %isdn_chr% 0
1232	;;
1233
1234isdnctl)
1235	mkdev isdnctl c %isdnctl_chr% 0
1236	;;
1237
1238isdnbchan*)
1239	unit=${i#isdnbchan}
1240	mkdev isdnbchan$unit c %isdnbchan_chr% $unit
1241	;;
1242
1243isdnteld*)
1244	unit=${i#isdnteld}
1245	mkdev isdnteld$unit c %isdntel_chr% $(($unit + 64))
1246	;;
1247
1248isdntel*)
1249	unit=${i#isdntel}
1250	mkdev isdntel$unit c %isdntel_chr% $unit
1251	;;
1252
1253isdntrc*)
1254	unit=${i#isdntrc}
1255	mkdev isdntrc$unit c %isdntrc_chr% $unit
1256	;;
1257
1258vmegen)
1259	makedev vmegen0 vmegen1 vmegen2 vmegen3
1260	;;
1261
1262vmegen*)
1263	unit=${i#vmegen}
1264	mkdev vmegen$unit c %vmegeneric_chr% $(($unit * 16 + 0))
1265	;;
1266
1267wsfont)
1268	mkdev wsfont c %wsfont_chr% 0
1269	;;
1270
1271cir*)
1272	unit=${i#cir}
1273	mkdev cir$unit c %cir_chr% $unit 666
1274	;;
1275
1276irframe*)
1277	unit=${i#irframe}
1278	mkdev irframe$unit c %irframe_chr% $unit
1279	;;
1280
1281fcom*)
1282	unit=${i#fcom}
1283	mkdev fcom$unit c %fcom_chr% $unit "" "" $u_uucp
1284	;;
1285
1286openfirm)
1287	mkdev openfirm c %openfirm_chr% 0 444
1288	;;
1289
1290nvram)
1291	mkdev nvram c %nvram_chr% 0 644
1292	;;
1293
1294rtc)
1295	mkdev rtc c %rtc_chr% 0 644
1296	;;
1297
1298clockctl)
1299	mkdev clockctl c %clockctl_chr% 0 660 $g_ntpd
1300	;;
1301
1302nsmb)
1303	makedev nsmb0 nsmb1 nsmb2 nsmb3
1304	;;
1305
1306nsmb*)
1307	unit=${i#nsmb}
1308	mkdev nsmb$unit c %nsmb_chr% $unit 644
1309	;;
1310
1311systrace)
1312	mkdev systrace c %systrace_chr% 0 644
1313	;;
1314
1315kttcp)
1316	mkdev kttcp c %kttcp_chr% 0
1317	;;
1318
1319dmoverio)
1320	mkdev dmoverio c %dmoverio_chr% 0 644
1321	;;
1322
1323veriexec)
1324	mkdev veriexec c %veriexec_chr% 0 600
1325	;;
1326
1327ttyv*)
1328	unit=${i#ttyv}
1329	mkdev ttyv$unit c %pc_chr% $unit
1330	;;
1331
1332# arm, acorn32
1333ttyv*)
1334	unit=${i#ttyv}
1335	mkdev ttyv$unit c %physcon_chr% $unit
1336	;;
1337
1338arcpp*)
1339	unit=${i#arcpp}
1340	mkdev arcpp$unit c %arcpp_chr% $unit
1341	;;
1342
1343par*)
1344	unit=${i#par}
1345	case $unit in
1346	0)
1347		mkdev par$unit c %par_chr% $unit
1348		;;
1349	*)
1350		warn "bad unit for par in: $i"
1351		;;
1352	esac
1353	;;
1354
1355ite*|ttye*)
1356	case $i in
1357	ite*)	unit=${i#ite};;
1358	ttye*)	unit=${i#ttye};;
1359	esac
1360	mkdev ttye$unit	c %ite_chr% $unit
1361	;;
1362
1363pms*)
1364	unit=${i#pms}
1365	mkdev pms$unit c %opms_chr% $unit
1366	;;
1367
1368qms*)
1369	unit=${i#qms}
1370	mkdev qms$unit c %qms_chr% $unit
1371	;;
1372
1373lms*)
1374	unit=${i#lms}
1375	mkdev lms$unit c %lms_chr% $unit
1376	;;
1377
1378mms*)
1379	unit=${i#mms}
1380	mkdev mms$unit c %mms_chr% $unit
1381	;;
1382
1383mouse-*)
1384	case $i in
1385	mouse-pms*) name=pms ;;
1386	mouse-qms*) name=qms ;;
1387	esac
1388	unit=${i#mouse-${name}}
1389	lndev $name$unit mouse
1390	;;
1391
1392kbd)
1393	mkdev kbd c %kbd_chr% 0
1394	;;
1395
1396kbdctl)
1397	mkdev kbdctl c %kbd_chr% 1
1398	;;
1399
1400vidcconsole0)
1401	mkdev vidcconsole0 c %vidcconsole_chr% 0 640
1402	;;
1403
1404view*)
1405	unit=${i#view}
1406	mkdev view$unit	c %view_chr% $unit 666
1407	;;
1408
1409mouse*)
1410	unit=${i#mouse}
1411	case $unit in
1412	0|1)
1413		mkdev mouse$unit c %ms_chr% $unit 666
1414		if [ $unit = 0 ]; then
1415			lndev mouse$unit mouse
1416		fi
1417		;;
1418	*)
1419		warn "bad unit for mouse in: $i"
1420		;;
1421	esac
1422	;;
1423
1424panel)
1425	mkdev panel0 c %panel_chr% 0 660
1426	;;
1427
1428tslcd)
1429	mkdev tslcd0 c %tslcd_chr% 0 660
1430	;;
1431
1432ipty)
1433	mkdev ttyp0 c %pts_chr% 0 666
1434	mkdev ttyp1 c %pts_chr% 1 666
1435	mkdev ptyp0 c %ptc_chr% 0 666
1436	mkdev ptyp1 c %ptc_chr% 1 666
1437	;;
1438
1439ptm)
1440	mkdev ptmx c %ptm_chr% 0 666
1441	mkdev ptm c %ptm_chr% 1 666
1442	;;
1443
1444grf*)
1445	unit=${i#grf}
1446	mkdev grf$unit c %grf_chr% $unit 666
1447	;;
1448
1449etvme)
1450	mkdev etvme c %et_chr% 0
1451	;;
1452
1453leo*)
1454	unit=${i#leo}
1455	mkdev leo$unit c %leo_chr% $unit
1456	;;
1457
1458scif*)
1459	unit=${i#scif}
1460	mkdev scif$unit c %scif_chr% $unit "" "" $u_uucp
1461	;;
1462
1463sci*)
1464	unit=${i#sci}
1465	mkdev sci$unit c %sci_chr% $unit "" "" $u_uucp
1466	;;
1467
1468maple*)
1469	case $i in
1470	mapleA*) name="mapleA"; unit=0;;
1471	mapleB*) name="mapleB"; unit=1;;
1472	mapleC*) name="mapleC"; unit=2;;
1473	mapleD*) name="mapleD"; unit=3;;
1474	esac
1475	subunit=${i#$name}
1476	mkdev $name$subunit c %maple_chr% $(($unit * 8 + 0$subunit))
1477	;;
1478
1479mmem*)
1480	unit=${i#mmem}
1481	for pt in 0	# 1 2 3 4 ... 255
1482	do
1483#		mkdev mmem${unit}.${pt}a  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1484		mkdev mmem${unit}.${pt}c  b %mmem_blk% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1485#		mkdev rmmem${unit}.${pt}a c %mmem_chr% $(($unit * 4096 + $pt * 16 + 0)) 640 $g_operator
1486		mkdev rmmem${unit}.${pt}c c %mmem_chr% $(($unit * 4096 + $pt * 16 + 2)) 640 $g_operator
1487	done
1488	;;
1489
1490mlcd*)
1491	unit=${i#mlcd}
1492	for pt in 0	# 1 2 3 4 ... 255
1493	do
1494		mkdev mlcd${unit}.${pt} c %mlcd_chr% $(($unit * 256 + $pt)) 640 $g_operator
1495	done
1496	;;
1497
1498ixpcom*)
1499	unit=${i#ixpcom}
1500	mkdev ixpcom$unit c %ixpcom_chr% $unit "" "" $u_uucp
1501	;;
1502
1503epcom*)
1504	unit=${i#epcom}
1505	mkdev epcom$unit c %epcom_chr% $unit "" "" $u_uucp
1506	;;
1507
1508ucbsnd)
1509	mkdev ucbsnd c %ucbsnd_chr% 0 666
1510	;;
1511
1512adb)
1513	mkdev adb c %aed_chr% 0 666
1514	;;
1515
1516asc*)
1517	unit=${i#asc}
1518	mkdev asc$unit c %asc_chr% $unit 666
1519	;;
1520
1521bwtwo*)
1522	unit=${i#bwtwo}
1523	mkdev bwtwo$unit c %bwtwo_chr% $unit 666
1524	;;
1525
1526cgtwo*)
1527	unit=${i#cgtwo}
1528	mkdev cgtwo$unit c %cgtwo_chr% $unit 666
1529	;;
1530
1531cgthree*)
1532	unit=${i#cgthree}
1533	mkdev cgthree$unit c %cgthree_chr% $unit 666
1534	;;
1535
1536cgfour*)
1537	unit=${i#cgfour}
1538	mkdev cgfour$unit c %cgfour_chr% $unit 666
1539	;;
1540
1541cgsix*)
1542	unit=${i#cgsix}
1543	mkdev cgsix$unit c %cgsix_chr% $unit 666
1544	;;
1545
1546cgeight*)
1547	unit=${i#cgeight}
1548	mkdev cgeight$unit c %cgeight_chr% $unit 666
1549	;;
1550
1551tcx*)
1552	unit=${i#tcx}
1553	mkdev tcx$unit c %tcx_chr% $unit 666
1554	;;
1555
1556xd*|xy*)
1557	case $i in
1558	xd*)	name=xd; unit=${i#xd}; blk=%xd_blk%;	chr=%xd_chr%;;
1559	xy*)	name=xy; unit=${i#xy}; blk=%xy_blk%;	chr=%xy_chr%;;
1560	esac
1561	%MKDISK% $name $unit $blk $chr
1562	;;
1563
1564magma*)
1565	unit=${i#magma}
1566	if [ 0$unit -gt 3 ]; then
1567		warn "bad unit for $i: $unit"
1568		break
1569	fi
1570	for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f
1571	do
1572		case $j in
1573		[0-9])	jn=$j ;;
1574		a)	jn=10 ;;
1575		b)	jn=11 ;;
1576		c)	jn=12 ;;
1577		d)	jn=13 ;;
1578		e)	jn=14 ;;
1579		f)	jn=15 ;;
1580		esac
1581		mkdev tty$unit$j c %mtty_chr% $(($unit * 64 + $jn))
1582	done
1583	mkdev bpp${unit}0 c %mbpp_chr% $(($unit * 64 + 0))
1584	mkdev bpp${unit}1 c %mbpp_chr% $(($unit * 64 + 1))
1585	;;
1586
1587clcd*)
1588	unit=${i#clcd}
1589	if [ 0$unit -gt 7 ]; then
1590		warn "bad unit for $i: $unit"
1591		break
1592	fi
1593	for j in 0 1 2 3 4 5 6 7
1594	do
1595		mkdev ttyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialin)) "" "" $u_uucp
1596		mkdev dtyA$unit$j c %clcd_chr% $(($unit * 8 + $j + $dialout)) "" "" $u_uucp
1597	done
1598	;;
1599
1600spif*)
1601	unit=${i#spif}
1602	if [ 0$unit -gt 3 ]; then
1603		warn "bad unit for $i: $unit"
1604		break
1605	fi
1606	for j in 0 1 2 3 4 5 6 7; do
1607		mkdev ttyS$unit$j c 102 $(($unit * 64 + $j)) "" "" $u_uucp
1608	done
1609	mkdev bppS${unit}0 c 103 $(($unit * 64 + 0))
1610	mkdev bppS${unit}1 c 103 $(($unit * 64 + 1))
1611	;;
1612
1613bpp*)
1614	unit=${i#bpp}
1615	mkdev bpp$unit c %bpp_chr% $(($unit + 0))
1616	;;
1617
1618tctrl*)
1619	unit=${i#tctrl}
1620	mkdev tctrl$unit c %tctrl_chr% $unit 666
1621	;;
1622
1623bmd*)
1624	unit=${i#bmd}
1625	mkdev bmd${unit}a  b %bmd_blk% $(($unit * 8 + 0)) 640 $g_operator
1626	mkdev bmd${unit}c  b %bmd_blk% $(($unit * 8 + 2)) 640 $g_operator
1627	mkdev rbmd${unit}a c %bmd_chr% $(($unit * 8 + 0)) 640 $g_operator
1628	mkdev rbmd${unit}c c %bmd_chr% $(($unit * 8 + 2)) 640 $g_operator
1629	;;
1630
1631sram)
1632	mkdev sram c %sram_chr% 0 644
1633	;;
1634
1635pow*)
1636	unit=${i#pow}
1637	case $unit in
1638	0|1)
1639		mkdev pow${unit} c %pow_chr% ${unit} 644
1640		if [ $unit = 0 ]; then
1641			lndev pow${unit} pow
1642		fi
1643		;;
1644	*)
1645		warn "bad unit for pow in: $i"
1646		;;
1647	esac
1648	;;
1649
1650ttyS*)
1651	unit=${i#ttyS}
1652	mkdev ttyS$unit c %sacom_chr% $(($unit + $dialin )) "" "" $u_uucp
1653	mkdev dtyS$unit c %sacom_chr% $(($unit + $dialout)) "" "" $u_uucp
1654	;;
1655
1656atabus*)
1657	unit=${i#atabus}
1658	mkdev atabus$unit c %atabus_chr% $unit 644
1659	;;
1660
1661drvctl)
1662	mkdev drvctl c %drvctl_chr% 0 644
1663	;;
1664
1665tap*)
1666	unit=${i#tap}
1667	case "$unit" in
1668	[0-9]*)
1669		mkdev tap${unit} c %tap_chr% ${unit} 600
1670		;;
1671	*)
1672		mkdev tap c %tap_chr% 0xfffff 600
1673		;;
1674	esac
1675	;;
1676
1677fw*)
1678	unit=${i#fw}
1679	for j in 0 1 2 3
1680	do
1681		mkdev fw${unit}.${j} c %fw_chr% $((${unit} * 256 + ${j})) 660 ${g_operator}
1682		mkdev fwmem${unit}.${j} c %fw_chr% $((65536 + ${unit} * 256 + ${j})) 660 ${g_operator}
1683	done
1684	;;
1685
1686puffs)
1687	mkdev puffs c %puffs_chr% 0x7ffff 600
1688	;;
1689
1690midevend)
1691%MI_DEVICES_END%
1692local)
1693	if [ -f "$0.local" ]; then
1694		umask 0
1695		if [ -n "$count_nodes" ]; then
1696			sh "$0.local" $opts -s all | \
1697			while read l; do
1698				count_nodes=$((count_nodes + 1))
1699			done
1700		else
1701			sh "$0.local" $opts all
1702		fi
1703		umask 077
1704	else
1705		warn "missing $0.local"
1706	fi
1707	;;
1708
1709*)
1710	warn "$i: unknown device"
1711	;;
1712
1713esac
1714done
1715
1716}
1717
1718
1719# three variants of disk partitions - max 8, max 16, max 16 with highpartoffset
1720# hack; only the one used by port is retained in final MAKEDEV script
1721# routine is called as:
1722# makedisk name unit blk chr
1723makedisk_p8()
1724{
1725	name="$1"; unit="$2"; blk="$3"; chr="$4"
1726
1727	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1728	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1729	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1730	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1731	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1732	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1733	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1734	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1735	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1736	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1737	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1738	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1739	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1740	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1741	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1742	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1743}
1744
1745makedisk_p16()
1746{
1747	name="$1"; unit="$2"; blk="$3"; chr="$4"
1748
1749	mkdev ${name}${unit}a	b $blk $(($unit * 16 + 0))	640 $g_operator
1750	mkdev ${name}${unit}b	b $blk $(($unit * 16 + 1))	640 $g_operator
1751	mkdev ${name}${unit}c	b $blk $(($unit * 16 + 2))	640 $g_operator
1752	mkdev ${name}${unit}d	b $blk $(($unit * 16 + 3))	640 $g_operator
1753	mkdev ${name}${unit}e	b $blk $(($unit * 16 + 4))	640 $g_operator
1754	mkdev ${name}${unit}f	b $blk $(($unit * 16 + 5))	640 $g_operator
1755	mkdev ${name}${unit}g	b $blk $(($unit * 16 + 6))	640 $g_operator
1756	mkdev ${name}${unit}h	b $blk $(($unit * 16 + 7))	640 $g_operator
1757	mkdev ${name}${unit}i	b $blk $(($unit * 16 + 8))	640 $g_operator
1758	mkdev ${name}${unit}j	b $blk $(($unit * 16 + 9))	640 $g_operator
1759	mkdev ${name}${unit}k	b $blk $(($unit * 16 + 10))	640 $g_operator
1760	mkdev ${name}${unit}l	b $blk $(($unit * 16 + 11))	640 $g_operator
1761	mkdev ${name}${unit}m	b $blk $(($unit * 16 + 12))	640 $g_operator
1762	mkdev ${name}${unit}n	b $blk $(($unit * 16 + 13))	640 $g_operator
1763	mkdev ${name}${unit}o	b $blk $(($unit * 16 + 14))	640 $g_operator
1764	mkdev ${name}${unit}p	b $blk $(($unit * 16 + 15))	640 $g_operator
1765	mkdev r${name}${unit}a	c $chr $(($unit * 16 + 0))	640 $g_operator
1766	mkdev r${name}${unit}b	c $chr $(($unit * 16 + 1))	640 $g_operator
1767	mkdev r${name}${unit}c	c $chr $(($unit * 16 + 2))	640 $g_operator
1768	mkdev r${name}${unit}d	c $chr $(($unit * 16 + 3))	640 $g_operator
1769	mkdev r${name}${unit}e	c $chr $(($unit * 16 + 4))	640 $g_operator
1770	mkdev r${name}${unit}f	c $chr $(($unit * 16 + 5))	640 $g_operator
1771	mkdev r${name}${unit}g	c $chr $(($unit * 16 + 6))	640 $g_operator
1772	mkdev r${name}${unit}h	c $chr $(($unit * 16 + 7))	640 $g_operator
1773	mkdev r${name}${unit}i	c $chr $(($unit * 16 + 8))	640 $g_operator
1774	mkdev r${name}${unit}j	c $chr $(($unit * 16 + 9))	640 $g_operator
1775	mkdev r${name}${unit}k	c $chr $(($unit * 16 + 10))	640 $g_operator
1776	mkdev r${name}${unit}l	c $chr $(($unit * 16 + 11))	640 $g_operator
1777	mkdev r${name}${unit}m	c $chr $(($unit * 16 + 12))	640 $g_operator
1778	mkdev r${name}${unit}n	c $chr $(($unit * 16 + 13))	640 $g_operator
1779	mkdev r${name}${unit}o	c $chr $(($unit * 16 + 14))	640 $g_operator
1780	mkdev r${name}${unit}p	c $chr $(($unit * 16 + 15))	640 $g_operator
1781}
1782
1783makedisk_p16high()
1784{
1785	ho=524280	# offset for partition 9 to 16
1786	name="$1"; unit="$2"; blk="$3"; chr="$4"
1787
1788	mkdev ${name}${unit}a	b $blk $(($unit * 8 + 0))	640 $g_operator
1789	mkdev ${name}${unit}b	b $blk $(($unit * 8 + 1))	640 $g_operator
1790	mkdev ${name}${unit}c	b $blk $(($unit * 8 + 2))	640 $g_operator
1791	mkdev ${name}${unit}d	b $blk $(($unit * 8 + 3))	640 $g_operator
1792	mkdev ${name}${unit}e	b $blk $(($unit * 8 + 4))	640 $g_operator
1793	mkdev ${name}${unit}f	b $blk $(($unit * 8 + 5))	640 $g_operator
1794	mkdev ${name}${unit}g	b $blk $(($unit * 8 + 6))	640 $g_operator
1795	mkdev ${name}${unit}h	b $blk $(($unit * 8 + 7))	640 $g_operator
1796	mkdev ${name}${unit}i	b $blk $(($unit * 8 + $ho + 8))	640 $g_operator
1797	mkdev ${name}${unit}j	b $blk $(($unit * 8 + $ho + 9))	640 $g_operator
1798	mkdev ${name}${unit}k	b $blk $(($unit * 8 + $ho + 10)) 640 $g_operator
1799	mkdev ${name}${unit}l	b $blk $(($unit * 8 + $ho + 11)) 640 $g_operator
1800	mkdev ${name}${unit}m	b $blk $(($unit * 8 + $ho + 12)) 640 $g_operator
1801	mkdev ${name}${unit}n	b $blk $(($unit * 8 + $ho + 13)) 640 $g_operator
1802	mkdev ${name}${unit}o	b $blk $(($unit * 8 + $ho + 14)) 640 $g_operator
1803	mkdev ${name}${unit}p	b $blk $(($unit * 8 + $ho + 15)) 640 $g_operator
1804	mkdev r${name}${unit}a	c $chr $(($unit * 8 + 0))	640 $g_operator
1805	mkdev r${name}${unit}b	c $chr $(($unit * 8 + 1))	640 $g_operator
1806	mkdev r${name}${unit}c	c $chr $(($unit * 8 + 2))	640 $g_operator
1807	mkdev r${name}${unit}d	c $chr $(($unit * 8 + 3))	640 $g_operator
1808	mkdev r${name}${unit}e	c $chr $(($unit * 8 + 4))	640 $g_operator
1809	mkdev r${name}${unit}f	c $chr $(($unit * 8 + 5))	640 $g_operator
1810	mkdev r${name}${unit}g	c $chr $(($unit * 8 + 6))	640 $g_operator
1811	mkdev r${name}${unit}h	c $chr $(($unit * 8 + 7))	640 $g_operator
1812	mkdev r${name}${unit}i	c $chr $(($unit * 8 + $ho + 8))	640 $g_operator
1813	mkdev r${name}${unit}j	c $chr $(($unit * 8 + $ho + 9))	640 $g_operator
1814	mkdev r${name}${unit}k	c $chr $(($unit * 8 + $ho + 10)) 640 $g_operator
1815	mkdev r${name}${unit}l	c $chr $(($unit * 8 + $ho + 11)) 640 $g_operator
1816	mkdev r${name}${unit}m	c $chr $(($unit * 8 + $ho + 12)) 640 $g_operator
1817	mkdev r${name}${unit}n	c $chr $(($unit * 8 + $ho + 13)) 640 $g_operator
1818	mkdev r${name}${unit}o	c $chr $(($unit * 8 + $ho + 14)) 640 $g_operator
1819	mkdev r${name}${unit}p	c $chr $(($unit * 8 + $ho + 15)) 640 $g_operator
1820}
1821
1822# make only the very few basic disk device nodes - 'a' partition
1823# and raw partition
1824makedisk_minimal()
1825{
1826	name=$1; unit=$2; blk=$3; chr=$4
1827	doff=%DISKMINOROFFSET%
1828	ro=%RAWDISK_OFF%
1829	rn=%RAWDISK_NAME%
1830
1831	mkdev ${name}${unit}a	b $blk $(($unit * $doff + 0))	640 $g_operator
1832	mkdev ${name}${unit}$rn	b $blk $(($unit * $doff + $ro))	640 $g_operator
1833	mkdev r${name}${unit}a	c $chr $(($unit * $doff + 0))	640 $g_operator
1834	mkdev r${name}${unit}$rn c $chr $(($unit * $doff + $ro)) 640 $g_operator
1835}
1836
1837create_mfs_dev()
1838{
1839	ninode=$((${1-1200} * 11 / 10))
1840	fs_size=$((8192 + 2 * 8192 + 4096 + ninode*(128+18) + 8192))
1841	fs_size=$((fs_size/512))
1842	[ "$fs_size" -lt 80 ] && fs_size=80
1843
1844	dev_mountpoint=${PWD:-/dev}
1845	mount_mfs -b 4096 -f 512 -s $fs_size -n $ninode -p 07555 -o union swap $dev_mountpoint
1846
1847	cd $dev_mountpoint
1848	if $do_redirect; then
1849		# Redirect stdout and stderr to console
1850		mknod -m 600 -g 0 -u 0 temp_console c 0 0
1851		exec >temp_console 2>&1
1852		rm temp_console
1853	fi
1854	echo "Created mfs $dev_mountpoint ($fs_size blocks, $ninode inodes)"
1855}
1856
1857#
1858# MAIN: If MAKEDEV_AS_LIBRARY is set, then we are being used as a
1859# function library, so just return.  Otherwise, call the setup function
1860# to parse command line args and set some other variables; then call the
1861# makedev function to create requested devices.
1862#
1863[ -n "${MAKEDEV_AS_LIBRARY}" ] && return
1864
1865setup ${1+"$@"}
1866shift $((${OPTIND}-1))
1867
1868if $do_create_mfs; then
1869	# Count inodes and create mfs file system
1870	count_nodes=0
1871	makedev ${1+"$@"}
1872	create_mfs_dev $count_nodes
1873	unset count_nodes
1874fi
1875
1876if $do_pax ; then
1877	# wrap_makedev will print an mtree specification;
1878	# pax will create device nodes.
1879	wrap_makedev makedev ${1+"$@"} | ${TOOL_PAX} -r -w -M .
1880else
1881	wrap_makedev makedev ${1+"$@"}
1882fi
1883