#! /bin/sh -

# TODO as of 2.0.0:
# -----------------
# - check FIXMEs
# - entries marked "UNIMPLEMENTED"
#
# - Stallion serial card
# - Specialix serial card
# - Comtrol Rocketport serial card
# - Chase serial card
# - Digiboard serial card
# - SDL RISCom serial card
# - Atari SLM ACSI laser printer (68k/Atari)
# - ACSI disk (68k/Atari)
# - Universal frame buffer ([2.0.0]: "currently [...] Linux/68k and Linux/SPARC"
# - ROM/flash memory card
# - Z8530 HDLC driver
# - tclmidi MIDI driver
# - MPU-401 MIDI
# - Netlink support
# - Myricom PCI Myrinet board
# - ML-16P experimental I/O board
# - Yet Another Micro Monitor
# - Baycom radio modem



RCSID='$Id: MAKEDEV 2.2 1995/05/21 17:55:14 alfie Exp $'

#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#
# Customisation:
#   The devices fall into various classes.  This section contains the mapping
# from a class name into a group name and permission.
#   You will almost certainly need to edit the group name to match your
# system, and you may change the permissions to suit your preference.  These
# lines _must_ be of the format "user group perm".

 public="  root sys     666"
 system="  root sys     660"
   kmem="  root kmem    660"
    tty="  root tty     666"
   cons="  root tty     622"
    vcs="  root sys     600"
dialout="  root dialout 660"
  mouse="  root sys     666"
printer="  root lp      660"
 floppy="  root floppy  660"
   disk="  root disk    660"
   scsi="  root sys     600"
  cdrom="  root cdrom   660"
   tape="  root disk    660"
  audio="  root audio   660"
  ibcs2="  root sys     666"
scanner="  root sys     666"
# FIXME: check these!
   qcam="  root lp      660"
 random="  root sys	664"
    kbd="  root sys     664"
framegr="  root sys     664"

MAXVT=8

#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#

procfs=/proc

opt_v=
opt_d=
opt_n=

while [ $# -ge 1 ]
do
	case $1 in
		--)	shift; break ;;
		-v)	shift; opt_v=1 ;;
		-d)	shift; opt_d=1 ;;
		-n)	shift; opt_n=1; opt_v=1 ;;
		-V)	shift; opt_V=1 ;;
		-*)	echo "$0: unknown flag \"$1\"" >&2; exit 1 ;;
		*)	break ;;
	esac
done

if [ "$opt_V" ]
then
	echo "$RCSID"
	exit 0
fi

opts="${opt_n:+-n} ${opt_v:+-v} ${opt_d:+-d}"

#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#

makedev () {	# usage: makedev name [bcu] major minor owner group mode
	if [ "$opt_v" ]
	then	if [ "$opt_d" ]
		then	echo "delete $1"
		else	echo "create $1	$2 $3 $4 $5:$6 $7" 
		fi
	fi
	if [ ! "$opt_n" ]
	then	if [ "$opt_d" ]
		then
			rm -f $1
		else
			mknod $1- $2 $3 $4 &&
			chown $5:$6 $1- &&
			chmod $7 $1- &&
			mv $1- $1
		fi
	fi
}
symlink () {	# usage: symlink name target
	if [ "$opt_v" ]
	then	if [ "$opt_d" ]
		then	echo "delete $1"
		else	echo "create $1	-> $2"
		fi
	fi
	[ ! "$opt_n" ] && rm -f $1 &&
	[ ! "$opt_d" ] && ln -s $2 $1
}

#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#

# For bash and ksh, we can use faster builtin routines to do manipulation,
# otherwise (ash) fall back to slower method using `expr'.
# The extra level of indirection using `eval' is necessary a) for ksh, and
# b) to get past ash.

if [ "$RANDOM" != "$RANDOM" ]
then
	math () {
		eval echo "\$(($*))"
	}
	index () {	# index string c
		eval "I=\${1%$2*}"
		eval echo "\${#I}"
	}
	suffix () {
	    eval echo "\${1#$2}"
	}
	strip () {
		eval echo "\${1% $2 *} \${1#* $2 }"
	}
else
	math () {
		expr "$@"
	}
	index () {	# index string c
		expr $1 : ".*$2" - 1
	}
	suffix () {
		expr "$1" : "$2\(.*\)"
	}
	strip () {
		echo "[$1][$2]" >&2
		echo "`expr \"$1\" : \"\(.*\) $2 \"` `expr \"$1\" : \".* $2 \(.*\)\"`"
	}
