Mike Walter

Mike has been developing VM tools to make his job easier and him more productive since 1978. Perhaps some of his tools can make your job easier and you more productive, too. Or, perhaps some might serve as kernels which you can grow into your own tools -- which, of course, you would share with the VM Community, too!

SFDATTIM (v1.4.1)

SFDATTIMe is used to display the full mm/dd/yy and hh:mm:ss Open, Close,
(or both) date and time of a specified SPOOL file.  Local timezone
offset,and UTC and TOD support is included.
 
                          +----*-----+
>--SFDATTIM--SpoolFileID--+--userid--+--+---------------------+-----><
                                        +-(-+-----------------+
                                            +- |Options |-+---+
                                                          +-)-+
or as a REXX function call:'
 
                               +----*----+
>--crdate=sfdattim(SpoolFileID-+-userid--+-+------------+-)---------><
                                           +- |Options|-+
 
Where:
 
SpoolFileID
      is the 1-4 digit SPOOL file number of which the full mm/dd/yy
      and hh:mm:ss creation date/time is to be returned.
 
userid
      is the userid which "owns" the SPOOL file.  If you have
      CP privclass "C" or "E" it may be an ID other than your own.
      DEFAULT=* (your own userid).
 
 
Options:
 
OPEN
     requests return of the "mm/dd/yy hh:mm:ss" when the SPOOL file was
     opened.
     Default=OPEN
 
CLOSe
     requests return of the "mm/dd/yy hh:mm:ss" when the SPOOL file was
     closed.  If the SPOOL file is still open, "00/00/00 00:00:00" is
     returned.
     This option is available only to those with system privclass of
     "C" or "E".'
 
BOTH
     requests return of both Open and Close date and time.
     Synonymous with entry of "OPEN" -and- "CLOSE" options.
 
TIMEzone +n/-n
     Where "n" is the number of hours the system is running east or west
     of UTC (Coordinated Universal Time in Greenwich, England).
     "n" must be in the range 0-23.
 
     The open AND close date/time of SPOOL files are stored as UTC.  This
     option permits displaying the date and time of the file would be
     shown in response to a "CP Query Reader ALL" command.
     CP automatically offsets the SPOOL file date/time by the number of
     hours the system is east or west of UTC.
 
     In the United States, one would want to subtract a number of hours
     from the UTC on SPOOL to derive the local time, as the time in
     in Greenwich, England is some number of hours ahead of U.S. times.
 
     The specified number of hours is added to or subtracted from the
     SPOOL file dates/times before display.
     Default=the active offset as displayed in response to a
     "CP Query TIMEZONE" command.
 
     When TIMEZONE is specified, the response is returned as:
 
     date1 time1 date2 time2
 
     Where: date1 = OpenDate (or CloseDate if only CLOSe was specified)
            time1 = OpenTime (or CloseTime if only CLOSe was specified)
            date2 = ClosDate (only when CLOSe was specified)
            time2 = ClosTime (only when CLOSe was specified)
     This option is available only to those with system privclass of
     "C" or "E".
 
UTC
     synonym for: TIMEzone +0.
     This option is available only to those with system privclass of
     "C" or "E".
 
TOD
     Return the 8-byte hexidecimal TOD clock values as requested for the
     OPEN and/or CLOSe times.  If the SPOOL file is still open, the
     right 4 bytes of the TOD will be returned as '00000000'x.
     This option is available only to those with system privclass of
     "C" or "E".
 
Usage notes.
 
If OPEN and CLOSe are both requested, OPEN date/time will always be
returned as the first tokens, followed by CLOSe date/time.
    	

TIMEDIFF EXEC (v2.2.1)

TIMEDIFF provides the number of hours, minutes and seconds (and
optionally, days) between two pairs of dates and times.
 
The command format is:
 
 
>>-TIMEDIFF-+-date1------+-+-time1----+----+-date2------+-+-time2----+->
            +-yyyy-mm-dd-+ +-hh:mm:ss-+    +-yyyy-mm-dd-+ +-hh:mm:ss-+
            +-yyyy/mm/dd-+ +-hhmmss---+    +-yyyy/mm/dd-+ +-hhmmss---+
            +-yyyymmdd---+ +-*--------+    +-yyyymmdd---+ +-*--------+
            +-yyyyddd----+ +-TOD_ABS--+(1) +-yyyyddd----+ +-=--------+
            +-yyddd------+ +-POSIX----+(1) +-yyddd------+
            +-mm/dd/yy---+                 +-mm/dd/yy---+
            +-*----------+                 +-*----------+
            +-xxxxxxxxxxxxxxxx-+(1)        +-=----------+
 
