Using LINK to pass data
These examples demonstrate how a LINK command causes data to be passed to the program being linked to. An XCTL command is coded in a similar way.
About this task
Figure 1 to Figure 4 show how a LINK command is used in COBOL, C, C++, PL/I, and assembler language.
These examples show data being passed in a COMMAREA. For an example of a LINK command that uses a channel to pass data, see Transferring data between programs using channels.
Ensure that the LENGTH value you specify in the LINK command matches the length of the data being passed in the COMMAREA. Do not specify 0 (zero) for LENGTH, because the resulting behavior is unpredictable and the EXEC CICS LINK command might fail.
When you use a COMMAREA to pass data, the program that is linked to must verify that the EIBCALEN field in the EIB of the task matches what the program expects. Discrepancies might result in storage violations or system failures. For more information, see COMMAREA.
Invoking program
IDENTIFICATION DIVISION.
PROGRAM ID. 'PROG1'.
.
WORKING-STORAGE SECTION.
01 COM-REGION.
02 FIELD PICTURE X(3).
.
PROCEDURE DIVISION.
MOVE 'ABC' TO FIELD.
EXEC CICS LINK PROGRAM('PROG2')
COMMAREA(COM-REGION)
LENGTH(3) END-EXEC.
.
Invoked program
IDENTIFICATION DIVISION.
PROGRAM-ID. 'PROG2'.
.
LINKAGE SECTION.
01 DFHCOMMAREA.
02 FIELD PICTURE X(3).
.
PROCEDURE DIVISION.
IF EIBCALEN GREATER ZERO
THEN
IF FIELD EQUALS 'ABC' …
In the following example, the COMMAREA contains a character string. For an example of a COMMAREA that contains a structure, see Using RETURN to pass data.
Invoking program
main()
{
unsigned char field[3];
memcpy(field, "ABC", 3);
EXEC CICS LINK PROGRAM("PROG2")
COMMAREA(field)
LENGTH(sizeof(field));
}
Invoked program
main()
{
unsigned char *commarea;
EXEC CICS ADDRESS COMMAREA(commarea) EIB(dfheiptr);
if (dfheiptr->eibcalen > 0)
{
if (memcmp(commarea, "ABC", 3) == 0)
{
.
Invoking program
PROG1: PROC OPTIONS(MAIN);
DCL 1 COM_REGION AUTOMATIC,
2 FIELD CHAR(3),
.
FIELD='ABC';
EXEC CICS LINK PROGRAM('PROG2')
COMMAREA(COM_REGION) LENGTH(3);
END;
Invoked program
PROG2:
PROC(COMM_REG_PTR) OPTIONS(MAIN);
DCL COMM_REG_PTR PTR;
DCL 1 COM_REGION BASED(COMM_REG_PTR),
2 FIELD CHAR(3),
.
IF EIBCALEN>0 THEN DO;
IF FIELD='ABC' THEN ...
.
END;
END;
Invoking program
DFHEISTG DSECT
COMREG DS 0CL20
FIELD DS CL3
.
PROG1 CSECT
.
MVC FIELD,=C'XYZ'
EXEC CICS LINK
PROGRAM('PROG2')
COMMAREA(COMREG) LENGTH(3)
.
END
Invoked program
COMREG DSECT
FIELD DS CL3
.
PROG2 CSECT
.
L COMPTR,DFHEICAP
USING COMREG,COMPTR
CLC FIELD,=C'ABC'
END