#! /bin/sh
#
#	@(#)MAKEDEV 4.71 88/02/22 SMI
#
# Device "make" file.  Valid arguments:
#	std	standard devices
#	local	configuration specific devices
# Tapes:
#	st*	SCSI tape
# Disks:
#	xd*	Xylogics 753 SMD / Xylogics SV-{67}800 IPI
#	sd*	SCSI Disk
#	fd*	Floppy Disk (Intel 82172)
#	sr*	Generic CD-ROM disk
#  controller at a time...
#	sv*	All disks on a specified BoSS scsi channel
# Terminal multiplexors:
#	xp*	Xylogics 781 MUX
# Pseudo terminals:
#	pty*	set of 16 master and slave pseudo terminals
# Printers:
#	TBS...
# Graphics/windows:
#	bwtwo*	Memory monochrome frame buffer
#       cgtwo*  Sun-2 compatible color board
#	sga*			Solbourne Graphics Accelerators
#       win*    (up to) 128 windows (96 default)
# Streams:
#	spx
# Misc:
#	audio	STREAMS audio driver
#	audioctl audio control pseudo-device
#	sbus	SBus interface
#	sa	scsi access driver
#	TBS...
#
PATH=/usr/bin:/usr/ucb:/usr/etc:/etc:/bin
umask 77

# mk name b/c major minor [mode] [group]
mk() {
	mknod $1 $2 $3 $4 &&
	chmod ${5-666} $1 &&
	test -n "$6" && chgrp $6 $1
	return 0
}

