IBM Support

General Example of the Use of APIs

Troubleshooting


Problem

This document provides an example of the use of APIs (Application Interface Programs) by the use of CL programs.

Resolving The Problem

This document provides an example of the use of APIs (Application Interface Programs) by the use of CL programs. In particular, this provides an example of the use of APIs that create and use user spaces. In this particular program, the QUSLJOB API is used to obtain information on jobs for a specified user. Information retrieved from the user space passed back to the CL program by the QUSLJOB API program is examined and then used to make a series of invocations to the WRKJOB command. More detailed information on the use of APIs is provided by the System API Reference manuals.

Note: This program is not supported by IBM.
 


 /***START OF SPECIFICATIONS******************************************/
 /*     (note - the function of the program is no longer relevant    */
 /*             but this works well as an example of API usage)      */
 /* NAME: XCLEANUPX                                                  */
 /*                                                                  */
 /* PURPOSE:  Automates the cleanup of temporary job structures for  */
 /*           A SPECIFIED USER.  This program creates a              */
 /*           temporary library for the spaces and objects that it   */
 /*           creates and uses.  It cleans up all that it creates    */
 /*           prior to ending.                                       */
 /* EXPECTED RESULTS:  Work control block table entries for THE      */
 /*           USER jobs have been marked as available if all         */
 /*           their spool files are in FIN status.                   */
 /* INTENDED MANNER OF USE:  After you have this CLP program in a    */
 /*          source file, create the program using the CRTCLPGM      */
 /*          command.  To execute the program, enter the following   */
 /*          command:  SBMJOB CMD(CALL PGM(libname/XCLEANUPX) +      */
 /*                       PARM('USER NAME ')                         */
 /*          NOTE THAT THE "USER NAME ' MUST BE 10 CHARACTERS IN     */
 /*          LENGTH (SPACE FILLED IF NEEDED) AND BE IN UPPER CASE.   */
 /*          If the job was set up to have cl command logging then   */
 /*          the output joblog will document all the USER            */
 /*          jobs that were dealt with. There should be no other     */
 /*          output.                                                 */
 /*          Note that a couple of comment lines were added to show  */
 /*          how many blanks have to be in certain quoted strings -  */
 /*          Each such blank is indicated by a 'b'                   */

 /***END OF SPECIFICATIONS********************************************/

             PGM       PARM(&USRNAME)


             DCL        VAR(&USRNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ERRCODLEN) TYPE(*CHAR) LEN(4)
                        /* Length of the error code parameter        */
             DCL        VAR(&FORMAT) TYPE(*CHAR) LEN(8) +
                          VALUE('JOBL0100')
                        /* Format name for QUSLJOB API               */
             DCL        VAR(&FORMAT200) TYPE(*CHAR) LEN(8) +
                          VALUE(JOBL0200)
             DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(26) +
                          VALUE('*ALL                *ALL  ')
                   /*     VALUE('*ALLbbbbbbbbbbbbbbbb*ALLbb')    */
             DCL        VAR(&STATUS) TYPE(*CHAR) LEN(10) VALUE(*OUTQ)
             DCL        VAR(&ERRCODE) TYPE(*CHAR) LEN(8) +
                        VALUE(X'0000000000000000')
             DCL        VAR(&ERRCODE32) TYPE(*CHAR) LEN(32) +
                          VALUE(X'00000000000000000000000000000000+
                                  00000000000000000000000000000000')
             DCL        VAR(&FLD) TYPE(*CHAR) LEN(4)
             DCL        VAR(&COUNT) TYPE(*DEC) LEN(5 0)
                        /* Looping counter                           */
 
             DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +
                          VALUE('XCLEANUPSPXCLEANUPLI')

                        /* User space name to get information         */

             DCL        VAR(&NUMENTB) TYPE(*CHAR) LEN(4) /* Number +
                          of entries from list job schedule entries +
                          in binary form */

             DCL        VAR(&NUMENT) TYPE(*DEC) LEN(8 0) /* Number +
                          of entries from list job schedule entries +
                          in decimal form */
             DCL        VAR(&GENHDR) TYPE(*CHAR) LEN(140) /* Generic +
                          header information from the user space */

             DCL        VAR(&OFFSETB) TYPE(*CHAR) LEN(4) /* Offset +
                          to the list portion of the user space in +
                          binary form */

             DCL        VAR(&STRPOSB) TYPE(*CHAR) LEN(4) /* Starting +
                          position in the user space  in binary form */

             DCL        VAR(&STRPOS)  TYPE(*DEC) LEN(5 0) /* Starting +
                          position in the user space in decimal form */

             DCL        VAR(&ELENB) TYPE(*CHAR) LEN(4) /* List job +
                          entry length in binary 4 form */

             DCL        VAR(&ELEN)  TYPE(*DEC) LEN(5 0) /* List job +
                          entry length in decimal form  */

             DCL        VAR(&LENTRY) TYPE(*CHAR) LEN(2000) /* +
                          Retrieve area for list job entry          */

             DCL        VAR(&JOBNUMBER) TYPE(*CHAR) LEN(6) /* Job +
                          number */

             DCL        VAR(&QJOBNAME) TYPE(*CHAR) LEN(10) /* +
                          Qualified Job Name */

             CHGVAR     VAR(%BIN(&ERRCODLEN)) VALUE(32)
             CHGVAR     VAR(%SST(&ERRCODE32 1 4)) VALUE(&ERRCODLEN)


 /********************************************************************/
 /* Create temporary library                                         */
 /********************************************************************/

              CRTLIB   XCLEANUPLI

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY LIBRARY ALREADY EXISTING            */
 /********************************************************************/

             MONMSG     MSGID(CPF2111) +
                        EXEC(GOTO CMDLBL(PROCED1))
 /********************************************************************/
 /* Create the user space                                            */
 /********************************************************************/

 PROCED1:
     CALL PGM(QUSCRTUS) PARM('XCLEANUPSPXCLEANUPLI' ' ' +
                        X'00000100' ' ' '*ALL      ' ' ')
  /* CALL PGM(QUSCRTUS) PARM('XCLEANUPSPXCLEANUPLI' 'b' +
  /*                    X'00000100'b'b'b'*ALLbbbbbb'b'b')
 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY SPACE ALREADY EXISTING              */
 /********************************************************************/

             MONMSG     MSGID(CPF9870) +
                          EXEC(GOTO CMDLBL(PROCED2))
 /********************************************************************/
 /* Create a temporary ouput queue                                   */
 /********************************************************************/
 PROCED2:    CRTOUTQ   XCLEANUPLI/XCLEANUPOQ
 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY OUTQ ALREADY EXISTING               */
 /********************************************************************/
             MONMSG     MSGID(CPF3353) +
                          EXEC(GOTO CMDLBL(PROCED3))
 /********************************************************************/
 /* Change job to use this temporary output queue                    */
 /********************************************************************/
 PROCED3:    CHGJOB    OUTQ(XCLEANUPLI/XCLEANUPOQ)
 /********************************************************************/
 /*  PUT INPUT USERNAME INTO &JOBNAME VAR                            */
 /********************************************************************/

             CHGVAR     VAR(%SST(&JOBNAME 11 10)) VALUE(&USRNAME)

 /********************************************************************/
 /*  Call the API to get the job information                         */
 /********************************************************************/

             CALL       PGM(QUSLJOB) PARM( +
                          &USRSPC &FORMAT &JOBNAME &STATUS +
                          &ERRCODE )
             MONMSG     MSGID(CPF0000) +
                          EXEC(GOTO CMDLBL(ABORT))
 /********************************************************************/
 /*  Read the generic header from the user space                     */
 /********************************************************************/

                CALL       PGM(QUSRTVUS) PARM(&USRSPC X'00000001' +
                             X'0000008C' &GENHDR)
                CHGVAR     VAR(&NUMENTB) VALUE(%SST(&GENHDR 133 4))
                CHGVAR     VAR(&NUMENT) VALUE(%BIN(&NUMENTB))
                CHGVAR     VAR(&ELENB) VALUE(%SST(&GENHDR 137 4))
                CHGVAR     VAR(&ELEN) VALUE(%BIN(&ELENB))
                CHGVAR     VAR(&OFFSETB) VALUE(%SST(&GENHDR 125 4))
                CHGVAR     VAR(%BIN(&STRPOSB)) VALUE(%BIN(&OFFSETB) + 1)
                CHGVAR     VAR(&STRPOS) VALUE(%BIN(&STRPOSB))
                CHGVAR     VAR(&COUNT) VALUE(&NUMENT)
 
/********************************************************************/
 /*  Check if no jobs found, if not then exit early                  */
 /********************************************************************/

             IF (&COUNT *NE 0) THEN( GOTO GETENTRY)
             SNDMSG     MSG('NO JOBS FOUND FOR SPECIFIED USER') +
                          TOUSR(*SYSOPR)

             GOTO CLEANUP

 /********************************************************************/
 /*  Read a list entry out of the user space                         */
 /********************************************************************/

 GETENTRY:
                CALL       PGM(QUSRTVUS) PARM(&USRSPC &STRPOSB +
                             &ELENB &LENTRY)

 /********************************************************************/
 /* Set up the parameters for the WRKJOB call                        */
 /********************************************************************/

             CHGVAR     VAR(&JOBNUMBER) VALUE(%SST(&LENTRY 21 6))

 /********************************************************************/
 /* SET JOBNAME FOR A SPECIFIC JOB FOUND                             */
 /********************************************************************/

             CHGVAR     VAR(&QJOBNAME) VALUE(%SST(&LENTRY 1 10))

 /********************************************************************/
 /*  Use WRKJOB to effect the cleanup if possible                    */
 /********************************************************************/

             WRKJOB     JOB(&JOBNUMBER/&USRNAME/&QJOBNAME) +
                          OUTPUT(*PRINT) OPTION(*SPLF)

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY NO JOB LOG OR JOB NOT FOUND         */
 /********************************************************************/

             MONMSG     MSGID(CPF2443 CPF1070) +
                          EXEC(GOTO CMDLBL(PROCED4))

 /********************************************************************/
 /*  Go get next entry if any more exist                             */
 /********************************************************************/

 PROCED4:       CHGVAR VAR(&STRPOS) VALUE(&STRPOS + &ELEN)
                CHGVAR VAR(%BIN(&STRPOSB)) VALUE(&STRPOS)

                       /* Save the starting position for next entry*/

                CHGVAR     VAR(&COUNT) VALUE(&COUNT - 1)

                IF (&COUNT *NE 0) THEN( GOTO GETENTRY)

 /********************************************************************/
 /*  Clear the output queue                                          */
 /********************************************************************/

 CLEANUP:

               CLROUTQ XCLEANUPLI/XCLEANUPOQ

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY OUTQ NOT EXISTING                   */
 /********************************************************************/

             MONMSG     MSGID(CPF3357) +
                          EXEC(GOTO CMDLBL(PROCED5))

 /********************************************************************/
 /*  Delete the output queue                                         */
 /********************************************************************/

 PROCED5:       DLTOUTQ   XCLEANUPLI/XCLEANUPOQ

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY OUTQ NOT EXISTING                   */
 /********************************************************************/

             MONMSG     MSGID(CPF2105) +
                        EXEC(GOTO CMDLBL(PROCED6))

 /********************************************************************/
 /*  Delete the user space                                           */
 /********************************************************************/

 PROCED6:       DLTUSRSPC USRSPC(XCLEANUPLI/XCLEANUPSP)

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY USER SPACE NOT EXISTING             */
 /********************************************************************/

             MONMSG     MSGID(CPF2110) +
                        EXEC(GOTO CMDLBL(PROCED7))

 

 /********************************************************************/
 /*  Delete the temporary lib                                        */
 /********************************************************************/

 PROCED7:       DLTLIB   XCLEANUPLI

 /********************************************************************/
 /*  MONITOR FOR ERROR CAUSED BY LIB NOT EXISTING                    */
 /********************************************************************/

             MONMSG     MSGID(CPF2110) +
                        EXEC(GOTO CMDLBL(EXITPGM))

                GOTO CMDLBL(EXITPGM)


 ABORT:      SNDMSG     MSG('CLEANUP DID NOT COMPLETE SUCCESSFULLY') +
                          TOUSR(*SYSOPR)

             GOTO CMDLBL(CLEANUP)
 EXITPGM:
             ENDPGM

 


[{"Type":"MASTER","Line of Business":{"code":"LOB68","label":"Power HW"},"Business Unit":{"code":"BU070","label":"IBM Infrastructure"},"Product":{"code":"SWG60","label":"IBM i"},"ARM Category":[{"code":"a8m3p000000hB4rAAE","label":"API"}],"ARM Case Number":"","Platform":[{"code":"PF012","label":"IBM i"}],"Version":"All Versions"}]

Historical Number

11752056

Document Information

More support for:
IBM i

Component:
API

Software version:
All Versions

Operating system(s):
IBM i

Document number:
642681

Modified date:
07 October 2024

UID

nas8N1018370

Manage My Notification Subscriptions