#!/bin/sh -
#
#	@(#)MAKEDEV	8.1 (Berkeley) 6/9/93
#

# Device "make" file.  Valid arguments:
#	std	standard devices
#	local	configuration specific devices
#
# Tapes:
#	st*	SCSI tapes
#
# Disks:
#	fd*	floppy disk drives
#	sd*	SCSI disks
#	cd*	SCSI CD rom
#	vnd*	"file" pseudo-disks
#	rd*	"ramdisk" pseudo-disks
#	ccd*	contatenated disk devices
#
# Console ports:
#	ttyv0	pccons
#
# Pointing devices:
#	pms*	PS/2 compatible mouse
#
# Terminal multiplexors:
#	tty*	tty ports
#
# Pseudo terminals:
#	pty*	set of 16 master and slave pseudo terminals
#
# Printers:
#	lpt*	centronics lpt
#
# Call units:
#
# Special purpose devices:
#	bpf*	packet filter
#	lkm	loadable kernel modules interface
#	tun*	network tunnel driver
#
# Platform-specific devices:
#

PATH=/sbin:/bin/:/usr/bin:/usr/sbin
umask 77
for i
do
case $i in

all)        
        sh MAKEDEV std fd fd0 sd0 sd1 sd2 st0 cd0 tty0 tty1 pty0 pty1
        sh MAKEDEV ttyv0 lpt0 pms0 local
        ;;

std)
	mknod console		c 0 0
	mknod drum		c 1 0	; chmod 640 drum ; chgrp kmem drum
	mknod kmem		c 3 1	; chmod 640 kmem ; chgrp kmem kmem
	mknod mem		c 3 0	; chmod 640 mem ; chgrp kmem mem
	mknod null		c 3 2	; chmod 666 null
	mknod zero              c 3 12  ; chmod 666 zero
	mknod tty		c 2 0	; chmod 666 tty
	mknod klog		c 6 0	; chmod 600 klog
	mknod stdin		c 7 0	; chmod 666 stdin
	mknod stdout		c 7 1	; chmod 666 stdout
	mknod stderr		c 7 2	; chmod 666 stderr
	;;

ttyv*)
	unit=`expr $i : 'ttyv\(.*\)'`
	rm -f ttyv$unit
	mknod ttyv$unit c 14 $unit
	chown root.wheel ttyv$unit
	case $unit in
	0)
		rm -f pccons
		ln -s ttyv0 pccons
		;;
	esac
	;;

pms*)
	unit=`expr $i : '.ms\(.*\)'`
	case $i in
	mms*) name=mms; chr=15;;
	esac
	rm -f $name$unit
	mknod $name$unit c $chr $unit
	chown root.wheel $name$unit
	ln -s $name$unit mouse
	;;

fd)
	rm -rf fd/*
	mkdir fd > /dev/null 2>&1
	(cd fd && eval `echo "" | awk ' BEGIN { \
		for (i = 0; i < 64; i++) \
			printf("mknod %d c 7 %d;", i, i)}'`)
	chown -R bin.bin fd
	chmod 555 fd
	chmod 666 fd/*
	;;

st*)
	umask 2 ; unit=`expr $i : '..\(.*\)'`
	case $i in
	st*) name=st; chr=10;;
	esac
	case $unit in
	0|1|2|3|4|5|6)
		unit0=`expr $unit \* 16`
		unit1=`expr $unit \* 16 + 1`
		unit2=`expr $unit \* 16 + 4`
		unit3=`expr $unit \* 16 + 5`
		mknod r${name}${unit} c $chr $unit0
		mknod nr${name}${unit} c $chr $unit1
		mknod r${name}h${unit} c $chr $unit2
		mknod nr${name}h${unit} c $chr $unit3
		chgrp operator r${name}${unit} nr${name}${unit} \
			r${name}h${unit} nr${name}h${unit}
		chmod 640 r${name}${unit} nr${name}${unit} \
			r${name}h${unit} nr${name}h${unit}
		;;
	*)
		echo bad unit for tape in: $1
		;;
	esac
	umask 77
	;;

bpf*|tun*)
	unit=`expr $i : '...\(.*\)'`
	case $i in
	bpf*) name=bpf; chr=23;;
	tun*) name=tun; chr=40;;
	esac
	rm -f $name$unit
	mknod $name$unit c $chr $unit
	chown root.wheel $name$unit
	;;

#	;;
#lkm)
#	rm -f lkm
#	mknod lkm c 112 0
#	chown root.kmem lkm
#	chmod 640 lkm
#	;;

fd*|sd*|vnd*)
	umask 2 ; unit=`expr $i : '..\(.*\)'`
	case $i in
	sd*) name=sd; blk=0; chr=9;;
	vnd*) name=vnd; blk=2; chr=11;;
	fd*) name=fd; blk=7; chr=13;;
	esac
	rm -f $name$unit r$name$unit
	case $unit in
	0|1|2|3|4|5|6)
		mknod ${name}${unit}c	b $blk `expr $unit '*' 8 + 2`
		mknod r${name}${unit}c	c $chr `expr $unit '*' 8 + 2`
		if [ $name != vnd ]
		then
		mknod ${name}${unit}a	b $blk `expr $unit '*' 8 + 0`
		mknod ${name}${unit}b	b $blk `expr $unit '*' 8 + 1`
		mknod ${name}${unit}d	b $blk `expr $unit '*' 8 + 3`
		mknod ${name}${unit}e	b $blk `expr $unit '*' 8 + 4`
		mknod ${name}${unit}f	b $blk `expr $unit '*' 8 + 5`
		mknod ${name}${unit}g	b $blk `expr $unit '*' 8 + 6`
		mknod ${name}${unit}h	b $blk `expr $unit '*' 8 + 7`
		mknod r${name}${unit}a	c $chr `expr $unit '*' 8 + 0`
		mknod r${name}${unit}b	c $chr `expr $unit '*' 8 + 1`
		mknod r${name}${unit}d	c $chr `expr $unit '*' 8 + 3`
		mknod r${name}${unit}e	c $chr `expr $unit '*' 8 + 4`
		mknod r${name}${unit}f	c $chr `expr $unit '*' 8 + 5`
		mknod r${name}${unit}g	c $chr `expr $unit '*' 8 + 6`
		mknod r${name}${unit}h	c $chr `expr $unit '*' 8 + 7`
		fi
		chgrp operator ${name}${unit}[a-h] r${name}${unit}[a-h]
		chmod 640 ${name}${unit}[a-h] r${name}${unit}[a-h]
		;;
	*)
		echo bad unit for disk in: $i
		;;
	esac
	umask 77
	;;

cd*)
	umask 2 ; unit=`expr $i : '.*cd\(.*\)'`
	case $i in
	cd*) name=cd; blk=3; chr=8;;
	esac
	rm -f $name$unit? r$name$unit? 
	mknod ${name}${unit}a   b $blk `expr $unit '*' 8 + 0`
	mknod ${name}${unit}c   b $blk `expr $unit '*' 8 + 2`
	mknod r${name}${unit}a  c $chr `expr $unit '*' 8 + 0`
	mknod r${name}${unit}c  c $chr `expr $unit '*' 8 + 2`
	chgrp operator ${name}${unit}[a-h] r${name}${unit}[a-h]
	chmod 640 ${name}${unit}[a-h] r${name}${unit}[a-h] 
	umask 77
	;;
        
lpt*)
	unit=`expr $i : 'lpt\(.*\)'`
	rm -f lpt$unit
	mknod lpt$unit c 16 $unit
	chown root.wheel lpt$unit
	;;

tty*)
	unit=`expr $i : '...\(.*\)'`
	rm -f tty0$unit
	mknod tty0$unit c 17 $unit
	chown uucp.wheel tty0$unit
	;;

pty*)
	class=`expr $i : 'pty\(.*\)'`
	case $class in
	0) offset=0 name=p;;
	1) offset=16 name=q;;
	2) offset=32 name=r;;
	3) offset=48 name=s;;
# Note that telnetd, rlogind, and xterm (at least) only look at p-s.
	4) offset=64 name=t;;
	*) echo bad unit for pty in: $i;;
	esac
	case $class in
	0|1|2|3|4)
		umask 0
		eval `echo $offset $name | awk ' { b=$1; n=$2 } END {
                        for (i = 0; i < 16; i++)
                                printf("rm -f tty%s%x; mknod tty%s%x c 4 %d; \
                                    rm -f pty%s%x; mknod pty%s%x c 5 %d; ", \
                                    n, i, n, i, b+i, n, i, n, i, b+i); }'`
		umask 77
		;;
	esac
	;;

local)
	umask 0
	sh MAKEDEV.local
	;;

*)
	echo $i: unknown device
	;;
esac
done