#! /bin/sh
#
# Copyright (c) 1990 The Regents of the University of California.
# All rights reserved.
#
# Redistribution and use in source and binary forms are permitted provided
# that: (1) source distributions retain this entire copyright notice and
# comment, and (2) distributions including binaries display the following
# acknowledgement:  ``This product includes software developed by the
# University of California, Berkeley and its contributors'' in the
# documentation or other materials provided with the distribution and in
# all advertising materials mentioning features or use of this software.
# Neither the name of the University nor the names of its contributors may
# be used to endorse or promote products derived from this software without
# specific prior written permission.
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#	@(#)MAKEDEV	4.16	7/23/83
#
# $Header: /usr/src/etc/etc.rt/RCS/MAKEDEV,v 1.13 1994/06/03 17:59:17 roger Exp $
# $Source: /usr/src/etc/etc.rt/RCS/MAKEDEV,v $
#
# Device "make" file.  Valid arguments:
#	std	standard devices
#	local	configuration specific devices
# Tapes:
#	st*	streaming tape
#	cs*	streaming SCSI tape
# Disks:
#	hd*	hard disk
#	fd*	floppy disk
#	xt*	SCSI disk
#	cd*	SCSI cd rom
# Terminal multiplexors:
#	asx*	8 port asynch
#	asy*	4 port asynch
#	com*	communications card
#	psp	2 port planar serial card
# Pseudo terminals:
#	pty*	set of 16 master and slave pseudo terminals
# Pseudo devices:
#	displays	aed, apa16, apa8, apa8c, mono
#	bpf*	set of 10 berkeley packet filters
# Printers:
#	lp*	line printer
#	ps*	PostScript printer
# Special:
#	mouse	planar mouse/tablet input
#	speaker	interface to keyboard speaker
#	displays	makes all the display device interfaces.
# 
# MAKEDEV floorstand creates devices for standard configuration for the
#	floorstand configuration
# MAKEDEV 6152	creates devices for the 6152 (similar to floorstand but
#		omitting various devices.
#
umask 77
for i
do
case $i in

floorstand)
	./MAKEDEV std st0 hd0 hd1 hd2 hd3 hd4 hd5 fd0 fd1 sc0 sc1 asy0 psp com1 com2 lp0 pty0 pty1
	;;

6152)
	./MAKEDEV std hd0 hd1 fd0 fd1 asy0 lp0 pty0
	;;

X)
	./MAKEDEV conttys displays mice bus
	;;
std)
	/sbin/mknod console	c 0 0
	/sbin/mknod drum	c 9 0	; chmod 640 drum ; chgrp kmem drum
	/sbin/mknod kmem	c 3 1	; chmod 640 kmem ; chgrp kmem kmem
	/sbin/mknod mem		c 3 0	; chmod 640 mem ; chgrp kmem mem
	/sbin/mknod null	c 3 2	; chmod 666 null
# following only make sense on an RT
	/sbin/mknod kmem1	c 3 3	; chmod 640 kmem1 ; chgrp kmem kmem1
	/sbin/mknod kmem2	c 3 4	; chmod 640 kmem2 ; chgrp kmem kmem2
	/sbin/mknod kmem4	c 3 5	; chmod 640 kmem4 ; chgrp kmem kmem4
	/sbin/mknod ros		c 3 6	; chmod 444 ros
	/sbin/mknod afpamem	c 3 12	; chmod 600 afpamem
	/sbin/mknod nvram	c 3 13	; chmod 640 nvram