fi

#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#---#

devices=
if [ ! -f $procfs/devices ]
then
	echo "$0: warning: can't read $procfs/devices" >&2
else
	exec 3<$procfs/devices
	while read major device <&3
	do
		case "$major" in
			Character|Block|'')
				;;
			*)
				eval "major_$device=$major"
				devices="$devices $device"
				;;
		esac
	done
	exec 3<&-
fi

Major () {
	device=$2
	if [ "$opt_d" ]
	then
		echo -1	# don't care
	else
		eval echo \${major_$1:-\${device:?\"unknown major number for $1\"}}
	fi
}

cvt () {
	while [ $# -ne 0 ]
	do
		case "$1" in
			mem|tty|ttyp|cua|cub)	;;
			hd|ide0)	echo hda hdb ;;
			cdu31a)	echo sonycd ;;
			ide1)	echo hdc hdd ;;
			sd)	echo sda sdb ;;
			sr)	echo scd0 ;;
			st)	echo st0 ;;
			xd)	echo xda xdb ;;
			dos_hd)	echo dos_hda dos_hdb dos_hdc dos_hdd ;;
			ed)	echo eda edb ;;
			ez)	echo eza ;;
			fd)	echo fd0 fd1 ;;
			lp)	echo lp ;;
			mt)	echo ftape ;;
			loop)	echo loop ;;
			md)	echo md ;;
			ibcs2)	echo ibcs2 ;;
			tpqic02)	echo qic ;;
			sound)		echo audio ;;
			logiscan)	echo logiscan ;;
			ac4096)		echo ac4096 ;;
			hw)	echo helloworld ;;
			sbpcd | sbpcd[123])	echo $1 ;;
			Joystick)	echo js ;;
			apm_bios)	echo apm ;;
			dcf)		echo dcf ;;
			aztcd)		echo aztcd ;;
			pcmcia)	;; # taken care of by its own driver
			ttyC)	echo cyclades ;;
			vcs)	;;
			*)	echo "$0: don't know what \"$1\" is" >&2 ;;
		esac
		shift
	done
}

