Loading...
Select Version
&pagelevel(4)&pagelevel
Die Zugriffsbedingungen im Guard TEST-GUA, das im Beispiel 1 erstellt und in den Beispielen 2 und 3 geändert wurde, sollen mit dem Makro SHWSAC gelesen, aufbereitet und nach SYSOUT ausgegeben werden.
Lösung
* **************************************************************
* * ---------------------------------------------------------- *
* * *
* * Makro SHWSAC: Zugriffsbedingungen anzeigen *
* * ========================================== *
* * *
* * ---------------------------------------------------------- *
* **************************************************************
*
GUA4 CSECT
*
* **************************************************************
* * ---------------------------------------------------------- *
* * Makro WRITE *
* * =========== *
* * Aufgabe: Ausgabe des Datensatzes WROBER nach WROUT und *
* * den Bereich WROBER wieder mit Blanks *
* * initialisieren. *
* * ---------------------------------------------------------- *
* **************************************************************
*
MACRO
WRITE
BAL R@BACK,OUTOUT
MEND
*
* **************************************************************
*
R@WEEK EQU 2 fuer Weekday-Bearbeitung
R@PRGNAM EQU 2 fuer Program-Bearbeitung
R@USED EQU 2 fuer Vergleich bereich mit R@OUT
R@I EQU 3 Schleifenzaehler
R@CON EQU 4 Basisregister fuer Condition
R@OUT EQU 5 Basisregister fuer Ausgabebereich
R@BASE EQU 10 Basisregister
R@GUA EQU 11 Subjekt-Zaehler
R@BACK EQU 14 Ruecksprungadresse
*
BALR R@BASE,0
USING *,R@BASE
*
* **************************************************************
* * Initialisierung *
* **************************************************************
MVC WROGNAM(WROTEXL),SPACES Ausgabebereich loeschen
MVC PARSACC(PROW#),PARSACL Parameterinitialisierung
SHWSAC MF=M, -
GUARD='TEST-GUA', -
SUBTYPE=*ALL, -
INFORM=*ADM, -
OUTAREA=(OUTBER,OUTBERLG)
*
* **************************************************************
* * Zugriffsbedingungen ermitteln, bis keine weiteren Guards *
* * mehr angezeigt werden. In diesem Beispiel wird jedoch *
* * nur das eine Guard TEST-GUA angefordert. *
* **************************************************************
MORE1 EQU *
SHWSAC MF=E,PARAM=PARSACC
CLC PROWMRET,=Y(PROPSUCC)
BNE RCNOTOK
*
* **************************************************************
* * Ausgabebereich abarbeiten *
* **************************************************************
L R@OUT,PROWOADR Laden SHWSAC-Ausgabebereiches
USING PROWOPUT,R@OUT
*
LA R@OUT,PROWOSGC Positionieren auf (erstes) Guard
USING PROWGCON,R@OUT
*
ONEGUARD EQU *
MVC WROGNAM,PROWGCNA Guardname -> WROUT-Bereich
LA R@OUT,PROWGCSA Positionieren auf 1. Subjekttyp
USING PROWACOS,R@OUT
*
* **************************************************************
* * Schleife ueber Subjekttyp *USER, *GROUP, *OTHERS, *ALLUSER *
* **************************************************************
SR R@GUA,R@GUA
LH R@GUA,PROWAAUN *USER
AH R@GUA,PROWAAGN *GROUP
AH R@GUA,PROWAAON *OTHERS
AH R@GUA,PROWAAAN *ALLUSER
*
LA R@OUT,PROWACS Positionieren auf erstes Subjekt
USING PROWACON,R@OUT
*
* **************************************************************
* * Fuer jedes Subjekt die Zugriffsbedingungen aus dem *
* * Ausgabebereich lesen *
* * Loop-Beginn *
* **************************************************************
MORE2 EQU *
*
* **************************************************************
* * Subjekt und Subjekttyp in den WROUT-Bereich schreiben
* **************************************************************
CLI PROWAITY,PROZSUSR
BNE SBJGRP
MVC WROSTYP,=C'USER ' Type USER -> WROUT-Bereich
MVC WROSNAM,PROWAINA Subject -> WROUT-Bereich
B SBJEND
SBJGRP CLI PROWAITY,PROZSGRP
BNE SBJOTH
MVC WROSTYP,=C'GROUP ' Type GROUP -> WROUT-Bereich
MVC WROSNAM,PROWAINA Subject -> WROUT-Bereich
B SBJEND
SBJOTH CLI PROWAITY,PROZSOTH
BNE SBJALL
MVC WROSTYP,=C'OTHERS ' Type OTHERS -> WROUT-Bereich
B SBJEND
SBJALL MVC WROSTYP,=C'ALLUSERS' Type ALLUSER -> WROUT-Bereich
SBJEND EQU *
*
* **************************************************************
* * Im Testguard sind fuer alle Subjekte spezielle *
* * Zugriffsbedingungen mit ADMISSION=*PARAMS *
* * (d.h. mit PROWAADM=PROZAPAR)spezifiziert *
* * Der Fall ADMISSION=*YES/*NO *
* * (d.h. mit PROWAADM=PROZAYES/PROZANO) wird nicht behandelt. *
* **************************************************************
LA R@OUT,PROWSTCO Positionieren auf Time Condition
*
* **************************************************************
* * TIME Condition *
* **************************************************************
USING PROWTCON,R@OUT
CLI PROWTKD,PROZCNO Kind of Time EQ *ANY?
BNE TIMCYCLA
LA R@OUT,PROWT#IN Positionieren auf Interval
B TIMEND
TIMCYCLA EQU *
CLI PROWTKD,PROZCEXC Kind of Time EXCEPT(TIME=?)
BNE TIMCYCLB
MVC WROINEX,=C'EX ' EX -> WROUT-Bereich
TIMCYCLB EQU *
MVC WROINEX,=C'IN ' IN -> WROUT-Bereich
SR R@I,R@I
IC R@I,PROWT#IN
LA R@OUT,PROWTINS
USING PROWTINT,R@OUT
TIMCYCL EQU *
MVC WROTIML,PROWTILB Time Lower Bound -> WROUT-Bereich
MVC WROTIMU,PROWTIUB Time Upper Bound -> WROUT-Bereich
LA R@OUT,PROWTIN#(R@OUT)
*
* * Time Condition nach WROUT schreiben
WRITE
*
BCT R@I,TIMCYCL Naechstes Zeitinterval
TIMEND EQU *
*
* **************************************************************
* * DATE Condition *
* **************************************************************
USING PROWDCON,R@OUT
CLI PROWDKD,PROZCNO Kind of Date EQ *ANY?
BNE DATCYCLA
LA R@OUT,PROWD#IN Positionieren auf Interval
B DATEND
DATCYCLA EQU *
CLI PROWDKD,PROZCEXC Kind of Date EXCEPT(TIME=?)
BNE DATCYCLB
MVC WROINEX,=C'EX ' EX -> WROUT-Bereich
DATCYCLB EQU *
MVC WROINEX,=C'IN ' IN -> WROUT-Bereich
SR R@I,R@I
IC R@I,PROWD#IN
LA R@OUT,PROWDINS
USING PROWDINT,R@OUT
DATCYCL EQU *
MVC WRODATL,PROWDILB Date Lower Bound -> WROUT-Bereich
MVC WRODATU,PROWDIUB Date Upper Bound -> WROUT-Bereich
LA R@OUT,PROWDIN#(R@OUT)
*
* * Date Condition nach WROUT schreiben
WRITE
*
BCT R@I,DATCYCL Naechstes Zeitinterval
DATEND EQU *
*
* **************************************************************
* * WEEKDAY Condition *
* **************************************************************
USING PROWWCON,R@OUT
CLI PROWWKD,PROZCNO Kind of Weekday EQ *ANY?
BNE WEKCYCLA
LA R@OUT,PROWWDYS Positionieren auf Weekdays
B WEKEND
WEKCYCLA EQU *
CLI PROWWKD,PROZCEXC Kind of Wekday EXCEPT(WEEKDAY=?)
BNE WEKCYCLB
MVC WROINEX,=C'EX ' EX -> WROUT-Bereich
WEKCYCLB EQU *
*
* Alle Wochentage im Ausgabefeld vorbesetzen
* In einer Schleife die vorbesetzen Wochentage mit Blank
* ueberschreiben, wenn sie nicht in der Zugriffsbedingung
* enthalten sind
*
MVC WROWEEK,=C'MO TU WE TH FR SA SU '
IC R@I,=X'08'
ICM R@CON,B'1000',PROWWDYS
LA R@WEEK,WROWEEK
USING WEKDSEC,R@WEEK
WEKCYCL EQU *
BM WEKCYCLC
MVC WEEKDAY,SPACES
WEKCYCLC EQU *
LA R@WEEK,WEEKDAY#
SLL R@CON,1
LTR R@CON,R@CON
BCT R@I,WEKCYCL
LA R@OUT,PROWW#(R@OUT)
*
* * Weekday Condition nach WROUT schreiben
WRITE
*
WEKEND EQU *
*
* **************************************************************
* * PRIVILEGE Condition *
* * Die Behandlung der einzelnen Privilegien wird im Beispiel *
* * nicht ausfuehrlich behandelt, sondern es wird gleich weiter*
* * auf die Zugriffsbedingungen PROGRAM ppositioniert. *
* **************************************************************
USING PROWPVCO,R@OUT
CLI PROWPKD,PROZCNO Kind of Privilege EQ *ANY?
BNE PRVCYCLA
LA R@OUT,PROWPRV Positionieren auf Privilegien
B PRVEND
PRVCYCLA EQU *
LA R@OUT,PROWP#(R@OUT) -> Zugriffsbedingung Typ PROGRAM
PRVEND EQU *
*
* **************************************************************
* * PROGRAM Condition *
* **************************************************************
USING PROWPCON,R@OUT
CLI PROWPCKD,PROZCNO Kind of Program EQ *ANY?
BNE PRGCYCLA
LA R@OUT,PROWPCNP Positionieren auf Anzahl Programs
* LA R@OUT,PROWPCPS Positionieren auf Programs
B PRGEND
PRGCYCLA EQU *
SR R@I,R@I
IC R@I,PROWPCNP Anzahl Programmnamen
LA R@OUT,PROWPCPS Programmname
USING PROWPRG,R@OUT
PRGCYCL EQU *
*
* Im Beispiel wird nur der Fall FILENAME behandelt
* Bibliotheksangaben werden nicht beruecksichtigt
*
SR R@PRGNAM,R@PRGNAM
IC R@PRGNAM,PROWPAL# size of whole program name
SH R@PRGNAM,=H'1' -1 fuer MVC-Laenge
N R@PRGNAM,=F'63' Name auf 64 begrenzt
EX R@PRGNAM,PRGEXMVC Programname ->WROUT-Bereich
AH R@PRGNAM,=H'1' +1 fuer echte Laenge
*
* * Program Condition nach WROUT schreiben
WRITE
*
LA R@OUT,PROWPCNS Start of Programs
AR R@OUT,R@PRGNAM
BCT R@I,PRGCYCL
PRGEND EQU *
*
* **************************************************************
* * Alle Zugriffsbedingungen fuer ein Subjekt sind abgearbeitet*
* * Auf Wortgrenze Positionieren *
* **************************************************************
AH R@OUT,=H'3'
N R@OUT,=F'-4' X'FFFFFFFC'
*
* **************************************************************
* * Fuer jedes Subjekt die Zugriffsbedingungen aus dem *
* * Ausgabebereich lesen *
* * Loop-Ende *
* **************************************************************
BCT R@GUA,MORE2
B GUAFRTG
*
* **************************************************************
* * Ein Guard wurde komplett abgearbeitet. Pruefen, ob es *
* * im SHWSAC-Ausgabebereich weitere Guardeintraege gibt. *
* * In diesem Beispiel gibt es keine. *
* **************************************************************
GUAFRTG EQU *
L R@USED,PROWOADR
A R@USED,PROWOUS#
CR R@USED,R@OUT
BP ONEGUARD
*
* **************************************************************
* * Pruefen, ob SHWSAC gemeldet hat, dass weitere Guards *
* * zur Anzeige anstehen, die im Ausgabebereich keinen Platz *
* * mehr gefunden haben. *
* **************************************************************
CLC PROWOMOR,=Y(PROWMNO)
BNE MORE1
B ENDE
*
* **************************************************************
* * Aufruf von WROUT *
* **************************************************************
OUTOUT EQU *
WROUT WROBER,WROFEHL
MVC WROGNAM(WROTEXL),SPACES
BR R@BACK
WROFEHL EQU *
B ENDE
*
* **************************************************************
* * Fehlerbehandlung *
* **************************************************************
RCNOTOK EQU *
* Die moeglichen Returncode-Werte sind im Makro MSGGUAD
* aufgelistet
B ENDE
*
* **************************************************************
* * Uebertragen Programmname in den WROUT-Ausgabebereich *
* **************************************************************
PRGEXMVC MVC WROPRGNA(1),PROWPCNS Start of Programs
*
* **************************************************************
* * Programmende von Beispielprogramm GUA4 *
* **************************************************************
ENDE EQU *
TERM
*
*
*
* **************************************************************
* *------------------------------------------------------------*
* * Parameterdeklarationen *
* *------------------------------------------------------------*
* **************************************************************
*
* Dieser Parameterbereichs wird bei Aufruf des Makros SHWSAC
* im Register 1 uebergeben.
*
PARSACC DS 0F
SHWSAC MF=C
*
* Dieser Parameterbereich wird vor Aufruf des Makros SHWSAC
* verwendet, um den Parameterbereich PARRACC neu zu
* initialisieren.
*
PARSACL DS 0F
SHWSAC MF=L, -
GUARD=' ' -
OUTAREA=(OUTBER,OUTBERLG)
*
OUTBERLG DC A(OUTBERL)
*
* **************************************************************
* *------------------------------------------------------------*
* * WROUT-Bereich *
* *------------------------------------------------------------*
* **************************************************************
*
SPACES DC CL256' '
WROBER EQU *
DC Y(WROBERL)
DC X'0000'
DC X'00'
WROGNAM DS CL24 Guardname
DS XL1
WROSTYP DS CL8 Subjekttyp
DS XL1
WROSNAM DS CL8 Subjekt
DS XL1
WROINEX DS CL3 INTERVAL oder EXCEPT
DS XL1
WROTIML DS CL5 Time Lower Bound
DS XL1
WROTIMU DS CL5 Time Upper Bound
ORG WROTIML
WRODATL DS CL10 Date Lower Bound
DS XL1
WRODATU DS CL10 Date Upper Bound
ORG WROTIML
WROWEEK DS CL21 Weekday
ORG WROTIML
WROPRGNA DS CL64 Programmname
ORG
WROTEXL EQU *-WROGNAM
WROBERL EQU *-WROBER
*
* **************************************************************
* *------------------------------------------------------------*
* * Ausgabebereich fur SHWSAC *
* *------------------------------------------------------------*
* **************************************************************
*
OUTBER EQU *
DS XL256
DS XL256
DS XL256
DS XL256
DS XL256
DS XL256
DS XL256
DS XL256
OUTBERL EQU *-OUTBER
*
* **************************************************************
* *------------------------------------------------------------*
* * Deklarationen globaler Variablen *
* *------------------------------------------------------------*
* **************************************************************
*
SACMGMT MF=D,XPAND=PARAM
*
* **************************************************************
* *------------------------------------------------------------*
* * Deklarationen des Ausgabebereiches von SHWSAC *
* *------------------------------------------------------------*
* **************************************************************
*
SHWSAC MF=D,XPAND=OUTPUT
*
* **************************************************************
* *------------------------------------------------------------*
* * Deklarationen der Returncodes *
* *------------------------------------------------------------*
* **************************************************************
*
MSGGUAD MF=D
*
WEKDSEC DSECT 0X Weekday-Dsect
WEEKDAY DS CL3
WEEKDAY# EQU *
*
END
Ergebnis
Das Programm gibt die Zugriffsbedingungen in folgender Form nach SYSOUT aus:
:PUB1:$TESTUID.TEST-GUA USER ANNE IN 2017-10-15 2017-11-15
USER MARY MO TU WE
USER PAUL IN 2017-07-01 2017-09-30
GROUP REVIEWER IN 09:00 15:00
IN 2017-08-23 2017-08-24
2017-09-09 2017-09-10
GROUP TEAMWORK IN 09:00 15:00
IN 2017-08-23 2017-08-24
2017-09-09 2017-09-10
ALLUSERS IN 07:00 19:00
EX SA SU