#sccs	"@(#)fndetc/convert:masterconvert	1.7"

#
#	FILE:  masterconvert
#
#	This program splits the new and old master files into
#	their four major sections.  For each section, any lines
#	missing from the old are added to the new.  Then the
#	new pieces are put back together.
#

if [ $# -lt 2 ]
then
	echo "usage:  masterconvert {old file} {new file}"
	exit
fi

OLDFILE=$1
NEWFILE=$2

if [ $# -eq 3 ]
then	VERBOSE=$3
else	VERBOSE=""
fi

#	First split the old and new master files.

splitmaster $OLDFILE /tmp/mOLD
splitmaster $NEWFILE /tmp/mNEW

#	Next, extract the missing parts from the old pieces and
#	add them to the new master file.

for I in 1 2
do
	##  GET THE LIST OF MISSING DEVICE ENTRIES

	diff  /tmp/mOLD$I /tmp/mNEW$I | getmissing - > /tmp/missing
	cp  /tmp/missing /tmp/checklist
	while read NAME JUNK
	do
		if [ "$NAME" = "*" ]
		then
			grep -v "^$NAME" /tmp/missing > /tmp/tmplist
			mv /tmp/tmplist /tmp/missing
			continue
		fi
		if grep "^$NAME" /tmp/mNEW$I > /dev/null
		then
			grep -v "^$NAME" /tmp/missing > /tmp/tmplist
			mv /tmp/tmplist /tmp/missing
		fi
	done < /tmp/checklist

	##  FOR EACH MISSING DEVICE, REMOVE ITS OLD /dev FILES,
	##  ADD THE ENTRY TO THE NEW MASTER FILE, THEN RECREATE
	##  ITS /dev FILES.

	while read NAME DEVMASK DEVTYPE HANDLER JUNK1 JUNK
	do
		##  CHECK THE MASTER VERSION vs 3.31
		NEWMSTR=`expr "$HANDLER" : '[0-9]'`
		if [ "$NEWMSTR" = "1" ]
		then
			DEVTYPE="$HANDLER"
			HANDLER="$JUNK1"
		fi

		##  ADD THE DEVICE TO THE MASTER FILE
		ADD=`expanddesc $DEVMASK $DEVTYPE`
		if [ "$NAME" != "$HANDLER" ]
		then	ADD="-p $HANDLER $ADD"
		fi
		masterupd -a -m $NEWFILE $ADD $NAME

		##  GET THE OLD AND NEW DEVICE NUMBERS
		rm -f /tmp/charflag /tmp/blockflag
		echo "$ADD" | grep "char" > /tmp/charflag
		echo "$ADD" | grep "block" > /tmp/blockflag
		fBLOCK=false
		fCHAR=false
		OLDNUM=""
		if [ -s /tmp/charflag ]
		then
			fCHAR=true
			OLDNUM=`$SAVEDIR/masterupd -c -m $OLDFILE $NAME`
			NEWNUM=`masterupd -c -m $NEWFILE $NAME`
			rm -f /tmp/charflag
		elif [ -s /tmp/blockflag ]
		then
			fBLOCK=true
			OLDNUM=`$SAVEDIR/masterupd -b -m $OLDFILE $NAME`
			NEWNUM=`masterupd -b -m $NEWFILE $NAME`
			rm -f /tmp/blockflag
		fi

		##  BUILD LIST OF ASSOCIATED DEVICE FILES
		if [ "$OLDNUM" ]
		then
			find /dev/* -print | grep -v "/dev/console" | \
			   getdevices $OLDNUM > /tmp/devlist
		else	> /tmp/devlist
		fi

		##  CONVERT DEVICE FILES FROM OLD TO NEW NUMBER
		while read FILE MINOR
		do
			rm -f  $FILE
			if $fCHAR
			then	mknod $FILE c $NEWNUM $MINOR
			elif $fBLOCK
			then	mknod $FILE b $NEWNUM $MINOR
			fi
		done < /tmp/devlist
	done < /tmp/missing

	#	Do listing update as necessary.

	if [ "$VERBOSE" ]
	then 
		echo "new master file updated with:"
		cat /tmp/missing
		echo
	fi

done

#	Clean up scratch files created.

rm -f  /tmp/mOLD? /tmp/mNEW?
rm -f  /tmp/missing /tmp/checklist /tmp/tmplist /tmp/devlist
