#! /bin/sh -
#
# Device 'make' file.  Valid arguments:
#
# 	std	standard devices
#	local	configuration specific devices (in MAKEDEV.local)
#	generic	generic devices
#
#  Kernel:
	MKERN=1	#	mem, zero, etc
#
#  Disks:
	MFD=2	#	fd*	floppy devices 
	MHD=3	#	hd*	hard drive devices
	MSD=8	#	sd*	SCSI disks (8)
#
#  Tapes:
	MST=?	#	st*	SCSI tapes
		#	tapes	qic tapes (9,12)
#  Parallel ports:
	MPAR=6	#	par*	parallel ports
#
#  Virtual Terminals:
	MTTY=4	#	tty*	virtual consoles
#
#  Pseudo Terminals:
	MPTY=4	#	pty	set of master and slave pseudo terminals
#
#  Serial devices:
	MTTYS=4	#	ttyS*	serial ports
	MCUA=5	#	cua*	serial ports
#
#  Bus Mice:
	MBM=10	#	bm	bus mouse
#
#  Scsi Compact Disks:
	MSR=11	#	sr*	CDROMs
#
#  non-Scsi Compact Disks:
	MMCD=23	#	mcd0	Mitsumi CDROMs
	MSCD=15	#	scd0	Sony CDROMs
	MSBP=25	#	sbp0	Sound Blaster CDROMs
#
#  network devices 
		#	net (16,17,18,20)
#
#  loop devices 
	MLOOP=14	#	loop*
#
#----
#
# I wouldn't be so bold as to say this is perfect, but I think it does a
# rather nice job creating devices.  Parts that could be improved is
# support for other than the auto-detecting floppy devices, but I can't
# think of a clean way to name the devices.  There should be support
# for more pty groups, and also for SCSI tapes.  The SCSI device names
# are also somewhat off from what Drew Eckhardt suggested, but they
# follow the same format as the hd* names.
#
#	jwinstea@jarthur.Claremont.EDU, 4 July 1992
#
# I've added all the 'hard' floppy devices - the names are /dev/fd#D#, where
# the first number is the drive number (0 or 1), the D designates the density of
# the drive, and size (d = 5.25" 360K, h = 5.25" 1200k, D = 3.5" 720k, H = 3.5"
# 1440k), and the final number represents the disk size, in kilobytes - this can
# be 360, 720, 1200, or 1400.
#
# Because SCSI devices should now support extended partitions, sd[ab][5-8] are
# created in addition to those generated before - this matches up with hd*.  It
# is possible to have (and create) higher numbered partitions, but it is
# generally not done, so it is not done by default.
#
# I've added par[0-3], which correspond to lp[0-3].  The par names are defined
# by the latest Linux Standards draft, but the lp names are in common usage.
#
# ttys[0-3] were renamed to ttyS[0-63], as they should have been
# originally.
#
# added bus mouse device (major 10, minor 0)
#
# Fixed some of the owners and permissions.
#
#	jwinstea@jarthur.Claremont.EDU, 3 August 1992
#