mkdevs()
{
	for i in "$@"
	do

		unit=`expr $i : '[a-z][a-z]*\([0-9][0-9]*\)'`
		case $unit in
		"") unit=0 ;;
		esac

		case $i in

		std)
			mk tty		c 2 0
			mk mem		c 3 0 640 kmem
			mk kmem		c 3 1 640 kmem
			mk null		c 3 2
			mk zero		c 3 12
			mk drum		c 7 0 640 kmem
			mk ttya		c 12 0
			mk ttyb		c 12 1
			mk klog		c 16 0 600
			mk nit		c 37 40 600
			mk dump		c 41 0 660 kmem
			# mk vd		c 57 0 644

			# for RFS
			mk spx		c 37 35 644	# streams pipe driver
			mk tcp		c 37 72 666	# tcp stream head

			# for CD-ROM
			mkdevs sr0 sr1 sr2 sr3 sr4 sr5

			# Multibus, Sun-2 only
			#mk mbmem	c 3 3 600
			#mk mbio	c 3 4 600
			mk mbio		c 3 4 644	# kbus too

			# EEPROM, all machines except Sun-2
			mk eeprom	c 3 11 640 kmem

			# Sun-4/330 only
			mk ttyc		c 12 4
			mk ttyd		c 12 5

			# Sun-4c specific devices
			mk openprom	c 70 0 644 kmem

			# recursive call to make standard floppies/disks
			#   and misc devices with their own lines
			mkdevs fd0
			mkdevs sd0 sd1 sd2 sd3 sd4 sd5 sd6
			mkdevs sd10 sd11 sd12 sd13 sd14 sd15 sd16
			mkdevs sd20 sd21 sd22 sd23 sd24 sd25 sd26
			mkdevs sd30 sd31 sd32 sd33 sd34 sd35 sd36
			mkdevs st0 st1 st2 st3 st4 st5 st6 st7
			mkdevs xd0 xd1 xd2 xd3 xd4 xd5 xd6 xd7
			mkdevs xd8 xd9 xd10 xd11 xd12 xd13 xd14 xd15
			mkdevs sbus audio
			mkdevs bwtwo cgtwo

			# 16-bit VMEbus
			mk vme16d16	c 3 5  600
			ln vme16d16 vme16
			mk vme24d16	c 3 6  600
			ln vme24d16 vme24

			# 32-bit VMEbus
			mk vme32d16	c 3 7 600
			mk vme16d32	c 3 8 600
			mk vme24d32	c 3 9 600
			mk vme32d32	c 3 10 600
			ln vme32d32 vme32
			mk vme16d16_sup	c 3 21 600 
			mk vme24d16_sup	c 3 22 600
			mk vme32d16_sup	c 3 23 600
			mk vme16d32_sup	c 3 24 600
			mk vme24d32_sup	c 3 25 600
			mk vme32d32_sup	c 3 26 600

			# Solbourne: fb keyboard mouse stuff
			mk fb		c 22 0
			mk fb1		c 22 1
			mk fb2		c 22 2
			mk fb3		c 22 3

			mk kbd		c 29 0
			mk kbd1		c 29 2
			mk kbd2		c 29 4
			mk kbd3		c 29 6

			mk mouse	c 13 0
			mk mouse1	c 13 1
			mk mouse2	c 13 2
			mk mouse3	c 13 3

			mk console	c 0 0 622
			mk ttyc1	c 0 1 622
			mk ttyc2	c 0 2 622
			mk ttyc3	c 0 3 622

			# Netware devices
			mk epc0		c 93 0 644
			mk mr		c 94 1 644
			mk diskdrv	c 94 2 644
			mk consoledrv	c 94 3 666
			mk mrnet	c 94 4 666
			mk nwfs		c 94 5 666
			mk nspx		c 37 95 666
			mk ipx		c 37 96 666

			;;

		vme*)
			unit=`expr $i : '...\(.*\)'`
			case $unit in
			0|1|2|3)
				mk vme16d16_$unit	c 3 `expr $unit '*' 32 + 5` 600
				mk vme24d16_$unit	c 3 `expr $unit '*' 32 + 6` 600
				mk vme32d16_$unit	c 3 `expr $unit '*' 32 + 7` 600
				mk vme16d32_$unit	c 3 `expr $unit '*' 32 + 8` 600
				mk vme24d32_$unit	c 3 `expr $unit '*' 32 + 9` 600
				mk vme32d32_$unit	c 3 `expr $unit '*' 32 + 10` 600
				mk vme16d16_sup_$unit	c 3 `expr $unit '*' 32 + 21` 600
				mk vme24d16_sup_$unit	c 3 `expr $unit '*' 32 + 22` 600
				mk vme32d16_sup_$unit	c 3 `expr $unit '*' 32 + 23` 600
				mk vme16d32_sup_$unit	c 3 `expr $unit '*' 32 + 24` 600
				mk vme24d32_sup_$unit	c 3 `expr $unit '*' 32 + 25` 600
				mk vme32d32_sup_$unit	c 3 `expr $unit '*' 32 + 26` 600
				ln vme16d16_$unit vme16_$unit
				ln vme24d16_$unit vme24_$unit
				ln vme32d32_$unit vme32_$unit
				;;
			*)
				echo "bad unit number in: $i; use vme0 thru vme3"
				;;
			esac
			;;

		st*)
			# HIGH_UNIT: for backward compatibility, SCSI tape minor bits
			# do not have contiguous unit number field.  See sys/mtio.h
			chr=18		#blk=11
			case $unit in
			0|1|2|3)
				uunit=$unit
				;;
			4|5|6|7)
				uunit=`expr $unit - 4 + 64`
				;;
			*)
				dev=`expr $i : '\(..\).*'`
				echo "bad unit for tape in: $i; use ${dev}0 thru ${dev}7"
				continue
				;;
			esac
			for x in 0 4 8 12 16 20 24 28 ; do
				eval un$x=`expr $unit + $x`
				eval uun$x=`expr $uunit + $x`
			done
			# to avoid conflict with tapes st4-7 dont make the non-rewind 
			# numbred devices like rst4, the user should use nrst0 instead.
			mk rst$un0	c $chr $uun0
			mk rst$un8	c $chr $uun8
			mk rst$un16	c $chr $uun16
			mk rst$un24	c $chr $uun24
			mk nrst$un0	c $chr $uun4
			mk nrst$un8	c $chr $uun12
			mk nrst$un16	c $chr $uun20
			mk nrst$un24	c $chr $uun28

			if (expr $unit == $uunit > /dev/null) then
				ln rst$un0	rmt$un0
				ln rst$un8	rmt$un8
				ln rst$un16	rmt$un16
				ln rst$un24	rmt$un24
				ln nrst$un0	nrmt$un0
				ln nrst$un8	nrmt$un8
				ln nrst$un16	nrmt$un16
				ln nrst$un24	nrmt$un24
				ln nrmt$un0	rmt$un4
				ln nrmt$un8	rmt$un12
			fi
			;;

		xd*|sd*)
			unit=`expr $i : '..\(.*\)'`
			uname=$unit
			name=`expr $i : '\(..\).*'`
			case $name in
			    xd) if (expr $unit \< 32 > /dev/null) then
				    blk=10; chr=42
				else
				    unit=`expr $unit - 32`
				    blk=15; chr=53
				fi
				;;
			    sd) if (expr $unit \< 32 > /dev/null) then
				    blk=7; chr=17
				else
				if (expr $unit \< 64 > /dev/null) then
				    unit=`expr $unit - 32`
				    blk=27; chr=80
				else
				if (expr $unit \< 96 > /dev/null) then
				    unit=`expr $unit - 64`
				    blk=28; chr=81
				else
				if (expr $unit \< 128 > /dev/null) then
				    unit=`expr $unit - 96`
				    blk=29; chr=82
				else
				if (expr $unit \< 160 > /dev/null) then
				    unit=`expr $unit - 128`
				    blk=30; chr=91
				else
				if (expr $unit \< 192 > /dev/null) then
				    unit=`expr $unit - 160`
				    blk=31; chr=92
				else
				if (expr $unit \< 224 > /dev/null) then
				    unit=`expr $unit - 192`
				    blk=32; chr=97
				else
				    unit=`expr $unit - 224`
				    blk=33; chr=98
				fi
				fi
				fi
				fi
				fi
				fi
				fi
				;;
			esac
			mk ${name}${uname}a	b $blk `expr $unit '*' 8 + 0` 640 operator
			mk ${name}${uname}b	b $blk `expr $unit '*' 8 + 1` 640 operator
			mk ${name}${uname}c	b $blk `expr $unit '*' 8 + 2` 640 operator
			mk ${name}${uname}d	b $blk `expr $unit '*' 8 + 3` 640 operator
			mk ${name}${uname}e	b $blk `expr $unit '*' 8 + 4` 640 operator
			mk ${name}${uname}f	b $blk `expr $unit '*' 8 + 5` 640 operator
			mk ${name}${uname}g	b $blk `expr $unit '*' 8 + 6` 640 operator
			mk ${name}${uname}h	b $blk `expr $unit '*' 8 + 7` 640 operator
			mk r${name}${uname}a	c $chr `expr $unit '*' 8 + 0` 640 operator
			mk r${name}${uname}b	c $chr `expr $unit '*' 8 + 1` 640 operator
			mk r${name}${uname}c	c $chr `expr $unit '*' 8 + 2` 640 operator
			mk r${name}${uname}d	c $chr `expr $unit '*' 8 + 3` 640 operator
			mk r${name}${uname}e	c $chr `expr $unit '*' 8 + 4` 640 operator
			mk r${name}${uname}f	c $chr `expr $unit '*' 8 + 5` 640 operator
			mk r${name}${uname}g	c $chr `expr $unit '*' 8 + 6` 640 operator
			mk r${name}${uname}h	c $chr `expr $unit '*' 8 + 7` 640 operator
			;;

		sa*)
			unit=`expr $i : 'sa\(.*\)'`
			case $unit in
			0|1|2|3|4|5|6|7)
				mknod sa$unit c 68 $unit
				chmod 600 sa$unit
				;;
			*)
				echo "bad unit number in: $i"
			esac
			;;  

		xp*)
			unit=`expr $i : 'xp\(.*\)'`
			case $unit in
			[0-7])
				eval `echo $unit | awk ' { unit = $1; u = 16 * $1 } END {
				    for (i = 0; i < 16; i++)
					printf("mknod tty%s%x c 10 %d; chmod 666 tty%s%x;",unit,i,u+i, unit, i); }'`
				;;
			*)
				echo "bad unit for xp in: $i, use xp0 thru xp7"
				;;
			esac
			;;

		fd*)
			case $unit in
			0|1)
				minor=`expr $unit '*' 8`

				mk fd${unit}a	b 16 $minor 600 staff
				mk fd${unit}b	b 16 `expr $minor + 1` 600 staff
				mk fd${unit}c	b 16 `expr $minor + 2` 600 staff
				rm -f fd${unit}
				ln fd${unit}c fd${unit}

				mk rfd${unit}a	c 54 $minor 600 staff
				mk rfd${unit}b	c 54 `expr $minor + 1` 600 staff
				mk rfd${unit}c	c 54 `expr $minor + 2` 600 staff
				rm -f rfd${unit}
				ln rfd${unit}c rfd${unit}
				;;
			*)
				echo "bad unit number in: $i; use fd0 or fd1"
				;;
			esac
			;;

		sbus)
			mk sbus0 c  3 32 600
			mk sbus1 c  3 33 600
			mk sbus2 c  3 34 600
			mk sbus3 c  3 35 600
			;;

		bwtwo*)
			mk bwtwo$unit c 27 $unit
			;;

		cgtwo*)
			mk cgtwo$unit c 31 $unit
			;;

		cgthree*)
			mk cgthree$unit c 55 $unit
			;;

		sga[0-9])
			unit=`expr $i : 'sga\(.*\)'`
			case $unit in
			0|1|2)
				mknod sga$unit c 71 $unit; chmod 666 sga$unit
				;;
			*)
				echo "bad unit number in: $i; use sga0, sga1 or sga2"
			esac
			;;  

		sga1*)
			unit=`expr $i : 'sga\(.*\)'`
			case $unit in
			10|11|12)
				mknod sga$unit c 71 $unit; chmod 666 sga$unit
				;;
			*)
				echo "bad unit number in: $i; use sga10, sga11 or sga12"
			esac
			;;  

		sga2*)
			unit=`expr $i : 'sga\(.*\)'`
			case $unit in
			20|21|22)
				mknod sga$unit c 71 $unit; chmod 666 sga$unit
				;;
			*)
				echo "bad unit number in: $i; use sga20, sga21 or sga22"
			esac
			;;  

		sga4*)
			unit=`expr $i : 'sga\(.*\)'`
			case $unit in
			40|41|42)
				mknod sga$unit c 71 $unit        ; chmod 666 sga$unit
				mknod sga${unit}_pager c 71 `expr $unit + 128`; chmod 444  sga${unit}_pager
				;;
			*)
				echo "bad unit number in: $i; use sga40, sga41 or sga42"
			esac
			;;  

		sga5*)
			unit=`expr $i : 'sga\(.*\)'`
			case $unit in
			50|51|52)
				mknod sga$unit c 71 $unit    ; chmod 666 sga$unit
				mknod sga${unit}_pager c 71 `expr $unit + 128`; chmod 444  sga${unit}_pager
				;;
			*)
				echo "bad unit number in: $i; use sga50, sga51 or sga52"
			esac
			;;  

		pty*)
			class=$unit
			case $class in
			0) offset=0 name=p tty_maj=20 pty_maj=21;;
			1) offset=16 name=q tty_maj=20 pty_maj=21;;
			2) offset=32 name=r tty_maj=20 pty_maj=21;;
			3) offset=48 name=s tty_maj=20 pty_maj=21;;
			4) offset=64 name=t tty_maj=20 pty_maj=21;;
			5) offset=80 name=u tty_maj=20 pty_maj=21;;
			6) offset=96 name=v tty_maj=20 pty_maj=21;;
			7) offset=112 name=w tty_maj=20 pty_maj=21;;
			8) offset=128 name=x tty_maj=20 pty_maj=21;;
			9) offset=144 name=y tty_maj=20 pty_maj=21;;
			10) offset=160 name=z tty_maj=20 pty_maj=21;;
			11) offset=176 name=P tty_maj=20 pty_maj=21;;
			12) offset=192 name=Q tty_maj=20 pty_maj=21;;
			13) offset=208 name=R tty_maj=20 pty_maj=21;;
			14) offset=224 name=S tty_maj=20 pty_maj=21;;
			15) offset=240 name=T tty_maj=20 pty_maj=21;;
			16) offset=0 name=U tty_maj=83 pty_maj=86;;
			17) offset=16 name=V tty_maj=83 pty_maj=86;;
			18) offset=32 name=W tty_maj=83 pty_maj=86;;
			19) offset=48 name=X tty_maj=83 pty_maj=86;;
			20) offset=64 name=Y tty_maj=83 pty_maj=86;;
			21) offset=80 name=Z tty_maj=83 pty_maj=86;;
			22) offset=96 name=A tty_maj=83 pty_maj=86;;
			23) offset=112 name=B tty_maj=83 pty_maj=86;;
			24) offset=128 name=C tty_maj=83 pty_maj=86;;
			25) offset=144 name=D tty_maj=83 pty_maj=86;;
			26) offset=160 name=E tty_maj=83 pty_maj=86;;
			27) offset=176 name=F tty_maj=83 pty_maj=86;;
			28) offset=192 name=G tty_maj=83 pty_maj=86;;
			29) offset=208 name=H tty_maj=83 pty_maj=86;;
			30) offset=224 name=I tty_maj=83 pty_maj=86;;
			31) offset=240 name=J tty_maj=83 pty_maj=86;;
			32) offset=0 name=K tty_maj=84 pty_maj=87;;
			33) offset=16 name=L tty_maj=84 pty_maj=87;;
			34) offset=32 name=M tty_maj=84 pty_maj=87;;
			35) offset=48 name=N tty_maj=84 pty_maj=87;;
			36) offset=64 name=O tty_maj=84 pty_maj=87;;
			37) offset=80 name=d tty_maj=84 pty_maj=87;;
			38) offset=96 name=e tty_maj=84 pty_maj=87;;
			39) offset=112 name=f tty_maj=84 pty_maj=87;;
			40) offset=128 name=g tty_maj=84 pty_maj=87;;
			41) offset=144 name=h tty_maj=84 pty_maj=87;;
			42) offset=160 name=i tty_maj=84 pty_maj=87;;
			43) offset=176 name=j tty_maj=84 pty_maj=87;;
			44) offset=192 name=k tty_maj=84 pty_maj=87;;
			45) offset=208 name=l tty_maj=84 pty_maj=87;;
			46) offset=224 name=m tty_maj=84 pty_maj=87;;
			47) offset=240 name=n tty_maj=84 pty_maj=87;;
			*) echo "bad unit for pty in: $i; use pty0 thru pty47" ; continue ;;
			esac

			eval `echo $offset $name $tty_maj $pty_maj | awk ' { b=$1; n=$2; s=$3; c=$4 } END {
				for (i = 0; i < 16; i++)
					printf("mk tty%s%x c %d %d; \
						mk pty%s%x c %d %d; ", \
						n, i, s, b+i, n, i, c, b+i); }'`

			;;

		win*)
			class=`expr $i : 'win\(.*\)'`
			case $class in
			0) offset=0 ;;
			1) offset=32 ;;
			2) offset=64 ;;
			3) offset=96 ;;
			*) echo "bad unit for win in: $i; use win0 thru win3";;
			esac
			case $class in
			0|1|2|3)
				eval `echo $offset | awk ' { b=$1 } END {
					for (i = b; i < (b + 32); i++)
						printf("mknod win%d c 15 %d;", i, i); \
				}'`
				chmod 666 win*
			esac
			;;

		spx)
			mknod spx c 37 35		; chmod 0644 spx
			;;

		audio)
			mk audio c 37 73
			mk audioctl c 73 128
			;;

		vol)
			mknod volconfig c 77 0		; chmod 0666 volconfig
			mknod volevent c 77 1		; chmod 0666 volevent
			mknod voliod c 77 2		; chmod 0666 voliod
			mkdir /dev/rvol /dev/vol /dev/plex
			chmod 755 /dev/rvol /dev/vol /dev/plex
			;;

		vcomm*)
			unit=`expr $i : '.....\(.*\)'`
			case $unit in
			0) chr=89 ;;
			*) echo "bad unit for vcomm" ; continue ;;
			esac
			mk vcomm0	c $chr 0
			mk vcs0		c 37 $chr
			tchr=`expr $chr + 1`
			eval `echo $tchr | awk ' { maj=$1 } END {
			    for (i = 1; i < 33; i++)
				printf("mknod ttyV%d c %d %d; chmod 666 ttyV%d;",i,maj, i, i); }'`
			;;

		sr*)
			unit=`expr $i : '..\(.*\)'`
			blk=18; chr=58
			mk sr${unit}	b $blk `expr $unit '*' 8 + 2` 555 operator
			mk sr${unit}a	b $blk `expr $unit '*' 8 + 0` 555 operator
			mk sr${unit}b	b $blk `expr $unit '*' 8 + 1` 555 operator
			mk sr${unit}c	b $blk `expr $unit '*' 8 + 2` 555 operator
			mk sr${unit}d	b $blk `expr $unit '*' 8 + 3` 555 operator
			mk sr${unit}e	b $blk `expr $unit '*' 8 + 4` 555 operator
			mk sr${unit}f	b $blk `expr $unit '*' 8 + 5` 555 operator
			mk sr${unit}g	b $blk `expr $unit '*' 8 + 6` 555 operator
			mk sr${unit}h	b $blk `expr $unit '*' 8 + 7` 555 operator
			mk rsr${unit}	c $chr `expr $unit '*' 8 + 2` 555 operator
			mk rsr${unit}a	c $chr `expr $unit '*' 8 + 0` 555 operator
			mk rsr${unit}b	c $chr `expr $unit '*' 8 + 1` 555 operator
			mk rsr${unit}c	c $chr `expr $unit '*' 8 + 2` 555 operator
			mk rsr${unit}d	c $chr `expr $unit '*' 8 + 3` 555 operator
			mk rsr${unit}e	c $chr `expr $unit '*' 8 + 4` 555 operator
			mk rsr${unit}f	c $chr `expr $unit '*' 8 + 5` 555 operator
			mk rsr${unit}g	c $chr `expr $unit '*' 8 + 6` 555 operator
			mk rsr${unit}h	c $chr `expr $unit '*' 8 + 7` 555 operator
			;;

		sv*)
			u=`expr $i : 'sv\(.*\)'`
			mkdevs sd$u"0" sd$u"1" sd$u"2" sd$u"3" sd$u"4" sd$u"5" sd$u"6"
			;;

		local)
			/bin/sh MAKEDEV.local
			;;

		*)
			echo "I don't know how to MAKEDEV $i."
			;;
		esac
	done
	return 0
}

mkdevs "$@"
exit 0