for arg
do
	case $arg in
	generic)
		$0 $opts std
		$0 $opts fd
		$0 $opts fd0 fd1
		$0 $opts hda hdb
		$0 $opts xda xdb
		$0 $opts sda sdb
		$0 $opts ptyp ptyq ptyr ptys
		$0 $opts console
		$0 $opts ttyS0 ttyS1 ttyS2 ttyS3
		$0 $opts busmice
		$0 $opts lp
		$0 $opts par
		;;
	local)
		$0.local $opts
		;;
	std)
		makedev mem	c 1 1 $kmem
		makedev kmem	c 1 2 $kmem
		makedev null	c 1 3 $public
		makedev port	c 1 4 $kmem
		makedev zero	c 1 5 $public
		symlink core	$procfs/kcore
		makedev full	c 1 7 $public
		# [2.0.0]
		makedev random	c 1 8 $random
		makedev urandom	c 1 9 $random
		# OUTDATED: makedev ram  b 1 1 $disk
		for no in 0 1 2 3 4 5 6 7 ;
		do
		  makedev ram$no b 1 $no $disk
		done
		symlink ramdisk ram0
		makedev initrd b 1 250 $disk
		makedev tty  c 5 0 $tty
		;;
	console)
		major=`Major vcs`	# not fatal
		# console
		makedev tty0 c 4 0 $cons
		symlink console tty0
		[ "$major" ] && makedev vcs0 c $major 0 $vcs
		[ "$major" ] && makedev vcsa c $major 128 $vcs
		# individual vts
		line=1
		while [ $line -le $MAXVT -a $line -le 63 ]
		do
			makedev tty$line c 4 $line $tty
			[ "$major" ] && makedev vcs$line c $major $line $vcs
			[ "$major" ] && makedev vcsa$line c $major `math $line + 128` $vcs
			line=`math $line + 1`
		done
		;;
	tty[1-9]|tty[1-5][0-9]|tty[6][0-3])
		line=`suffix $arg tty`
		makedev tty$line c 4 $line $tty
		;;
	ttyS[0-9]|ttyS[1-5][0-9]|ttyS[6][0-3])
		line=`suffix $arg ttyS`
		minor=`math 64 + $line`
		makedev ttyS$line c 4 $minor $tty
		makedev cua$line c 5 $minor $dialout
		;;
	pty[p-s])
		# Currently limited to 64 master/slave pairs.
		bank=`suffix $arg pty`
		base=`index pqrs $bank`
		base=`math $base \* 16`
		for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f
		do
			j=`index 0123456789abcdef $i`
			makedev pty$bank$i c 4 `math 128 + $base + $j` $tty
			makedev tty$bank$i c 4 `math 192 + $base + $j` $tty
		done
		;;
	cyclades)
		major1=`Major ttyC` || continue
		major2=`Major cub` || continue
		for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
		do
			makedev ttyC$i c $major1 `math 32 + $i` $tty
			makedev cub$i c $major2 `math 32 + $i` $dialout
		done
		;;
	lp)
		major=`Major lp 6` || continue
		makedev ${arg}0 c $major 0 $printer
		makedev ${arg}1 c $major 1 $printer
		makedev ${arg}2 c $major 2 $printer
		;;
	par)
		major=`Major lp 6` || continue
		makedev ${arg}0 c $major 0 $printer
		makedev ${arg}1 c $major 1 $printer
		makedev ${arg}2 c $major 2 $printer
		;;
	busmice)
		major=`Major mouse 10` || continue
		makedev logibm    c $major 0 $mouse
		symlink logimouse logibm
		makedev psaux     c $major 1 $mouse
		symlink psmouse   psaux
		makedev inportbm  c $major 2 $mouse
		symlink msmouse   inportbm
		makedev atibm     c $major 3 $mouse
		symlink atimouse  atibm
		makedev jbm       c $major 4 $mouse
		symlink jmouse    jbm
		# Conflict: #makedev amigamouse   c $major 4 $mouse
		#makedev atarimouse   c $major 5 $mouse
		#makedev sunmouse     c $major 6 $mouse
		#makedev amigamouse1  c $major 7 $mouse
		;;
	misc)
		major=`Major misc 10` || continue
		# FIXME: check categories!!
		makedev beep		c $major 128 $audio
		makedev modreq		c $major 129 $system
		makedev watchdog	c $major 130 $system
		makedev temperature	c $major 131 $system
		makedev hwtrap		c $major 132 $system
		makedev exttrap		c $major 133 $system
		makedev apm_bios	c $major 134 $system
		# symlink apm apmbios
		makedev rtc		c $major 135 $system
		makedev qcam0		c $major 136 $qcam
		makedev qcam0		c $major 137 $qcam
		makedev qcam0		c $major 138 $qcam
		;;
	kbd)	
		major=`Major kbd 11` || continue
		# [2.0.0] "the raw keyboard device is used on Linux/Sparc only"
		makedev kbd		c $major 11  $kbd
		;;
	js)
		major=`Major Joystick 15` || continue
		makedev js0 c $major 0 $mouse
		makedev js1 c $major 1 $mouse
		# [2.0.0]
		makedev djs0 c $major 128 $mouse
		makedev djs1 c $major 129 $mouse
		;;
	fd[0-7])
		major=`Major fd 2` || continue
		base=`suffix $arg fd`
		if [ $base -ge 4 ]
		then
			base=`math $base + 124`
		fi
		makedev ${arg} b $major $base $floppy
		makedev ${arg}d360  b $major `math $base +  4` $floppy
		makedev ${arg}h1200 b $major `math $base +  8` $floppy
		makedev ${arg}D360  b $major `math $base + 12` $floppy
		makedev ${arg}D720  b $major `math $base + 16` $floppy
		makedev ${arg}h360  b $major `math $base + 20` $floppy
		makedev ${arg}h720  b $major `math $base + 24` $floppy
		makedev ${arg}H1440 b $major `math $base + 28` $floppy
		makedev ${arg}E2880 b $major `math $base + 32` $floppy
		makedev ${arg}CompaQ b $major `math $base + 36` $floppy

		symlink ${arg}H360 ${arg}D360
		symlink ${arg}H720 ${arg}D720

		makedev ${arg}h1440 b $major `math $base + 40` $floppy
		makedev ${arg}H1680 b $major `math $base + 44` $floppy
		makedev ${arg}h410  b $major `math $base + 48` $floppy
		makedev ${arg}H820  b $major `math $base + 52` $floppy
		makedev ${arg}h1476 b $major `math $base + 56` $floppy
		makedev ${arg}H1722 b $major `math $base + 60` $floppy
		makedev ${arg}h420  b $major `math $base + 64` $floppy
		makedev ${arg}H830  b $major `math $base + 68` $floppy
		makedev ${arg}h1494 b $major `math $base + 72` $floppy
		makedev ${arg}H1743 b $major `math $base + 76` $floppy
		makedev ${arg}h880  b $major `math $base + 80` $floppy
		makedev ${arg}D1040 b $major `math $base + 84` $floppy
		makedev ${arg}D1120 b $major `math $base + 88` $floppy
		makedev ${arg}h1600 b $major `math $base + 92` $floppy
		makedev ${arg}H1760 b $major `math $base + 96` $floppy
		makedev ${arg}H1920 b $major `math $base + 100` $floppy
		makedev ${arg}E3200 b $major `math $base + 104` $floppy
		makedev ${arg}E3520 b $major `math $base + 108` $floppy
		makedev ${arg}E3840 b $major `math $base + 112` $floppy
		makedev ${arg}H1840 b $major `math $base + 116` $floppy
		makedev ${arg}D800  b $major `math $base + 120` $floppy
		makedev ${arg}H1600 b $major `math $base + 124` $floppy
		;;
	hd[a-b])
		major=`Major ide0` || major=`Major hd 3` || continue
		unit=`suffix $arg hd`
		base=`index ab $unit`
		base=`math $base \* 64`
		makedev hd$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev hd$unit$part b $major `math $base + $part` $disk
		done
		;;
	hd[c-d])
		major=`Major ide1 22` || continue
		unit=`suffix $arg hd`
		base=`index cd $unit`
		base=`math $base \* 64`
		makedev hd$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev hd$unit$part b $major `expr $base + $part` $disk
		done
		;;
	xd[a-d])
		major=`Major xd 13` || continue
		unit=`suffix $arg xd`
		base=`index abcd $unit`
		base=`math $base \* 64`
		makedev xd$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev xd$unit$part b $major `expr $base + $part` $disk
		done
		;;
	sd[a-h])
		major=`Major sd 8` || continue
		unit=`suffix $arg sd`
		base=`index abcdefgh $unit`
		base=`math $base \* 16`
		makedev sd$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
		do
			minor=`expr $base + $part`
			makedev sd$unit$part b $major $minor $disk
		done
		;;
	loop)
		major=`Major loop` || continue
		for part in 0 1 2 3 4 5 6 7
		do
			makedev loop$part b $major $part $disk
		done
		;;
	md)
		major=`Major md` || continue
		for part in 0 1 2 3
		do
			makedev md$part b $major $part $disk
		done
		;;
	st[0-7])
		major=`Major st 9`
		unit=`suffix $arg st`
		makedev st$unit c $major $unit $tape
		makedev nst$unit c $major `math 128 + $unit` $tape
		;;
	qic)
		major=`Major tpqic02 12` || continue
		makedev rmt8       c $major   6 $tape
		makedev rmt16      c $major   8 $tape
		makedev tape-d     c $major 136 $tape
		makedev tape-reset c $major 255 $tape
		# [2.0.0] proposed:
		#makedev ntpqic11	c $major   2 $tape
		#makedev tpqic11	c $major   3 $tape
		#makedev ntpqic24	c $major   4 $tape
		#makedev tpqic24	c $major   5 $tape
		#makedev ntpqic120	c $major   6 $tape
		#makedev tpqic120	c $major   7 $tape
		#makedev ntpqic150	c $major   8 $tape
		#makedev tpqic150	c $major   9 $tape
		;;
	idetape)
		major=`Major IDE-tape 37` || continue
		# [2.0.0]
		makedev ht0	c $major   0 $tape
		makedev nht0	c $major 128 $tape
		;;
	zorroIIram)
		major=`Major Zorro_II_Ramdisk 37` || continue
		makedev z2ram	b $major   0 $disk
		;;
	mscdex)
		major=`Major mscdex 12` || continue
		# [2.0.0]
		# FIXME: check categories!!
		makedev dos_cd0		b $major   0 $cdrom
		makedev dos_cd1		b $major   0 $cdrom
		;;
	ftape)
		major=`Major mt 27` || continue
		for unit in 0 1 2 3
		do
			makedev rft$unit c $major $unit $tape
			makedev nrft$unit c $major `math $unit + 4` $tape
		done
		symlink ftape rft0
		symlink nftape nrft0
		;;
	scd[0-7])
		major=`Major sr 11` || continue
		unit=`suffix $arg scd`
		makedev scd$unit b $major $unit $cdrom
		;;
	sonycd)
		major=`Major cdu31a 15` || continue
		makedev $arg b $major 0 $cdrom
		;;
	mcd)
		major=`Major mcd 23` || continue
		makedev $arg b $major 0 $cdrom
		;;
	cdu535)
		makedev $arg b 24 0 $cdrom
		;;
	cm205cd)
		makedev $arg b 24 0 $cdrom
		symlink lmscd $arg
		;;
	lmscd)
		echo "OUTDATED! use cm205cd"
		;;
	cm206cd)
		makedev $arg b 32 0 $cdrom
		;;
	sbpcd|sbpcd[123])
		major=`Major $arg 25` || continue
		base=`suffix ${arg}0 sbpcd`
		# base=`expr ${arg}0 : "sbpcd\(.\)"`
		for minor in 0 1 2 3
		do
			# XXX
			unit=`expr substr 0123456789abcdef \( $base \* 4 + $minor + 1 \) 1`
			makedev sbpcd$unit b $major $minor $cdrom
		done
		[ $arg = sbpcd ] && symlink $arg ${arg}0
		;;
	aztcd)
		major=`Major aztcd 29` || continue
		makedev ${arg}0 b $major 0 $cdrom
		;;
	gscd)
		# [2.0.0]
		major=`Major GoldStarCD 16` || continue
		makedev gscd b $major 0 $cdrom
		;;
	optcd)
		# [2.0.0]
		major=`Major OpticsStorageCD 17` || continue
		makedev optcd b $major 0 $cdrom
		;;
	hitcd)
		# [2.0.0]
		major=`Major HitachiCD 20` || continue
		makedev hitcd b $major 0 $cdrom
		;;
	logiscan)
		major=`Major logiscan` || continue
		makedev $arg c $major 0 $scanner
		;;
	m105scan)
		major=`Major m105` || continue
		makedev $arg c $major 0 $scanner
		;;
	ac4096)
		major=`Major ac4096` || continue
		makedev $arg c $major 0 $scanner
		;;
	audio)
		major=`Major sound 14`
		makedev mixer      c $major  0 $audio
		makedev sequencer  c $major  1 $audio
		makedev midi00     c $major  2 $audio
		makedev dsp        c $major  3 $audio
		makedev audio      c $major  4 $audio
		makedev sndstat    c $major  6 $audio
