#! /bin/sh

#ident	"$Header: MAKEDEV 1.29 90/10/01 $"
# $Copyright:	$
# Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989, 1990 
# Sequent Computer Systems, Inc.   All rights reserved.
#  
# This software is furnished under a license and may be used
# only in accordance with the terms of that license and with the
# inclusion of the above copyright notice.   This software may not
# be provided or otherwise made available to, or used by, any
# other person.  No title to or ownership of the software is
# hereby transferred.

#
# Device "make" file.  Valid arguments:
#	std		standard devices
#	mb		multibus memory devices
#	auto		devices found when the system was booted
#	s27,s81		generic devices for s27 or s81
#	s16		generic devices for s16
# Disks:
#	sd*	SCSI disks on SCED
#	wd*	SCSI disks on SSM
#	zd*	ZDC disks
# Tapes:
#	tg*	SCSI GCR tape on SSM
#	ts*	SCSI Streamer tape on SCED
#	tm*	SCSI Streamer tape on SSM
#	xt*	Cipher 1600 bpi *or* Fujitsu GCR on Xylogics 472 on multibus
# Printers:
#	lp*	Systech MLP-2000 parallel line printer interface
#	wp*	VME based parallel printer interface on the SSM
# Console Devices and Terminals:
#	sec*	SCED console terminal lines
#	ssm*	SSM console terminal lines
#	st*	Systech 8-16 line mux on Multibus
#	xs*	Xylogics 16 line mux for s16
# Memory devices:
#	msec*	SCED console memory
#	mssm*	SSM console memory
# Pseudo devices:
#	pty*	set of slave pseudo terminals (* = number to make)
#	pts*	(same as pty*)
#	ptm*	set of master pseudo terminals (* = number to make)
#	sp*	Streams Pipes (* = number to make)
# Permissions:
#	Std is on a per device basis, with memory devices group sys mode 440
#	Disks are owned by root, group sys, and mode 600
#	Tapes are mode 666
#	Permission on terminals will be set by login
#
MAKEDEV=$0
PATH=/bin:/etc:/usr/bin:$PATH export PATH
CLONE=5		# major number of STREAMS clone driver

if [ "$1" = "-n" ]; then
	MKDIR="echo mkdir"
	MKNOD="echo mknod"
	CHOWN="echo chown"
	CHMOD="echo chmod"
	CHGRP="echo chgrp"
	LN="echo ln"
	MAKEDEV="${MAKEDEV} -n"
	shift
else
	MKDIR=mkdir
	MKNOD=makenod
	CHOWN=chown
	CHMOD=chmod
	CHGRP=chgrp
	LN=link
fi
TTYNAME=ttydevname
export MKDIR MKNOD CHOWN CHMOD CHGRP LN MAKEDEV TTYNAME CLONE
umask 77

#---
#--- Directories under /dev
#---
BDSKDIR=dsk
CDSKDIR=rdsk
DIAGDIR=diag
#BMTDIR=mt
CMTDIR=rmt
LPDIR=printer
MEMDIR=cmem
BSADIR=SA
CSADIR=rSA
ENETDIR=enet
export BDSKDIR CDSKDIR DIAGDIR CMTDIR LPDIR MEMDIR BSADIR CSADIR ENETDIR

#---
#--- These two shell functions must be included in all MAKEDEV.* files
#---

makenod() {
	[ -c "$1" -o -b "$1" ] || mknod $*
}

link() {
	if [ -c "$1" -o -b "$1" ]; then
		rm -f $2
		ln -f $1 $2
	fi
}

for i
do
case $i in

# Dummy entries for bus specifiers that have no nodes
mbad*|multibus*|sec_scsi*|sb8000*|smde*|zdc*)
	# no nodes
	;;

#---
#--- Determine the type of machine and make the appropriate
#--- devices that may be found by the generic kernel.
#---
generic)
	sh ${MAKEDEV} auto
	;;

#---
#--- Create the nodes for the physical devices that were found by
#--- the auto-configure routine when the system was booted.
#--- All the machine types are here for history's sake.
#--- There is no longer a specific config for each system, with Series II.
#---
auto*|s16|s27|s81)
	# First make all necessary devices
	sh ${MAKEDEV} std

	DISKS="sd wd zd"
	TAPES="tg tm ts xt"
	PORTS="sec ssm st xs lp"

	#
	# create an egrep pattern from list of devices
	#
	pattern=
	for p in $DISKS $TAPES $PORTS
	do
		[ -z "$pattern" ] || pattern="${pattern}|"
		pattern="${pattern}^${p} "
	done

	DEVLIST=`
		/etc/dumpconf -d |
		egrep "$pattern" |
		awk ' { printf(" %s%s", $1, $2); } '
		`
	PSEUDOLIST=`
		/etc/dumpconf -p |
		egrep "pty" |
		awk '{ printf(" %s%s", $2,$3);}'
		`
	sh ${MAKEDEV} $DEVLIST $PSEUDOLIST
	if [ `/etc/showcfg -s | egrep -c ssm` -eq 0 ]; then
		sh ${MAKEDEV} mb SCED_SA
	else
		sh ${MAKEDEV} SSM_SA
	fi
	;;

#---
#--- The console pseudo driver will determine if powerup control is
#--- via SCED or SSM and setup the devices accordingly.
#---
#--- /dev/console is now a write-only device that can be used for logging
#--- output from daemons with no "controlling tty" side-effects.
#---
#--- /dev/syscon will always follow the front panel light and
#--- /dev/altcon will never follow the front panel light.
#---
#--- /dev/systty is here only for historical reasons.
#---
std)
	${MKNOD} syscon		c 27 0
	${MKNOD} altcon		c 27 1
	${MKNOD} console	c 27 2
		${LN} console systty
		${CHMOD} 622 syscon altcon
		${CHMOD} 622 console
	#---
	#--- consmem: console memory pseudo driver
	#--- will determine if SCED or SSM
	#---
	${MKNOD} consmem	c 28 64
		${CHMOD} 440 consmem;	${CHGRP} sys consmem
	${MKNOD} tty	c 2  0	; ${CHMOD} 666 tty
	${MKNOD} mem	c 3  0	; ${CHMOD} 440 mem;	${CHGRP} sys mem
	${MKNOD} kmem	c 3  1	; ${CHMOD} 440 kmem;	${CHGRP} sys kmem
	${MKNOD} null	c 3  2	; ${CHMOD} 666 null
	${MKNOD} swap	c 4  0	; ${CHMOD} 660 swap;	${CHGRP} sys swap
	${MKNOD} usclk	c 19 0	; ${CHMOD} 444 usclk;	${CHGRP} sys usclk

	#---
	#--- streams clone devices for
	#--- log, master ptys and streams pipes
	#---
	${MKNOD} log	c $CLONE 24; ${CHMOD} 666 log;	${CHGRP} sys log
	${MKNOD} getpty	c $CLONE 53; ${CHMOD} 666 getpty; ${CHGRP} sys getpty
	${MKNOD} spx	c $CLONE 54; ${CHMOD} 666 spx;	${CHGRP} sys spx

	#---
	#--- necessary vtoc devices
	#---
	${MKNOD} cmpt	c 21 0	; ${CHMOD} 640 cmpt;	${CHGRP} sys cmpt
	${MKNOD} vtoc	c 30 0	; ${CHMOD} 640 vtoc;	${CHGRP} sys vtoc
	;;

mb)
	[ -d ${MEMDIR} ] || ${MKDIR} ${MEMDIR} && ${CHMOD} 755 ${MEMDIR}
	${MKNOD} ${MEMDIR}/kMWmem	c 29 0
	${MKNOD} ${MEMDIR}/kMBmem	c 29 1
	${CHMOD} 600 ${MEMDIR}/kMWmem ${MEMDIR}/kMBmem
	${CHGRP} sys ${MEMDIR}/kMWmem ${MEMDIR}/kMBmem
	;;

strtest)
	umask 133	# (644)
	${MKNOD} lbtst	c  $CLONE 13
	${MKNOD} loop	c  $CLONE 14
	${MKNOD} loopd	c  $CLONE 15
	${MKNOD} tmux	c  $CLONE 16
	umask 77
	;;

