$ verf='F$VERIFY(F$TRNLNM(F$PARSE(F$ENVIRONMENT("PROCEDURE"),,,"NAME")+"_VERIFY")) $ self=F$PARSE(";",F$ENVIRONMENT("PROCEDURE")) $ name=F$PARSE(self,,,"NAME") $ debug=F$TRNLNM(name+"_DEBUG").NES."" $ node=F$GETSYI("NODENAME") $ now=F$CVTIME(,"ABSOLUTE") $ stat=1 $ lockfile=F$PARSE(".LOCK",self) $ ks=8 $ IF F$EXTRACT(0,1,p1).EQS."#" $ THEN $ target=p1-"#" $ GOTO 'target' $ ENDIF $ $ Nodes="" $ ctx="" $ NodeLoop: csid=F$CSID(ctx) $ IF csid.NES."" $ THEN $ Nodes=Nodes+","+F$GETSYI ("NODENAME",,csid) $ GOTO NodeLoop $ ENDIF $ IF F$SEARCH(lockfile).EQS."" $ THEN $ CREATE 'lockfile' - /FDL="FILE;ORG indexed;REC;FORM variable;KEY 0;CHANGE no;DUP no;TYPE string;SEG0_POS 0;SEG0_LEN ''ks'" $ ENDIF $ OPEN/READ/WRITE/SHARE=WRITE lock 'lockfile' $ doit="GOSUB MakeNodeRecs" $ GOSUB LoopNodes $ READ/NOLOCK/KEY="''rec'" lock rec $ doit="GOSUB SendCleanup" $ GOSUB LoopNodes $ doit="GOSUB WaitNodes" $ GOSUB LoopNodes $ READ/NOLOCK/KEY="''rec'" lock rec $ doit="GOSUB SendShutdown" $ GOSUB LoopNodes $ doit="GOSUB WaitNodes" $ GOSUB LoopNodes $ @'self' #SHUTDOWN $ GOTO FinExit $ $ LoopNodes: $ i=1 $ ALoop: ANode=F$ELEMENT(i,",",Nodes)-"," $ IF ANode.NES."" $ THEN $ 'doit' $ i=i+1 $ GOTO ALoop $ ENDIF $ RETURN $ $ MakeNodeRecs: $ key="L''ANode' " $ GOSUB MakeRecord $ RETURN $ $ MakeRecord: $ rec=F$EXTRACT(0,ks,key) $ READ/KEY="''rec'"/ERROR=NewRec lock rec $ RETURN $ NewRec: $ WRITE lock rec $ RETURN $ $ SendCleanup: $ RSH 'ANode' @'self' #CLEANUP $ RETURN $ $ WaitNodes: $ rec=F$EXTRACT(0,ks,"L''ANode'") $ READ/WAIT/KEY="''rec'" lock rec $ RETURN $ $ SendShutdown: $ IF ANode.NES.node THEN RSH 'ANode' @'self' #SHUTDOWN $ RETURN $ $ LockNode: $ OPEN/READ/WRITE/SHARE=WRITE lock 'lockfile' $ rec=F$EXTRACT(0,ks,"L''node' ") $ READ/KEY="''rec'" lock rec $ stat=$STATUS $ RETURN $ $ CLEANUP: $ GOSUB LockNode $ IF stat $ THEN $ WRITE SYS$OUTPUT "Doing cleanup on ''node'" $ WAIT 00:00:02.00 $ ENDIF $ GOTO FinExit $ $ SHUTDOWN: $ GOSUB LockNode $ IF stat $ THEN $ WRITE SYS$OUTPUT "Doing shutdown on ''node'" $ WAIT 00:00:02.00 $ ENDIF $ GOTO FinExit $ $ DEBUG: $ VERIFY: $ DEFINE/NOLOG 'name'_'target' TRUE $ IF p2.NES."" $ THEN $ @'self' "''p2'" "''p3'" "''p4'" "''p5'" "''p6'" "''p7'" "''p8'" $ stat=$STATUS $ GOTO NO'target' $ ENDIF $ GOTO FinExit $ NODEBUG: $ NOVERIFY: $ target=target-"NO" $ IF F$TRNLNM("''name'_''target'").NES."" THEN DEASSIGN 'name'_'target' $ GOTO FinExit $ $ FinExit: $ IF F$TRNLNM("LOCK").NES."" THEN CLOSE lock $ EXIT %X10000000.OR.F$INTEGER(stat)+(F$VERIFY(verf).AND.0)