* AS WRITTEN, THIS PROGRAM REQUIRES THE FOLLOWING CBL OPTIONS. * CBL MAP,XREF(SHORT),OFFSET,TEST(ALL,SYM),APOST,LIB * CBL TRUNC(BIN),NOZWB * CBL DATA(31),RMODE(ANY) IDENTIFICATION DIVISION. PROGRAM-ID. BSTTEZ01. * * COPYRIGHT TEI 2001-2011 * * BASED ON FIGURE 38 IN MVS TCP/IP SOCKETS RED BOOK. * GG24-2561-00 * * ALL LINES MARKED WITH CHANGE> MUST BE CHANGED TO MATCH * LOCAL REQUIREMENTS. * * HOW TO USE THIS SAMPLE PROGRAM: * * 1) MODIFY ALL 'CHANGE>' LINES IN BSTTEZ01. * 2) COMPILE BSTTEZ01, BSTTEZ02, AND BSTTEZ03. * 3) SUBMIT THE FOLLOWING BATCH JCL TO RUN BSTTEZ01. * (CHANGE LIBDEF AND PUN CLASS AS REQUIRED). * // JOB BSTTEZ01 * // OPTION PARTDUMP,NOSYSDUMP,NOLOG * // OPTION SYSPARM='10' * // SETPARM IPTRACE='NNN' * // LIBDEF *,SEARCH=(BSILIB.TTDEV,BSILIB.WORK) * // EXEC BSTTEZ01,SIZE=BSTTEZ01 * * $$ PUN CLASS=Z,DISP=I * 1 * * $$ PUN CLASS=Z,DISP=I * 2 * * $$ PUN CLASS=Z,DISP=I * Y * * $$ PUN CLASS=Z,DISP=I * /* * /& * (MORE CARD PAIRS CAN BE ADDED TO INDICATE HOW MANY * TIME A LISTEN PORT WILL BE CREATED. EACH PAIR MUST HAVE * A PUN CARD FOLLOWED BY A DATA CARD. THE CONTENTS OF THE * DATA CARD ARE IGNORED EXCEPT IF A 'Y' IS FOUND IN THE * FIRST POSITION OF THE CARD. AT THAT TIME, BSTTEZ01 WILL * TERMINATE PROCESSING.) * 4) SUBMIT THE FOLLOWING BATCH JCL TO RUN BSTTEZ02. * (CHANGE LIBDEF AND PUN CLASS AS REQUIRED). * // JOB BSTTEZ02 * // OPTION PARTDUMP,NOSYSDUMP,NOLOG * // OPTION SYSPARM='10' * /. OPTION SYSPARM='00' * // SETPARM IPTRACE='YYNY' * // LIBDEF *,SEARCH=(BSILIB.TTDEV,BSILIB.WORK) * // EXEC BSTTEZ02,SIZE=BSTTEZ02 * /* * /& * 5) ONCE BSTTEZ02 CONNECTS TO BSTTEZ01, BSTTEZ01 WILL * SPAWN THE JOB EZATAKE WHICH WILL RUN BSTTEZ03. * 6) BSTTEZ03 WILL HANDLE THE SEND/RECEIVES FROM BSTTEZ02. * 7) BSTTEZ01 WILL CREATE ANOTHER LISTEN CONNECTION UNTIL * THE FIRST POSITION OF THE INPUT CARD IS 'Y'. * * CHANGE LOG: * JUL 17, 2009 TT SAVED DOMAIN FROM GETCLIENTID FOR USE BY * GIVESOCKET. (NEEDED ONLY WHEN USING AN * IPV6 LINKED TO AN IPV4 STACK.) * TT = TONY THIGPEN TONY@VSE2PDF.COM * JUL 19, 2009 TT ADDED ',PARM=(/TRAP) TO THE GENERATED * JECL EXEC STATEMENT * AUG 19, 2009 TT CHANGED LISTEN.BACKLOG FOR Z/OS COMPAT * AUG 19, 2009 TT REPLACE EZA CALLS WITH COPYBOOK BSTTEZAP * FEB 09, 2010 TT CORRECTED ACCEPT AFTER SELECT TIMEOUT * MAY 10, 2010 TT ADD NEW COPYBOOK BSTTEZA9 * SEP 04, 2010 TT REMOVED BSTTEZA8 AND BSTTEZA9 COPYBOOKS ENVIRONMENT DIVISION. CONFIGURATION SECTION. DATA DIVISION. WORKING-STORAGE SECTION. 01 PROGRAM-INFOMATION. 05 PROGRAM-NAME PIC X(08) VALUE 'BSTTEZ01'. 05 PROGRAM-TITLE PIC X(23) VALUE 'EZA SERVER LISTENER '. 01 WS-AREA. 05 WS-STOP PIC X(01) VALUE SPACE. 05 WS-SOCKET-ORIGINAL PIC S9(04) COMP. 05 WS-SOCKET-ACCEPT PIC S9(04) COMP. 05 WS-SOCKET-TAKE PIC S9(04) COMP. 05 WS-IPADDRESS PIC X(04) VALUE LOW-VALUES. 05 WS-IPPORT PIC S9(04) COMP VALUE +4321. 05 WS-COUNT PIC S9(04) COMP VALUE +0. 05 WS-OURCLIENT PIC X(40) VALUE LOW-VALUES. 01 ABEND-INFORMATION. 03 CURRENT-FUNCTION PIC X(20) VALUE SPACES. 03 CURRENT-ERROR PIC 9(05) VALUE ZEROES. 03 ABEND-CODE PIC 9(04) VALUE ZEROS. 03 ABEND-SPACE. 05 ABEND-NUMBER PIC S9(04) VALUE ZEROS. 01 BUFFER-IN PIC X(80) VALUE SPACES. 01 BUFFER-OUT PIC X(80) VALUE SPACES. 01 RSNDMSK PIC X(08) VALUE LOW-VALUES. 01 WSNDMSK PIC X(08) VALUE LOW-VALUES. 01 ESNDMSK PIC X(08) VALUE LOW-VALUES. 01 RRETMSK PIC X(08) VALUE LOW-VALUES. 01 WRETMSK PIC X(08) VALUE LOW-VALUES. 01 ERETMSK PIC X(08) VALUE LOW-VALUES. 01 EZA-CALL-DATA. COPY BSTTEZA. 01 EZACIC06-DATA. COPY BSTTEZA6. 01 JOB-CARDS. 05 JC1 PIC X(72) VALUE CHANGE '* $$ JOB JNM=EZATAKE,LDEST=(,TTHIGPEN),CLASS=Z'. 05 JC2 PIC X(72) VALUE CHANGE '* $$ LST CLASS=O '. 05 JC3 PIC X(72) VALUE '// JOB EZATAKE '. 05 JC4 PIC X(72) VALUE '// OPTION PARTDUMP,NOSYSDUMP,NOLOG '. 05 JC5 PIC X(72) VALUE '// OPTION SYSPARM=''??'' '. 05 JC6 PIC X(72) VALUE '// SETPARM IPTRACE=''YYNYNN'' '. 05 JC7 PIC X(72) VALUE CHANGE '// LIBDEF *,SEARCH=(BSILIB.WORK,BSILIB.TTDEV) '. 05 JC8 PIC X(72) VALUE 'EXEC CARD WILL GO HERE '. 05 JC9 PIC X(72) VALUE 'CLIENT ID WILL GO HERE '. 05 JC10 PIC X(72) VALUE 'ORIGINAL SOCKET NUMBER WILL GO HERE '. 05 JC11 PIC X(72) VALUE '/* '. 05 JC12 PIC X(72) VALUE '/& '. 05 JC13 PIC X(72) VALUE '* $$ EOJ '. PROCEDURE DIVISION. MAINLINE SECTION. ML-START. PERFORM EZACIC06-SETUP. ML-INITAPI. MOVE +0 TO EZA-MAXSOC. MOVE SPACES TO EZA-IDENT. MOVE SPACES TO EZA-SUBTASK. PERFORM EZA-INITAPI. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0001. ML-GETCLIENTID. PERFORM EZA-GETCLIENTID. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0002. MOVE EZA-CLIENT TO WS-OURCLIENT. ML-SOCKET. MOVE EZA-INET TO EZA-AF. PERFORM EZA-SOCKET. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0003. MOVE EZA-RETCODE TO EZA-S. MOVE EZA-RETCODE TO WS-SOCKET-ORIGINAL. ML-BIND. MOVE LOW-VALUES TO EZA-NAME. MOVE EZA-INET TO EZA-NAME-FAMILY. MOVE WS-IPPORT TO EZA-NAME-PORT. MOVE WS-IPADDRESS TO EZA-NAME-IPADDRESS. PERFORM EZA-BIND. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0004. ML-LISTEN. MOVE +10 TO EZA-BACKLOG. PERFORM EZA-LISTEN. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0005. ML-ACCEPT-LOOP. ADD +1 TO WS-COUNT. IF BUFFER-IN (1 : 4) IS EQUAL TO 'STOP' MOVE 'Y' TO WS-STOP. IF WS-STOP IS EQUAL TO 'Y' GO TO ML-CLOSE. ML-SELECT. COMPUTE EZA-MAXSOC-SELECT = EZA-S + 1. MOVE LOW-VALUES TO EZA-TIMEOUT. MOVE 120 TO EZA-TIMEOUT-SECONDS. MOVE ZEROES TO EZ6-FLAGS. COMPUTE EZ6-SUB1 = WS-SOCKET-ORIGINAL + 1. IF EZ6-SUB1 IS GREATER THAN EZ6-MAXSOC GO TO AR-0006. MOVE '1' TO EZ6-FLAG (EZ6-SUB1). PERFORM EZA-CHARACTERS-TO-BITS. MOVE LOW-VALUES TO RSNDMSK. MOVE EZ6-MASK TO RSNDMSK (1 : LENGTH OF EZ6-MASK). MOVE LOW-VALUES TO WSNDMSK. MOVE LOW-VALUES TO ESNDMSK. PERFORM EZA-SELECT. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0007. MOVE LOW-VALUES TO EZ6-MASK. MOVE LENGTH OF EZ6-MASK TO EZ6-SUB1. IF LENGTH OF RRETMSK IS LESS THAN EZ6-SUB1 MOVE LENGTH OF ERETMSK TO EZ6-SUB1. MOVE RRETMSK TO EZ6-MASK (1 : EZ6-SUB1). PERFORM EZA-BITS-TO-CHARACTERS. 020910 COMPUTE EZ6-SUB1 = WS-SOCKET-ORIGINAL + 1. 020910 IF EZ6-FLAG (EZ6-SUB1) IS NOT EQUAL TO '1' 020910 GO TO ML-SELECT. MOVE WS-SOCKET-ORIGINAL TO EZA-S. PERFORM EZA-ACCEPT. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0008. MOVE EZA-RETCODE TO EZA-S. MOVE EZA-RETCODE TO WS-SOCKET-ACCEPT. PERFORM EZA-PEEK. * PROGRAM TO RUN IS IN BUFFER-IN (1 : 8) IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0009. DISPLAY PROGRAM-NAME ' RECEIVED A REQUEST TO RUN PROGRAM ' BUFFER-IN (1 : 8) UPON CONSOLE. ML-GIVESOCKET. PERFORM EZA-GIVESOCKET. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0010. PERFORM SPAWN-CHILD. ML-SELECT3. COMPUTE EZA-MAXSOC-SELECT = EZA-S + 1. MOVE LOW-VALUES TO EZA-TIMEOUT. MOVE 30 TO EZA-TIMEOUT-SECONDS. MOVE LOW-VALUES TO RSNDMSK. MOVE LOW-VALUES TO WSNDMSK. MOVE ZEROES TO EZ6-FLAGS. COMPUTE EZ6-SUB1 = EZA-S + 1. MOVE '1' TO EZ6-FLAG (EZ6-SUB1). PERFORM EZA-CHARACTERS-TO-BITS. MOVE LOW-VALUES TO ESNDMSK. MOVE EZ6-MASK TO ESNDMSK (1 : LENGTH OF EZ6-MASK). PERFORM EZA-SELECT. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0011. MOVE LOW-VALUES TO EZ6-MASK. MOVE LENGTH OF EZ6-MASK TO EZ6-SUB1. IF LENGTH OF ERETMSK IS LESS THAN EZ6-SUB1 MOVE LENGTH OF ERETMSK TO EZ6-SUB1. MOVE ERETMSK TO EZ6-MASK (1 : EZ6-SUB1). PERFORM EZA-BITS-TO-CHARACTERS. ML-CLOSE-GIVEN. PERFORM EZA-CLOSE. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0012. ML-SELECT-LOOP-END. GO TO ML-ACCEPT-LOOP. ML-ACCEPT-LOOP-END. ML-CLOSE. MOVE WS-SOCKET-ORIGINAL TO EZA-S. PERFORM EZA-CLOSE. IF EZA-RETCODE IS LESS THAN +0 GO TO AR-0013. ML-TERMAPI. PERFORM EZA-TERMAPI. ML-EXIT. GOBACK. SPAWN-CHILD SECTION. SC-START. STRING '// EXEC ' DELIMITED BY SIZE BUFFER-IN (1 : 8) DELIMITED BY SPACE ',SIZE=' DELIMITED BY SIZE BUFFER-IN (1 : 8) DELIMITED BY SPACE 071909 ',PARM=' DELIMITED BY SIZE 071909 QUOTE DELIMITED BY SIZE 071909 '/TRAP(OFF)' DELIMITED BY SIZE 071909 QUOTE DELIMITED BY SIZE INTO JC8. MOVE WS-OURCLIENT TO JC9. MOVE EZA-S-X TO JC10. DISPLAY JC1 UPON SYSPCH. DISPLAY JC2 UPON SYSPCH. DISPLAY JC3 UPON SYSPCH. DISPLAY JC4 UPON SYSPCH. DISPLAY JC5 UPON SYSPCH. DISPLAY JC6 UPON SYSPCH. DISPLAY JC7 UPON SYSPCH. DISPLAY JC8 UPON SYSPCH. DISPLAY JC9 UPON SYSPCH. DISPLAY JC10 UPON SYSPCH. DISPLAY JC11 UPON SYSPCH. DISPLAY JC12 UPON SYSPCH. DISPLAY JC13 UPON SYSPCH. ACCEPT WS-STOP FROM SYSIN. SC-EXIT. EXIT. * COPY IN ALL THE EZA SECTIONS COPY BSTTEZAP. CONSOLE-TRACE SECTION. * COMMENT OUT THE DISPLAY IF IT IS NOT WANTED CT-START. DISPLAY PROGRAM-NAME ' ' EZA-FUNCTION UPON CONSOLE. CT-EXIT. EXIT. ABEND SECTION. AR-0001. MOVE 0001 TO ABEND-CODE. GO TO AR-ABEND. AR-0002. MOVE 0002 TO ABEND-CODE. GO TO AR-ABEND. AR-0003. MOVE 0003 TO ABEND-CODE. GO TO AR-ABEND. AR-0004. MOVE 0004 TO ABEND-CODE. GO TO AR-ABEND. AR-0005. MOVE 0005 TO ABEND-CODE. GO TO AR-ABEND. AR-0006. MOVE 0006 TO ABEND-CODE. GO TO AR-ABEND. AR-0007. MOVE 0007 TO ABEND-CODE. GO TO AR-ABEND. AR-0008. MOVE 0008 TO ABEND-CODE. GO TO AR-ABEND. AR-0009. MOVE 0009 TO ABEND-CODE. GO TO AR-ABEND. AR-0010. MOVE 0010 TO ABEND-CODE. GO TO AR-ABEND. AR-0011. MOVE 0011 TO ABEND-CODE. GO TO AR-ABEND. AR-0012. MOVE 0012 TO ABEND-CODE. GO TO AR-ABEND. AR-0013. MOVE 0013 TO ABEND-CODE. GO TO AR-ABEND. AR-ABEND. DISPLAY '*ABEND* ' PROGRAM-INFOMATION UPON CONSOLE. DISPLAY 'PROGRAM ABEND=' ABEND-CODE UPON CONSOLE. DISPLAY 'FUNCTION=' CURRENT-FUNCTION UPON CONSOLE. DISPLAY 'ERROR=' CURRENT-ERROR UPON CONSOLE. MOVE SPACES TO ABEND-SPACE. ADD +1 TO ABEND-NUMBER. AR-EXIT. EXIT.