msec*|mssm*)
	[ -d ${MEMDIR} ] || ${MKDIR} ${MEMDIR} && ${CHMOD} 755 ${MEMDIR}
	case $i in
	msec*) name=msec; chr=10;;
	mssm*) name=mssm; chr=7;;
	esac
	unit=`expr $i : "$name\(.*\)"`
	case $unit in
	[0-3])	${MKNOD} ${MEMDIR}/${name}${unit} c $chr $unit
		${CHMOD} 440 ${MEMDIR}/${name}${unit}
		${CHGRP} sys ${MEMDIR}/${name}${unit} ;;
	*) echo bad unit for memory driver in: $i ;;
	esac
	;;

xt*)
#	[ -d ${BMTDIR} ] || ${MKDIR} ${BMTDIR} && ${CHMOD} 755 ${BMTDIR}
	[ -d ${CMTDIR} ] || ${MKDIR} ${CMTDIR} && ${CHMOD} 755 ${CMTDIR}
	case $i in
	xt*) name=$i; chr=33;;
	esac
	unit=`expr $i : "..\(.*\)"`
	case $unit in
	[0-3])
		umask 0		# (666)
		four=`expr $unit + 4`
		eight=`expr $unit + 8`; twelve=`expr $unit + 12`
#		${MKNOD} ${BMTDIR}/${name}m	b $blk $unit
#		${MKNOD} ${BMTDIR}/${name}mn	b $blk $four
#		${MKNOD} ${BMTDIR}/${name}h	b $blk $eight
#		${MKNOD} ${BMTDIR}/${name}hn	b $blk $twelve

#		${MKNOD} ${CMTDIR}/${name}m	c $chr $unit
#		${MKNOD} ${CMTDIR}/${name}mn	c $chr $four
		${MKNOD} ${CMTDIR}/${name}	c $chr $eight
#		${LN} ${CMTDIR}/${name} ${CMTDIR}/${name}h
		${MKNOD} ${CMTDIR}/${name}n	c $chr $twelve
#		${LN} ${CMTDIR}/${name}n ${CMTDIR}/${name}hn
		umask 77
		;;
	*)
		echo bad unit for 9-track tape in: $i
		;;
	esac
	;;

#---
#--- New mag tape drive minor numbers
#---	BITS	USAGE		PARTICULARS
#---	0-3	density select	0=NONE, 1=LOW, 2=MED, 3=HIGH, 4=COMPRESS
#---	4-7	flags		bit 7=NO rewind
#---	8-15	unit
#---
tg*)
	[ -d ${CMTDIR} ] || ${MKDIR} ${CMTDIR} && ${CHMOD} 755 ${CMTDIR}
	case $i in
	tg*) name=$i; chr=68;;
	esac
	unit=`expr $i : "..\(.*\)"`
	norew=128
	case $unit in
	[0-7])
		umask 0		# (666)
		unit=`expr $unit '*' 256`
		med=`expr $unit + 2`
		high=`expr $unit + 3`

		${MKNOD} ${CMTDIR}/${name}	c $chr $unit
		${MKNOD} ${CMTDIR}/${name}n	c $chr `expr $unit + $norew`
		${MKNOD} ${CMTDIR}/${name}m	c $chr $med
		${MKNOD} ${CMTDIR}/${name}mn	c $chr `expr $med + $norew`
		${MKNOD} ${CMTDIR}/${name}h	c $chr $high
		${MKNOD} ${CMTDIR}/${name}hn	c $chr `expr $high + $norew`
		umask 77
		;;
	*)
		echo bad unit for 9-track tape in: $i
		;;
	esac
	;;

ts*|tm*)
	[ -d ${CMTDIR} ] || ${MKDIR} ${CMTDIR} && ${CHMOD} 755 ${CMTDIR}
	case $i in
	ts*) name=$i; chr=9 ;;
	tm*) name=$i; chr=26 ;;
	esac
	unit=`expr $i : "..\(.*\)"`
	case $unit in
	[0-7])
		umask 0		# (666)
		zero=$unit; eight=`expr $unit + 8`
		${MKNOD} ${CMTDIR}/${name}	c $chr $zero
		${MKNOD} ${CMTDIR}/${name}n	c $chr $eight
		umask 77
		;;
	*)
		echo bad unit for cartridge tape in: $i
		;;
	esac
	;;