for arg in $@; do
	case $arg in
		generic)
			sh $0 std
			sh $0 fd0 fd1
			sh $0 fd0d360 fd0h360 fd0h720 fd0h1200 fd0D360 fd0D720 fd0H360 fd0H720 fd0H1440
			sh $0 fd1d360 fd1h360 fd1h720 fd1h1200 fd1D360 fd1D720 fd1H360 fd1H720 fd1H1440
			# first eight partitions on each hard drive
			sh $0 hda hda1 hda2 hda3 hda4 hda5 hda6 hda7 hda8
			sh $0 hdb hdb1 hdb2 hdb3 hdb4 hdb5 hdb6 hdb7 hdb8
			# SCSI drives now support extended partitions
			sh $0 sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sda8
			sh $0 sdb sdb1 sdb2 sdb3 sdb4 sdb5 sdb6 sdb7 sdb8
			sh $0 sdc sdc1 sdc2 sdc3 sdc4 sdc5 sdc6 sdc7 sdc8
			sh $0 sdd sdd1 sdd2 sdd3 sdd4 sdd5 sdd6 sdd7 sdd8
			sh $0 sde sde1 sde2 sde3 sde4 sde5 sde6 sde7 sde8
			# makes the pty group
			sh $0 pty
			# first twelve virtual terminals
			sh $0 tty0 tty1 tty2 tty3 tty4 tty5 tty6 tty7 tty8 tty9 tty10 tty11 tty12
			# four serial ports
			sh $0 ttyS0 ttyS1 ttyS2 ttyS3
			sh $0 cua0 cua1 cua2 cua3
			sh $0 bm
			# all three parallel ports
			sh $0 lp0 lp1 lp2
			sh $0 par0 par1 par2
			sh $0 tapes
			sh $0 sr0 sr1 sr2
			sh $0 mcd0 scd0 sbp0
			sh $0 net
			sh $0 loop0 loop1 loop2 loop3 loop4 loop5 loop6 loop7 loop8 loop9
			;;

		local)
			sh $0.local
			;;

		std)
			mknod mem c $MKERN 1; chown root:mem mem; chmod 0660 mem
			mknod kmem c $MKERN 2; chown root:mem kmem; chmod 0640 kmem
			mknod null c $MKERN 3; chown root:mem null; chmod 0666 null
			mknod port c $MKERN 4; chown root:mem port; chmod 0660 port
			mknod zero c $MKERN 5; chown root:mem zero; chmod 0666 zero
			mknod ram b $MKERN 0; chown root:disk ram; chmod 0660 ram
			mknod ramdisk b $MKERN 1; chown root:disk ramdisk; chmod 0660 ramdisk
			mknod console c $MTTY 1; chown root:tty console; chmod 0622 console
			mknod tty c $MCUA 0; chown root:tty tty; chmod 0666 tty
			mknod boot0 c 0 0; chown root:tty boot0; chmod 0666 boot0
			;;

		fd*)
			case $arg in
				fd0)	mknod fd0 b $MFD 0; chown root:floppy fd0; chmod 0660 fd0 ;;
				fd1)	mknod fd1 b $MFD 1; chown root:floppy fd1; chmod 0660 fd1 ;;

				fd*)
					base=`expr $arg : "fd\(.\).*"`
					if [ $base != 0 -a $base != 1 ]; then
						echo invalid disk number in: $arg;
					else
						density=`expr $arg : "fd.\(.\).*"`
						kbytes=`expr $arg : "fd..\(.*\)"`
						minor=0
						case $density in
							d)
								case $kbytes in
									360) minor=`expr 4 + $base`;;
									*) echo invalid size in: $arg;;
								esac
								;;

							h)
								case $kbytes in
									360) minor=`expr 20 + $base`;;
									720) minor=`expr 24 + $base`;;
									1200) minor=`expr 8 + $base`;;
									*) echo invalid size in: $arg;;
								esac
								;;

							D)
								case $kbytes in
									360) minor=`expr 12 + $base`;;
									720) minor=`expr 16 + $base`;;
									*) echo invalid size in $arg;;
								esac
								;;

							H)
								case $kbytes in
									360) minor=`expr 12 + $base`;;
									720) minor=`expr 16 + $base`;;
									1440) minor=`expr 28 + $base`;;
									*) echo invalid size in $arg;;
								esac
								;;

							*)	echo invalid density in: $arg;;
						esac
						if [ $minor != 0 ]; then
							mknod $arg b $MFD $minor; chown root:floppy $arg; chmod 0660 $arg
						fi
					fi
					;;

				*)	echo invalid floppy disk in: $arg ;;
			esac

			;;
		hd*)

			case $arg in
				hda)	mknod hda b $MHD 0; chown root:disk hda; chmod 0660 hda ;;
				hdb)	mknod hdb b $MHD 64; chown root:disk hdb; chmod 0660 hdb ;;

				hda*)	part=`expr $arg : "hd.\(.*\)"`
					mknod $arg b $MHD $part; chown root:disk $arg; chmod 0660 $arg ;;
				hdb*)	part=`expr $arg : "hd.\(.*\)"`
					mknod $arg b $MHD `expr 64 + $part`; chown root:disk $arg; chmod 0660 $arg ;;

				*)	echo invalid device in: $arg ;;
			esac
			;;

		sd*)
			case $arg in
				sda)	mknod sda b $MSD 0; chown root:disk sda; chmod 0660 sda ;;
				sdb)	mknod sdb b $MSD 16; chown root:disk sdb; chmod 0660 sdb ;;
				sdc)	mknod sdc b $MSD 32; chown root:disk sdc; chmod 0660 sdc ;;
				sdd)	mknod sdd b $MSD 48; chown root:disk sdd; chmod 0660 sdd ;;
				sde)	mknod sde b $MSD 64; chown root:disk sde; chmod 0660 sde ;;

				sda*)	part=`expr $arg : "sd.\(.*\)"`
					mknod $arg b $MSD $part; chown root:disk $arg; chmod 0660 $arg ;;
				sdb*)	part=`expr $arg : "sd.\(.*\)"`
					mknod $arg b $MSD `expr 16 + $part`; chown root:disk $arg; chmod 0660 $arg ;;
				sdc*)	part=`expr $arg : "sd.\(.*\)"`
					mknod $arg b $MSD `expr 32 + $part`; chown root:disk $arg; chmod 0660 $arg ;;
				sdd*)	part=`expr $arg : "sd.\(.*\)"`
					mknod $arg b $MSD `expr 48 + $part`; chown root:disk $arg; chmod 0660 $arg ;;
				sde*)	part=`expr $arg : "sd.\(.*\)"`
					mknod $arg b $MSD `expr 64 + $part`; chown root:disk $arg; chmod 0660 $arg ;;

				*)	echo invalid device in: $arg ;;
			esac
			;;

		st*)
			echo not supported yet
			;;

		tapes)
			mknod rmt b 9 0; chown root:disk rmt; chmod 0660 rmt 
			mknod nrmt b 9 128; chown root:disk nrmt; chmod 0660 nrmt 
			mknod rmt0 c 12 4          # QIC-24
			mknod rmt8 c 12 6          # QIC-120
			mknod rmt16 c 12 8         # QIC-150
			mknod tape c 12 8          # Or whatever appropriate
			mknod tape-d c 12 `expr 128 + 8`   # ditto
			mknod tape-reset c 12 255  # For resetting only
			mknod tape-nodens c 12 0   # Without setting density
			;;

		sr*)
			port=`expr $arg : "sr\(.*\)"`
			case $port in
				[0-2])	mknod sr$port b $MSR $port; chown root:daemon sr$port; chmod 0660 sr$port ;;
				*)	echo invalid CD ROM device in: $arg ;;
			esac
			;;

		scd*)
			port=`expr $arg : "scd\(.*\)"`
			case $port in
				0)	mknod scd$port b $MSCD $port; chown root:daemon scd$port; chmod 0660 scd$port ;;
				*)	echo invalid Sony CD ROM device in: $arg ;;
			esac
			;;

		mcd*)
			port=`expr $arg : "mcd\(.*\)"`
			case $port in
				0)	mknod mcd$port b $MMCD $port; chown root:daemon mcd$port; chmod 0660 mcd$port ;;
				*)	echo invalid Mitsumi CD ROM device in: $arg ;;
			esac
			;;

		sbp*)
			port=`expr $arg : "sbp\(.*\)"`
			case $port in
				0)	mknod sbp$port b $MSBP $port; chown root:daemon sbp$port; chmod 0660 mcd$port ;;
				*)	echo invalid Sound Blaster CD ROM device in: $arg ;;
			esac
			;;

		par*)
			port=`expr $arg : "par\(.*\)"`
			case $port in
				[0-2])	mknod par$port c $MPAR $port; chown root:daemon par$port; chmod 0660 par$port ;;
				*)	echo invalid parallel port in: $arg ;;
			esac
			;;

		lp*)
			port=`expr $arg : "lp\(.*\)"`
			case $port in
				[0-2])	mknod lp$port c $MPAR $port; chown root:daemon lp$port; chmod 0660 lp$port;;
				*)	echo invalid parallel port in: $arg ;;
			esac
			;;

		pty)
			declare -i ind;
			declare -i mast;
			declare -i slave;
			mast=128
			slave=192
			for i in p q r s; do
				ind=0;
				for myind in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do
					rm -f pty$i$myind;  mknod pty$i$myind c $MPTY $mast;
					rm -f tty$i$myind;  mknod tty$i$myind c $MPTY $slave;
					mast=$mast+1
					slave=$slave+1
					ind=$ind+1
				done
				chown root:tty pty$i* tty$i*; 
				chmod 0622 pty$i* tty$i*
			done
			;;

		bm)
			declare -i mousenum;
			mousenum=0
			for mousename in bmouselogitec ps2aux bmousems bmouseatixl; do 
				mknod $mousename c $MBM $mousenum; 
				chown root:tty $mousename; 
				chmod a+rw $mousename
				mousenum=$mousenum+1
			done
			;;

		serial)
			for ind in 0 8 16 24 32 40 48 56; do
			sh $0 ttyS`expr $ind` ttyS`expr $ind+1` ttyS`expr $ind+2` ttyS`expr $ind+3` \
			  ttyS`expr $ind+4` ttyS`expr $ind+5` ttyS`expr $ind+6` ttyS`expr $ind+7`
			sh $0 cua`expr $ind` cua`expr $ind+1` cua`expr $ind+2` cua`expr $ind+3` \
			  cua`expr $ind+4` cua`expr $ind+5` cua`expr $ind+6` cua`expr $ind+7`
			done
			;;
		ttyS*)
			com=`expr $arg : "ttyS\(.*\)"`
			case $com in
				[0-63])  mknod ttyS$com c $MTTYS `expr $com + 64`; chown root:tty ttyS$com; chmod a+rw ttyS$com ;;
				*)	echo invalid com port in: $arg ;;
			esac
			;;

		cua*)
			com=`expr $arg : "cua\(.*\)"`
			case $com in
				[0-63])  mknod cua$com c $MCUA `expr $com + 64`; chown root:tty cua$com; chmod a+rw cua$com ;;
				*)	echo invalid com port in: $arg ;;
			esac
			;;


		tty*)
			num=`expr $arg : "tty\(.*\)"`
			case $num in
				[0-9]|10|11|12)	mknod tty$num c $MTTY $num; chown root:tty tty$num; chmod 0622 tty$num ;;
				*)	echo invalid number in: $arg ;;
			esac
			;;
		net)
			mknod net  c 16 0
			mknod arp  c 16 1

			mknod unix c 17 0

			mknod inet c 18 0
			mknod ip   c 18 1
			mknod icmp c 18 2
			mknod tcp  c 18 3
			mknod udp  c 18 4

			mknod wd0  c 20 0
			mknod wd1  c 20 1
			mknod wd2  c 20 2
			mknod wd3  c 20 3

			mknod ec0  c 20 8
			mknod ec1  c 20 9
			mknod ec2  c 20 10
			mknod ec3  c 20 11

			mknod ne0  c 20 16
			mknod ne1  c 20 17
			mknod ne2  c 20 18
			mknod ne3  c 20 19
			;;
		loop*)	
			com=`expr $arg : "loop\(.*\)"`
			case $com in
				[0-9])  mknod loop$com b $MLOOP `expr $com + 64`; chown root:tty loop$com; chmod a+rw loop$com ;;
				*)	echo invalid loop device in: $arg ;;
			esac
			;;

		*)
			echo invalid device: $arg
			;;
	esac
done

exit 0