>-----------+-------------------------------+-------------------------><
            +--(----| Options |---+-----+---+
                                  +--)--+
 
(1) TOD_ABS and POSIX are entered as 'time1' to indicate that 'date1' is
    a string of 16 hexadecimal characters representing the specified
    date/time.
 
 
Options:
 
             +-TERM--+
|--+------+--+-------+-------------------------------------------------|
   +-DAYS-+  +-FIFO--+
   +-MET--+  +-STACK-+
             +-LIFO--+
 
 
Dates are supported between 01 Jan 0001 AD and 31 Dec 9999 AD.
 
The dates may be entered as any of the following date formats:
 
Format             Format type
----------         ------------------------------------------------------
*                - Current date
yyyy-mm-dd       - ISOdate
yyyy/mm/dd       - DateTimeSubtract CSL
yyyymmdd         - Standard date;  rexx date(S)
yyyyddd          - Julian date;    (long)
yyddd            - Julian date;    rexx date(J)
mm/dd/yy         - Gregorian Date; rexx date(U)
xxxxxxxxxxxxxxxx - When "time1" is entered as "TOD_ABS", an
                   unsigned doubleword indicating # of TOD clock units
                   that have elapsed since January 1, 1900, 00:00:00 UTC
                   E.g. CBDAE6439DA00000
xxxxxxxxxxxxxxxx - When "time1" is entered as "POSIX", an
                   unsigned doubleword indicating # of seconds since
                   January 1, 1900, 00:00:00 UTC,
                   E.g. DC0106C052564574
=                - For 'date2' only; equal to 'date1'
 
The times may be entered as any of the following time formats:
 
Format       Format type
----------   ----------------------------------
*          - Current time
hh:mm:ss   - Specific time
hhmmss     - Specific time
TOD_ABS    - A 16 hex character string is entered as "date1",
             representing a z/VM Time of Day clock value.
POSIX      - A 16 hex character string is entered as "date1", as the
             number of seconds since Jan 1, 1900, 00:00:00 UTC
=          - For 'time2' only, equal to 'time1'
 
 
Options:
 
DAYS       - Display the number of days between the dates
             For a 'TERM' display as:
             Time difference is: n days, n hours, n minutes, n seconds.
             For a function call as:
             days hh:mm:ss
             For LIFO, FIFO, or STACK:
             * n n n n
MET        - Display the days in "Mission Elapsed Time" format.
             For a 'TERM' display as:
             Time difference is: n days/ n hours, n minutes, n seconds.
             For a function call as:
             days/hh:mm:ss
             For LIFO, FIFO, or STACK:
             * days/hh:mm:ss
 
 
TERM       - Display results at console (DEFAULT)
FIFO       - Queue results in Program Stack
STACK      - Queue results in Program Stack
LIFO       - Push results in Program Stack
 
 
 
Usage notes:
 
1) Options for a rexx function call are entered after a comma, as in:
   diff=timediff(date1 time1 date2 time2,options)
 
2) Any date entered as a 2-digit year (Gregorian or Julian) will be
   converted to a 4-digit year using a 50 year sliding window from the
   the current date.
 
   The sliding window range of years is computed as:
 
       current year -50, through current year +49.
 
   The century is taken from the matching year in that range.
 
   Examples:
                                                2-digit   Resulting
   Current year;  Window begin;  Window end;    year      4-digit year
   -------------  ------------  ----------      -------   ------------
      2000        2000-50=1950   2000+49=2049   00        2000
                                                49        2049
                                                50        1950
                                                99        1999
 
      2005        2005-50=1955   2005+49=2054   00        2000
                                                49        1949
                                                50        2050
                                                99        1999
 
 
Examples from within a REXX program:
 
