**FREE
/TITLE GETJOBTR Get Active Job Type:  Interactive, Batch, whatever
// -------------------------------------------------------------------
// This program is passed job name, user and job number and if the
// job is active, it returns the job type, otherwise returns ' '.
// Initially written to be called from GETOBJUR.
//=== Parameters =================================================
// Input Parm:
//   Job name -  10 char job name + 10 char user + 6 char job number,
//               or * for job program is running in.
// Out Parm:
//   Type - 1 character as returned by the QUSLJOB API.
//     I=Interactive, B=Batch, blank is job not active.
//     A=Autostart, M=subsystem monitor, R=spooled reader,
//     S=system job, W=spooled writer, X=SCPF system job.
//Compile: CRTBNDRPG PGM(GETJOBTR) SRCFILE(...) DBGVIEW(*LIST)
// -------------------------------------------------------------------
// 12/00/97 LENNON Original Writing
// 07/--/2021 Lennon Converted to **FREE and Linear module.
//            It was origially a standalone program. Perhaps it should
//            be a service program and perhaps some of the diract API
//            call should be in a service program.
// -------------------------------------------------------------------
ctl-opt debug option(*nodebugio: *srcstmt)
    dftactgrp(*no) actgrp(*caller)
    main(Main);
/copy copy_mbrs,USPHDR
//=== CRTUSRSPC (QUSCTRUS) Parameters ================================
dcl-s CusName char(20) inz('GETJOBTR  QTEMP');
dcl-s CusAttr char(10) inz('GETJOBTR  ');
dcl-s CusIntSize bindec(9);
dcl-s CusIntVal char(1) inz(x'00');
dcl-s CusAut char(10) inz('*CHANGE');
dcl-s CusText char(50) inz('GETJOBTR  ');
dcl-s CusReplace char(10) inz('*NO');
dcl-s CusDomain char(10) inz('*DEFAULT');
//=== List Job (QUSLJOB) Parameters ==================================
dcl-s LJBFormat char(8) inz('JOBL0100');
dcl-s LJBQJobName char(26);
dcl-s LJBStatus char(10) inz('*ACTIVE');
//=== List Job Entry Layout ==========================================
dcl-ds LJLEntry based(ljptr);
    LJJobName char(10);
    LJJobUser char(10);
    LJJobNum char(6);
    LJJobIdent char(16);
    LJJobStus char(10);
    LJJobType char(1);
    LJJobSubT char(1);
    LJReserved char(2);
end-ds;
dcl-s LJPtr pointer inz(*null);
//=== Send Pgm Message (QMHSNDPM) Parameters =========================
dcl-s MSNMsgId char(7);
dcl-s MSNFile char(20) inz('QCPFMSG   *LIBL     ');
dcl-s MSNData char(1);
dcl-s MSNLength bindec(9);
dcl-s MSNType char(10) inz('*ESCAPE');
dcl-s MSNStackE char(10) inz('*CTLBDY');
dcl-s MSNStackC bindec(9) inz(1);
dcl-s MSNMsgKey char(4);
//=== API Error Code Structure =======================================
dcl-ds APIError len(272);
    APIEProv int(10) inz(0) pos(1);
    APIEAvail int(10) inz(0) pos(5);
    APIErrId char(7) pos(9);
    APIErrRsv char(1);
    APIEData char(256);
end-ds;
dcl-pr p_qusdltus extpgm('QUSDLTUS');
    *n char(20); // CusName
    *n char(272); // APIError
end-pr;
//------------------------------------------------------
dcl-pr p_qmhsndpm extpgm('QMHSNDPM');
    *n char(7); // MSNMsgId
    *n char(20); // MSNFile
    *n char(256); // APIEData
    *n bindec(9); // MSNLength
    *n char(10); // MSNType
    *n char(10); // MSNStackE
    *n bindec(9); // MSNStackC
    *n char(4); // MSNMsgKey
    *n char(272); // APIError
end-pr;
//------------------------------------------------------
dcl-pr p_quscrtus extpgm('QUSCRTUS');
    *n char(20); // CusName
    *n char(10); // CusAttr
    *n bindec(9); // CusIntSize
    *n char(1); // CusIntVal
    *n char(10); // CusAut
    *n char(50); // Custext
    *n char(10); // CusReplace
    *n char(272); // APIError
    *n char(10); // CusDomain
end-pr;
//------------------------------------------------------
dcl-pr p_qusptrus extpgm('QUSPTRUS');
    *n char(20); // CusName
    *n pointer; // UspPtr
end-pr;
//------------------------------------------------------
dcl-pr p_qusljob extpgm('QUSLJOB');
    *n char(20); // CusName
    *n char(8); // LJBFormat
    *n char(26); // LJBQJobName
    *n char(10); // LJBStatus
end-pr;
//=== Main ===========================================================
dcl-proc Main;
    // -----------------------------------
    dcl-pi *n extpgm('GETJOBTR');
        pQJob char(26);
        pType char(1);
    end-pi;
    //=== Delete the User Space ======================================
    APIEProv=%LEN(APIError);
    p_QUSDLTUS(
            CusName:
            APIError);
    // If user space doesn't exist, accept message CPF2105, else
    // something nasty wrong - pass errors back
    if APIEAvail <> 0 and APIErrId <> 'CPF2105';
        APIEProv=0;
        MSNMsgId=APIErrId;
        MSNLength=APIEAvail-16;
        p_QMHSNDPM(
            MSNMsgId:
            MSNFile:
            APIEData:
            MSNLength:
            MSNType:
            MSNStackE:
            MSNStackC:
            MSNMsgKey:
            APIError);
    endif;
    // === Create User Space =========================================
    // We only expect one entry back since job is fully qualified, but
    // allocate enough for 10 entries in case entry size expands.
    CusIntSize=%size(UspHdr) + (%size(LJLentry)*10);
    LJBQJobname=pQJob;
    // === Create the User Space =====================================
    APIEProv = 0;
    p_QUSCRTUS(
            CusName:
            CusAttr:
            CusIntSize:
            CusIntVal:
            CusAut:
            Custext:
            CusReplace:
            APIError:
            CusDomain);
    // === Get Pointer to User Space =================================
    p_QUSPTRUS(CusName: UspPtr);
    // === Get Job Info ==============================================
    p_QUSLJOB(
            CusName:
            LJBFormat:
            LJBQJobName:
            LJBStatus);
    if UspLst#Ent>0;
        LJPtr=UspPtr+UspLstOfs;
        // All that code just to execute this one instruction...
        pType=LJJobType;
    else;
        pType=' ';
    endif;
    // === Return to Caller ==========================================
    // Leave LR Off - this isn't very big.
    return;
    //
end-proc;
