You must be logged in to use the copy button.
**free
ctl-opt
copyright('Copyright JAS, Inc. 2024')
nomain debug option(*srcstmt : *nodebugio) ccsid(*char:*jobrun)
decedit(*jobrun) alwnull(*usrctl)
DatFmt(*ISO) TimFmt(*ISO);
//*****************************************************************************
// PURPOSE: This application will get the name of the caller application
// COMPILE Module: CRTRPGMOD MODULE(*CURLIB/JSCALLSTK) SRCFILE(*CURLIB/QRPGLESRC)
// SRCMBR(JSCALLSTK) DBGVIEW(*SOURCE) REPLACE(*YES)
// COMPILE SrvPgm: CRTSRVPGM SRVPGM(*CURLIB/JSCALLSTK) EXPORT(*ALL) ACTGRP(*CALLER)
// ADDBNDDIRE BNDDIR(JSUPE1/JASTOOL) OBJ((JSCALLSTK))
// **********************************************************************************
/define Get_Caller_pr
/copy qProtosrc,JSCALLSTK
dcl-proc Get_Caller export;
/define Get_Caller_pi
/copy qProtosrc,JSCALLSTK
//*****************************************************************************
/copy QSYSINC/QRPGLESRC,QWVRCSTK
/copy QSYSINC/QRPGLESRC,QWCATTR
dcl-pr Rtv_CallStack extpgm('QWVRCSTK');
CStkRcvr likeds(QWVK0100) options(*varsize);
CStkRLen int(10:0) const;
CStkRFmt char(8) const;
CStkJInfo likeds(QWCF0100) options(*varsize);
CStkJFmt char(8) const;
CStkErrC likeds(ApiErrC) options(*varsize);
end-pr;
dcl-ds ApiErrC Qualified Inz;
BytProv Int(10:0) Inz(%size(ApiErrC));
BytAvail Int(10:0);
MsgId Char(7);
Reserved Char(1);
MsgData Char(3000);
end-ds;
// data structure to return a call stack entry
dcl-ds IBMAPI_CStkE qualified;
QWVEL int(10:0); // Entry Length
QWVSD int(10:0); // Stmt Displacement
QWVSRTN int(10:0); // Stmt Returned
QWVPD int(10:0); // Proc Displacement
QWVPL int(10:0); // Proc Length
QWVRL01 int(10:0); // Request Level
QWVPGMN char(10); // Program Name
QWVPGML char(10); // Program Library
QWVCTION int(10:0); // Instruction
QWVMN char(10); // Module Name
QWVMLIB char(10); // Module Library
QWVCB char(1); // Control Bdy
QWVERVED01 char(3); // Reserved
QWVAGNBR uns(10:0); // Act Group Number
QWVAGN char(10); // Act Group Name
QWVRSV201 char(2); // Reserved 2
QWVPASPN char(10); // Program ASP Name
QWVLASPN char(10); // Pgm Library ASP Name
QWVPASPN00 int(10:0); // Program ASP Number
QWVLASPN00 int(10:0); // Pgm Library ASP No.
QWVAGNL uns(20:0); // Act Group No. (Long)
QWVSI char(10); // Statement Ident.
QWVPN char(200); // Procedure Name
end-ds;
dcl-s w_Count int(10:0) inz(*zero);
dcl-s w_Program char(10) inz;
dcl-ds CallStack len(65535) qualified;
Hdr likeds(QWVK0100);
end-ds;
dcl-ds CurrEntry likeds(IBMAPI_CStkE) Based(CurrPtr);
dcl-s w_PgmPosition int(10:0) inz;
dcl-s w_PgmLevel char(50) inz;
//** Main *********************************************************************
if %parms >= %parmnum(p_PgmPosition) and not %omitted(p_PgmPosition)
and p_PgmPosition > 0;
w_PgmPosition = p_PgmPosition;
else;
// Position 3 is the default location of the calling program
// but if the calling program calls this service program then the location
// will be in 8th position depending on how deep this application is called
// in the procedure
w_PgmPosition = 3;
endIf;
clear QWCF0100; // initialize job info structure
QWCJN02 = '*'; // for current job
QWCERVED06 = *loval; // no internal job identifier
QWCTI00 = 1; // use currently running thread
QWCTI01 = *loval; // no thread identifier
callp Rtv_CallStack( CallStack: %len(CallStack) : 'CSTK0100'
: QWCF0100: 'JIDF0100': ApiErrC );
if ApiErrC.BytAvail > *zero; // if API issued an error message
return w_Program; // exit
endif;
CurrPtr = %addr(CallStack) + CallStack.Hdr.QWVEO; // point to first entry
w_Count = 1; // find specified program name
dou w_Count = w_PgmPosition; // Calling pgm is on position 3rd
if %parms >= %parmnum(p_Debug);
w_PgmLevel = %char(w_Count) + '=' + %trim(CurrEntry.QWVPGMN);
dsply w_PgmLevel;
endIf;
CurrPtr += CurrEntry.QWVEL; // point to next entry
w_Count += 1;
enddo;
w_Program = CurrEntry.QWVPGMN;
return w_Program; // return the call stack entry
end-proc;