#!/bin/sh -
#
# $Header: MAKEDEV,v 4.300 91/06/08 23:47:30 root Rel41 $ SONY;
#
# Device "make" file.  Valid arguments:
#	std	standard devices
#	local	configuration specific devices
#
# Tapes:
#	st*	standard SCSI tape interface
#
# Disks:
#	sd*	standard SCSI disk interface
#	fd*	floppy disk
#	md	memory disk
#	rd*	remote disk
#	vd*	virtual disk (SAFS)
#	xd*	remote disk (SAFS)
#
#    floppy disk initial format  [r]fd[unit][fmt]a
#    unit  fmt=0       1       2        3        4       5       6       7  
#     0    FD2HD     FD2DD   FD2DDMS9 FD2DDMS8 FD2DMS9 FD2DMS8 FD2HDPS FD2DDOA
#     2    FD2HD1024 FD2DDOA FD2DDMS9 FD2DDMS8 FD2DMS9 FD2DMS8 FD1S128 FD2D256
#     3    FD2HD1024 FD2DDOA FD2DDMS9 FD2DDMS8 FD2DMS9 FD2DMS8 FD1S128 FD2D256
#
# Scsi:
#	scsi*	raw scsi interface
#
# Terminal multiplexors:
#	rs*	RS-232C
#
# Pseudo terminals:
#	pty*	set of 16 master and slave pseudo terminals
#
# Printers:
#	lp*	centronics printer
#
# Frame buffers:
#	fb	old frame buffer interface
#	fb*	new frame buffer interface
#
# Keyboard:
#	keyboard	keyboard
#
# Mouse:
#	mouse	mouse
#
# Ether:
#	ether*	raw ethernet interface
#
# Gpib:
#	gpib	gpib
#
# Ir:
#	ir	image reader
#
# Lbp:
#	lbp	laser beam printer
#
# Ib:
#	ib	image board
#
# Vmemem:
#	vmemem	VME memory interface
#
# Shm:
#	shm	shared memory interface
#
# Sem:
#	sem	Semaphore (simulated) driver
#
# Vvcrs:
#	vvcrs	VTR controller driver
#
# Sound Board:
#	sb0	Audio I/F Kit for PWS-1500 series
#	sbe0	Audio Encoding Board for Ex-I/O Slot
#
# Isdn:
#	isdn	ISDN/X.25 interface
#
# Voice:
#	voice	ISDN/voice interface
#
# BPFilter:
#	bpf*	BPFilter interface
#
# Rb:
#	rb0	
#
# Rx:
#	rx0	
#
# Gs:
#	gs/gs[0-63]	
#

umask 77
for i
do
case $i in

std)
	/etc/mknod console	c 0 0
	/etc/mknod drum		c 7 0	; chmod 640 drum; chgrp kmem drum
	/etc/mknod iopmem	c 3 3	; chmod 600 iopmem
	/etc/mknod kmem		c 3 1	; chmod 640 kmem; chgrp kmem kmem
	/etc/mknod mem		c 3 0	; chmod 640 mem; chgrp kmem mem
	/etc/mknod null		c 3 2	; chmod 666 null
	/etc/mknod tty		c 2 0	; chmod 666 tty
	/etc/mknod klog		c 33 0	; chmod 600 klog
	;;

st[0-9]*)
	unit=`expr $i : '..\(.*\)'`
	umask 0
	case $unit in
	0|1|2|3)
		for j in 0 8 16 24 32 40 48 56; do
			n=`expr 0\`expr $j + $unit\` : '.*\(..\)'`
			/etc/mknod rst$n c 16 `expr $j + $unit`
			/etc/mknod nrst$n c 16 `expr $j + $unit + 4`
			/etc/mknod anrst$n c 16 `expr $j + $unit + 132`
		done
		;;
	*)
		echo Invalid unit number for tape in: $1
		;;
	esac
	;;

sd*)
	case $i in
	sd??)
		umask 077
		bus=`expr $i : '..\(.\)'`
		unit=`expr $i : '...\(.\)'`
		blk=0; chr=4
		fullname=sd${bus}${unit}
		;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7)
		minor=`expr ${bus} '*' 64 + ${unit} '*' 8`
		for p in a b c d e f g h; do
			/etc/mknod ${fullname}$p	b ${blk} ${minor}
			/etc/mknod r${fullname}$p	c ${chr} ${minor}
			minor=`expr ${minor} + 1`
		done
		;;
	*)
		echo Invalid unit number for disk in: $i
		;;
	esac
	umask 077
	;;

