Annotation of researchv10no/cmd/odist/pax/ship/shipout, revision 1.1.1.1

1.1       root        1: :
                      2: # @(#)shipout (ulysses!{dgk,gsf}) 01/31/91
                      3: #
                      4: # shipout [ options ... ] [ name ... ] [ tool ... ]
                      5: #
                      6: # ship software to recipient using system|user info in $SHIPINFO
                      7: #
                      8: # options -- + turns the corresponding option off
                      9: #
                     10: #      -b              ship bases with deltas
                     11: #      -c              don't generate tool closure
                     12: #      -d              don't ship deltas
                     13: #      -i              list info on specified recipient(s) only
                     14: #      -k              mark recipient(s) as having received tool(s)
                     15: #      -l file         list of people to ship to
                     16: #      -m              don't send shipment manifest mail message
                     17: #      -n              show but don't execute
                     18: #      -o              set shipment ownership to shipper
                     19: #      -p name         next argument is a recipient to ship to
                     20: #      -s              don't send shipment support files
                     21: #      -t              don't execute but show total shipment
                     22: #      -u [[yy]mm]dd   ignore db info for date pattern
                     23: #      -v yymmdd       override current date stamp
                     24: #      -C files        add to default crate file list
                     25: #      -D secs         delay in seconds between sends
                     26: #      -F              force db override
                     27: #      -S files        add to default support file list
                     28: #
                     29: # name -- recipient address
                     30: #
                     31: #      machine!user    uucp address
                     32: #      host:directory  rcp address
                     33: #      *%compress      generates compressed cpio archive on stdout
                     34: #      *%list          generates shipment file list
                     35: #      *%pull          generates sh script with datakit pull's
                     36: #      *%push          generates sh script with datakit push's
                     37: #
                     38: # the message file is evaluated by the shell and the following variables
                     39: # are predefined by ship:
                     40: #
                     41: #      f                       list of expanded file names
                     42: #      name                    name of shipee
                     43: #
                     44: 
                     45: umask 02
                     46: PATH=:$PATH
                     47: 
                     48: SHIPSLOG=${SHIPSLOG:-shipslog}
                     49: SHIPINFO=${SHIPINFO:-$SHIPSLOG/info}
                     50: SHIPFILES="README shipin shipout"
                     51: SHIPMENT=*[0-9][0-9][0-9][0-9][0-9][0-9]
                     52: SHIPPER=${SHIPPER:-${USER:-${LOGNAME:-${HOME##*/}}}}
                     53: SHIPSPOOL=${SHIPSPOOL:-/usr/spool/uucppublic}
                     54: CRATEFILES="items message promo release report"
                     55: TMP=${TMPDIR:=/tmp}/ship$$
                     56: FROMSYS=$((uname -n || hostname || cat /etc/whoami) 2>/dev/null)
                     57: 
                     58: test -f shipinit && . ./shipinit
                     59: 
                     60: function errexit
                     61: {
                     62:        # print out an error message on unit 2 and exit
                     63:        print -u2 - "$command: $@"
                     64:        exit 1
                     65: }
                     66: 
                     67: function warning
                     68: {
                     69:        print -u2 - "$command: warning: $@"
                     70: }
                     71: 
                     72: function cleanup # exitcode
                     73: {
                     74:        db_done
                     75:        rm -f $TMP.?
                     76:        exit $1
                     77: }
                     78: 
                     79: db_data=
                     80: db_db=
                     81: db_key_base=
                     82: db_key_delta=
                     83: db_status=
                     84: db_style=
                     85: 
                     86: #
                     87: # send request to dbm server
                     88: # status returned in db_status
                     89: # data returned in db_data
                     90: #
                     91: 
                     92: function db_request # request
                     93: {
                     94:        print -p "$@"
                     95:        read -p db_status db_data
                     96:        case $db_debug in
                     97:        ?*)     print -u2 DB: "$@": $db_status $db_data ;;
                     98:        esac
                     99:        case $db_status in
                    100:        I)      return 0 ;;
                    101:        E)      print -u2 $logfile: $db_data; return 1 ;;
                    102:        *)      return 1 ;;
                    103:        esac
                    104: }
                    105: 
                    106: #
                    107: # initialize db
                    108: #
                    109: 
                    110: function db_init # machine user
                    111: {
                    112:        case $db_debug in
                    113:        grep)   db_style=grep ;;
                    114:        esac
                    115:        case $db_style in
                    116:        "")     if      (shipdbm) </dev/null >/dev/null 2>&1
                    117:                then    db_style=dbm
                    118:                        logfile=$SHIPSLOG/log
                    119:                        shipdbm |&
                    120:                        db_request om$logfile || db_request oc$logfile || errexit $logfile: cannot access log
                    121:                        db_db=$db_data
                    122:                else    db_style=grep
                    123:                fi
                    124:                ;;
                    125:        esac
                    126:        case $db_style in
                    127:        dbm)    first_time=0
                    128:                db_request s$db_db
                    129:                db_check - $1 $2 shipin "*" base || first_time=1
                    130:                ;;
                    131:        grep)   typeset -L2 dir=$1
                    132:                case $logfile in
                    133:                ?*)     mv $logfile $SHIPSLOG/.tmp.
                    134:                        sort -r < $SHIPSLOG/.tmp. | sort -m -u +0 -1 > $logfile
                    135:                        rm -f $SHIPSLOG/.tmp.
                    136:                        ;;
                    137:                esac
                    138:                logfile=$SHIPSLOG/$dir/$1/$2
                    139:                if      test  "" = "$force" -a -r "$logfile"
                    140:                then    first_time=0
                    141:                else    first_time=1
                    142:                        case $noexec in
                    143:                        "")     if      test ! -d "$SHIPSLOG/$dir"
                    144:                                then    mkdir "$SHIPSLOG/$dir" || logfile=$SHIPSLOG/log
                    145:                                fi
                    146:                                if      test ! -d "$SHIPSLOG/$dir/$1"
                    147:                                then    mkdir "$SHIPSLOG/$dir/$1" || logfile=$SHIPSLOG/log
                    148:                                fi
                    149:                                ;;
                    150:                        esac
                    151:                fi
                    152:                ;;
                    153:        esac
                    154: }
                    155: 
                    156: #
                    157: # end db interaction
                    158: #
                    159: 
                    160: function db_done #
                    161: {
                    162:        case $noexec in
                    163:        "")     case $db_style in
                    164:                dbm)    case $db_db in
                    165:                        ?*)     db_request c$db_db && db_request q ;;
                    166:                        esac
                    167:                        ;;
                    168:                grep)   case $logfile in
                    169:                        ?*)     mv $logfile $SHIPSLOG/.tmp.
                    170:                                sort -r < $SHIPSLOG/.tmp. | sort -m -u +0 -1 > $logfile
                    171:                                rm -f $SHIPSLOG/.tmp.
                    172:                                ;;
                    173:                        esac
                    174:                        ;;
                    175:                esac
                    176:                ;;
                    177:        esac
                    178: }
                    179: 
                    180: #
                    181: # check if < machine user tool version type > was sent
                    182: #
                    183: 
                    184: function db_check # [ - ] machine user tool version type
                    185: {
                    186:        typeset k key ks sav x nocheck=
                    187:        case $first_time:$force in
                    188:        1:*|*:1)        return 1 ;;
                    189:        esac
                    190:        case $1 in
                    191:        -)      shift; nocheck=1 ;;
                    192:        esac
                    193:        typeset a=$1!$2 n=$3 v=$4 t=$5 m
                    194:        case $5 in
                    195:        "*")    ks="base delta" ;;
                    196:        base)   ks=base ;;
                    197:        *)      ks=delta ;;
                    198:        esac
                    199:        for k in $ks
                    200:        do      key=$a,$n,$k
                    201:                eval sav=\$db_key_$k
                    202:                case $key in
                    203:                $sav)   eval set -- \$db_val_$k
                    204:                        ;;
                    205:                *)      case $db_style in
                    206:                        dbm)    if      db_request g$db_db$key
                    207:                                then    set -- $db_data
                    208:                                else    continue
                    209:                                fi
                    210:                                ;;
                    211:                        grep)   set -- `grep "^$key" $logfile`
                    212:                                case $# in
                    213:                                0)      continue ;;
                    214:                                esac
                    215:                                shift
                    216:                                ;;
                    217:                        esac
                    218:                        eval db_key_$k='$key' db_val_$k='$*'
                    219:                        ;;
                    220:                esac
                    221:                case $1/$2 in
                    222:                $v/$t)  case $undo:$nocheck in
                    223:                        :*|*:1) ;;
                    224:                        *)      continue ;;
                    225:                        esac
                    226:                        case $3 in
                    227:                        $undo)  continue ;;
                    228:                        *)      ;;
                    229:                        esac
                    230:                        case $v in
                    231:                        "*")    return 0 ;;
                    232:                        esac
                    233:                        ;;
                    234:                *)      case "$v" in
                    235:                        "*")    return 0 ;;
                    236:                        esac
                    237:                        continue
                    238:                        ;;
                    239:                esac
                    240:                if      test -d $n
                    241:                then    m=$(shipop time $n/$1/$2)
                    242:                else    m=$(shipop time $n)
                    243:                fi
                    244:                case $6 in
                    245:                ""|$m)  return 0 ;;
                    246:                *)      return 1 ;;
                    247:                esac
                    248:        done
                    249:        return 1
                    250: }
                    251: 
                    252: #
                    253: # note that < machine user tool version type > was sent
                    254: #
                    255: 
                    256: function db_note # machine user tool version type name
                    257: {
                    258:        typeset k v m
                    259:        case $5 in
                    260:        base)   k=base ;;
                    261:        *)      k=delta ;;
                    262:        esac
                    263:        if      test -d $3
                    264:        then    m=$(shipop time $3/$4/$5)
                    265:        else    m=$(shipop time $3)
                    266:        fi
                    267:        v="$1!$2,$3,$k $4 $5 $date $SHIPPER $6 $m"
                    268:        case $db_style in
                    269:        dbm)    db_request p$db_db$v ;;
                    270:        grep)   print $v >> $logfile ;;
                    271:        esac
                    272: }
                    273: 
                    274: #
                    275: # output SHIPMENT stamp for file [current date]
                    276: #
                    277: 
                    278: function shipstamp # file
                    279: {
                    280:        typeset -Z2 day month
                    281:        typeset -R2 year
                    282:        integer mon Jan=1 Feb=2 Mar=3 Apr=4 May=5 Jun=6 \
                    283:                Jul=7 Aug=8 Sep=9 Oct=10 Nov=11 Dec=12
                    284:        case $# in
                    285:        0)      set -- $(date)
                    286:                shift 1
                    287:                ;;
                    288:        *)      set -- $(ls -ld $1) 
                    289:                while   :
                    290:                do      case $# in
                    291:                        [01])   break ;;
                    292:                        esac
                    293:                        case $1 in
                    294:                        Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
                    295:                                case $2 in
                    296:                                [1-9]|[0-3][0-9])
                    297:                                        case $3 in
                    298:                                        [0-9]*) break ;;
                    299:                                        esac
                    300:                                        ;;
                    301:                                esac
                    302:                                ;;
                    303:                                        
                    304:                        esac
                    305:                        shift
                    306:                done
                    307:                ;;
                    308:        esac
                    309:        mon=$1
                    310:        day=$2
                    311:        month=$mon
                    312:        case $3 in
                    313:        *:*:*)  year=$5
                    314:                ;;
                    315:        *:*)    set -- $(date)
                    316:                year=$6
                    317:                if      (($mon > $2))
                    318:                then    let year=year-1
                    319:                fi
                    320:                ;;
                    321:        *)      year=$3
                    322:                ;;
                    323:        esac
                    324:        print $year$month$day
                    325: }
                    326: 
                    327: #
                    328: # prepare $tool for shipping -- $tool.000 always created
                    329: #
                    330: 
                    331: function package
                    332: {
                    333:        typeset tool=$1
                    334:        integer nblocks=${2-20}
                    335: 
                    336:        integer size i=0 skip=0
                    337:        integer chunksize=nblocks*8*1024
                    338:        typeset -RZ3 suffix
                    339:        typeset fsize
                    340:        print packaging $tool
                    341:        rm -f "$tool".???
                    342:        fsize=$(wc -c $tool)
                    343:        size=${fsize%$tool}
                    344:        if      ((size <= chunksize))
                    345:        then    ln "$tool" "$tool".000
                    346:        else    while   (( size > 0))
                    347:                do      suffix=$i
                    348:                        dd if="$tool" of="$tool.$suffix" bs=8k skip=$skip count=$nblocks 2> /dev/null
                    349:                        let i=i+1 skip=skip+nblocks size=size-chunksize
                    350:                done
                    351:        fi
                    352:        set -- "$tool".???
                    353:        case $1 in
                    354:        *.\?\?\?)       errexit "$tool: cannot package" ;;
                    355:        esac
                    356: }
                    357: 
                    358: function gencontrol # tool
                    359: {
                    360:        typeset tool=${1%/*}
                    361:        typeset format=${1#$tool/}
                    362:        typeset init
                    363:        if      test -f $1
                    364:        then    if      test $1 -nt $1.000
                    365:                then    package $1
                    366:                fi
                    367:                set -- $1.???
                    368:        else    # $SHIPFILES
                    369:                print - "cp $date.$SHIPPER/${tool%/*} \$INSTALLROOT/ship" >> $TMP.u
                    370:                return
                    371:        fi
                    372:        tooldir=${tool%%/*}
                    373:        {
                    374:                cat <<-!
                    375:                        if      test ! -f "\$INSTALLROOT/ship/$tooldir/items"
                    376:                        then
                    377:                !
                    378:                case $format in
                    379:                base)   init= ;;
                    380:                *)      init=$basetoo ;;
                    381:                esac
                    382:                case $init in
                    383:                "")     cat <<-!
                    384:                                if      test ! -d "\$INSTALLROOT/ship/$tooldir"
                    385:                                then    mkdir "\$INSTALLROOT/ship/$tooldir"
                    386:                                fi
                    387:                                rm -rf "\$INSTALLROOT/ship/$tool"
                    388:                                mkdir "\$INSTALLROOT/ship/$tool"
                    389:                        !
                    390:                        ;;
                    391:                esac
                    392:                cat <<-!
                    393:                        if      cat $tool/$format.??? > \$INSTALLROOT/ship/$tool/$format
                    394:                        then    rm -f $tool/$format.???
                    395:                        fi
                    396:                !
                    397:                case $init in
                    398:                "")     for i in $CRATEFILES
                    399:                        do      if      test -s $tool/$i
                    400:                                then    print - "echo \"$(cat $tool/$i 2>/dev/null)\" > \$INSTALLROOT/ship/$tool/$i"
                    401:                                elif    test -f $tool/$i
                    402:                                then    print - "> \$INSTALLROOT/ship/$tool/$i"
                    403:                                fi
                    404:                        done
                    405:                        if      test "" = "$shipper" -a -s $tool/owner
                    406:                        then    owner=$(<$tool/owner)
                    407:                        else    owner=$SHIPPER
                    408:                        fi
                    409:                        case ${TOSYS##*!} in
                    410:                        ${owner%%!*})   owner=${TOSYS%!*}!$owner ;;
                    411:                        *)              owner=$TOSYS!$owner ;;
                    412:                        esac
                    413:                        print - "echo \"$owner\" > \$INSTALLROOT/ship/$tool/owner"
                    414:                        ;;
                    415:                esac
                    416:                cat <<-!
                    417:                        fi
                    418:                !
                    419:         } >> $TMP.u
                    420: }
                    421: 
                    422: function buildscript # machine user
                    423: {
                    424:        # create mscript to execute as a . script
                    425:        typeset tool format
                    426:        integer delta=0 first=1 no_shipin
                    427:        mscript=$TMP.s tfile=$TMP.f
                    428:        case $message in
                    429:        ?*)     {
                    430:                print "cat > $tfile <<!EOF!"
                    431:                print "Subject: software shipment"
                    432:                if      test -f ship.body
                    433:                then    print
                    434:                        cat ship.body
                    435:                else    f=${name#*,}
                    436:                        l=${name%,*}
                    437:                        case $f in
                    438:                        $l)     ;;
                    439:                        *)      print "\
                    440: 
                    441: Dear ${name#*,} ${name%,*}:" ;;
                    442:                        esac
                    443:                        if      test -f ship.head
                    444:                        then    cat ship.head
                    445:                                print
                    446:                        fi
                    447:                        if      db_check $1 $2 shipin "*" base
                    448:                        then    no_shipin=0
                    449:                        else    no_shipin=1
                    450:                        fi
                    451:                        if      ((first_time||no_shipin))
                    452:                        then    print "\
                    453: 
                    454: As a first time recipient:
                    455: 
                    456: (1) Wait for a \\\`copy succeeded' message from uucp for the file:
                    457: 
                    458:        \$user/$FROMSYS/$date.$SHIPPER/manifest
                    459: 
                    460: (2) For safety do not run as root.  If you are not running as \$user then:
                    461: 
                    462:        RECIPIENT=\$user
                    463:        export RECIPIENT
                    464: 
                    465: (3) Create a shipment root directory under which all source and binaries
                    466:     will be generated.  This should not be a final installation directory.
                    467: 
                    468:        INSTALLROOT=<shipment-root-directory>
                    469:        test -d \\\$INSTALLROOT || mkdir \\\$INSTALLROOT
                    470:        cd \\\$INSTALLROOT
                    471:        test -d ship || mkdir ship
                    472: 
                    473: (4) Name the uucp shipment spool directory:
                    474: 
                    475:        SHIPSPOOL=$uuspool/\$user/$FROMSYS
                    476: 
                    477:     however if $uuspool/\$user/$FROMSYS was copied to \\\$SPOOLROOT then:
                    478: 
                    479:        SHIPSPOOL=\\\$SPOOLROOT
                    480: 
                    481: (5) If your system has att and bsd/ucb universes then in general the tools
                    482:     will have more functionality when built in the bsd/ucb universe.  You
                    483:     can set the C compiler name and/or flags by:
                    484: 
                    485:        CC='hackcc -systype bsd43' CCFLAGS='-g'  # just an example #
                    486:        export CC CCFLAGS
                    487: 
                    488: (6) Execute the following commands to unpack and install the shipment:
                    489: 
                    490:        export SHIPSPOOL
                    491:        cp \\\$SHIPSPOOL/$date.$SHIPPER/shipin ship/shipin
                    492:        chmod 0755 ship/shipin
                    493:        nohup ship/shipin &
                    494: 
                    495: (7) Use shipout within \\\$INSTALLROOT/ship to ship to other machines.
                    496:     \\\$INSTALLROOT/ship/README contains more detailed information.
                    497: "
                    498:                        else    print "\
                    499: 
                    500: As a repeat recipient:
                    501: 
                    502: (1) Wait for a \\\`copy succeeded' message from uucp for the file:
                    503: 
                    504:        \$user/$FROMSYS/$date.$SHIPPER/manifest
                    505: 
                    506: (2) For safety do not run as root.  If you are not running as \$user then:
                    507: 
                    508:        RECIPIENT=\$user
                    509:        export RECIPIENT
                    510: 
                    511: (3) Name the directory under which previous shipments were installed:
                    512: 
                    513:        INSTALLROOT=<shipment-root-directory>
                    514: 
                    515: (4) If $uuspool/\$user/$FROMSYS was copied to \\\$SPOOLROOT then:
                    516: 
                    517:        SHIPSPOOL=\\\$SPOOLROOT
                    518:        export SHIPSPOOL
                    519: 
                    520: (5) If your system has att and bsd/ucb universes then in general the tools
                    521:     will have more functionality when built in the bsd/ucb universe.  You
                    522:     can set the C compiler name and/or flags by:
                    523: 
                    524:        CC='hackcc -systype bsd43' CCFLAGS='-g'  # just an example #
                    525:        export CC CCFLAGS
                    526: 
                    527: (6) Execute the following commands to unpack and install the shipment:
                    528: 
                    529:        cd \\\$INSTALLROOT
                    530:        nohup ship/shipin &
                    531: 
                    532: (7) Use shipout within \\\$INSTALLROOT/ship to ship to other machines.
                    533:     \\\$INSTALLROOT/ship/README contains more detailed information.
                    534: "
                    535:                        fi
                    536:                fi
                    537:                typeset -L n='tool        ' d='release     '
                    538:                t='type'
                    539:                print "\
                    540: This distribution contains:
                    541: 
                    542:        $n$d$t"
                    543:                n=----
                    544:                d=-------
                    545:                t=----
                    546:                print "\
                    547:        $n$d$t"
                    548:                for tool in "${ship_list[@]}"
                    549:                do      format=${tool##*/}
                    550:                        tool=${tool%/$format}
                    551:                        test -r $tool && eval _notes_${tool%%/*}=0
                    552:                        n=${tool%%/*}
                    553:                        d=${tool##*/}
                    554:                        case $format in
                    555:                        base)   t="base" ;;
                    556:                        $SHIPMENT)      t="$format delta" delta=1 ;;
                    557:                        *)              errexit "$format: invalid format" ;;
                    558:                        esac
                    559:                        print " $n$d$t"
                    560:                done
                    561:                print
                    562:                if      ((delta))
                    563:                then    print "\
                    564: Unpacking delta shipments requires the new pax command.
                    565: "
                    566:                fi
                    567:                for tool in "${ship_list[@]}"
                    568:                do      if      test ! -r $tool
                    569:                        then    continue
                    570:                        fi
                    571:                        format=${tool##*/}
                    572:                        tool=${tool%/$format}
                    573:                        if      test -s "$tool/message"
                    574:                        then    item=${tool%%/*}
                    575:                                eval x='$'_notes_$item
                    576:                                case $x in
                    577:                                0)      print "\
                    578: $item notes:
                    579: "
                    580:                                        eval _notes_$item=1
                    581:                                        ;;
                    582:                                1)      if      cmp -s "$tool/message" "$item/$format/message"
                    583:                                        then    continue
                    584:                                        fi
                    585:                                        ;;
                    586:                                esac
                    587:                                cat "$tool/message"
                    588:                                print
                    589:                        fi
                    590:                done
                    591:                if      test -f ship.tail
                    592:                then    cat ship.tail
                    593:                elif    test -f $HOME/.signature
                    594:                then    cat $HOME/.signature
                    595:                fi
                    596:                print  '!EOF!'
                    597:                case $noexec in
                    598:                "")     print 'mail $mail < $tfile'
                    599:                        ;;
                    600:                *)      print 'print "mail $mail <<!EOF!"'
                    601:                        print "cat $tfile"
                    602:                        print  'echo !EOF!'
                    603:                        ;;
                    604:                esac
                    605:                } > $mscript
                    606:                ;;
                    607:        esac
                    608: }
                    609: 
                    610: function tosys # machine
                    611: {
                    612:        # construct return mail address
                    613:        typeset IFS=!
                    614:        TOSYS=
                    615:        for i in $@
                    616:        do      TOSYS=$i!$TOSYS
                    617:        done
                    618:        case $TOSYS in
                    619:        $FROMSYS!) TOSYS= ;;
                    620:        esac
                    621:        TOSYS=$TOSYS$FROMSYS
                    622: }
                    623: 
                    624: function genshiplist # machine user mail
                    625: {
                    626:        typeset tool file x n v t need_pax= missing=
                    627:        integer i=0 j=0
                    628:        lclfiles= rmtfiles=
                    629:        db_init $1 $2
                    630:        db_check - $1 $2 pax "*" base || need_pax=1
                    631:        machine=$1
                    632:        user=$2
                    633:        mail=$3
                    634:        unset ship_list
                    635:        for file in $SHIPFILES
                    636:        do      if      test ! -r "$file"
                    637:                then    continue
                    638:                fi
                    639:                v=$(shipstamp $file)
                    640:                if      db_check $machine $user $file $v base
                    641:                then    continue
                    642:                fi
                    643:                ship_list[i]=$file/$v/base
                    644:                i=i+1
                    645:        done
                    646:        j=i
                    647:        for tool in "${tool_list[@]}"
                    648:        do      n=${tool%%/*}
                    649:                case $need_pax in
                    650:                "")     eval t=\$type_$n
                    651:                        case $t in
                    652:                        pax)    continue ;;
                    653:                        esac
                    654:                        ;;
                    655:                esac
                    656:                v=${tool#*/}
                    657:                v=${v%/*}
                    658:                t=${tool##*/}
                    659:                case $tool in
                    660:                */*/$SHIPMENT)
                    661:                        if      db_check $machine $user $n $t "*"
                    662:                        then    case $basetoo in
                    663:                                ?*)     if      db_check $machine $user $n $v base
                    664:                                        then    :
                    665:                                        elif    test -f $n/$v/base
                    666:                                        then    ship_list[i]=$n/$v/base
                    667:                                                i=i+1
                    668:                                        else    print -u2 "$n/$v/base: missing base archive"
                    669:                                                missing=1
                    670:                                        fi
                    671:                                        ;;
                    672:                                *)      case $noexec in
                    673:                                        "")     db_note $machine $user $n $t base $name ;;
                    674:                                        esac
                    675:                                        ;;
                    676:                                esac
                    677:                        elif    test -f "$n/$v/base"
                    678:                        then    if      db_check $machine $user $n $v base
                    679:                                then    case $basetoo in
                    680:                                        "")     continue ;;
                    681:                                        esac
                    682:                                else    ship_list[i]=$n/$v/base
                    683:                                        i=i+1
                    684:                                        case $basetoo in
                    685:                                        "")     continue ;;
                    686:                                        esac
                    687:                                fi
                    688:                        elif    test -f $n/$t/base
                    689:                        then    ship_list[i]=$n/$t/base
                    690:                                i=i+1
                    691:                        else    print -u2 "$n/$t/base: missing base archive"
                    692:                                missing=1
                    693:                        fi
                    694:                        ;;
                    695:                esac
                    696:                if      db_check $machine $user $n $v $t
                    697:                then    continue
                    698:                fi
                    699:                ship_list[i]=$tool
                    700:                eval clean_$n=
                    701:                i=i+1
                    702:        done
                    703:        case $missing in
                    704:        ?*)     exit 1 ;;
                    705:        esac
                    706:        if      ((j>=i))
                    707:        then    case $total in
                    708:                "")     print -u2 "$mail is up to date" ;;
                    709:                *)      print -u2 "\n$mail: up to date" ;;
                    710:                esac
                    711:                return 0
                    712:        else    case $mark in
                    713:                ?*)     case $user:$noexec in
                    714:                        ?*:)    for tool in "${ship_list[@]}"
                    715:                                do      x=${tool#*/}
                    716:                                        x=${x%/*}
                    717:                                        db_note $machine $user ${tool%%/*} $x ${tool##*/} $name
                    718:                                done
                    719:                                ;;
                    720:                        esac
                    721:                        return 0
                    722:                        ;;
                    723:                esac
                    724:                case $total in
                    725:                ?*)     print -u2 "\n$mail:"
                    726:                        PS3=''
                    727:                        select i in ${ship_list[*]}
                    728:                        do      :
                    729:                        done </dev/null
                    730:                        return 0
                    731:                        ;;
                    732:                esac
                    733:        fi
                    734:        return 1
                    735: }
                    736: 
                    737: function sendcontrol # machine user
                    738: {
                    739:        # $transport the control file to <user> on given <machine>
                    740:        case $transport in
                    741:        uucp)   typeset dest=$1!$uupublic/$2/$FROMSYS/$date.$SHIPPER
                    742:                print "$rmtfiles
                    743: $date.$SHIPPER/unspool
                    744: $date.$SHIPPER/manifest" > $TMP.m
                    745:                print uucp -r -C $TMP.u $dest/unspool
                    746:                case $noexec in
                    747:                "")     uucp -r -C $TMP.u $dest/unspool ;;
                    748:                esac
                    749:                case $SHIPID in
                    750:                ?*)     print $date.$SHIPPER/id >> $TMP.m
                    751:                        id="$SHIPPER    SEAL    $(date) $1!$2"
                    752:                        print "$1!$SHIPID $id" > $TMP.i
                    753:                        print uucp -r -C $TMP.i $dest/id
                    754:                        case $noexec in
                    755:                        "")     uucp -r -C $TMP.i $dest/id ;;
                    756:                        esac
                    757:                        case $noexec in
                    758:                        "")     print "$id\t$(shipop seal $lclfiles $TMP.u $TMP.m $TMP.i)" >> $SHIPSLOG/seals
                    759:                                ;;
                    760:                        esac
                    761:                        ;;
                    762:                esac
                    763:                print uucp -r -C -m -n"$2" $TMP.m $dest/manifest
                    764:                case $noexec in
                    765:                "")     uucp -r -C -m -n"$2" $TMP.m $dest/manifest ;;
                    766:                esac
                    767:                ;;
                    768:        uuto)   print uuto -m $TMP.u $1!$2
                    769:                case $noexec in
                    770:                "")     uuto -m $TMP.u $1!$2 ;;
                    771:                esac
                    772:                ;;
                    773:        esac
                    774:        case $noexec in
                    775:        ?*)     case $SHIPID in
                    776:                ?*)     print "ID:"
                    777:                        cat $TMP.i
                    778:                        ;;
                    779:                esac
                    780:                print "MANIFEST:"
                    781:                cat $TMP.m
                    782:                print "UNSPOOL:"
                    783:                cat $TMP.u
                    784:                ;;
                    785:        esac
                    786: }
                    787: 
                    788: function doship #
                    789: {
                    790:        # ship the files
                    791:        typeset i j tool file
                    792:        integer d
                    793:        case "$info" in
                    794:        ?*)     fixedname=${name%% *}
                    795:                print "$fixedname $address $phone $mail $company $project $transport"
                    796:                return
                    797:        esac
                    798:        user=${mail##*!} machine=${mail%!*}
                    799:        user=${user%%@*} machine=${machine#*@}
                    800:        target=$machine!~/$user/$FROMSYS
                    801:        uuspool=$SHIPSPOOL
                    802:        case $transport in
                    803:        uucp)   uupublic='~'
                    804:                ;;
                    805:        uuto)   uuspool=$uuspoool/receive
                    806:                uupublic=$uuspool
                    807:                print -u2 $transport: transport not supported for $user
                    808:                return
                    809:                ;;
                    810:        *)      print -u2 $transport: unknown transport for $user
                    811:                return
                    812:                ;;
                    813:        esac
                    814:        if      genshiplist $machine $user $mail
                    815:        then    return
                    816:        fi
                    817:        tosys $machine
                    818:        > $TMP.u
                    819:        for i in "${ship_list[@]}"
                    820:        do      gencontrol "$i"
                    821:        done
                    822:        buildscript $machine $user
                    823:        dtime=0
                    824:        for tool in "${ship_list[@]}"
                    825:        do      for i in $tool.???
                    826:                do      case $i in
                    827:                        *.\?\?\?)
                    828:                                d=50
                    829:                                if      test -f $tool
                    830:                                then    i=$tool j=$tool.000
                    831:                                else    # here for $SHIPFILES
                    832:                                        i=${tool%%/*}; j=$date.$SHIPPER/$i
                    833:                                fi;;
                    834:                        *.000)  j=$i d=50;;
                    835:                        *)      j=$i d=100;;
                    836:                        esac
                    837:                        dfile=$target/$j
                    838:                        if      test -f "$i"
                    839:                        then    lclfiles="$lclfiles $i"
                    840:                                case $rmtfiles in
                    841:                                "")     rmtfiles=$j
                    842:                                        ;;
                    843:                                *)      rmtfiles="$rmtfiles
                    844: $j"
                    845:                                        ;;
                    846:                                esac
                    847:                                print   uucp -r $nocopy $PWD/"$i" "$dfile"
                    848:                                case $noexec in
                    849:                                "")     uucp -r $nocopy $PWD/"$i" "$dfile"
                    850:                                        dtime=dtime+d
                    851:                                        ;;
                    852:                                esac
                    853:                        fi
                    854:                done
                    855:                i=${tool#*/}
                    856:                i=${i%/*}
                    857:                case $noexec in
                    858:                "")     db_note $machine $user ${tool%%/*} $i ${tool##*/} $name ;;
                    859:                esac
                    860:        done
                    861:        if      test -r $mscript
                    862:        then    . $mscript
                    863:        fi
                    864:        sendcontrol $machine $user
                    865: }
                    866: 
                    867: function dosend # recipient open
                    868: {
                    869:        # lookup <recipient> in database and transport software to them
                    870:        # if <open> is given, the database is re-opened
                    871:        addr=$1
                    872:        case $addr in
                    873:        *:*)    transport=rcp
                    874:                mail=$1
                    875:                host=${addr%:*}
                    876:                machine=$host
                    877:                dir=${addr#*:}
                    878:                user=${dir%%/*}
                    879:                case $user in
                    880:                '~'*)   user=${user#~} ;;
                    881:                *)      user=$SHIPPER ;;
                    882:                esac
                    883:                ;;
                    884:        *!*)    name=${1##*!} transport=uucp
                    885:                ;;
                    886:        *@*)    name=${1%%@*} transport=uucp
                    887:                ;;
                    888:        *%compress|*%list|*%pull|*%push)
                    889:                mail=$addr
                    890:                transport=${addr##*'%'}
                    891:                machine=%$transport
                    892:                user=${addr%$machine}
                    893:                dir=.
                    894:                ;;
                    895:        *)      transport=db
                    896:                ;;
                    897:        esac
                    898:        case $transport in
                    899:        uucp)   address= phone= mail=$1 project=
                    900:                doship
                    901:                return 1
                    902:                ;;
                    903:        db)     typeset -l given match
                    904:                case $shipinfo_test in
                    905:                "")     if      test ! -f "$SHIPINFO"
                    906:                        then    errexit "$SHIPINFO: cannot find information file"
                    907:                        fi
                    908:                        shipinfo_test=1
                    909:                        ;;
                    910:                esac
                    911:                case $2 in
                    912:                ?*)     exec 3< $SHIPINFO ;;
                    913:                esac
                    914:                given=$1
                    915:                while IFS=: read -ru3 name address phone mail company project unused transport comments
                    916:                do      match=$name
                    917:                        case $match in
                    918:                        \#*)            ;;
                    919:                        $given*)        doship
                    920:                                        return 1
                    921:                                        ;;
                    922:                        esac
                    923:                done
                    924:                ;;
                    925:        *)      typeset d i p s
                    926:                if      genshiplist $machine $user $mail
                    927:                then    return 1
                    928:                fi
                    929:                tosys $machine
                    930:                {
                    931:                        case $transport in
                    932:                        compress|list|push)
                    933:                                ;;
                    934:                        *)      print - "umask 02"
                    935:                                ;;
                    936:                        esac
                    937:                        for i in "${ship_list[@]}"
                    938:                        do      if      test -f $i
                    939:                                then    d=$i/file
                    940:                                        p=${d%%/*}
                    941:                                        s=${d#${p}/}
                    942:                                        t=$p
                    943:                                        while   test "$s" != file
                    944:                                        do      if      test "" != "$p"
                    945:                                                then    case $transport in
                    946:                                                        compress|list)
                    947:                                                                print - "$dir/$p"
                    948:                                                                ;;
                    949:                                                        push)   ;;
                    950:                                                        *)      print - "if     test ! -d $dir/$p"
                    951:                                                                print - "then   mkdir $dir/$p"
                    952:                                                                print - "fi"
                    953:                                                                ;;
                    954:                                                        esac
                    955:                                                fi
                    956:                                                p=${p}/${s%%/*}
                    957:                                                s=${d#${p}/}
                    958:                                        done
                    959:                                        i=${i%/*}
                    960:                                        for f in $CRATEFILES
                    961:                                        do      if      test -s $i/$f
                    962:                                                then    case $transport in
                    963:                                                        compress|list|push)
                    964:                                                                print - "$dir/$i/$f"
                    965:                                                                ;;
                    966:                                                        *)      print - "echo \"$(cat $i/$f 2>/dev/null)\" > $dir/$i/$f"
                    967:                                                                ;;
                    968:                                                        esac
                    969:                                                elif    test -f $i/$f
                    970:                                                then    case $transport in
                    971:                                                        compress|list|push)
                    972:                                                                print - "$dir/$i/$f"
                    973:                                                                ;;
                    974: 
                    975:                                                        *)      print - "> $dir/$i/$f"
                    976:                                                                ;;
                    977:                                                        esac
                    978:                                                fi
                    979:                                        done
                    980:                                        case $transport in
                    981:                                        compress|list|push)
                    982:                                                if      test -s $i/owner
                    983:                                                then    print - "$dir/$i/owner"
                    984:                                                fi
                    985:                                                ;;
                    986:                                        *)      if      test "" = "$shipper" -a -s $i/owner
                    987:                                                then    owner=$(<$i/owner)
                    988:                                                else    owner=$SHIPPER
                    989:                                                fi
                    990:                                                case ${TOSYS##*!} in
                    991:                                                ${owner%%!*})   owner=${TOSYS%!*}!$owner ;;
                    992:                                                *)              owner=$TOSYS!$owner ;;
                    993:                                                esac
                    994:                                                print - "echo \"$owner\" > $dir/$i/owner"
                    995:                                                ;;
                    996:                                        esac
                    997:                                fi
                    998:                        done
                    999:                        case $transport in
                   1000:                        list|push)
                   1001:                                ;;
                   1002:                        *)      print - "rm -f $dir/ship.$date"
                   1003:                                ;;
                   1004:                        esac
                   1005:                } | case $transport:$noexec in
                   1006:                compress:)
                   1007:                        cat
                   1008:                        ;;
                   1009:                compress:*)
                   1010:                        print - "(pax -wv | compress${mail:+" > $mail"}) <<!"
                   1011:                        cat
                   1012:                        ;;
                   1013:                list:*) cat
                   1014:                        ;;
                   1015:                pull:*) print - ': pull shipment from remote dk host'
                   1016:                        print - 'case $# in'
                   1017:                        print - '1|2)   ;;'
                   1018:                        print - '*)     echo "Usage: $0 dk-address [remote-INSTALLROOT]" >&2; exit 1 ;;'
                   1019:                        print - 'esac'
                   1020:                        print - 'DK_ADDRESS=$1'
                   1021:                        print - 'DK_INSTALLROOT=${2-.}'
                   1022:                        cat
                   1023:                        ;;
                   1024:                push:*) print - ': push shipment to remote dk host'
                   1025:                        print - 'case $# in'
                   1026:                        print - '1|2)   ;;'
                   1027:                        print - '*)     echo "Usage: $0 dk-address [remote-INSTALLROOT]" >&2; exit 1 ;;'
                   1028:                        print - 'esac'
                   1029:                        print - 'push $1 - ${2-ship} <<"!"'
                   1030:                        cat
                   1031:                        ;;
                   1032:                *:)     cat > $TMP.r
                   1033:                        rcp $TMP.r $host:$dir/ship.$date || exit
                   1034:                        rm -f $TMP.r
                   1035:                        case $rsh in
                   1036:                        "")     for i in rcmd remsh
                   1037:                                do      if      ($i $host date) >/dev/null 2>&1
                   1038:                                        then    rsh=$i
                   1039:                                                break
                   1040:                                        fi
                   1041:                                done
                   1042:                                case $rsh in
                   1043:                                "") rsh=rsh ;;
                   1044:                                esac
                   1045:                                ;;
                   1046:                        esac
                   1047:                        $rsh $host sh $dir/ship.$date || exit
                   1048:                        ;;
                   1049:                *)      print - "cat '"
                   1050:                        cat
                   1051:                        print - "' > ship.$date"
                   1052:                        print - "rcp ship.$date $host:$dir"
                   1053:                        print - "rm ship.$date"
                   1054:                        print - "rsh $host sh $dir/ship.$date"
                   1055:                        ;;
                   1056:                esac
                   1057:                for tool in "${ship_list[@]}"
                   1058:                do      if      test ! -f $tool
                   1059:                        then    i=${tool%%/*}
                   1060:                        else    i=$tool
                   1061:                        fi
                   1062:                        dfile=$mail/$i
                   1063:                        if      test -f "$i"
                   1064:                        then    case $transport in
                   1065:                                compress)
                   1066:                                        print -u2 "oops: $i"
                   1067:                                        ;;
                   1068:                                list|push)
                   1069:                                        print - "$i"
                   1070:                                        ;;
                   1071:                                pull)   case $i in
                   1072:                                        */*)    t=${i%/*} ;;
                   1073:                                        *)      t=. ;;
                   1074:                                        esac
                   1075:                                        print - echo pull '$DK_ADDRESS' '$DK_INSTALLROOT'/ship/$i $t
                   1076:                                        print - pull '$DK_ADDRESS' '$DK_INSTALLROOT'/ship/$i $t
                   1077:                                        ;;
                   1078:                                rcp)    print   rcp "$i" "$dfile"
                   1079:                                        case $noexec in
                   1080:                                        "")     rcp "$i" "$dfile" || exit ;;
                   1081:                                        esac
                   1082:                                        ;;
                   1083:                                esac
                   1084:                        fi
                   1085:                        i=${tool#*/}
                   1086:                        i=${i%/*}
                   1087:                        case $user:$noexec in
                   1088:                        ?*:)    db_note $machine $user ${tool%%/*} $i ${tool##*/} $name ;;
                   1089:                        esac
                   1090:                done
                   1091:                case $transport in
                   1092:                push)   print - '!' ;;
                   1093:                esac
                   1094:                return 1
                   1095:                ;;
                   1096:        esac
                   1097:        print -u2 "$command: address for $1 not found"
                   1098:        return 1
                   1099: }
                   1100: 
                   1101: function closure # tools
                   1102: {
                   1103:        tools=
                   1104:        for tool
                   1105:        do      if      test ! -d $tool
                   1106:                then    case $original in
                   1107:                        *" ${tool%/*} "*|*" $tool "*)   warning "${tool%/*}: invalid tool" ;;
                   1108:                        esac
                   1109:                else    case $tool in
                   1110:                        */?*)   release=${tool#*/}
                   1111:                                tool=${tool#*/}
                   1112:                                ;;
                   1113:                        *)      eval items=\"\$items_$item\"
                   1114:                                case $items in
                   1115:                                "")     release= ;;
                   1116:                                *)      eval release=\$release_$tool ;;
                   1117:                                esac
                   1118:                                ;;
                   1119:                        esac
                   1120:                        eval release_${tool%/*}=$release
                   1121:                        tools="$tools $tool"
                   1122:                fi
                   1123:        done
                   1124:        set -- $tools
                   1125:        #
                   1126:        # now generate the closure of the top level tools and releases
                   1127:        #
                   1128:        tools=
                   1129:        for tool
                   1130:        do      old=
                   1131:                new=$tool
                   1132:                while :
                   1133:                do      case $new in
                   1134:                        $old)   break
                   1135:                        esac
                   1136:                        dup=
                   1137:                        for item in $new
                   1138:                        do      # we assume items_* not in environment
                   1139:                                eval items=\"\$items_$item\"
                   1140:                                case $items in
                   1141:                                "")     eval release=\$release_$item
                   1142:                                        case $release in
                   1143:                                        "")     set -- $item/$SHIPMENT
                   1144:                                                shift $#-1
                   1145:                                                case $1 in
                   1146:                                                "$item/$SHIPMENT") continue ;;
                   1147:                                                esac
                   1148:                                                release=${1#*/}
                   1149:                                                eval release_$item=$release
                   1150:                                        esac
                   1151:                                        if      test ! -f $item/$release/items
                   1152:                                        then    continue
                   1153:                                        fi
                   1154:                                        case $closure in
                   1155:                                        "")     items=$item ;;
                   1156:                                        *)      items=$(<$item/$release/items)" $item" ;;
                   1157:                                        esac
                   1158:                                        eval items_$item=\"$items\"
                   1159:                                        ;;
                   1160:                                esac
                   1161:                                dup="$dup $items"
                   1162:                        done
                   1163:                        old=$new
                   1164:                        new=
                   1165:                        for item in $dup
                   1166:                        do      eval seen_$item=
                   1167:                        done
                   1168:                        for item in $dup
                   1169:                        do      eval seen=\$seen_$item
                   1170:                                case $seen in
                   1171:                                "")     eval seen_$item=1
                   1172:                                        new="$new $item"
                   1173:                                esac
                   1174:                        done
                   1175:                done
                   1176:                tools="$tools $new"
                   1177:        done
                   1178: }
                   1179: 
                   1180: function undup # tools
                   1181: {
                   1182:        tools=
                   1183:        for item
                   1184:        do      eval seen_$item=
                   1185:        done
                   1186:        for item
                   1187:        do      eval seen=\$seen_$item
                   1188:                case $seen in
                   1189:                "")     eval seen_$item=1
                   1190:                        tools="$tools $item"
                   1191:                esac
                   1192:        done
                   1193: }
                   1194: 
                   1195: command=$0
                   1196: integer dtime=0 i=0 nrecipient=0 first_time=1 delay=0
                   1197: info= mark= list= logfile= message=1 nocopy= noexec= format=$SHIPMENT
                   1198: shipinfo_test= force= shipper= closure=1 undo= date= basetoo=
                   1199: while  :
                   1200: do     case    $1 in
                   1201:        -b)     basetoo=1 ;;
                   1202:        +b)     basetoo= ;;
                   1203:        -c)     closure= ;;
                   1204:        +c)     closure=1 ;;
                   1205:        -d)     format=base ;;
                   1206:        +d)     format=$SHIPMENT ;;
                   1207:        -i)     info=1 delay=0 ;;
                   1208:        -k)     mark=1 delay=0 ;;
                   1209:        -l)     shift; list=$1 ;;
                   1210:        +l)     list= ;;
                   1211:        -m)     message= ;;
                   1212:        +m)     message=1 ;;
                   1213:        -n)     noexec=1 delay=0 ;;
                   1214:        +n)     noexec= ;;
                   1215:        -o)     shipper=1 ;;
                   1216:        +o)     shipper= ;;
                   1217:        -p)     shift; recipient_list[nrecipient]=$1; nrecipient=nrecipient+1 ;;
                   1218:        +p)     recipient= ;;
                   1219:        -s)     SHIPFILES= ;;
                   1220:        -t)     total=1 noexec=1 delay=0 ;;
                   1221:        -u)     shift; undo=$1 ;;
                   1222:        +u)     undo= ;;
                   1223:        -v)     shift; date=$1 ;;
                   1224:        -C)     shift; CRATEFILES="$CRATEFILES $1" ;;
                   1225:        -D)     shift;  delay=$1 ;;
                   1226:        +D)     delay=0 ;;
                   1227:        -F)     force=1 ;;
                   1228:        +F)     force= ;;
                   1229:        -S)     shift; SHIPFILES="$SHIPFILES $1" ;;
                   1230:        *[,:!%@]*)recipient_list[nrecipient]=$1;nrecipient=nrecipient+1 ;;
                   1231:        --)     shift; break ;;
                   1232:        -*|+*)  print -u2 "Usage: $command [-bcdikmnostfF] [-l recipient-list] [-p recipient] [-u [[yy]mm]dd] [-v yymmdd] [-C crate-file] [-D delay] [-S support-file] [recipient ...] [tool ...]"; exit 2 ;;
                   1233:        *)      break ;;
                   1234:        esac
                   1235:        shift
                   1236: done
                   1237: case $date in
                   1238: $SHIPMENT)     ;;
                   1239: *)             date=$(shipstamp) ;;
                   1240: esac
                   1241: case $info in
                   1242: "")    if      test 0 = "$nrecipient" -a ! -f "$list"
                   1243:        then    errexit "no recipient(s)"
                   1244:        fi
                   1245:        trap 'cleanup $?' EXIT INT TERM
                   1246:        #
                   1247:        # generate the tools list
                   1248:        #
                   1249:        original=" $* "
                   1250:        case $# in
                   1251:        0)      tools=
                   1252:                for tool in *
                   1253:                do      set -- $tool/$SHIPMENT
                   1254:                        case $1 in
                   1255:                        "$tool/$SHIPMENT")      ;;
                   1256:                        *)              tools="$tools $tool" ;;
                   1257:                        esac
                   1258:                done
                   1259:                case $tools in
                   1260:                "")     errexit "no tools" ;;
                   1261:                esac
                   1262:                set -- $tools
                   1263:                ;;
                   1264:        esac
                   1265:        closure $*
                   1266:        case $tools in
                   1267:        "")     errexit "no 'items' file(s)" ;;
                   1268:        esac
                   1269:        tools_usr=$tools
                   1270:        tools_pax=
                   1271:        case $closure:$format:$SHIPFILES in
                   1272:        :*|*:|*:base:*)
                   1273:                ;;
                   1274:        *)      set -- pax/$SHIPMENT
                   1275:                case $1 in
                   1276:                "$tool/$SHIPMENT")
                   1277:                        ;;
                   1278:                *)      closure pax
                   1279:                        tools_pax=$tools
                   1280:                        ;;
                   1281:                esac
                   1282:                ;;
                   1283:        esac
                   1284:        undup $tools_pax $tools_usr
                   1285:        set -- $tools
                   1286:        for tool in $tools_pax
                   1287:        do      eval type_$tool=pax
                   1288:        done
                   1289:        for tool in $tools_usr
                   1290:        do      eval type_$tool=usr
                   1291:        done
                   1292:        set -- $tools
                   1293:        for tool
                   1294:        do      eval tool=$tool/\$release_$tool
                   1295:                item=
                   1296:                for f in "$format" base
                   1297:                do      set -- $tool/$f
                   1298:                        if      test -f "$1"
                   1299:                        then    item=${1##*/}
                   1300:                                break
                   1301:                        fi
                   1302:                done
                   1303:                case $item in
                   1304:                "")     if      test ! -d ${tool%/*}
                   1305:                        then    case $original in
                   1306:                                *" ${tool%/*} "*|*" $tool "*)   warning "${tool%/*}: invalid tool" ;;
                   1307:                                esac
                   1308:                                continue
                   1309:                        fi
                   1310:                        case $format in
                   1311:                        base)   set -- $tool/$SHIPMENT
                   1312:                                if      test -f "$1"
                   1313:                                then    eval release_${tool%/*}=${1##*/}
                   1314:                                        tool=${tool%/*}/${1##*/}
                   1315:                                        item=base
                   1316:                                        warning "${tool}: latest base not crated"
                   1317:                                else    warning "${tool}: base not crated"
                   1318:                                        continue
                   1319:                                fi
                   1320:                                ;;
                   1321:                        *)      continue
                   1322:                                ;;
                   1323:                        esac
                   1324:                        ;;
                   1325:                esac
                   1326:                case $format in
                   1327:                "$SHIPMENT"|$item)
                   1328:                        tool=$tool/$item
                   1329:                        ;;
                   1330:                *)      tool=${tool%/*}/$item/base
                   1331:                        if      test ! -f $tool
                   1332:                        then    errexit "${tool%/*}: $item base not crated"
                   1333:                        fi
                   1334:                        ;;
                   1335:                esac
                   1336:                tool_list[i]=$tool;i=i+1
                   1337:        done
                   1338:        ;;
                   1339: *)     typeset -lL16 fixedname
                   1340:        typeset -L9 address project
                   1341:        typeset -R12 phone
                   1342:        typeset -L21 mail
                   1343:        typeset -L11 company
                   1344:        ;;
                   1345: esac
                   1346: if     test ! -d $SHIPSLOG
                   1347: then   mkdir $SHIPSLOG || errexit "$SHIPSLOG: cannot create log directory"
                   1348: fi
                   1349: if     test -f shipop.c -a -x shipop
                   1350: then   SHIPID=$FROMSYS!$SHIPPER
                   1351:        case $SHIPFILES in
                   1352:        ?*)     SHIPFILES="$SHIPFILES shipop.c" ;;
                   1353:        esac
                   1354: else   SHIPID=
                   1355: fi
                   1356: while  :
                   1357: do     case $undo in
                   1358:        ""|??????*)     break ;;
                   1359:        *)              undo="?$undo" ;;
                   1360:        esac
                   1361: done
                   1362: nocopy=${nocopy+-c}
                   1363: flag=1
                   1364: case $list in
                   1365: "")    set -s -- "${recipient_list[@]}"
                   1366:        ;;
                   1367: ?*)    if      test ! -r "$list"
                   1368:        then    errexit "$list: cannot read"
                   1369:        else    set -s -- "${recipient_list[@]}" $(sed -e '/^#/d' -e 's/[:      ].*//' $list)
                   1370:        fi
                   1371:        ;;
                   1372: esac
                   1373: for recipient
                   1374: do     if      ((dtime))
                   1375:        then    sleep $dtime
                   1376:        fi
                   1377:        if      dosend "$recipient" $flag
                   1378:        then    flag=
                   1379:                case $noexec$info in
                   1380:                "")     print "$name" >> ${tool%/*}/list ;;
                   1381:                esac
                   1382:        else    flag=1
                   1383:        fi
                   1384:        if      ((delay > dtime))
                   1385:        then    dtime=delay
                   1386:        fi
                   1387: done
                   1388: exit 0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.