PROC 0                                                                -
  LISTUDDN(NULLFILE)         /* LISTUSER DDname            */         -
  DATADDN(NULLFILE)          /* DATA DDname                */         -
  DATAMBR(ALLUSERS)          /* DATA default member name   */
 
/* 11/15/2005 JL.NELSON Copied from CARC0501 for Top Secret.
/* 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/15/2005 JL.NELSON Copied/modified for Top Secret extracts.
/* 11/18/2005 JL.NELSON Added tests for File condition codes.
/* 01/31/2006 JL.NELSON Made intermediate file a seq. was PDS.
/* 01/31/2006 JL.NELSON Changed from TSO to ISPF commands.
/* 02/15/2006 JL.NELSON Drop FACILITYs from DEPT/DIV/ZONE records.
/* 03/15/2006 JL.NELSON Made changes to avoid SUBSTR abend 920/932.
/* 03/21/2006 JL.NELSON Use NRSTR avoid abend 900 if ampersand in data.
/* 05/09/2006 JL.NELSON Added WRITE &LASTCC for debugging.
/* 02/10/2008 CL FENTON Removed unused variables and obtain trace variables.
 
SET PGMNAME = &STR(CATC0501 03/31/08)
 
NGLOBAL USRID USRNAME GRP1 GRP2 GRP3 GRP4 GRP5 GRP6 NR
NGLOBAL PGMNAME RETURN_CODE DATAID DATAMEM
 
SET SYSPROMPT = OFF                /* CONTROL NOPROMPT          */
SET SYSFLUSH  = OFF                /* CONTROL NOFLUSH           */
SET SYSASIS   = ON                 /* CONTROL ASIS - caps off   */
 