runtime=timediff('20001231 01:00:00 20001231 02:00:00')
diff=timediff('20001231 01:00:00 20001231 02:00:00','MET')
say timediff('01/11/00 01:00:00 2000-01-11 02:00:00')
say timediff('05/11/50 14:00:00 2000/05/11 14:00:00','DAYS')
'EXEC TIMEDIFF 12/05/84 08:30:00 1999/12/05 = (DAYS'
    	

FINDFILE EXEC (v1.2.1)

FINDFILE is used to search the issuing userid, for files on all
virtual DASD (even those not accessed), and accessed SFS directories.
 
Each virtual DASD address is ACCESSed using a free filemode, LISTFILE
issued, and matching files and their virtual address reported.  If the
'ACCESSM0 MODULE' is available, ACCESSM0 is SET ON so that filemode 0
(zero) files on R/O disks are searched as well.
 
LISTFILE is issued against accessed SFS Directories, with matching
files and their directory name reported.
 
Syntax:
 
                                +-*-------------+
>--FINDFILE--+-fname_pattern-+--+-ftype_pattern-+---------------------->
 
 
>------------+------------------+--------------------| options |------><
             +-pipe PICK stage -+
 
pipe PICK stage
 
        CMS Pipelines arguments as entered for the Pipe PICK stage.
        E.g. FINDFILE * * PICK ANYcase W1 == /DIRECTORY/
          or FINDFILE * * PICK PAD BLANK ANYcase 1.5 == /USER/
 
 
 
        Note: PICK PAD BLANK ANY 1.5 == /USER/
        is not equal to:
 
              PICK PAD BLANK ANY W1 == /USER/
 
        For details, enter: HELP PIPE PICK
 
        Depending on the number of LINKed minidisks, and file on
        each, this 'pipe PICK stage' operand can run quite long,
        and produce a lot of output.
 
Options:
 
Options are passed directly to LISTFILE.  Some will not make sense to
use from this command.
 
TOCYL
      a non-LISTFILE option (removed before calling LISTFILE) which
       displays the "TO cylinder" instead of the mdisk cylinder size.
       E.g. without TOCYL, an mdisk might be displayed as from/size
       cylinders: 01810 00011
       while with TOCYL, the same mdisk would be displayed as from/to
       cylinders: 01810 01820
 
VERBOSE
      a non-LISTFILE option (removed before calling LISTFILE) which
       displays each mdisk and directory just before searching,
       providing confidence-building PUF (Positive User Feedback).
    	

LOSTDISK EXEC (v1.1.1)

LOSTDISK is used from a userid with the PrivClass for 'CP DEFINE MDISK'
to locate minidisks, and optionally files, on a full-pack volume.
 
It is handy if you no longer have a DIRECTORY mapping that volume.
 
Syntax:
 
>--LOSTDISK--+-volser-+--+---------------------------------+-|options|-><
                         +--fnamepattern--+----------------+
                                          +--ftypepattern--+
 
|-Options-|
 
FILEList
FL
          Enter FILELIST on the files with patching filename (and
          optionally filetype) patterns from the found mdisk(s).
 
LFoptions
          Mutually exclusive with "FILELIST" or "FL".
          Issues LISTFILE for the specified "fnamepattern ftypepattern"
          with the "LFoptions" arguments as LISTFILE's options.
 
For example:
 
