home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 March B / SCO_CASTOR4RRT.iso / base / root.15 / usr / lib / drf / prep_flop / prep_flop~
Text File  |  1998-08-19  |  13KB  |  519 lines

  1. #!/usr/bin/ksh
  2.  
  3. # Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
  4. #                                                                         
  5. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
  6. #                   SANTA CRUZ OPERATION INC.                             
  7. #                                                                         
  8. #   The copyright notice above does not evidence any actual or intended   
  9. #   publication of such source code.                                      
  10.  
  11.  
  12. #ident    "@(#)drf:cmd/prep_flop.sh    1.30.2.3"
  13.  
  14. # This script will create the mini-kernel, build special boot-floppy only
  15. # commands, and prep the executables included on the boot floppy.  The shell
  16. # script cut_flop is then used to create the boot floppy.
  17.  
  18. ############# Initialization and Command-line Parsing #############
  19.  
  20. cd $PROTO
  21.  
  22. STRIP=/usr/ccs/bin/strip
  23. MCS=/usr/ccs/bin/mcs
  24. NM=/usr/ccs/bin/nm
  25.  
  26. PATH=:/usr/lib/drf:/usr/ccs/bin:$PATH export PATH
  27. RAMPROTOF="$PROTO/ramdfs.proto" export RAMPROTOF
  28. FLOP_TMP_DIR=$PROTO/flop.$$ export FLOP_TMP_DIR
  29.  
  30. # IMPORTANT -- DO NOT CHANGE THE ORDER OF THE MODULES IN _DRVMODS!
  31. #_DRVMODS="dpt cpqsc adsc ictha ide" export _DRVMODS
  32. _DRVMODS=" " export _DRVMODS
  33. FSMODS="" export FSMODS
  34.  
  35. CMD=$0
  36.  
  37. kernel=true
  38. kflag=true
  39. # We don't use unixsyms any more for both non/with kdb kernel.
  40. #        SYMS="-l $FLOP_TMP_DIR/symlist"
  41. SYMS=""
  42. if [ "$DRF_KDB" ]
  43. then
  44.     KDB=kdb
  45. else
  46.     KDB=nokdb
  47. fi
  48.  
  49. ############# Function defintions #############
  50.  
  51. build_kernel()
  52. {
  53.     trap "rm -rf $FLOP_TMP_DIR; exit 1" 1 2 3 15
  54.     mkdir -p $FLOP_TMP_DIR
  55.  
  56.     echo "\nCreating a kernel build tree in $ROOT/$LCL_MACH" >> ${DRF_LOG_FL}
  57.     rm -f $ROOT/$LCL_MACH/stand/unix.nostrip
  58.     [ -d $ROOT/$LCL_MACH/stand ] || mkdir -p $ROOT/$LCL_MACH/stand
  59.     [ -d $ROOT/$LCL_MACH/etc/conf/mod.d ] ||
  60.         mkdir -p $ROOT/$LCL_MACH/etc/conf/mod.d
  61.     [ -d $ROOT/$LCL_MACH/etc/conf/modnew.d ] ||
  62.         mkdir -p $ROOT/$LCL_MACH/etc/conf/modnew.d
  63.     (
  64.         cd /
  65.             find etc/conf/*.d -print |
  66.             egrep -v 'unix$|\.o$|mod\.d|modnew\.d' |
  67.             cpio -pdum $ROOT/$LCL_MACH
  68.         find etc/conf/pack.d \( -name Driver.o -o -name Modstub.o -o -name Driver_atup.o -o -name stubs.o \) -print |
  69.             cpio -pdum $ROOT/$LCL_MACH
  70.     )
  71.     cp /usr/lib/drf/fdboot $PROTO
  72.     cp /usr/lib/drf/stage2.fdinst $PROTO
  73.     cp /stand/dcmp.blm $PROTO
  74.     cp /stand/stage3.blm $PROTO
  75.     cp /stand/platform.blm $PROTO
  76.     cp /stand/logo.img $PROTO 2>/dev/null
  77.     [ -h $ROOT/$LCL_MACH/etc/conf/bin ] ||
  78.         ln -s /etc/conf/bin $ROOT/$LCL_MACH/etc/conf/bin
  79.  
  80.     echo "\nReconfiguring files under $ROOT/$LCL_MACH/etc/conf" >> ${DRF_LOG_FL}
  81.     # mini_kernel echoes the list of loadable modules to stdout.
  82.     MACH=$LCL_MACH /usr/lib/drf/mini_kernel $KDB > $PROTO/mini.$$
  83.     rc=$?
  84.     if [ $rc -ne 0 ]
  85.     then
  86.         cat $PROTO/mini.$$ >> ${DRF_LOG_FL}
  87.         rm -f $PROTO/mini.$$
  88.         return 1
  89.     fi
  90.  
  91.     MODLIST=`cat $PROTO/mini.$$`
  92.     rm -f $PROTO/mini.$$
  93.     
  94.     echo "\nCreating loadable modules." >> ${DRF_LOG_FL}
  95.     (
  96.     cd $ROOT/$LCL_MACH/etc/conf/sdevice.d
  97.     for i in $MODLIST
  98.     do
  99.         grep '^\$static' $i > /dev/null 2>&1
  100.         if [ $? -eq 0 ]
  101.         then
  102.             ed -s $i > /dev/null <<-END
  103.                 /^\$static
  104.                 d
  105.                 w
  106.                 q
  107.             END
  108.         fi
  109.     done
  110.  
  111.     MODARGS=`for i in $MODLIST
  112.         do
  113.             echo "-M $i \c"
  114.         done`
  115.     echo "\nDoing idbuild -M to create loadable modules." >> ${DRF_LOG_FL}
  116.     echo "The loadable modules option : $MODARGS" >> ${DRF_LOG_FL}
  117.     MACH=$LCL_MACH $ROOT/$LCL_MACH/etc/conf/bin/idtype atup
  118.  
  119.     IDBLD_ERRS=/tmp/drf_$$_moderr
  120.     MACH=$LCL_MACH $ROOT/$LCL_MACH/etc/conf/bin/idbuild \
  121.         -I/usr/include $MODARGS -# > ${IDBLD_ERRS} 2>&1
  122.     rc=$?
  123.     if [ $rc -ne 0 ]
  124.     then
  125.         echo "The idbuild of ${MODARGS} failed with error = $rc " >> ${DRF_LOG_FL}
  126.         echo "Check the ${IDBLD_ERRS} file for the idbuild failure reasons." >> ${DRF_LOG_FL}
  127.         exit 1
  128.     fi
  129.  
  130.     rm -rf ${IDBLD_ERRS}
  131.  
  132.     mv $ROOT/$LCL_MACH/etc/conf/mod.d/* $ROOT/$LCL_MACH/etc/conf/modnew.d 2> /dev/null
  133.  
  134.     echo "\nExamining symbol tables of various loadable modules."
  135.     (
  136.     cd $ROOT/$LCL_MACH/etc/conf/modnew.d
  137.     for i in $MODLIST
  138.     do
  139.         [ -f $i ] || {
  140.             echo ERROR -- Cannot find $ROOT/$LCL_MACH/etc/conf/modnew.d/$i >&2
  141.             exit 1
  142.         }
  143.         ${NM} $i | grep UNDEF | sed -e 's/.*|//' > $FLOP_TMP_DIR/${i}list
  144.     done
  145.     )
  146.     ) || return 1
  147.     sed -e '/#/D' -e '/^$/D' /usr/lib/drf/staticlist > $FLOP_TMP_DIR/staticlist
  148.     {
  149.     for i in $MODLIST static
  150.     do
  151.         cat $FLOP_TMP_DIR/${i}list
  152.     done
  153.     } | LC_ALL=C sort -u > $FLOP_TMP_DIR/symlist
  154.  
  155.     IDBLD_ERRS=/tmp/drf_$$_kernerr
  156.     echo "\nBuilding the mini-kernel." >> ${DRF_LOG_FL}
  157.  
  158.     echo "\nSaving symlist ..."
  159.     cp $FLOP_TMP_DIR/symlist $PROTO/symlist
  160. #
  161. # -c flag added to override the various mdep.c checks in idmkunix,
  162. # e.g. don't do dma channel conflict checking, memory address overlap
  163. # checking, etc.
  164. #
  165.     echo "$ROOT/$LCL_MACH/etc/conf/bin/idbuild " >> ${DRF_LOG_FL}
  166.  
  167.     MACH=$LCL_MACH $ROOT/$LCL_MACH/etc/conf/bin/idbuild -K -x \
  168.         -I/usr/include \
  169.         -O $ROOT/$LCL_MACH/stand/unix.nostrip > ${IDBLD_ERRS} 2>&1
  170.     rc=$?
  171.     if [ $rc -ne 0 ]
  172.     then
  173.             echo "The mini-kernel build failed with error = $rc " >> ${DRF_LOG_FL}
  174.             echo "Check the ${IDBLD_ERRS} file for the mini-kernel failure reasons. " >> ${DRF_LOG_FL}
  175.             return 1
  176.     fi
  177.  
  178.     rm -f ${IDBLD_ERRS}
  179.     [ -d $PROTO/stage ] || mkdir $PROTO/stage
  180.     rm -rf $FLOP_TMP_DIR
  181.  
  182.     # collect PDI driver entries from mod_register file or /etc/loadmods
  183.     > $ROOT/$LCL_MACH/stand/loadmods
  184.     for i in $_DRVMODS
  185.     do
  186.         grep $i $ROOT/$LCL_MACH/etc/conf/cf.d/mod_register \
  187.             >> $ROOT/$LCL_MACH/stand/loadmods
  188.         if [ $? -ne 0 ]
  189.         then
  190.             grep $i /etc/loadmods >> $ROOT/$LCL_MACH/stand/loadmods
  191.         fi
  192.     done
  193.     return $rc
  194. }
  195.  
  196. # Just strip the comment section using mcs(1).
  197.  
  198. f_pstamp()
  199. {
  200.     if [ -w $1 ]
  201.     then
  202.         # There is a problem with strip, so don't use it
  203.         # ${STRIP} $1 > /dev/null 2>&1
  204.         ${MCS} -d $1 > /dev/null 2>&1
  205.     else
  206.         echo "WARNING: Cannot write file $1, not mcs'ing"
  207.     fi
  208. }
  209.  
  210. strip_em()
  211. {
  212.     echo "\nStripping various files."
  213.     cd $PROTO
  214.     export SLBASE
  215.     SLBASE=$PROTO/bin
  216.     SLBASE=$ROOT/.$MACH
  217.     for name in $ROOT/$LCL_MACH/etc/conf/modnew.d/*
  218.     do
  219.         f_pstamp $name
  220.     done
  221. }
  222.  
  223. # after putting the undefined DLM NIC symbols into .unixsyms in case that 
  224. # driver is chosen for a netinstall we need to disable the driver so that a 
  225. # later cut.flop->cut.flop.mk will not include the NICS when building the
  226. # resmgr file (since idconfupdate -s would still find the nics as enabled from
  227. # first call to mini_kernel)
  228. turnoffnics()
  229. {
  230.     NICLIST=`MACH=$LCL_MACH mini_kernel nics` || exit $?
  231.     for nic in $NICLIST
  232.     do
  233.  
  234.         awk 'BEGIN    {
  235.                     OFS="\t";
  236.                 }
  237.             NF==11    {
  238.                     $2="N";
  239.                     print $0
  240.                     next
  241.                 }
  242.             NF==12    {
  243.                     $2="N";
  244.                     print $0
  245.                     next
  246.                 }
  247.                 { print $0 }' \
  248.         $ROOT/$LCL_MACH/etc/conf/sdevice.d/$nic > \
  249.         $ROOT/$LCL_MACH/etc/conf/sdevice.d/.$nic && \
  250.         mv $ROOT/$LCL_MACH/etc/conf/sdevice.d/.$nic \
  251.            $ROOT/$LCL_MACH/etc/conf/sdevice.d/$nic
  252.     done
  253. }
  254.  
  255. add_terminfo()
  256. {
  257.     ed -s $RAMPROTOF > /dev/null <<-END
  258.         /ANSI
  259.         a
  260.         AT386    ---644 0 3 /usr/share/lib/terminfo/A/AT386
  261.         AT386-M    ---644 0 3 /usr/share/lib/terminfo/A/AT386-M
  262.         .
  263.         w
  264.         q
  265.     END
  266.     return
  267. }
  268.  
  269. add_terminfo_ie()
  270. {
  271.     ed -s $RAMPROTOF > /dev/null <<-END
  272.         /ANSI
  273.         a
  274.         AT386-ie    ---644 0 3 /usr/share/lib/terminfo/A/AT386-ie
  275.         AT386-M-ie    ---644 0 3 /usr/share/lib/terminfo/A/AT386-M-ie
  276.         .
  277.         w
  278.         q
  279.     END
  280.     return
  281. }
  282.  
  283. add_terminfo_mb()
  284. {
  285.     ed -s $RAMPROTOF > /dev/null <<-END
  286.         /ANSI
  287.         a
  288.         AT386-mb    ---644 0 3 /usr/share/lib/terminfo/A/AT386-mb
  289.         AT386-M-mb    ---644 0 3 /usr/share/lib/terminfo/A/AT386-M-mb
  290.         .
  291.         w
  292.         q
  293.     END
  294.     return
  295. }
  296.  
  297. add_keyboard()
  298. {
  299.     [ -s /usr/lib/keyboard/$KEYBOARD ] || {
  300.         echo "\n\t/usr/lib/keyboard/$KEYBOARD file is missing" >> ${DRF_LOG_FL}
  301.         return
  302.     }
  303.     [ -s /usr/lib/mapchan/88591.dk ] || {
  304.         echo "\n\t/usr/lib/mapchan/88591.dk file is missing" >> ${DRF_LOG_FL}
  305.         return
  306.     }
  307.     ( cd /usr/lib/drf
  308.         ./keycomp /usr/lib/keyboard/$KEYBOARD $PROTO/kbmap
  309.         ./dkcomp /usr/lib/mapchan/88591.dk $PROTO/dead_keys
  310.     )
  311.     # Check to see if it is a dir/file string instead of just a file string
  312.     FIL="`echo $KEYBOARD | cut -d/ -f1`"
  313.     DIR="`echo $KEYBOARD | cut -d/ -f2`"
  314.     if [ "$DIR" != "$KEYBOARD" ]
  315.     then
  316.         ed -s $RAMPROTOF > /dev/null <<-END
  317.             /keyboards
  318.             a
  319.             $FIL    d--755 2 2
  320.                 $DIR    d--755 2 2
  321.                 kbmap    ---644 0 3 $PROTO/kbmap
  322.                 dead_keys    ---644 0 3 $PROTO/dead_keys
  323.                 \$
  324.             \$
  325.             .
  326.             w
  327.             q
  328.         END
  329.     else
  330.         ed -s $RAMPROTOF > /dev/null <<-END
  331.             /keyboards
  332.             a
  333.             $KEYBOARD    d--755 2 2
  334.             kbmap    ---644 0 3 $PROTO/kbmap
  335.             dead_keys    ---644 0 3 $PROTO/dead_keys
  336.             \$
  337.             .
  338.             w
  339.             q
  340.         END
  341.     fi
  342.     return
  343. }
  344.  
  345. add_lc_ctype()
  346. {
  347.     [ -s /usr/lib/locale/$LANG/LC_CTYPE ] || {
  348.         echo "\n\t/usr/lib/locale/$LANG/LC_CTYPE file is missing" >> ${DRF_LOG_FL}
  349.         return
  350.     }
  351.     ed -s $RAMPROTOF > /dev/null <<-END
  352.         /locale    d
  353.         a
  354.         $LANG    d--755 2 2
  355.         LC_CTYPE    ---644 0 3 /usr/lib/locale/$LANG/LC_CTYPE
  356.         \$
  357.         .
  358.         w
  359.         q
  360.     END
  361.     return
  362. }
  363.  
  364. addodm_vfstab()
  365. {
  366.     ed -s $RAMPROTOF > /dev/null <<-END
  367.         /loadmods
  368.         a
  369.         odm_vfstab    ---644 0 3 $PROTO/vfstab
  370.         old_vtoc_1    ---644 0 3 $PROTO/old_vtoc_1
  371.         new_vtoc_1    ---644 0 3 $PROTO/new_vtoc_1
  372.         .
  373.         w
  374.         q
  375.     END
  376.     return
  377. }
  378.  
  379. addodm_vtoc_2()
  380. {
  381.     ed -s $RAMPROTOF > /dev/null <<-END
  382.         /loadmods
  383.         a
  384.         old_vtoc_2    ---644 0 3 $PROTO/old_vtoc_2
  385.         new_vtoc_2    ---644 0 3 $PROTO/new_vtoc_2
  386.         .
  387.         w
  388.         q
  389.     END
  390.     return
  391. }
  392.  
  393. set_mod_list()
  394. {
  395.     # Get the fs type for root, /stand, /usr, /home, /var, and /home2
  396.  
  397.     FSCKS="`print \`egrep -v '^\#' /etc/vfstab | egrep '[     ]/[     ]|[     ]/stand[     ]|[     ]/usr[     ]|[     ]/home[     ]|[     ]/var[    ] |[     ]/home2[     ]' | cut -f4 | egrep 'bfs|s5|ufs|vxfs' | sort -u\``"
  398.  
  399.     FSMODS=`echo "$FSCKS"`
  400.     # ufs module depends on sfs module. So,...
  401.     echo $FSMODS | grep ufs > /dev/null 2>&1
  402.     [ $? -eq 0 ] && FSMODS="$FSMODS sfs"
  403.     #Add dow module if sfs module is present
  404.     echo "$FSMODS" | egrep 'sfs' > /dev/null 2>&1
  405.     [ $? -eq 0 ] && FSMODS="$FSMODS dow"
  406.     _DRVMODS="`print \`/etc/scsi/pdiconfig | grep '[    ]Y[    ]' | cut -f1 | sort -u\``"
  407.     MODLIST="$FSMODS $_DRVMODS"
  408.     export MODLIST
  409. }
  410.  
  411. #main()
  412. {
  413.     VM_RUNNING=No export VM_RUNNING
  414.     # Get and set current LANG and KEYBOARD
  415.     LANG=${LANG:-NoLang}
  416.     if [ "$LANG" == "NoLang" -o ! -d /usr/lib/drf/locale/$LANG ]
  417.     then
  418.         eval `defadm locale LANG 2>/dev/null`
  419.     fi
  420.     LANG=${LANG:-C}
  421.     LANGS="`echo $LANG | cut -c1,2`"
  422.     # Force use of system default keyboard, since restore will use the
  423.     #    system keyboard
  424.     eval `defadm keyboard KEYBOARD 2>/dev/null`
  425.     [ "$KEYBOARD" = "NONE" ] && KEYBOARD=""
  426.     KEYBOARDS="`echo $KEYBOARD | cut -d/ -f2`"
  427.     export LANG LANGS KEYBOARD KEYBOARDS
  428.  
  429.     echo "\n\t The log messages from $0 " > ${DRF_LOG_FL}
  430.     echo "\t\tLANG=$LANG, LANGS=$LANGS, KEYBOARD=$KEYBOARD, KEYBOARDS=$KEYBOARDS" >> ${DRF_LOG_FL}
  431.  
  432.     cp /usr/lib/drf/drfram.proto $RAMPROTOF
  433.  
  434.     if [ "$LANGS" = "ja" ]
  435.     then
  436.         add_terminfo_mb    # add multi-byte terminfo to ram proto file
  437.     elif [ "$LANGS" = "C" -a -z "$KEYBOARD" ] ||
  438.         [ "$KEYBOARDS" = "AX" ] || [ "$KEYBOARDS" = "A01" ]
  439.     then
  440.         add_terminfo    # add AT386 terminfo entries to ram proto file
  441.     else
  442.         add_terminfo_ie    # add AT386 terminfo entries to ram proto file
  443.     fi
  444.     [ -z "$KEYBOARD" ] || add_keyboard # add keyboard info to ram proto file
  445.     [ "$LANG" != "C" ] && add_lc_ctype # add LC_CTYPE file to ram proto file
  446.  
  447.     grep standvol /etc/vfstab >/dev/null 2>&1    # check for odm
  448.     [ $? -eq 0 ] && {
  449.         VM_RUNNING=Yes
  450.         /usr/lib/drf/odm_vfs $PROTO/vfstab $PROTO/old_vtoc_1 \
  451.             $PROTO/new_vtoc_1 $PROTO/old_vtoc_2 $PROTO/new_vtoc_2
  452.         addodm_vfstab
  453.         [ -s $PROTO/old_vtoc_2 ] && addodm_vtoc_2
  454.     }
  455.  
  456.     NWS_CONFIG=false
  457.     NWS_SYS_PATH=""
  458.     [ -f /var/sadm/pkg/nwsrvr/pkginfo -o -f /var/sadm/pkg/nwsrvrJ/pkginfo ] && {
  459.         NWS_CONFIG=true
  460.         while read num vol type path rest
  461.         do
  462.             [ "$vol" != "SYS" ] && continue
  463.             echo $path >$PROTO/syspath
  464.             break
  465.         done < /etc/netware/voltab
  466.  
  467.         NWS_SYS_PATH=`cat $PROTO/syspath`
  468.  
  469.         [ "$NWS_SYS_PATH" = "" ] && {
  470.             pfmt -l UX:drf -s NOSTD -g drf:31 "\n\tCannot locate SYS volume of NetWare Server.\n"
  471.             pfmt -l UX:drf -s NOSTD -g drf:30 "\n\tEmergency Recovery floppy creation terminated.\n\n"
  472.             exit 1
  473.         }
  474.         awk -v mnt_pt="$NWS_SYS_PATH" '{ if ($3==mnt_pt) exit_val=1 } END { exit exit_val }' </etc/vfstab || {
  475.             mount | grep $NWS_SYS_PATH > /dev/null || mount $NWS_SYS_PATH ||
  476.             pfmt -l UX:drf -s NOSTD -g drf:32 "\n\tCannot mount SYS volume of NetWare Server.\n"
  477.             pfmt -l UX:drf -s NOSTD -g drf:30 "\n\tEmergency Recovery floppy creation terminated.\n\n"
  478.             exit 1
  479.         }
  480.     }
  481.     echo "exit 0" > $PROTO/putdev
  482.     echo "/dev/vt /dev/kd/kd    3" > $PROTO/work.1
  483.     RESMGR= export RESMGR
  484.     eval `echo "RESMGR=\c"; grep -i "^files=" /stand/boot | cut -d'=' -f2-`
  485.     [ -z "$RESMGR" ] && RESMGR=resmgr
  486.  
  487.     set_mod_list
  488.  
  489.     build_kernel
  490.     [ $? -ne 0 ] && exit 1
  491.     [ -s $ROOT/$LCL_MACH/stand/unix.nostrip ] || {
  492.         echo ERROR -- You must use the -k or -K flag at least once. >&2
  493.         exit 1
  494.     }
  495.     strip_em
  496.     [ -d $PROTO/bin ] || mkdir -p $PROTO/bin
  497.     [ -d $PROTO/etc/conf/hbamod.d ] || mkdir -p $PROTO/etc/conf/hbamod.d
  498.     [ -d $PROTO/etc/conf/mod.d ] || mkdir -p $PROTO/etc/conf/mod.d
  499.     [ -d $PROTO/stand ] || mkdir -p $PROTO/stand
  500.     cp /usr/lib/drf/rmwhite $PROTO/bin
  501.     cp /usr/lib/drf/checkwhite $PROTO/bin
  502.     for mod in $_DRVMODS
  503.     do
  504.         mv $ROOT/$LCL_MACH/etc/conf/modnew.d/$mod $PROTO/etc/conf/hbamod.d
  505.     done
  506.     mv $ROOT/$LCL_MACH/etc/conf/modnew.d/* $PROTO/etc/conf/mod.d
  507.     for i in $FSMODS
  508.     do
  509.         [ -d $PROTO/etc/fs/$i -o "$i" = "dow" ] || mkdir -p $PROTO/etc/fs/$i
  510.         [ -r /etc/fs/$i/fsck ] && cp /etc/fs/$i/fsck $PROTO/etc/fs/$i/fsck
  511.         [ -r /etc/fs/$i/mkfs ] && cp /etc/fs/$i/mkfs $PROTO/etc/fs/$i/mkfs
  512.         [ -r /etc/fs/$i/labelit ] && cp /etc/fs/$i/labelit $PROTO/etc/fs/$i/labelit
  513.     done
  514.     cd /usr/lib/drf
  515.     cut_flop || exit $?
  516.     echo "\n$0: Done."
  517.         exit 0
  518. }
  519.