# following only make sense on a 6152
#	/sbin/mknod pcmem	c 3 7	; chmod 640 pcmem ; chgrp kmem pcmem
#	/sbin/mknod rpc0a	c 3 8	; chmod 640 rpc0a ; chgrp kmem rpc0a
#	/sbin/mknod pc0a	b 9 8	; chmod 640 pc0a ; chgrp kmem pc0a
#	/sbin/mknod mem0	c 3 9	; chmod 640 mem0 ; chgrp kmem mem0
#	/sbin/mknod mem1	c 3 10	; chmod 640 mem1 ; chgrp kmem mem1
#	/sbin/mknod mem2	c 3 11	; chmod 640 mem2 ; chgrp kmem mem2
# end of 6152 devices
	/sbin/mknod tty		c 2 0	; chmod 666 tty
	/sbin/mknod klog		c 19 0	; chmod 640 klog ; chgrp kmem klog
 	/sbin/mknod mouse	c 15 80	; chmod 666 mouse
	/sbin/mknod speaker	c 14 0  ; chmod 666 speaker
        /sbin/mknod stdin             c 26 0  ; chmod 666 stdin
        /sbin/mknod stdout            c 26 1  ; chmod 666 stdout
        /sbin/mknod stderr            c 26 2  ; chmod 666 stderr
        mkdir fd > /dev/null 2>&1
        (cd fd && eval `echo "" | awk ' BEGIN { \
                for (i = 0; i < 64; i++) \
                        printf("/sbin/mknod %d c 26 %d;", i, i)}'`)
        chown -R bin.bin fd
        chmod 555 fd
        chmod 666 fd/*
	;;

cs0)
	umask 0 ; unit=`expr $i : '..\(.*\)'`
	blk=10; chr=27;
#	/etc/mknod cs$unit	b $blk $unit
	/sbin/mknod cs0		b $blk 0
	/sbin/mknod ncs0	b $blk 8
	/sbin/mknod rcs0	c $chr 0
	/sbin/mknod nrcs0	 c $chr 8
	/bin/rm -f mt0 mt4 mt8 mt12 rmt0 rmt4 rmt8 rmt12
	ln rcs0 rmt0
	ln rcs0 rmt8
	ln nrcs0 rmt4
	ln nrcs0 rmt12
	ln cs0 mt0
	ln cs0 mt8
	ln ncs0 mt4
	ln ncs0 mt12
	umask 77
	;;
cs1)
        umask 0 ; unit=`expr $i : '..\(.*\)'`
        blk=10; chr=25;
#       /etc/mknod cs$unit      b $blk $unit
        /sbin/mknod cs1		b $blk 16
        /sbin/mknod ncs1	b $blk 24
        /sbin/mknod rcs1	c $chr 16
        /sbin/mknod nrcs1	c $chr 24
        umask 77
        ;;

st0)
	umask 0 ; unit=`expr $i : '..\(.*\)'`
	blk=5;
#	/sbin/mknod st$unit	b $blk $unit
	/sbin/mknod st0	b 5 0
	/sbin/mknod nst0	b 5 4
	/sbin/mknod rst0	c 11 0
	/sbin/mknod nrst0 c 11 4
	umask 77
	;;

xt*)
	unit=`expr $i : '..\(.*\)'`
	case $i in
	xt*) name=xt; blk=11; chr=28;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16)
		/sbin/mknod ${name}${unit}a	b $blk `expr $unit '*' 16 + 0`
		/sbin/mknod ${name}${unit}b	b $blk `expr $unit '*' 16 + 1`
		/sbin/mknod ${name}${unit}c	b $blk `expr $unit '*' 16 + 2`
		/sbin/mknod ${name}${unit}g	b $blk `expr $unit '*' 16 + 6`
		/sbin/mknod r${name}${unit}a	c $chr `expr $unit '*' 16 + 0`
		/sbin/mknod r${name}${unit}b	c $chr `expr $unit '*' 16 + 1`
		/sbin/mknod r${name}${unit}c	c $chr `expr $unit '*' 16 + 2`
		/sbin/mknod r${name}${unit}g	c $chr `expr $unit '*' 16 + 6`
		/sbin/mknod ${name}${unit}d	b $blk `expr $unit '*' 16 + 3`
		/sbin/mknod ${name}${unit}e	b $blk `expr $unit '*' 16 + 4`
		/sbin/mknod ${name}${unit}f	b $blk `expr $unit '*' 16 + 5`
		/sbin/mknod ${name}${unit}h	b $blk `expr $unit '*' 16 + 7`
		/sbin/mknod r${name}${unit}d	c $chr `expr $unit '*' 16 + 3`
		/sbin/mknod r${name}${unit}e	c $chr `expr $unit '*' 16 + 4`
		/sbin/mknod r${name}${unit}f	c $chr `expr $unit '*' 16 + 5`
		/sbin/mknod r${name}${unit}h	c $chr `expr $unit '*' 16 + 7`
		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
	;;

cd0)
	umask 0 ; unit=`expr $i : '..\(.*\)'`
	blk=12; chr=29;
	/bin/mkdir  cdrom${unit} ; chmod 755 cdrom${unit}
	/sbin/mknod cdrom${unit}/m1   b $blk 0	; chmod 444 cdrom${unit}/m1
	/sbin/mknod cdrom${unit}/m2f1 b $blk 64	; chmod 444 cdrom${unit}/m2f1
	/sbin/mknod cdrom${unit}/m2f2 b $blk 128; chmod 444 cdrom${unit}/m2f2
	/sbin/mknod cdrom${unit}/default b $blk 192; chmod 444 cdrom${unit}/default
	/bin/mkdir  rcdrom${unit} ; chmod 755 rcdrom${unit}
	/sbin/mknod rcdrom${unit}/m1   c $chr 0	 ; chmod 444 rcdrom${unit}/m1
	/sbin/mknod rcdrom${unit}/m2f1 c $chr 64 ; chmod 444 rcdrom${unit}/m2f1
	/sbin/mknod rcdrom${unit}/m2f2 c $chr 128; chmod 444 rcdrom${unit}/m2f2
	/sbin/mknod rcdrom${unit}/default c $chr 192; chmod 444 rcdrom${unit}/default
# Data CD alias (Mode1 sectors)
	ln -s /dev/cdrom${unit}/m1 /dev/cd${unit}
	ln -s /dev/rcdrom${unit}/m1 /dev/rcd${unit}
# PhotoCD alias (Mode2 Form1 sectors)
	ln -s /dev/cdrom${unit}/m2f1 /dev/pcd${unit}
	ln -s /dev/rcdrom${unit}/m2f1 /dev/rpcd${unit}
# for compatibility with SunOS
	ln -s /dev/cdrom${unit}/default /dev/sr${unit}
	ln -s /dev/rcdrom${unit}/default /dev/rsr${unit}
	;;

hd*)
	unit=`expr $i : '..\(.*\)'`
	case $i in
	hd*) name=hd; blk=1; chr=4;;
	esac
	case $unit in
	0|1|2|3|4|5)
		/sbin/mknod ${name}${unit}a	b $blk `expr $unit '*' 8 + 0`
		/sbin/mknod ${name}${unit}b	b $blk `expr $unit '*' 8 + 1`
		/sbin/mknod ${name}${unit}c	b $blk `expr $unit '*' 8 + 2`
		/sbin/mknod ${name}${unit}g	b $blk `expr $unit '*' 8 + 6`
		/sbin/mknod r${name}${unit}a	c $chr `expr $unit '*' 8 + 0`
		/sbin/mknod r${name}${unit}b	c $chr `expr $unit '*' 8 + 1`
		/sbin/mknod r${name}${unit}c	c $chr `expr $unit '*' 8 + 2`
		/sbin/mknod r${name}${unit}g	c $chr `expr $unit '*' 8 + 6`
		/sbin/mknod ${name}${unit}d	b $blk `expr $unit '*' 8 + 3`
		/sbin/mknod ${name}${unit}e	b $blk `expr $unit '*' 8 + 4`
		/sbin/mknod ${name}${unit}f	b $blk `expr $unit '*' 8 + 5`
		/sbin/mknod ${name}${unit}h	b $blk `expr $unit '*' 8 + 7`
		/sbin/mknod r${name}${unit}d	c $chr `expr $unit '*' 8 + 3`
		/sbin/mknod r${name}${unit}e	c $chr `expr $unit '*' 8 + 4`
		/sbin/mknod r${name}${unit}f	c $chr `expr $unit '*' 8 + 5`
		/sbin/mknod r${name}${unit}h	c $chr `expr $unit '*' 8 + 7`
		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
	;;

sc*)
	unit=`expr $i : '..\(.*\)'`
	case $i in
	sc*) name=sc; blk=7; chr=18;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7|8|9)
		uval=$unit;;
	a)
		uval=10;;
	b)
		uval=11;;
	c)
		uval=12;;
	d)
		uval=13;;
	*)
		uval=999;;
	esac
	case $unit in
	0|1|2|3|4|5|6|7|8|9|a|b|c|d)
		/sbin/mknod ${name}${unit}a	b $blk `expr $uval '*' 8 + 0`
		/sbin/mknod ${name}${unit}b	b $blk `expr $uval '*' 8 + 1`
		/sbin/mknod ${name}${unit}c	b $blk `expr $uval '*' 8 + 2`
		/sbin/mknod ${name}${unit}g	b $blk `expr $uval '*' 8 + 6`
		/sbin/mknod r${name}${unit}a	c $chr `expr $uval '*' 8 + 0`
		/sbin/mknod r${name}${unit}b	c $chr `expr $uval '*' 8 + 1`
		/sbin/mknod r${name}${unit}c	c $chr `expr $uval '*' 8 + 2`
		/sbin/mknod r${name}${unit}g	c $chr `expr $uval '*' 8 + 6`
		/sbin/mknod ${name}${unit}d	b $blk `expr $uval '*' 8 + 3`
		/sbin/mknod ${name}${unit}e	b $blk `expr $uval '*' 8 + 4`
		/sbin/mknod ${name}${unit}f	b $blk `expr $uval '*' 8 + 5`
		/sbin/mknod ${name}${unit}h	b $blk `expr $uval '*' 8 + 7`
		/sbin/mknod r${name}${unit}d	c $chr `expr $uval '*' 8 + 3`
		/sbin/mknod r${name}${unit}e	c $chr `expr $uval '*' 8 + 4`
		/sbin/mknod r${name}${unit}f	c $chr `expr $uval '*' 8 + 5`
		/sbin/mknod r${name}${unit}h	c $chr `expr $uval '*' 8 + 7`
		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
	;;

fd*)
	umask 0
	unit=`expr $i : '..\(.*\)'`
	name=fd; blk=3; chr=10;
	case $unit in
	0|1)
		/bin/mkdir  floppy${unit} ; chmod 755 floppy${unit}
		/sbin/mknod floppy${unit}/1.2m	 b $blk `expr $unit + 16`
		/sbin/mknod floppy${unit}/1.44m  b $blk `expr $unit + 64`
		/sbin/mknod floppy${unit}/360k   b $blk `expr $unit + 32`
		/sbin/mknod floppy${unit}/720k   b $blk `expr $unit + 80`
		/sbin/mknod floppy${unit}/autodensity   b $blk $unit
		ln -s floppy${unit}/autodensity ${name}${unit}
		/bin/mkdir  rfloppy${unit} ; chmod 755 floppy${unit}
		/sbin/mknod rfloppy${unit}/1.2m	 c $chr `expr $unit + 16`
		/sbin/mknod rfloppy${unit}/1.44m c $chr `expr $unit + 64`
		/sbin/mknod rfloppy${unit}/360k  c $chr `expr $unit + 32`
		/sbin/mknod rfloppy${unit}/720k  c $chr `expr $unit + 80`
		/sbin/mknod rfloppy${unit}/autodensity   c $chr $unit
		ln -s rfloppy${unit}/autodensity r${name}${unit}
# to keep newfs happy
		ln -s r${name}${unit} r${name}${unit}a
		;;
	*)
		echo bad unit for floppy disk in: $i
		;;
	esac
	umask 77
	;;

asy*)
	# 4-port devices. tty00 -> tty0f (ie, up to 4 boards)
	unit=`expr $i : 'asy\(.*\)'`
	case $unit in
	0|1|2|3)
                eval `echo $unit | awk ' { u=$1 } END {
                    for (i = u*4; i < (u*4)+4; i++)
                        printf("/sbin/mknod tty0%x c 20 %d; \n", i, i); }'`
                ;;
	*)
		echo bad unit for asy in: $i
		;;
	esac
	;;

asx*)
	# 8-port devices. tty10 -> tty2v (ie, up to 8 boards)
	unit=`expr $i : 'asx\(.*\)'`
	case $unit in
	0|1|2|3|4|5|6|7)
                eval `echo $unit | awk ' { u=$1; j=u/4+1 } END {
		    if (u > 3)
			u=u-4;
                    for (i = u*8; i < (u*8)+8; i++) {
			if (i < 15)
			    printf("/sbin/mknod tty%d%x c 21 %d; \n", j, i, i);
			else
			    printf("/sbin/mknod tty%d%c c 21 %d; \n", j, i+87, i);
		    }
		}'`
                ;;
	*)
		echo bad unit for asx in: $i
		;;
	esac
	;;

psp)
	/sbin/mknod ttys0 c 12 0
	/sbin/mknod ttys1 c 12 1
	;;

conttys)
	/sbin/mknod ttyaed c 0 1
	/sbin/mknod ttyap16 c 0 2
	/sbin/mknod ttyap8c c 0 3
	/sbin/mknod ttyapa8 c 0 4
	/sbin/mknod ttyega c 0 5
	/sbin/mknod ttymono c 0 6
	/sbin/mknod ttympel c 0 7
	/sbin/mknod ttyvga c 0 1
	/sbin/mknod tty8514 c 0 2
	;;

bus)
	/sbin/mknod bus c 13 0; chmod 666 bus
	;;

com*)
	unit=`expr $i : 'com\(.*\)'`
	case $unit in
	1|2|3|4)
		cunit=`expr $unit - 1`
		/sbin/mknod ttyc${cunit} c 1 $cunit
		chmod 666 ttyc${cunit}
		;;
	*)
		echo bad unit for com in: $i
		;;
	esac
	;;

lp*)
	unit=`expr $i : "lp\(.*\)"`
	case $unit in
	0|1|2)
		/sbin/mknod $i c 8 `expr $unit \* 8`
		chmod 666 $i
		;;
	*)
		echo bad unit for $name in: $i
		;;
	esac
	;;

ps*)
	unit=`expr $i : "ps\(.*\)"`
	case $unit in
	0|1|2)
		/sbin/mknod $i c 22 $unit
		chmod 666 $i
		;;
	*)
		echo bad unit for $name in: $i
		;;
	esac
	;;
pty*)
	class=`expr $i : 'pty\(.*\)'`
	case $class in
	0) offset=0 name=p;;
	1) offset=16 name=q;;
	2) offset=32 name=r;;
	*) echo bad unit for pty in: $i;;
	esac
	case $class in
	0|1|2)
		umask 0
		eval `echo $offset $name | awk ' { b=$1; n=$2 } END {
			for (i = 0; i < 16; i++)
				printf("/sbin/mknod tty%s%x c 6 %d; \
					/sbin/mknod pty%s%x c 7 %d; ", \
					n, i, b+i, n, i, b+i); }'`
		umask 77
		;;
	esac
	;;

displays)
	/sbin/mknod aed c 0 73; chmod 666 aed
	/sbin/mknod apa16 c 0 74 ; chmod 666 apa16
	/sbin/mknod apa8c c 0 75 ; chmod 666 apa8c
	/sbin/mknod apa8 c 0 76 ; chmod 666 apa8
	/sbin/mknod ega c 0 77 ; chmod 666 ega
	/sbin/mknod mono c 0 78 ; chmod 666 mono
	/sbin/mknod mpel c 0 79 ; chmod 666 mpel
	/sbin/mknod vga c 0 73 ; chmod 666 vga
	/sbin/mknod ibm8514 c 0 74 ; chmod 666 ibm8514
 	;;

bpf*)
	/sbin/mknod bpf0 c 25 0
	/sbin/mknod bpf1 c 25 1
	/sbin/mknod bpf2 c 25 2
	/sbin/mknod bpf3 c 25 3
	/sbin/mknod bpf4 c 25 4
	/sbin/mknod bpf5 c 25 5
	/sbin/mknod bpf6 c 25 6
	/sbin/mknod bpf7 c 25 7
	/sbin/mknod bpf8 c 25 8
	/sbin/mknod bpf9 c 25 9
	chmod 400 bpf*
	;;

mice)
	/sbin/mknod msaed c 15 1 ; chmod 666 msaed
	/sbin/mknod msapa16 c 15 2; chmod 666 msapa16
	/sbin/mknod msapa8c c 15 3; chmod 666 msapa8c
	/sbin/mknod msapa8  c 15 4; chmod 666 msapa8
	/sbin/mknod msega  c 15 5; chmod 666 msega
	/sbin/mknod msmono  c 15 6; chmod 666 msmono
	/sbin/mknod msmpel  c 15 7; chmod 666 msmpel
	/sbin/mknod msvga  c 15 1; chmod 666 msvga
	/sbin/mknod ms8514  c 15 2; chmod 666 ms8514
	;;

local)
	sh -$- MAKEDEV.local
	;;

rvd*)
	umask 0
	eval `echo "6 17 10" | awk ' { BLOCK=$1; CHAR=$2; limit=$3
		for (i=0; i<limit; ++i)
		printf("/sbin/mknod vd%da b %d %d; /sbin/mknod rvd%da c %d %d; \n", i, BLOCK, i, i, CHAR, i); } ' `
	/sbin/mknod rvdcontrol c 17 255 ; chmod 666 rvdcontrol
	;;

# make limit (10) devices for each drive specified
op*)
	drive=`expr $i : 'op\(.*\)'`
	umask 0
	eval `echo "8 21 10 $drive" | awk ' { BLOCK=$1; CHAR=$2; limit=$3; drive=$4;
		start = drive*32; end = start+limit
		for (i=start; i<end; ++i)
		printf("op=op%d; /sbin/mknod $op b %d %d; /sbin/mknod rop%d c %d %d; chmod 640 $op r$op; chgrp operator $op r$op; \n", i, BLOCK, i, i, CHAR, i); } ' `
	;;

*)
	echo "${0}: error: undefined target: ${i}"
	exit 1;;
	
esac
done
