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