rd*|vd*|xd*)
	case $i in
	rd?*)
		umask 077
		blk=5; chr=21
		unit=`expr $i : '..\(.*\)'`
		fullname=rd${unit}
		;;
	vd?*)
		umask 077
		blk=11; chr=37
		unit=`expr $i : '..\(.*\)'`
		fullname=vd${unit}
		;;
	xd?*)
		umask 077
		blk=12; chr=38
		unit=`expr $i : '..\(.*\)'`
		fullname=xd${unit}
		;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15)
		minor=`expr ${unit} '*' 8`
		for p in a b c d e f g h; do
			/etc/mknod ${fullname}$p	b ${blk} ${minor}
			/etc/mknod r${fullname}$p	c ${chr} ${minor}
			minor=`expr ${minor} + 1`
		done
		;;
	*)
		echo bad unit for disk in: $i
		;;
	esac
	umask 077
	;;

scsi*)
	case $i in
	scsi??)
		bus=`expr $i : '....\(.\)'`
		unit=`expr $i : '.....\(.\)'`
		chr=28
		name=$i
		;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7)
		/etc/mknod ${name}	c ${chr} `expr ${bus} '*' 8 + ${unit}`
		;;
	*)
		echo bad unit for scsi in: $i
		;;
	esac
	;;

fd*)
	unit=`expr $i : '..\(.*\)'`
	name=fd; chr=5; blk=1;
	case $unit in
	0)
		umask 0
		rm -f fh0 fd0 rfh0a rfd0a fd0[0-7]a rfd0[0-7]a
		/etc/mknod fh0	  b $blk 0
		/etc/mknod fd0	  b $blk 8
		/etc/mknod rfh0a  c $chr 0
		/etc/mknod rfd0a  c $chr 8
		for fmt in 0 1 2 3 4 5 6 7; do
			minor=`expr ${unit} '*' 64 + ${fmt} '*' 8`
			/etc/mknod ${name}${unit}${fmt}a   b ${blk} ${minor}
			/etc/mknod r${name}${unit}${fmt}a  c ${chr} ${minor}
		done
		;;
	2|3)
		umask 0
		rm -f fd${unit}[0-7]a rfd${unit}[0-7]a
		for fmt in 0 1 2 3 4 5 6 7; do
			minor=`expr ${unit} '*' 64 + ${fmt} '*' 8`
			/etc/mknod ${name}${unit}${fmt}a   b ${blk} ${minor}
			/etc/mknod r${name}${unit}${fmt}a  c ${chr} ${minor}
		done
		;;
	*)
		echo Invalid unit number for fd in: $i
		;;
	esac
	umask 77
	;;

md)
	/etc/mknod md0a b 2 0
	/etc/mknod rmd0a c 10 0
	;;

rs*)
	unit=`expr $i : 'rs\(.*\)'`
	case $unit in
	0)
		eval `echo $unit | awk ' { b=$1; n=$1 } END {
			for (i = 0; i < 2; i++)
				printf("/etc/mknod tty%s%d c 1 %d; ", \
					n, i, b*4+i); }'`
		;;
	1|2)
		eval `echo $unit | awk ' { b=$1; n=$1 } END {
			for (i = 0; i < 4; i++)
				printf("/etc/mknod tty%s%d c 1 %d; ", \
					n, i, b*4+i); }'`
		;;
	*)
		echo bad unit for rs in: $i
		;;
	esac
	;;

lp*)
	case $i in
	lp*) name=lp; major=6;;
	esac
	unit=`expr $i : "$name\(.*\)"`
	case $unit in
	0|1|2|3|4|5|6|7)
		/etc/mknod $i c $major $unit;
		chmod 666 $i
		;;
	*)
		echo bad unit for $name in: $i
		;;
	esac
	;;

pty*)
	class=`expr $i : 'pty\(.*\)'`
	if [ $class -gt 10 ]
	then
		echo bad unit for pty in: $i
	else
		offset=`expr $class '*' 16`
		#
		# 112 = 'p'
		#
		name=`echo $class | awk '{printf("%c\n", 112 + $0);}'`
		umask 0
		eval `echo $offset $name | awk ' { b=$1; n=$2 } END {
			for (i = 0; i < 16; i++)
				printf("/etc/mknod tty%s%x c 8 %d; \
					/etc/mknod pty%s%x c 9 %d; ", \
					n, i, b+i, n, i, b+i); }'`
		umask 77
	fi
	;;

