Skip to content

Instantly share code, notes, and snippets.

@JohnArchieMckown
Last active April 28, 2016 13:06
Show Gist options
  • Save JohnArchieMckown/b27747d0c4750a258997 to your computer and use it in GitHub Desktop.
Save JohnArchieMckown/b27747d0c4750a258997 to your computer and use it in GitHub Desktop.
z/OS REXX program which uses the SDSF / REXX interface to copy all held sysout from the JES SPOOL to individual disk data sets or z/OS UNIX files. The logic does not copy output which is already on disk, as determined by the DSN of file already existing.
/* REXX */
PARSE ARG JOBNAME HLQ .
NUMERIC DIGITS 12
IF JOBNAME='' THEN JOBNAME='*'
HLQ=STRIP(HLQ,'B',"'")
IF HLQ='' THEN HLQ='SYSJO'
IF '/' = LEFT(HLQ,1) THEN DO
if syscalls('ON')>3 then
do
say 'Unable to establish the SYSCALL environment'
return
end
end
XX=ISFCALLS('ON')
IF XX <> 0 THEN DO
SAY 'ISFCALLS RC='XX
RETURN XX
END
ISFSORT='JOBID'
ISFPREFIX=JOBNAME
ISFOWNER='*'
ISFFILTER=''
ADDRESS SDSF 'ISFEXEC ST (DELAYED)'
IF RC <> 0 THEN DO
SAY 'ISFEXEC RC='RC
RETURN RC
END
DO IX=1 TO JNAME.0
/* "LISTALC SYSNAMES STATUS" */
SAY 'JBN='JNAME.IX' JOBNUMBER='JOBID.IX' QUEUE='QUEUE.IX
IF QUEUE.IX <> 'PRINT' & ,
QUEUE.IX <> 'OUTPUT' ,
THEN ITERATE
IF '/' = LEFT(HLQ,1) THEN DO
DATEE=DATEE.IX
TIMEE=TIMEE.IX
IF DATEE="N/A" | TIMEE="N/A" THEN DO
DATEE=DATE("S") /* YYYYMMDD */
TIMEE=TIME("N") /* HH:MM:SS */
END
ELSE DO
PARSE VAR DATEE YY '.' DDD
YY=RIGHT(YY,4,'0')
IF 0=DATATYPE(YY,"W")* ,
DATATYPE(DDD,"W")
THEN DO
TIMEE=TIMER.IX
DATEE=DATER.IX
PARSE VAR DATEE YY '.' DDD
YY=RIGHT(YY,4,'0')
END
TIMEE=LEFT(TIMEE,8) /* HH:MM:SS */
DATEE=DDD+DATE("B",YY"0101","S")-1
DATEE=DATE('S',DATEE,'B')
END
/* calculate POSIX epoch time
number of seconds since midnight on Jan 1, 1970
*/
PARSE VAR DATEE 1 YYYY 5 MM 7 DD
mtime=DATE('B',DATEE,'S')-DATE('B',"19700101",'S')
DATEE=YYYY"-"MM"-"DD
PARSE VAR TIMEE HH ":" M2 ":" SS
mtime= SS+60*(M2+60*(HH+24*mtime))
/* mtime is used in utime for setting the modified time */
RFC3339=DATEE"T"TIMEE
/* RFC3339 is the Job Start time in RFC3339 format */
/* Except that it is LOCAL time instead of UTC */
PATH=HLQ"/"JNAME.IX"."JOBID.IX"."RFC3339".txt"
SAY ,
"ALLOC DD(SYSJO) FILEDATA(TEXT) ",
"PATH('"PATH"') " ,
" RECFM(V B A) LRECL(255) BLKSIZE(27998) ",
" REUSE ",
" FILEDATA(TEXT) ",
" PATHMODE(SIRWXU) PATHOPTS(OEXCL,OCREAT,OWRONLY)"
"ALLOC DD(SYSJO) FILEDATA(TEXT) ",
"PATH('"PATH"') " ,
" RECFM(V B A) LRECL(255) BLKSIZE(27998) ",
" REUSE ",
" FILEDATA(TEXT) ",
" PATHMODE(SIRWXU) PATHOPTS(OEXCL,OCREAT,OWRONLY)"
CC=RC
END
ELSE DO
PATH=''
SAY ,
"ALLOC DDN(SYSJO) DSN('"HLQ"."JNAME.IX"."JOBID.IX"')",
" RECFM(V B A) LRECL(255) BLKSIZE(27998) ",
" NEW CATALOG SPACE(10,50) CYLINDERS RELEASE"
"ALLOC DDN(SYSJO) DSN('"HLQ"."JNAME.IX"."JOBID.IX"')",
" RECFM(V B A) LRECL(255) BLKSIZE(27998) ",
" NEW CATALOG SPACE(10,50) CYLINDERS RELEASE"
CC=RC
END
IF CC <> 0 THEN DO
SAY "FAILED TO ALLOCATE "JNAME.IX"."JOBID.IX" RC="CC
ITERATE
END
ADDRESS SDSF "ISFACT ST TOKEN('"TOKEN.IX"') PARM(NP SA)"
DO JX=1 TO ISFDDNAME.0
DO FOREVER
"EXECIO 10000 DISKR "ISFDDNAME.JX"(STEM LINE. "
LINES = LINE.0
IF RC=2 THEN RC=0
IF RC <> 0 THEN DO
SAY "LINES READ="LINES" RC="RC
EXIT 12;
END
"EXECIO * DISKW SYSJO (STEM LINE."
DROP LINE.
IF LINES<10000 THEN LEAVE
END
"EXECIO 0 DISKR "ISFDDNAME.JX"(FINIS"
END
DROP ISFDDNAME.
"EXECIO 0 DISKW SYSJO (FINIS"
"FREE DDN(SYSJO)"
IF PATH<>'' THEN DO
address syscall "chmod (PATH) 444"
SAY PATH MTIME
address syscall "utime (PATH) " mtime mtime
END
END
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment