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.
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
Was this topic helpful?
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