PROC 0 - LISTUDDN(NULLFILE) /* LISTUSER DDname */ - DATADDN(NULLFILE) /* DATA DDname */ - DATAMBR(ALLUSERS) /* DATA default member name */ /* 11/02/2005 JL.NELSON Split out ACPs from SY$ACTON /* 11/02/2005 JL.NELSON RACF only, create list of users in DATA file /* 11/04/2005 JL.NELSON Test for End-Of-File condition code. /* 11/15/2005 JL.NELSON Modified next User condition to force write. /* 11/18/2005 JL.NELSON Added tests for File condition codes. /* 12/09/2005 JL.NELSON Added check for GROUP attributes. /* 12/09/2005 JL.NELSON Made PUT_DATA a subroutine. /* 01/17/2006 JL.NELSON Identify GROUP attributes with G*. /* 01/26/2006 JL.NELSON Made intermediate file a seq. was PDS. /* 01/26/2006 JL.NELSON Changed from TSO to ISPF commands. /* 03/07/2006 JL.NELSON Made changes to avoid abend 920/932. /* 02/10/2008 CL FENTON Removed unused variables and obtain trace variables. SET PGMNAME = &STR(CARC0501 03/31/08) NGLOBAL RACFUSR RACFNAM GRP1 GRP2 GRP3 GRP4 GRP5 GRP6 NR NGLOBAL DATAID DATAMEM RETURN_CODE ISPEXEC CONTROL ERRORS RETURN /* ERROR ROUTINE */ ERROR DO SET RETURN_CODE = &LASTCC /* SAVE LAST ERROR CODE */ IF &LASTCC GE 16 THEN + WRITE &PGMNAME LASTCC = &LASTCC &ZERRLM RETURN END SET SYSPROMPT = OFF /* CONTROL NOPROMPT */ SET SYSFLUSH = OFF /* CONTROL NOFLUSH */ SET SYSASIS = ON /* CONTROL ASIS - caps off */ SET ZISPFRC = 0 /* Called from CACC0501 /* ISPEXEC VPUT (ZISPFRC) SHARED SET RETURN_CODE = 0 ISPEXEC VGET ( + SYMLIST + CONSLIST + COMLIST + TERMMSGS + ACPNAME + ACPVERS + ) ASIS IF &STR(&ACPNAME) NE &STR(RACF) THEN DO WRITE &PGMNAME RACF Job running on the wrong system WRITE &PGMNAME &ACPNAME &ACPVERS SET RETURN_CODE = 20 GOTO ERR_EXIT END SET SYSSYMLIST = &SYMLIST /* CONTROL SYMLIST/NOSYMLIST */ SET SYSCONLIST = &CONSLIST /* CONTROL CONLIST/NOCONLIST */ SET SYSLIST = &COMLIST /* CONTROL LIST/NOLIST */ SET SYSMSG = &TERMMSGS /* CONTROL MSG/NOMSG */ /* *************************************** */ /* INITIALIZE LIBRARY MANAGEMENT */ /* *************************************** */ SET RETURN_CODE = 0 ISPEXEC LMINIT DATAID(LISTUID) DDNAME(&LISTUDDN) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMINIT_LISTUID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 GOTO ERR_EXIT END ISPEXEC LMOPEN DATAID(&LISTUID) OPTION(INPUT) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMOPEN_LISTUID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 GOTO ERR_EXIT END ISPEXEC LMINIT DATAID(DATAID) DDNAME(&DATADDN) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMINIT_DATAID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 GOTO ERR_EXIT END ISPEXEC LMOPEN DATAID(&DATAID) OPTION(OUTPUT) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMOPEN_DATAID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 GOTO ERR_EXIT END SET DATAMEM = &DATAMBR /* Can not be in PROC & GLOBAL */ SET CNT = 0 SET NR = 0 SET NRM = 6 SET BLK10 = &STR( ) DO X = 1 TO &NRM SET GRP&X = &STR( ) END READRF: + SET RETURN_CODE = 0 ISPEXEC LMGET DATAID(&LISTUID) MODE(INVAR) DATALOC(LISTU) + DATALEN(LRECL) MAXLEN(255) IF &RETURN_CODE EQ 8 THEN GOTO EOF_LISTUSER IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMGET_LISTUID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 GOTO ERR_EXIT END IF &LENGTH(&STR(&LISTU)) LT 23 THEN GOTO READRF IF &SYSINDEX(&STR(USER=),&STR(&LISTU)) GT 0 THEN DO IF &NR GT 0 THEN SYSCALL PUT_DATA SET RACFUSR = SET RACFNAM = SET CNT = &CNT + 1 SET XU = &SYSINDEX(&STR(USER=),&STR(&LISTU)) SET XN = &SYSINDEX(&STR(NAME=),&STR(&LISTU)) SET XO = &SYSINDEX(&STR(OWNER=),&STR(&LISTU)) IF &XU GT 0 AND + &XN GT &XU AND + &XO GT &XN THEN DO SET RACFUSR = &SUBSTR(&XU+5:&XN-2,&LISTU) SET RACFNAM = &SUBSTR(&XN+5:&XO-2,&LISTU) SET RACFUSR = &SUBSTR(1:8,&RACFUSR&BLK10) SET RACFNAM = &SUBSTR(1:17,&RACFNAM&BLK10&BLK10) END GOTO READRF END IF &SUBSTR(2:12,&STR(&LISTU)) EQ &STR(ATTRIBUTES=) THEN DO SET XF = 13 SET XC = &SYSINDEX(&STR( ),&STR(&LISTU),&XF) IF &XC EQ 0 THEN DO SET NR = &NR + 1 SET GRP&NR = &SUBSTR(13:20,&STR(&LISTU)) IF &NR EQ &NRM THEN SYSCALL PUT_DATA GOTO READRF END ELSE DO NEXT_ATTR: + SET ATTR = &SUBSTR(&XF:&XC-1,&STR(&LISTU)) IF &STR(&ATTR) EQ &STR(NONE) THEN GOTO READRF SET NR = &NR + 1 SET GRP&NR = &SUBSTR(1:8,&ATTR&BLK10) IF &NR EQ &NRM THEN SYSCALL PUT_DATA SET XF = &XC+1 SET XC = &SYSINDEX(&STR( ),&STR(&LISTU),&XF) IF &XC-1 GT &XF THEN + IF &SUBSTR(&XF:&XC-1,&STR(&LISTU)) NE &STR( ) THEN GOTO NEXT_ATTR GOTO READRF END END IF &SUBSTR(13:23,&STR(&LISTU)) EQ &STR(ATTRIBUTES=) THEN DO SET XF = 24 SET XC = &SYSINDEX(&STR( ),&STR(&LISTU),&XF) IF &XC EQ 0 THEN DO SET NR = &NR + 1 SET GRP&NR = &SUBSTR(24:31,&STR(&LISTU.&BLK10)) IF &NR EQ &NRM THEN SYSCALL PUT_DATA GOTO READRF END ELSE DO GROUP_ATTR: + SET ATTR = &SUBSTR(&XF:&XC-1,&STR(&LISTU)) IF &STR(&ATTR) EQ &STR(NONE) THEN GOTO READRF SET NR = &NR + 1 SET GRP&NR = &SUBSTR(1:8,G&ATTR&BLK10) IF &NR EQ &NRM THEN SYSCALL PUT_DATA SET XF = &XC+1 SET XC = &SYSINDEX(&STR( ),&STR(&LISTU),&XF) IF &XC-1 GT &XF THEN + IF &SUBSTR(&XF:&XC-1,&STR(&LISTU)) NE &STR( ) THEN GOTO GROUP_ATTR GOTO READRF END END IF &SUBSTR(3:8,&STR(&LISTU)) EQ &STR(GROUP=) THEN DO SET NR = &NR + 1 SET GRP&NR = &SUBSTR(9:16,&STR(&LISTU)) IF &NR EQ &NRM THEN SYSCALL PUT_DATA END GOTO READRF EOF_LISTUSER: + SET RETURN_CODE = 0 IF &NR GT 0 THEN SYSCALL PUT_DATA SYSCALL ADD_MEMBER SET RETURN_CODE = 0 ISPEXEC LMCLOSE DATAID(&LISTUID) SET LMCLOSE_LISTUID_RC = &RETURN_CODE SET RETURN_CODE = 0 ISPEXEC LMFREE DATAID(&LISTUID) SET LMFREE_LISTCUD_RC = &RETURN_CODE ISPEXEC LMCLOSE DATAID(&DATAID) SET LMCLOSE_DATAID_RC = &RETURN_CODE SET RETURN_CODE = 0 ISPEXEC LMFREE DATAID(&DATAID) SET LMFREE_DATAID_RC = &RETURN_CODE /* *************************************** */ /* END of program */ /* *************************************** */ END_EXIT: + SET RETURN_CODE = 0 IF &TERMMSGS = ON THEN DO WRITE =============================================================== WRITE &PGMNAME Output member &DATAMBR WRITE &PGMNAME Users = &CNT WRITE &PGMNAME RACF Processing completed. END /* *************************************** */ /* ERROR EXIT */ /* *************************************** */ ERR_EXIT: + IF &MAXCC GE 16 OR + &RETURN_CODE GT 0 THEN DO ISPEXEC VGET (ZISPFRC) SHARED IF &MAXCC GT &ZISPFRC THEN + SET ZISPFRC = &MAXCC ELSE + SET ZISPFRC = &RETURN_CODE ISPEXEC VPUT (ZISPFRC) SHARED WRITE &PGMNAME ZISPFRC = &ZISPFRC END EXIT CODE(0) /******************************************* /* Write record and clear variables * /******************************************* PUT_DATA: PROC 0 SET DATA = &STR(&RACFUSR &RACFNAM &GRP1 &GRP2 + &GRP3 &GRP4 &GRP5 &GRP6) SET RETURN_CODE = 0 ISPEXEC LMPUT DATAID(&DATAID) MODE(INVAR) DATALOC(DATA) + DATALEN(&LENGTH(&STR(&DATA))) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMPUT_DATAID_RC = &RETURN_CODE &ZERRSM SET RETURN_CODE = &RETURN_CODE + 16 END DO X = 1 TO &NR SET GRP&X = &STR( ) END SET NR = 0 END /* *************************************** */ /* SYSCALL SUBROUTINES */ /* *************************************** */ ADD_MEMBER: PROC 0 SET RETURN_CODE = 0 ISPEXEC LMMADD DATAID(&DATAID) MEMBER(&DATAMEM) IF &RETURN_CODE EQ 4 THEN DO /* MEMBER ALREADY EXISTS SET RETURN_CODE = 0 ISPEXEC LMMREP DATAID(&DATAID) MEMBER(&DATAMEM) IF &RETURN_CODE NE 0 THEN DO WRITE &PGMNAME LMMREP_DATA_RCODE = &RETURN_CODE &DATAMEM &ZERRSM END END ELSE DO IF &RETURN_CODE NE 0 THEN + WRITE &PGMNAME LMMADD_DATA_RCODE = &RETURN_CODE &DATAMEM &ZERRSM END END