lostdisk vmres1
lostdisk vmpk01 *some* file*
lostdisk vmpk02 *some* cata* (filel
lostdisk vmu087 *some* *x*   (fl
lostdisk 520res user direct  (fl
    	

QOWNER EXEC (v1.1.2)

QOWNER is used to display each LINKed disk, showing commonly needed
information for all accessed and un-accessed disks.  A period is
displayed as a place-holder for missing values (un-accessed minidisks).
 
Any accessed SFS directories will also be displayed.
 
If the 'DEVTYPE MODULE' from the CMS Utilties Feature is available,
added detail is displayed: unaccessed mindisk labels, and the minidisk
label type (CMS1, VOL1, None).
 
 
The format of the output would appear as:
 
Label  Vdev M  Stat Cylinders Used    Files Ownerid  Addr Rdev Volser LblType
labelx vdev x/x r/w nnnnn CYL nnn% nnnnnnnn = owneridx nnnn rdev volser CMS1
-       DIR x   r/o nnnnn CYL nnn%        . = filepool:filespaceid.
labely vdev .   r/o nnnnn CYL nnn%        . = owneridx nnnn rdev volser VOL1
.      vdev .   r/o nnnnn CYL nnn%        . = owneridx nnnn rdev volser None
 
Note: the 'Cylinder' value for SFS directories is a calculated value,
provided for consistency and comparison to minidisks.
 
 
Syntax:
           +-----------+
           V           |
>--QOWNER---+---------++-------------------+-------------------+----><
            +-accmode-+                    +-(-| Options |-+---+
            +-vdev----+                                    +-)-+
            +-DIR-----+
 
Options:
 
|--+------------------+--+------+--+----------+--|
   +-OWNedby-+-userid-+  +-vdev-+  +-ACCESsed-+
   +-OWNerid-+
 
Where:
 
accmode
 
    is the access mode or extension of an accessed minidisk.
 
 
userid
    is the userid's disks to be displayed.  "userid" may also be entered
    as "*" to indicate the userid from which the command is issued.  The
    following forms of the "NOT" symbol may prefixed to the "userid" to
    indicate mdisks of a given userid which should NOT be displayed:
    "\", "<>", "^", as in "\userid" or "<>*".
 
 
vdev
    minidisk address (will be left-padded with zeros before comparison).
 
DIR
    Specifies accessed SFS directories. This is used as a pattern match.
 
 
 
Options:
 
OWNedby userid
or
OWNerid userid
    display of only minidisks owned by the specified userid.
 
vdev
    display of only the specified minidisk owned by the specified
    ownerid.
 
ACCESsed
    display of only ACCESSED minidisks or directories.
    is the access mode or extension of an accessed minidisk.
 
Examples:  (with the same disks/directories accessed, just showing different options)
 
QOWNER
Label  Vdev M  Stat Cylinders Used    Files   Ownerid  Addr Rdev Volser LblType
M2W191 0191 A   R/W   150 CYL  76%     2552 = M2WALTER 0191 0F19 VMPP09 CMS1
ADM199 0199 B/A R/O   600 CYL  53%     2931 = HEWADMN  0199 0E15 VMPP05 CMS1
ADM399 0399 C/B R/O    15 CYL  75%      328 = HEWADMN  0399 0F12 VMPP02 CMS1
-       DIR Q   R/O 12222 CYL  63%       19 = PPS01:SYSPROG.PIPELINES.FIELDTEST.
12000A
MNT190 0190 S   R/O   107 CYL  85%      703 = MAINT    0190 0E10 VMR54I CMS1
-       DIR T/T R/O   998 CYL  37%      538 = AUD01:MAINT.TDISK
-       DIR X   R/W 12222 CYL  63%       77 = PPS01:SYSPROG.TOOLS.CA
-       DIR Y/S R/O   998 CYL  37%     3847 = AUD01:MAINT.YDISK
-       DIR Z   R/W 12222 CYL  63%     3648 = PPS01:SYSPROG.TOOLS
RSTCKD 0050 .   R/W    50 CYL    .        . = M2WALTER 0050 0F6E VMU334 CMS1
M2W107 0107 .   R/W    20 CYL    .        . = M2WALTER 0107 0F7C VMU357 CMS1
HATOOL 019C .   R/O    20 CYL    .        . = MAINT    019C 0E11 VMR54H CMS1
54Z19D 019D .   R/O   200 CYL    .        . = MAINT    019D 0E11 VMR54H CMS1
54Z19E 019E .   R/O   500 CYL    .        . = MAINT    019E 0E11 VMR54H CMS1
M2W1B0 01B0 .   R/W    10 CYL    .        . = M2WALTER 01B0 0F79 VMU348 CMS1
TRKV54 0540 .   R/W    25 CYL    .        . = M2WALTER 0540 0F13 VMPP03 CMS1
BADDSK 0BAD .   R/W     1 CYL    .        . = M2WALTER 0BAD 0F11 VMPP01 CMS1
M2W101 1993 .   R/W   100 CYL    .        . = M2WALTER 1993 0F79 VMU348 CMS1
NEWSTE 6191 .   R/W   100 CYL    .        . = M2WALTER 6191 0F7C VMU357 CMS1
M2DEAD DEAD .   R/W   800 CYL    .        . = M2WALTER DEAD 0F6E VMU334 CMS1
 
qowner (accessed
Label  Vdev M  Stat Cylinders Used    Files   Ownerid  Addr Rdev Volser LblType
M2W191 0191 A   R/W   150 CYL  76%     2552 = M2WALTER 0191 0F19 VMPP09 CMS1
ADM199 0199 B/A R/O   600 CYL  53%     2931 = HEWADMN  0199 0E15 VMPP05 CMS1
ADM399 0399 C/B R/O    15 CYL  75%      328 = HEWADMN  0399 0F12 VMPP02 CMS1
-       DIR Q   R/O 12222 CYL  63%       19 = PPS01:SYSPROG.PIPELINES.FIELDTEST.
12000A
MNT190 0190 S   R/O   107 CYL  85%      703 = MAINT    0190 0E10 VMR54I CMS1
-       DIR T/T R/O   998 CYL  37%      538 = AUD01:MAINT.TDISK
-       DIR X   R/W 12222 CYL  63%       77 = PPS01:SYSPROG.TOOLS.CA
-       DIR Y/S R/O   998 CYL  37%     3847 = AUD01:MAINT.YDISK
-       DIR Z   R/W 12222 CYL  63%     3648 = PPS01:SYSPROG.TOOLS
 
qowner (ownedby m2walter
Label  Vdev M  Stat Cylinders Used    Files   Ownerid  Addr Rdev Volser LblType
M2W191 0191 A   R/W   150 CYL  76%     2552 = M2WALTER 0191 0F19 VMPP09 CMS1
RSTCKD 0050 .   R/W    50 CYL    .        . = M2WALTER 0050 0F6E VMU334 CMS1
M2W107 0107 .   R/W    20 CYL    .        . = M2WALTER 0107 0F7C VMU357 CMS1
M2W1B0 01B0 .   R/W    10 CYL    .        . = M2WALTER 01B0 0F79 VMU348 CMS1
TRKV54 0540 .   R/W    25 CYL    .        . = M2WALTER 0540 0F13 VMPP03 CMS1
BADDSK 0BAD .   R/W     1 CYL    .        . = M2WALTER 0BAD 0F11 VMPP01 CMS1
M2W101 1993 .   R/W   100 CYL    .        . = M2WALTER 1993 0F79 VMU348 CMS1
NEWSTE 6191 .   R/W   100 CYL    .        . = M2WALTER 6191 0F7C VMU357 CMS1
M2DEAD DEAD .   R/W   800 CYL    .        . = M2WALTER DEAD 0F6E VMU334 CMS1
 
Label  Vdev M  Stat Cylinders Used    Files   Ownerid  Addr Rdev Volser LblType
ADM199 0199 B/A R/O   600 CYL  53%     2931 = HEWADMN  0199 0E15 VMPP05 CMS1
ADM399 0399 C/B R/O    15 CYL  75%      328 = HEWADMN  0399 0F12 VMPP02 CMS1
-       DIR Q   R/O 12222 CYL  63%       19 = PPS01:SYSPROG.PIPELINES.FIELDTEST.
12000A
MNT190 0190 S   R/O   107 CYL  85%      703 = MAINT    0190 0E10 VMR54I CMS1
-       DIR T/T R/O   998 CYL  37%      538 = AUD01:MAINT.TDISK
-       DIR X   R/W 12222 CYL  63%       77 = PPS01:SYSPROG.TOOLS.CA
-       DIR Y/S R/O   998 CYL  37%     3847 = AUD01:MAINT.YDISK
-       DIR Z   R/W 12222 CYL  63%     3648 = PPS01:SYSPROG.TOOLS
HATOOL 019C .   R/O    20 CYL    .        . = MAINT    019C 0E11 VMR54H CMS1
54Z19D 019D .   R/O   200 CYL    .        . = MAINT    019D 0E11 VMR54H CMS1
54Z19E 019E .   R/O   500 CYL    .        . = MAINT    019E 0E11 VMR54H CMS1
    	

ONELINE EXEC

The ONELINE EXEC is used to compress other EXECs into one long line.
    	
This is done by using PIPEs FPLCMPRX if, available, or by using EXECUPDT
 
logic to delete all comments (except those in EXECUPDT-type format where
 
comments begin in column 1 with: /*! ), all blank lines and all leading
 
and trailing blanks on each record.
 
 
 
The resultant records are packed together on one line with REXX's
 
instruction separator ";" between them.
 
 
 
Lines continued with a "," are handled properly.
 
 
 
If the resultant line exceeds 65,535 bytes, it is broken at suitable
 
points into additional long records.
 
 
 
Syntax:
 
                                              +-1$EXEC--+
 
                                              +-1$XEDIT-+
 
                  +-EXEC-+  +-*---+           +-ONELINE-+  +-A---+
 
ONELINE--+-ifn-+--+-ift--+--+-ifm-+--+-ofn-+--+-oft-----+--+-ofm-+----->
 
                                                           +- = -+
 
 
 
       >--+--------------------------------+--------------------------<>
 
          +-(-+---------+--+---------+-+---+
 
              +-REPlace-+  +-NEWDate-+ +-)-+
 
 
 
 
 
Usage notes:
 
 
 
IBM's "FPLCMPRX REXX" does a far better job of compressing the input
 
rexx file than the 'hard way' compression routine within this exec:
 
 
 
Filename Filetype Fm Format Lrecl    Records     Blocks
 
ISPDTLC  1$EXEC   A1 F     345723          1         85  <- FPLCMPRX
 
ISPDTLC  1$EXEC   A1 V      65527          6         91  <- internal
    	

REXXBACK EXEC

REXXBACK provides the names (and optionally minidisk owner and address)
 
of all the calling rexx programs, back to the beginning of the calling
 
chain of REXX EXECs.
 
 
 
The command format is:
 
 
 
            +-*-----+
 
>>-REXXBACK-+-------+---------------+-------------------------------+-->
 
            +-n-----+               +--(----| Options |---+-----+---+
 
            +-Init--+               +--(----| Options |---+-----+---+
 
                                                          +--)--+
 
 
 
 
 
Options:
 
 
 
|--+-------+-----------------------------------------------------------|
 
   +-OWNER-+
 
 
 
 
 
Where:
 
 
 
Init
 
       Displays only the first calling EXEC in the chain.
 
 
 
n
 
       limits the number of calling execs to search back.  For example
 
       '0' would display only the current exec running REXXBACK, '1'
 
       would display the current exec and go back only 1 level.
 
       Default: '*' - meaning to go back to the beginning of the chain.
 
 
 
OWNER
 
       includes the userid and minidisk address within parenthesis the
 
       first time each filemode is encountered in the chain.
 
 
 
 
 
Usage note:
 
 
 
The displayed rexx exec chain is for REXX execs only.  And imbedded
 
EXEC or EXEC2 execs will not be displayed.
    	
say rexxback()
 
*= E EXEC A1, D EXEC A1, C EXEC A1, B EXEC A1, A EXEC A1
 
 
 
say rexxback(0,OWNER)
 
0= E EXEC A1(JQPUBLIC 0191)
 
 
 
say rexxback(1,OWNER)
 
1= E EXEC A1(JMDOE 0191), D EXEC A1
 
 
 
say rexxback(4,OWNER)
 
4= E EXEC A1(DWJONES 0191), D EXEC A1, C EXEC A1, B EXEC A1, A EXEC A1
 
 
 
EXEC REXXBACK 4 (OWNER
 
REXXback 4="E EXEC A1(ABSMITH 0191), D EXEC A1, C EXEC A1, B EXEC D1(ONMOORE 02
 
00), A EXEC A1".
 
 
 
EXEC REXXBACK (OWNER
 
REXXback *="E EXEC A1(LSONE 0191), D EXEC A1, C EXEC C1(YKNOT 0192), B EXEC A1, A EXEC A1".
 
 
 
EXEC REXXBACK
 
REXXback *="E EXEC A1, D EXEC A1, C EXEC A1, B EXEC A1, A EXEC A1".
 
 
    	

Attachments:
VMARC File CPSYNTAX.VMARC
VMARC File SFDATTIM.VMARC
VMARC File TIMEDIFF.VMARC
VMARC File FINDFILE.VMARC
VMARC File LOSTDISK.VMARC
VMARC File QOWNER.VMARC
VMARC File ONELINE.VMARC
VMARC File REXXBACK.VMARC