sd*|wd*|zd*)
	[ -d ${BDSKDIR} ] || ${MKDIR} ${BDSKDIR} && ${CHMOD} 775 ${BDSKDIR}
	[ -d ${CDSKDIR} ] || ${MKDIR} ${CDSKDIR} && ${CHMOD} 775 ${CDSKDIR}
	if [ ! -d ${DIAGDIR} -a ! -d ${DIAGDIR}/${CDSKDIR} ]; then
		${MKDIR} ${DIAGDIR} ${DIAGDIR}/${CDSKDIR}
		${CHMOD} 775 ${DIAGDIR} ${DIAGDIR}/${CDSKDIR}
	fi
	case $i in
	sd*) name=$i; blk=8;  chr=8;;
	wd*) name=$i; blk=25; chr=25;;
	zd*) name=$i; blk=34; chr=34;;
	esac
	if [ "$blk" != "$chr" ]
	then	echo block and character major numbers must match for $i
		continue
	fi
	unit=`expr $i : "..\(.*\)"`
	case $unit in
	# Support for 7 DCC's
	[0-9]|[1-4][0-9]|5[0-5])
		umask 177	# (600)
		s=0
		nslice=${nslice:=16}
		minor=`expr $unit '*' 256`
		while [ $s -lt $nslice ]; do
			N=${name}s${s}
			${MKNOD} ${BDSKDIR}/$N b $blk $minor
			${MKNOD} ${CDSKDIR}/$N c $chr $minor
			${CHGRP} sys ${BDSKDIR}/$N ${CDSKDIR}/$N
			s=`expr $s + 1`
			minor=`expr $minor + 1`
		done
		# Make the un-partitioned device
		minor=`expr $unit '*' 256 + 255`
		${MKNOD} ${BDSKDIR}/${name} b $blk $minor
		${MKNOD} ${CDSKDIR}/${name} c $chr $minor
		${CHGRP} sys ${BDSKDIR}/${name} ${CDSKDIR}/${name}

		# Turn on high bit for diagnostics (major + 2^15)
		# and use the un-partitioned minor
		chr=`expr $chr + 32768`
		${MKNOD} ${DIAGDIR}/${CDSKDIR}/${name} c $chr $minor
		${CHGRP} sys ${DIAGDIR}/${CDSKDIR}/${name}
		umask 77
		;;
	*)
		echo bad unit for disk in: $i
		;;
	esac
	;;

#---
#--- Console Devices and Terminals
#---
sec*|ssm*|st*|xs*)
	case $i in
	sec*) name=sec; major=1;  nlines=2; valid='[0-3]'; valid1=;;
	ssm*) name=ssm; major=22; nlines=2; valid='[0-3]'; valid1=;;
	st*) name=st; major=6;  nlines=16; valid='[0-9]'; valid1='1[0-5]';;
	xs*) name=xs; major=23; nlines=16; valid='[0-9]'; valid1='1[0-5]';;
	esac
	unit=`expr $i : "$name\(.*\)"`
	case $unit in
	$valid|$valid1)
		if [ "$name" = "ssm" ]; then
			${MAKEDEV} wp${unit}
		fi
		if [ "$name" = "sec" ]; then
			${MAKEDEV} sced_ether${unit}
		fi
		umask 155	# (622)
		unit=`expr $unit '*' $nlines`
		tty=`${TTYNAME} $major $unit`
		TTYDIR=`expr $tty : "/dev/\(tty..\)"`
		[ -d ${TTYDIR} ] || ${MKDIR} ${TTYDIR} && ${CHMOD} 755 ${TTYDIR}
		line=0
		while [ $line -lt $nlines ]; do
			minor=`expr $unit '+' $line`
			tty=`${TTYNAME} $major $minor`
			tty=`expr $tty : "/dev/\(tty../....\)"`
			${MKNOD} $tty c $major $minor
			line=`expr $line + 1`
		done
		umask 77
		;;
	*) echo bad unit for $name in: $i ;;
	esac
	;;

