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