#		makedev sequencer2 c $major  8 $audio
		makedev mixer1     c $major 16 $audio
#		makedev patmgr0    c $major 17 $audio
		makedev midi01     c $major 18 $audio
		makedev dsp1       c $major 19 $audio
		makedev audio1     c $major 20 $audio
#		makedev patmgr1    c $major 33 $audio
		makedev midi02     c $major 34 $audio
		makedev midi03     c $major 50 $audio
		;;
	pcaudio)
		major=`Major pcsp 13` || continue
		makedev pcmixer c $major 0 $audio
		# Was: makedev pcsp    c $major 3 $audio
		# [2.0.0]:
		makedev pcsp    c $major 0 $audio
		makedev pcaudio c $major 4 $audio
		makedev pcsp16  c $major 5 $audio
		;;
	dos_hd[a-d])
		# [2.0.0]
		major=`Major idebios 14` || continue
		unit=`suffix $arg dos_hd`
		base=`index abcd $unit`
		base=`math $base \* 64`
		makedev dos_hd$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev dos_hd$unit$part b $major `expr $base + $part` \
				$disk
		done
		;;
	ed[ab])
		# [2.0.0]
		major=`Major MCA_ESDI_HDs 36` || continue
		unit=`suffix $arg ed`
		base=`index abcd $unit`
		base=`math $base \* 64`
		makedev ed$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev ed$unit$part b $major `expr $base + $part` $disk
		done
		;;
	eza)
		# [2.0.0]
		major=`Major Syquest_Removable 40` || continue
		unit=`suffix $arg ez`
		base=`index abcd $unit`
		base=`math $base \* 64`
		makedev ez$unit b $major $base $disk
		for part in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
		do
			makedev ez$unit$part b $major `expr $base + $part` $disk
		done
		;;
	geniusscan)
		major=`Major GeniusScan 16` || continue
		# [2.0.0]
		makedev gs4500 c $major 0 $scanner
		;;
	doublecompress)
		major=`Major DoubleCompress 19` || continue
		# FIXME: check categories!!
		# [2.0.0]
		for no in 0 1 2 3 4 5 6 7
		do
			makedev double$no b $major $0 $disk
			makedev cdouble$no b $major `math 128 + $no` $disk
		done
		;;
	sg)
		major=`Major sg 21`
		for unit in a b c d e f g h
		do
			minor=`index abcdefgh $unit`
			# minor=`expr abcdefgh : ".*$unit" - 1`
			makedev $arg$unit c $major $minor $scsi
		done
		;;
	fd)
		# not really devices, we use the /proc filesystem
		symlink fd     $procfs/self/fd
		symlink stdin  fd/0
		symlink stdout fd/1
		symlink stderr fd/2
		;;
	ibcs2)
		major=`Major ibcs2 30` || continue
		makedev socksys c $major 0 $ibcs2
		symlink nfsd socksys
		makedev spx     c $major 1 $ibcs2
		symlink X0R null
		# FIXME: check categories!!
		# [2.0.0]
		mkdir inet ; chmod 755 inet
		makedev inet/arp	c $major 2 $ibcs2
		makedev inet/icmp	c $major 2 $ibcs2
		makedev inet/ip		c $major 2 $ibcs2
		makedev inet/udp	c $major 2 $ibcs2
		makedev inet/tcp	c $major 2 $ibcs2
		chmod 755 inet
		;;
	dcf)
		major=`Major dcf` || continue
		makedev $arg c $major 0 $system
		;;
	helloworld)
		major=`Major hw` || continue
		makedev helloworld c $major 0 $public
		;;
	wvisfgrab)
		major=`Major QuantaWinvisionFrameGrabber 26` || continue
		makedev $arg c $major 0 $framegr
		;;
	mmetfgrab)
		major=`Major MatroxMeteorFrameGrabber 40` || continue
		makedev $arg c $major 0 $framegr
		;;
	isdn)
		# FIXME: check categories!!
		# [2.0.0]
		makedev isdninfo c 255 0 $system
		for no in 0  1  2  3  4  5  6  7  8  9 \
			 10 11 12 13 14 15 16 17 18 19 \
			 20 21 22 23 24 25 26 27 28 29 \
			 30 31 32 33 34 35 36 37 38 39 \
			 40 41 42 43 44 45 46 47 48 49 \
			 50 51 52 53 54 55 56 57 58 59 \
			 60 61 62 63 
		do
			makedev ttyI$no		c 43 $no $tty
			makedev cui$no		c 44 $no $dialout
			makedev idsn$no		c 45 $no $system
			makedev idsnctrl$no	c 45 `math 64 + $no` $system
			makedev ipp$no		c 45 `math 128 + $no` $system
		done
		;;
	update)
		if [ ! "$devices" ]
		then
			echo "$0: don't appear to have any devices" >&2
			continue
		fi
		if [ "$opt_d" ]
		then
			echo "$0: can't delete an update" >&2
			continue
		fi
		create=
		delete=
		devs="$devices"
		if [ -f DEVICES ]
		then
			exec 3<DEVICES
			while read device major <&3
			do
				eval now=\$major_$device
				if [ "$now" = "" ]
				then
					delete="$delete `cvt $device`"
					continue
				elif [ "$now" != $major ]
				then
					create="$create "`cvt $device`
				fi
				devs=`strip " $devs " $device`
				# devs=`expr "$devs" : "\(.*\) $device"``expr "$devs" : ".* $device\(.*\)"`
			done
			exec 3<&-
		fi
		create="$create "`cvt $devs`
		[ "$delete" != "" ] && $0 $opts -d $delete
		[ "$create" != " " ] && $0 $opts $create
		[ "$opt_n" ] && continue
		for device in $devices
		do
			if [ "`cvt $device`" ]
			then
			    eval echo $device \$major_$device
			fi
		done > DEVICES
		;;
	*)
		echo "$0: don't know how to make device \"$arg\"" >&2
		;;
	esac
done

exit 0