/* 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 ZISPFRC = 0
 
/* Called from CACC0501
/* ISPEXEC VPUT (ZISPFRC) SHARED
 
SET RETURN_CODE = 0
 
ISPEXEC VGET ( +
  SYMLIST      +
  CONSLIST     +
  COMLIST      +
  TERMMSGS     +
  ACPNAME      +
  ACPVERS      +
  ) ASIS
 
IF &SUBSTR(1:3,&NRSTR(&ACPNAME   )) NE TSS THEN DO
  WRITE &PGMNAME Top Secret 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 ICNT = 0
SET OCNT = 0
SET NR   = 0
SET NRM  = 6
SET BLK10 = &STR(          )
SET USRID   = &STR( )
SET USRNAME = &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 &NRSTR(&LISTU) EQ &STR( ) THEN GOTO READRF
 
SET XL = &LENGTH(&NRSTR(&LISTU))
IF &XL LT 21 THEN GOTO READRF
 
IF &SYSINDEX(&STR(ACCESSORID =),&NRSTR(&LISTU)) GT 0 THEN DO
  SYSCALL PUT_DATA
  SET ICNT = &ICNT + 1
 
  SET USRID = &SUBSTR(14:21,&NRSTR(&LISTU))
  IF &XL GE 57 THEN +
    SET USRNAME = &SUBSTR(37:57,&NRSTR(&LISTU))
 
  SET USRID = &SUBSTR(1:8,&NRSTR(&USRID &BLK10))
  SET USRNAME = &SUBSTR(1:17,&NRSTR(&USRNAME &BLK10&BLK10))
  GOTO READRF
  END
 
IF &SUBSTR(1:5,&NRSTR(&LISTU)) EQ TYPE  THEN DO
  SET TYPE = &SUBSTR(14:21,&NRSTR(&LISTU))
  SELECT &NRSTR(&TYPE)
    WHEN (USER    ) SET TYPE = &STR(USER    )
    WHEN (CENTRAL ) SET TYPE = &STR(SCA     )
    WHEN (MASTER  ) SET TYPE = &STR(MSCA    )
    WHEN (LIMITED ) SET TYPE = &STR(LSCA    )
    WHEN (&STR(DEPT C/A)) SET TYPE = &STR(DCA     )
    WHEN (&STR(DIV  C/A)) SET TYPE = &STR(VCA     )
    WHEN (&STR(ZONE C/A)) SET TYPE = &STR(ZCA     )
    WHEN (GENERIC ) SET USRID = &STR( )
    WHEN (GROUP   ) SET USRID = &STR( )
    WHEN (PROFILE ) SET USRID = &STR( )
    WHEN (DEPT    ) SET USRID = &STR( )
    WHEN (DIV     ) SET USRID = &STR( )
    WHEN (DIVISION) SET USRID = &STR( )
    WHEN (ZONE    ) SET USRID = &STR( )
    OTHERWISE DO
      WRITE &PGMNAME Invalid TYPE &TYPE was found for report
      SET USRID = &STR( )
      END
    END
  IF &NRSTR(&USRID) NE &STR( ) THEN DO
    SET OCNT = &OCNT + 1
    SET NR = &NR + 1
    SET GRP&NR = &SUBSTR(14:21,&NRSTR(&LISTU))
    IF &NR EQ &NRM THEN SYSCALL PUT_DATA
    END
  GOTO READRF
  END
 
IF &SUBSTR(1:8,&NRSTR(&LISTU)) EQ FACILITY   THEN DO
  SET NR = &NR + 1
  SET GRP&NR = &SUBSTR(14:21,&NRSTR(&LISTU))
  IF &NR EQ &NRM THEN SYSCALL PUT_DATA
  GOTO READRF
  END
 
IF &SUBSTR(1:10,&NRSTR(&LISTU)) EQ ATTRIBUTES THEN DO
  SET XC = &SYSINDEX(&STR(,),&NRSTR(&LISTU),14)
  IF &XC EQ 0 THEN DO
    SET NR = &NR + 1
    SET GRP&NR = &SUBSTR(14:21,&NRSTR(&LISTU))
    IF &NR EQ &NRM THEN SYSCALL PUT_DATA
    GOTO READRF
    END
  ELSE DO
    SET XF = 14
 
    NEXT_ATTR: +
    SET RETURN_CODE = 0
 
    IF &XF GT 0 AND &XF LE &XC-1 THEN DO
      SET ATTR = &SUBSTR(&XF:&XC-1,&NRSTR(&LISTU))
      SET NR = &NR + 1
      SET GRP&NR = &SUBSTR(1:8,&NRSTR(&ATTR&BLK10))
      IF &NR EQ &NRM THEN SYSCALL PUT_DATA
      SET XF = &XC+1
      END
    SET XC = &SYSINDEX(&STR(,),&NRSTR(&LISTU),&XF)
    IF &XC-1 GT &XF THEN GOTO NEXT_ATTR
    SET XC = &SYSINDEX(&STR( ),&NRSTR(&LISTU),&XF)
    IF &XC-1 GT &XF THEN +
     IF &SUBSTR(&XF:&XC-1,&NRSTR(&LISTU)) NE &STR( ) THEN GOTO NEXT_ATTR
    GOTO READRF
    END
  END
 
IF &SUBSTR(1:8,&NRSTR(&LISTU)) EQ PROFILES  OR +
   &SUBSTR(1:6,&NRSTR(&LISTU)) EQ GROUPS    THEN DO
  DO XF = 14 TO 54 BY 10
    IF &XF+7 GT &XL THEN GOTO READRF
    SET GROUP = &SUBSTR(&XF:&XF+7,&NRSTR(&LISTU))
    IF &NRSTR(&GROUP) EQ &STR( ) THEN GOTO READRF
    SET NR = &NR + 1
    SET GRP&NR = &NRSTR(&GROUP)
    IF &NR EQ &NRM THEN SYSCALL PUT_DATA
    END
  END
 
GOTO READRF
 
 
EOF_LISTUSER: +
SET RETURN_CODE = 0
 
IF &NRSTR(&USRID) NE &STR( ) 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 &NRSTR(&TERMMSGS) EQ ON THEN DO
WRITE ===============================================================
WRITE &PGMNAME Output member &DATAMBR
WRITE &PGMNAME Input IDs = &ICNT  Output USERS = &OCNT
WRITE &PGMNAME Top Secret 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)
 
/* *************************************** */
/*  SYSCALL SUBROUTINES                    */
/* *************************************** */
 
/*******************************************
/* Write record and clear variables        *
/*******************************************
 
PUT_DATA: PROC 0
 
IF &NRSTR(&USRID) EQ &STR( ) OR +
   &NRSTR(&GRP1) EQ &STR( ) THEN GOTO CLEAR_VARS
 
SET DATA = &NRSTR(&USRID &USRNAME &GRP1 &GRP2 +
           &GRP3 &GRP4 &GRP5 &GRP6)
 
SET RETURN_CODE = 0
 
ISPEXEC LMPUT DATAID(&DATAID) MODE(INVAR) DATALOC(DATA) +
  DATALEN(&LENGTH(&NRSTR(&DATA)))
 
IF &RETURN_CODE NE 0 THEN DO
  WRITE &PGMNAME LMPUT_DATAID_RC = &RETURN_CODE &ZERRSM
  RETURN CODE(&RETURN_CODE)
  END
 
CLEAR_VARS: +
SET RETURN_CODE = 0
 
DO X = 1 TO &NR
  SET GRP&X = &STR(        )
  END
SET NR = 0
 
RETURN CODE(&RETURN_CODE)
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
 
RETURN CODE(&RETURN_CODE)
END