fb)
	/etc/mknod fb c 14 0		; chmod a+rw fb
	;;

fb*)
	unit=`expr $i : "..\(.*\)"`
	/etc/mknod $i c 14 $unit
	/etc/mknod video${unit} c 14 `expr $unit + 128`
	chmod a+rw $i video${unit}
	;;

keyboard)
	/etc/mknod keyboard c 11 0	; chmod a+rw keyboard
	;;

mouse)
	/etc/mknod mouse c 12 0		; chmod a+rw mouse
	;;

ether*)
	case $i in
	ether*) name=ether; major=23;;
	esac
	unit=`expr $i : "$name\(.*\)"`
	case $unit in
	0|1|2)
		/etc/mknod $i c $major $unit;
		chmod 644 $i
		;;
	*)
		echo bad unit for $name in: $i
		;;
	esac
	;;

gpib)
	/etc/mknod gpib c 20 0		; chmod a+rw gpib
	;;

ir)
	rm -f ir ibctrl
	/etc/mknod ir c 18 0		; chmod a+rw ir
	/etc/mknod ibctrl c 34 0	; chmod a+rw ibctrl
	;;

lbp)
	rm -f lbp ibctrl
	/etc/mknod lbp c 17 0		; chmod a+rw lbp
	/etc/mknod ibctrl c 34 0	; chmod a+rw ibctrl
	;;

ib)
	rm -f ir lbp ibctrl
	/etc/mknod ir		c 18 0	; chmod a+rw ir
	/etc/mknod lbp		c 17 0	; chmod a+rw lbp
	/etc/mknod ibctrl	c 34 0	; chmod a+rw ibctrl
	/etc/mknod ibstat	c 34 1	; chmod a+rw ibstat
	/etc/mknod ib		c 34 2	; chmod a+rw ib
	/etc/mknod iblbp	c 34 3	; chmod a+rw iblbp
	;;

vmemem)
	/etc/mknod vmemem c 19 0	; chmod a+rw vmemem
	;;

shm*)
	class=`expr $i : 'shm\(.*\)'`

	case $class in
	0|1|2|3|4|5|6|7)
		umask 0
		eval `echo $class | awk ' { b=$1 * 32 } END {
			for (i = 0; i < 32; i++)
				printf("/etc/mknod shm%d c 29 %d; ", \
					i+b, i+b); }'`
		umask 77
		;;
	*)
		echo bad unit for shm in: $i
		;;
	esac
	;;

sem*)
	class=`expr $i : 'sem\(.*\)'`

	case $class in
	0|1|2|3|4|5|6|7)
		umask 0
		eval `echo $class | awk ' { b=$1 * 32 } END {
			for (i = 0; i < 32; i++)
				printf("/etc/mknod sem%d c 30 %d; ", \
					i+b, i+b); }'`
		umask 77
		;;
	*)
		echo bad unit for sem in: $i
		;;
	esac
	;;

vvcrs)
	/etc/mknod vvcrs0 c 31 0	; chmod a+rw vvcrs0
	/etc/mknod vvcrs1 c 31 1	; chmod a+rw vvcrs1
	;;

sb)
	/etc/mknod sb0 c 35 0		; chmod a+rw sb0
	;;
	
sbe)
	/etc/mknod sbe0 c 36 0		; chmod a+rw sbe0
	/etc/mknod sbec0 c 36 1		; chmod a+rw sbec0
	;;

isdn)
	/etc/mknod isdn c 39 0		; chmod 644 isdn
	/etc/mknod voice c 39 1		; chmod 666 voice
	;;

bpf*)
	unit=`expr $i : "...\(.*\)"`
	/etc/mknod $i c 24 $unit
	;;

rb)
	/etc/mknod rb0 c 40 0		; chmod 666 rb0
	;;

gs)
	umask 0
	mkdir gs; chmod 755 gs
	echo -n | eval `awk 'END {
		for (i = 0; i < 64; i++)
			printf("/etc/mknod gs/gs%d c 41 %d;", i, i); }'`
	umask 77
	;;

rx)
	/etc/mknod rx0 c 42 0		; chmod 666 rx0
	;;

local)
	sh MAKEDEV.local
	;;
esac
done