#---
#--- SCED Ethernet (se)
#--- This ether controller is an integral part of the SCED.
#---
sced_ether*)
	[ -d ${ENETDIR} ] || ${MKDIR} ${ENETDIR} && ${CHMOD} 755 ${ENETDIR}
	unit=`expr $i : "sced_ether\(.*\)"`
	case $i in
	sced_ether*) name=se${unit}; chr=55;;
	esac
	case $unit in
	[0-3])
		umask 0		# (644)
		minor=`expr $unit '*' 256 + $chr`

		${MKNOD} ${ENETDIR}/${name}	c $CLONE $minor
		umask 77
		;;
	*)
		echo Bad unit for SCED ether in: $name
		;;
	esac
	;;

pty*|pts*|ptm*)
	case $i in
	pts*)  name=pts; major=52;;
	pty*)  name=pty; major=52;;
	ptm*)  name=ptm; major=53;;
	esac

	umask 111			 # (666) anyone can use

	num=`expr $i : "$name\(.*\)"`
	minor=0
	while [ $minor -lt $num ]; do
		tty=`${TTYNAME} $major $minor`
		TTYDIR=`expr $tty : "/dev/\(tty..\)"`
		[ -d ${TTYDIR} ] || ${MKDIR} ${TTYDIR} &&
			${CHMOD} 755 ${TTYDIR}

		tty=`${TTYNAME} $major $minor`
		tty=`expr $tty : "/dev/\(tty../....\)"`
		${MKNOD} $tty c $major $minor
		minor=`expr $minor + 1`
	done
	umask 77
	;;

# Streams Pipes
sp*)
	name=sp; major=54

	umask 111			 # (666) anyone can use

	num=`expr $i : "$name\(.*\)"`
	minor=0
	while [ $minor -lt $num ]; do
		${MKNOD} sp$minor c $major $minor
		minor=`expr $minor + 1`
	done
	umask 77
	;;

lp*|wp*)
	[ -d ${LPDIR} ] || ${MKDIR} ${LPDIR} && ${CHMOD} 755 ${LPDIR}
	case $i in
	lp*) name=lp; major=12; ports=2;;
	wp*) name=wp; major=20; ports=1;;
	esac
	unit=`expr $i : "$name\(.*\)"`
	case $unit in
	[0-3])
		umask 7
		name=${LPDIR}/${name}
		p=0
		minor=`expr $unit '*' $ports`
		while [ $p -lt $ports ]; do
			minor=`expr $minor + $p`
			${MKNOD} ${name}${minor} c $major $minor
			${CHGRP} sys ${name}${minor}
			p=`expr $p + 1`
		done
		umask 77
		;;
	*) echo bad unit for $name in: $i;;
	esac
	;;

#---
#--- The following section will make the appropriate device links
#--- for sysadm.
#---
SCED_SA)
	[ -d ${CSADIR} ] || ${MKDIR} ${CSADIR} && ${CHMOD} 775 ${CSADIR}
	${LN} ${CMTDIR}/ts0 ${CSADIR}/ctape0
	${LN} ${CMTDIR}/ts0n ${CSADIR}/ctape0n
	${LN} ${CMTDIR}/xt0 ${CSADIR}/mtape0
	${LN} ${CMTDIR}/xt0n ${CSADIR}/mtape0n
	;;

SSM_SA)
	[ -d ${CSADIR} ] || ${MKDIR} ${CSADIR} && ${CHMOD} 775 ${CSADIR}
	${LN} ${CMTDIR}/tm0 ${CSADIR}/ctape0
	${LN} ${CMTDIR}/tm0n ${CSADIR}/ctape0n
	${LN} ${CMTDIR}/tg0 ${CSADIR}/mtape0
	${LN} ${CMTDIR}/tg0n ${CSADIR}/mtape0n
	;;

#---
#--- When a MAKEDEV target is not available in this file,
#--- check to see if it exists in any other MAKEDEV.* file.
#---
#--- NOTE: All MAKEDEV.* files must exit with non-zero status
#--- (quietly) if they cannot make a specified target.  For
#--- example:
#
#	for i
#	do
#	case $i in
#	your_targets)
#		;;
#	 *)
#		exit 1
#		;;
#	esac
#	done
#---
*)
	status=1
	for file in MAKEDEV.*
	do
		sh ./$file $i
		status=$?
		if [ $status -eq 0 ]; then
			break
		fi
	done
	if [ $status -ne 0 ]; then
		echo "MAKEDEV: $i: unsupported device"
	fi
	;;
esac
done
