/* * Poll * * USAGE: * boolean = 'mail/Poll'(NODE/M,STOP/S) * * REQUIREMENTS: * LIBS:rexxdossupport.library * REXX:db/Config * REXX:mail/Poll_TD * REXX:mail/Poll_GMS * REXX:dos/ReadBlock * REXX:dos/WriteBlock * * Poll is mainly intended for using as execution module for the * OutBoundManager... * * $(C): (1996, Rocco Coluccelli, Bologna) * $VER: Poll 0.04 (14.Nov.1996) */ OPTIONS RESULTS m. = "" m.cfg_deft = "" m.cfg_file = ARG(2) IF ARG(2) = "" THEN m.cfg_file = "REXX:mail/Poll.cfg" INTERPRET 'db/Config'("LOAD",m.cfg_file,m.cfg_deft) /* * Phone numbers are rejected... */ IF ~ReadArgs(ARG(1),"NODE/M,STOP/S") THEN RETURN 0 CALL PRAGMA('D',cfg.pop.1) /* Outbound-dir is the current-dir */ CALL PRAGMA('W','N') /* Disable system request */ file. = "" DO n = 0 FOR node.count IF EXISTS(node.n) THEN DO node = TRANSLATE(FilePart(node.n)," ","."); file.n = node.n; END ELSE node = TRANSLATE(node.n," ",":/.") PARSE VAR node zn nt hb . node.n = zn":"nt"/"hb".0" file = zn"."nt"."hb".0.INF" IF EXISTS(file) THEN DO INTERPRET 'db/Config'("LOAD",file); node.n = cfg.db_aka; END END file.count = node.count /* * type = External, Trapdoor, Gms (0,1,2) * mode = Node by Node, Node with Aka, Do all Nodes, Shedule (0,1,2,3) */ type = cfg.cyc.1; mode = cfg.cyc.2 IF type > 0 THEN DO mode = cfg.cyc.3 + 1; cfg.swt.3 = 0; cfg.swt.4 = 0; cfg.swt.5 = 0 type.1 = "TD"; type.2 = "GMS"; mode.1 = "CALL"; mode.2 = "POLL" cfg.pop.3 = "CALL 'mail/Poll_" || type.type || "'('OPEN')" cfg.pop.4 = "CALL 'mail/Poll_" || type.type || "'('" || mode.mode || "',%S,cfg.sld.2 cfg.sld.3 cfg.sld.1,cfg.pop.6,cfg.pop.7)" cfg.pop.5 = "CALL 'mail/Poll_" || type.type || "'('QUIT')" END PARSE VAR cfg.pop.4 sx"%S"dx IF mode < 2 THEN CALL run_cmd(cfg.pop.3,cfg.swt.3) nodes = "" IF mode = 3 THEN DO /* Scheduling */ DO n = 0 FOR node.count node.n = chk_dupes(node.n,nodes); IF node.n ~= "" THEN nodes = nodes || node.n || '0a'x END IF 'dos/WriteBlock'(cfg.pop.2,nodes) THEN CALL run_cmd(sx'"'cfg.pop.2'"'dx,cfg.swt.4) END ELSE IF mode = 2 THEN DO /* Do all nodes */ nodes = node.0 DO n = 1 FOR node.count - 1 node.n = chk_dupes(node.n,nodes); IF node.n ~= "" THEN nodes = nodes"|"node.n END CALL run_cmd(sx'"'nodes'"'dx,cfg.swt.4) END ELSE IF mode = 1 THEN /* Node with aka */ DO n = 0 FOR node.count node.n = chk_dupes(node.n,nodes) IF node.n = "" | ~EXISTS(file.n) THEN ITERATE CALL run_cmd(sx'"'node.n'"'dx,cfg.swt.4); nodes = nodes node.n END ELSE IF mode = 0 THEN /* Node by node */ DO n = 0 FOR node.count node.n = chk_dupes(node.n,nodes); nodes = nodes node.n DO m = 1 TO WORDS(node.n) IF EXISTS(file.n) THEN CALL run_cmd(sx'"'WORD(node.n,m)'"'dx,cfg.swt.4) END END IF mode < 2 THEN CALL run_cmd(cfg.pop.5,cfg.swt.5) RETURN /* * run_cmd(cmd,type) * * type = 1 executable command line (AmigaDOS/batch) * type = 0 ARexx command line */ run_cmd: PROCEDURE EXPOSE cfg. PARSE ARG cmd,ctp IF cmd = "" THEN RETURN 0 IF ctp = 0 THEN INTERPRET cmd ELSE ADDRESS COMMAND cmd RETURN 1 /* * chk_dupes(src_string,dst_string) */ chk_dupes: PROCEDURE PARSE ARG src,dst DO m = 1 FOR WORDS(src) IF POS(WORD(src,m),dst) = 0 THEN ITERATE src = DELWORD(src,m); m = m - 1 END RETURN src