 
                pause-café
rendez-vous technique
                
                    Pause-Café est une réunion technique 
destinée aux informaticiens sur plateforme IBM i.
                destinée aux informaticiens sur plateforme IBM i.
                    Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.
                
            Pause-café #15
Juin 1998
                    API Messages (permettent de traiter les messages en pgm HLL). Exemple : Déplacement de messages vers une autre PGMQ (dans la liste d'invocation) ATTENTION: Les messages *ESCAPE deviennent *DIAG + QMHMOVPM - BIN(4) clé du message (blanc = tous) - x fois CHAR(10) = type(s) de messages *COMP,*DIAG,*ESCAPE,*INFO 0 = par clé 1 à 4 si clé = blanc - BIN(4) nombre de types (0 à 4) - CHAR(10) PGMQ contenant les messages - un nom de pgm - '*' = le pgm en cours. - BIN(4) n° dans la pile 0 = le pgm en cours 1 = l'appelant x = x niveau au dessus - CHAR(?) Zone de retour d'erreur
    API Messages
     + QMHRCVM            Réception de messages à partir d'une MSGQ
                           (RCVMSG MSGQ(xxx).)
     + QMHRCVPM          Réception de messages à partir d'une PGMQ
                           (RCVMSG PGMQ(xxx).)
     + QMHRMVM            suppression de message(s) d'une MSGQ
                           (RMVMSG)
     + QMHRMVPM           suppression de message(s) d'une PGMQ
                           (RMVMSG)
              
              + QMHRSNEM Renvoi le dernier message *ESCAPE reçu par un pgm vers l'appelant, toujours de type *ESCAPE. + QMHRTVM Retrouve la définition d'un message. (RTVMSG) + QMHRTVRQ Réception de messages *RQS PRATIQUE POUR (RCVMSG PGMQ(*EXT).) GERER F9 sur une ligne de cde. + QMHSNDBM envoi un message en BREAK (SNDBRKMSG) + QMHSNDM envoi un message à une MSGQ (SNDPGMMSG TOMSGQ(xxx).) + QMHSNDPM envoi un message à une PGMQ (SNDPGMMSG TOPGMQ(xxx).)
Quelques exemples d'utilisation en RPG:
      * déclarations communes
     E                    MTYP        2 10
     IMSGTB       DS
     I                                        1  20 MTYP
     IMSGDS       DS
     I                                        1  10 MSGF
     I                                       11  20 MSGL
     I                                        1  20 MSGFL
     I                                    B  21  240LENTXT
     I                                    B  25  280STACK
     I                                    B  29  320KEY
     I                                    B  33  360NBTYP
     ICODERR      DS
     I I            16                    B   1   40LGCOD
     I                                    B   5   80LGUTIL
     I                                        9  15 MSGID
     I                                       16  16 RESERV
              
              
      * gestion des erreurs en cas de probleme
         ...............
      *
      * EN CAS D'ERREUR ==> RENVOI DES MESSAGES ET CANCEL DU PGM
      *
     C           *PSSR     BEGSR
     C                     MOVEL'*DIAG'   MTYP,1
     C                     MOVEL'*ESCAPE' MTYP,2
     C                     CALL 'QMHMOVPM'
     C                     PARM           MSGCLE  4
     C                     PARM           MSGTB
     C                     PARM 2         NBTYP
     C                     PARM '*'       PGMQ   10
     C                     PARM 1         STACK
     C                     PARM           CODERR
     C                     ENDSR'*CANCL'
              
              * envoi de message *STATUS dans l'external I 'Liste en cours..' C MTX I 'Liste terminée ' C MTX2 C MOVEL'QCPFMSG' MSGF C MOVEL'*LIBL' MSGL C MOVELMTX MSGTXT C CALL 'QMHSNDPM' C PARM 'CPF9898' ID 7 C PARM MSGFL C PARM MSGTXT 50 C PARM 50 LENTXT C PARM '*STATUS' MSGTYP 10 C PARM '*EXT' PGMQ 10 C PARM 0 STACK C PARM KEY C PARM CODERR * sous programme de chargement C EXSR ---- *
     C                     MOVELMTX2      MSGTXT
     C                     CALL 'QMHSNDPM'
     C                     PARM 'CPF9898' ID      7
     C                     PARM           MSGFL
     C                     PARM           MSGTXT 50
     C                     PARM 50        LENTXT
     C                     PARM '*STATUS' MSGTYP 10
     C                     PARM '*EXT'    PGMQ   10
     C                     PARM 0         STACK
     C                     PARM           KEY
     C                     PARM           CODERR
       * supprime tous les messages reçus entre deux affichages
       * (DSPF avec sous-fichier message)
     C                     CALL 'QMHRMVPM'
     C                     PARM '*'       PGMQ   10
     C                     PARM 0         STACK
     C                     PARM           KEY
     C                     PARM '*ALL'    RMVOPT 10
     C                     PARM           CODERR
              
                     *
       * exemple en RPG-IV, retrouve le nom du pgm appellant
       *
     Dbinaire          S             10I 0
     DLENTXT           S                   like(binaire)
     DSTACK            S                   like(binaire)
     DKEY              S                   like(binaire)
     DATTENTE          S                   like(binaire)
     DCODERR           DS
     D  LGCOD                              like(binaire)   INZ(16)
     D  LGUTIL                             like(binaire)
     D  MSGID                         7
     D  RESERV                        1
      *
      *  on envoi un message au programme au-dessus (stack = 1)
      *  et on le relit (dans les infos retournées il y a le nom du pgm)
      *
              
              C CALL 'QMHSNDPM' C PARM ID 7 C PARM MSGFL 20 C PARM 'peu importe' MSGTXT 10 C PARM 10 LENTXT C PARM '*INFO ' MSGTYP 10 C PARM '*' PGMQ 10 C PARM 1 STACK C PARM KEY C PARM CODERR C CALL 'QMHRCVPM' C PARM retour 120 C PARM 120 lentxt C PARM 'RCVM0200' format 8 C PARM '*' PGMQ 10 C PARM 1 STACK C PARM '*ANY' MSGTYP C PARM KEY C PARM 0 ATTENTE C PARM '*REMOVE' ACTION 10 C PARM CODERR c eval pgm = %subst(retour:111:10)
* * le même exemple en RPG-IV, sous forme d'une fonction * * utilisable sous la forme if quiappel(1) = 'xxxx' H nomain * prototype de la fonction * * (tout programme utilisant la fonction doit lui-même * contenir les deux lignes qui suivent) Dquiappel PR 10 D 10I 0 * corps de la fonction Pquiappel B D PI 10 D niveau 10I 0 * variables locales Dbinaire S 10I 0
DLENTXT S like(binaire) DSTACK S like(binaire) DKEY S like(binaire) DATTENTE S like(binaire) DCODERR DS D LGCOD like(binaire) INZ(16) D LGUTIL like(binaire) D MSGID 7 D RESERV 1 * * on envoi un message au programme au-dessus * et on le relit (dans les infos retournées il y a le nom du pgm) * * on rajoute UN pour tenir compte de la place occupée par le pgm * utilisant lui même la fonction et de laplace du PEP (entry point) c eval stack = niveau + 2 C CALL 'QMHSNDPM'
C PARM ID 7 C PARM MSGFL 20 C PARM 'peu importe' MSGTXT 10 C PARM 10 LENTXT C PARM '*INFO ' MSGTYP 10 C PARM '*' PGMQ 10 C PARM STACK C PARM KEY C PARM CODERR C CALL 'QMHRCVPM' C PARM retour 120 C PARM 120 lentxt C PARM 'RCVM0200' format 8 C PARM '*' PGMQ 10 C PARM STACK C PARM '*ANY' MSGTYP C PARM KEY C PARM 0 ATTENTE C PARM '*REMOVE' ACTION 10 C PARM CODERR c return %subst(retour:111:10) Pquiappel E
Registration Facility Nouvelles fonction de l'OS permettant d'associer à une fonction logiciel un pgm de contrôle entreprise chargé de valider une action. DEUX NOTIONS : - Exit POINT : association d'un point d'appel de programme à une action logiciel. ce point d'appel est nommé sur 20 caractères. Exemple : QIBM_QPWSF_File_Serveur la fonction serveur de fichier de Client/Access est reconnue, il est possible de lui associer un pgm de validation. > APIs : QUSRGPT permet de définir un point d'exit. + paramètres : nom du point d'exit, modifiable ou non action et format des données transmises au pgm nombre de programes d'exit maxi # possibilité d'enlever ce point d'exit ou non. QUSDRGPT permet d'enlever ce point d'exit.
Registration Facility Nouvelles fonction de l'OS permettant d'associer à une action logiciel un pgm de contrôle entreprise chargé de valider cette action. DEUX NOTIONS : - Exit program : programme associé à un point d'exit. l'écriture est à votre charge il reçoit deux paramètres 1/ 1 alpha renvoyé par le programme '0' = refus '1' = validation 2/ données reçues (description suivant le format) > APIs : QUSADDEP ajout d'un programe d'exit QUSRMVEP retrait un programe d'exit QUSRTVEI extraction d'informations > Commandes : WRKREGINF # ADDEXITPGM RMVEXITPGM
Attributs du réseau Système: S4409790 Nombre maximal d'étapes . . . . . . . . . . . . : 16 Accès aux demandes DDM . . . . . . . . . . . . . : *OBJAUT Accès aux demandes Client Access . . . . . . . . : *REGFAC <-- Type du réseau RNIS par défaut . . . . . . . . . : Liste de connexion RNIS par défaut . . . . . . . : QDCCNNLANY Support ANYNET admis . . . . . . . . . . . . . . : *NO Domaine du serveur de réseau . . . . . . . . . . : S4409790 ######################################################################## # # # Pour utiliser ces concepts avec Client/Access vous devez saisir : # # CHGNETA PCSACC(*REGFAC) # # # # ce qui permet d'avoir un pgm de contrôle par fonction # # (et non un pgm général comme en V2R30) # # # ######################################################################## Fin Appuyez sur ENTREE pour continuer. F3=Exit F12=Annuler
Work with Registration Info (WRKREGINF) Indiquez vos choix, puis appuyez sur ENTREE. Exit point . . . . . . . . . . . EXITPNT *REGISTERED Exit point format . . . . . . . FORMAT *ALL Output . . . . . . . . . . . . . OUTPUT * ######################################################################### # # # Puis utilisez WRKREGINF qui affiche tous les points d'exit définis. # # # ######################################################################### Fin F3=Exit F4=Invite F5=Réafficher F12=Annuler F13=Mode d'emploi invite F24=Autres touches
 voici la liste des points d'exit définis en V4R20 :
 Exit
 Point                 Format     Text
---------------------------------------------------------------------------
 QIBM_QHQ_DTAQ         DTAQ0100   Original Data Queue Server
 QIBM_QJO_DLT_JRNRCV   DRCV0100   Delete Journal Receiver
 QIBM_QLZP_LICENSE     LICM0100   Original License Mgmt Server
 QIBM_QMF_MESSAGE      MESS0100   Original Message Server
 QIBM_QNPS_ENTRY       ENTR0100   Network Print Server - entry
 QIBM_QNPS_SPLF        SPLF0100   Network Print Server - spool
 QIBM_QOE_OV_USR_ADM   UADM0100   OfficeVision/400 Administration
 QIBM_QOE_OV_USR_SND   DOCI0900   OfficeVision/400 Mail Send Exit point
 QIBM_QOK_NOTIFY       VRFY0100   System Directory Notify Exit point
 QIBM_QOK_SUPPLIER     SUPL0100   System Directory Supplier Exit point
 QIBM_QOK_VERIFY       VRFY0100   System Directory Verify Exit point
 QIBM_QPWFS_FILE_SERV  PWFS0100   File Server
 QIBM_QRQ_SQL          RSQL0100   Original Remote SQL Server
 QIBM_QSU_LCMD         EXTP0100   EXIT POINT FOR SEU USER DEFINE COMMANDS
              
              
 QIBM_QSY_CHG_PROFILE  CHGP0100   Change User Profile
 QIBM_QSY_CRT_PROFILE  CRTP0100   Create User Profile
 QIBM_QSY_DLT_PROFILE  DLTP0100   Delete User Profile - after delete
 QIBM_QSY_DLT_PROFILE  DLTP0200   Delete User Profile - before delete
 QIBM_QSY_RST_PROFILE  RSTP0100   Restore User Profile
 QIBM_QTA_STOR_EX400   EX400200   Storage Extension Exit Program
 QIBM_QTA_TAPE_TMS     TMS00200   Tape Management Exit Program
 QIBM_QTF_TRANSFER     TRAN0100   Original File Transfer Function
 QIBM_QTG_DEVINIT      INIT0100   Telnet Device Initialization
 QIBM_QTG_DEVTERM      TERM0100   Telnet Device Termination
 QIBM_QTMF_CLIENT_REQ  VLRQ0100   FTP Client Request Validation
 QIBM_QTMF_SERVER_REQ  VLRQ0100   FTP Server Request Validation
 QIBM_QTMF_SVR_LOGON   TCPL0100   FTP Server Logon
 QIBM_QTMT_WSG         QAPP0100   WSG Server Sign-On Validation
 QIBM_QTMX_SERVER_REQ  VLRQ0100   REXEC Server Request Validation
 QIBM_QTMX_SVR_LOGON   TCPL0100   REXEC Server Logon
 QIBM_QTOD_DHCP_ABND   DHCA0100   DHCP Address Binding Notify
 QIBM_QTOD_DHCP_ARLS   DHCR0100   DHCP Address Release Notify
 QIBM_QTOD_DHCP_REQ    DHCV0100   DHCP Request Packet Validation
 QIBM_QTOD_SERVER_REQ  VLRQ0100   TFTP Server Request Validation
              
              
 QIBM_QVP_PRINTERS     PRNT0100   Original Virtual Print Server
 QIBM_QWC_PWRDWNSYS    PWRD0100   Prepower down system exit point
 QIBM_QWC_QSTGLOWACN   STGL0100   Auxiliary storage lower limit
 QIBM_QWT_JOBNOTIFY    NTFY0100   JOB NOTIFICATION
 QIBM_QWT_PREATTNPGMS  ATTN0100   Preattention program exit point
 QIBM_QWT_SYSREQPGMS   SREQ0100   Presystem request pgm exit point
 QIBM_QZCA_ADDC        ZCAA0100   Add Client exit point
 QIBM_QZCA_REFC        ZCAF0100   Refresh Client Information exit point
 QIBM_QZCA_RMVC        ZCAR0100   Remove Client exit point
 QIBM_QZCA_SNMPTRAP    ZCAT0100   SNMP trap routing exit point
 QIBM_QZCA_UPDC        ZCAU0100   Update Client Information exi
 QIBM_QZDA_INIT        ZDAI0100   Database Server - entry
 QIBM_QZDA_NDB1        ZDAD0100   Database Server - data base access
 QIBM_QZDA_NDB1        ZDAD0200   Database Server - data base access
 QIBM_QZDA_ROI1        ZDAR0100   Database Server - object information
 QIBM_QZDA_ROI1        ZDAR0200   Database Server - object information
 QIBM_QZDA_SQL1        ZDAQ0100   Database Server - SQL access
 QIBM_QZDA_SQL2        ZDAQ0200   Database Server - SQL access
 QIBM_QZHQ_DATA_QUEUE  ZHQ00100   Data Queue Server
              
              
 QIBM_QZMFMSF_ACT      MSFF0100   MSF Accounting Exit
 QIBM_QZMFMSF_ADR_RSL  MSFF0100   MSF Address Resolution
 QIBM_QZMFMSF_ATT_CNV  MSFF0100   MSF Attachment Conversion
 QIBM_QZMFMSF_ATT_MGT  MSFF0100   MSF Attachment Management
 QIBM_QZMFMSF_ENL_PSS  MSFF0100   MSF Envelope Processing
 QIBM_QZMFMSF_LCL_DEL  MSFF0100   MSF Local Delivery
 QIBM_QZMFMSF_LST_EXP  MSFF0100   MSF List Expansion
 QIBM_QZMFMSF_MSG_FWD  MSFF0100   MSF Message Forwarding
 QIBM_QZMFMSF_NON_DEL  MSFF0100   MSF Non Delivery
 QIBM_QZMFMSF_SEC_AUT  MSFF0100   MSF Security and Authority
 QIBM_QZMFMSF_TRK_CHG  MSFF0100   MSF Track Mail Message Change
 QIBM_QZMFMSF_VLD_TYP  MSFF0100   MSF Validate Type
 QIBM_QZRC_RMT         CZRC0100   Remote Command/Program Call
 QIBM_QZSC_LM          ZSCL0100   Central Server - license mgmt
 QIBM_QZSC_NLS         ZSCN0100   Central Server - conversion map
 QIBM_QZSC_SM          ZSCS0100   Central Server - client mgmt
 QIBM_QZSO_SIGNONSRV   ZSOY0100   TCP Signon Server
  comment associer un programme :
              
              Work with Registration Information Type options, press Enter. 5=Display exit point 8=Work with exit programs <-- Exit Exit Point Opt Point Format Registered Text QIBM_QHQ_DTAQ DTAQ0100 *YES Original Data Queue Server QIBM_QLZP_LICENSE LICM0100 *YES Original License Mgmt Server QIBM_QMF_MESSAGE MESS0100 *YES Original Message Server QIBM_QNPS_ENTRY ENTR0100 *YES Network Print Server - entry QIBM_QNPS_SPLF SPLF0100 *YES Network Print Server - spool QIBM_QOE_OV_USR_ADM UADM0100 *YES OfficeVision/400 Administrati QIBM_QOK_SUPPLIER SUPL0100 *YES System Directory Supplier Exi QIBM_QOK_VERIFY VRFY0100 *YES System Directory Verify Exit 8 QIBM_QPWFS_FILE_SERV PWFS0100 *YES File Server QIBM_QRQ_SQL RSQL0100 *YES Original Remote SQL Server A suivre... Command ===> F3=Exit F4=Prompt F9=Retrieve F12=Cancel
Work with Exit Programs Exit point: QIBM_QPWFS_FILE_SERV Format: PWFS0100 Type options, press Enter. 1=Add 4=Remove 5=Display 10=Replace Exit Program Exit Opt Number Program Library 1 (No exit programs found.) #################################################################### # # # Sur cet écran 1 = ADDEXITPGM : ajout d'un pgm d'exit # # 4 = RMVEXITPGM : retrait d'un pgm d'exit # # # #################################################################### Fin Command ===> F3=Exit F4=Prompt F5=Refresh F9=Retrieve F12=Cancel
 Quelques précisions :
  un point d'exit peut avoir plusieurs "formats".
     il s'agit de la définition de plusieurs actions pouvant être réalisées
      par la même fonction.
      exemple du point d'exit QIBM_QZDA_NDB1 serveur de données (ODBC) :
      format ZDAD0100 = gestion de la base (CREATE, DROP, etc...)
             ZDAD0200 = Gestion de la liste de bibliothèques (ADDLIBLE)
     chaque format définit la structure des données envoyées au pgm.
     pour connaitre le détail d'un format voir la documentation
     SC41-374 : "OS/400 server concept and administration "
  Ci-dessous, les plus importants :
              
              QIBM_QPWSF_FIle_Serveur : serveur de fichier V3R10 Format PWFS0100 : - CHAR(10) Profil utilisateur - CHAR(10) fonction = '*FILESRV' - BIN(4) Action : 1 = modif des attributs 2 = création (STMF ou directory) 3 = supression ( " " ) 4 = liste des attributs 5 = MOV 6 = OPEN 7 = RNM 8 = Allocate d'une conversation - CHAR(8) format = 'PWFS0100' - CHAR(4) type d'ouverture (1=oui, 0=non) - CHAR(1) Read - CHAR(1) write - CHAR(1) Read/write - CHAR(1) delete possible
                     - BIN(4)  lg du nom de fichier
                     - CHAR(??) nom du fichier
                       y compris le chemin, lg maxi 16Mo.
  ATTENTION : le nom du fichier est donné en UNICODE.
 Il s'agit d'une norme de codification ISO (basée sur l'ASCII) qui tient
  compte des paramètres nationaux :
  - codée sur deux octets pour les idéogrammes asiatiques (DBCS)
    en france le premier octet vaut TOUJOURS x'00'
  - tenant compte du code page et des caractères accentués (comme l'ANSI)
 Voir l'exemple ci-dessous qui propose une conversion EBCDIC/UNICODE pour
  les chiffres et les caractères sans accents (partie invariante du LATIN 1)
              
              PGM PARM(&VALID &PARAM) DCL VAR(&VALID) TYPE(*CHAR) LEN(1) DCL VAR(&PARAM) TYPE(*CHAR) LEN(512) DCL VAR(&LGPATH) TYPE(*DEC) LEN(9 0) DCL VAR(&UNICODE) TYPE(*CHAR) LEN(128) DCL VAR(&PATH) TYPE(*CHAR) LEN(64) /*********************************************************************/ /*QIBM_QPWSF_FIle_Serveur : serveur de fichier V3R10 */ /* */ /*Format PWFS0100 : - CHAR(10) Profil utilisateur */ /* - CHAR(10) fonction = '*FILESRV' */ /* - BIN(4) Action : 1 = modif des attributs */ /* 2 = création (STMF ou director*/ /* 3 = supression ( " " */ /* 4 = liste des attributs */ /* 5 = MOV */ /* 6 = OPEN */ /* 7 = RNM */ /* 8 = Allocate d'une conversatio*/ /* */
/* - CHAR(8) format = 'PWFS0100' */ /* - CHAR(4) type d'ouverture (1=oui, 0=non) */ /* - CHAR(1) Read */ /* - CHAR(1) write */ /* - CHAR(1) Read/write */ /* - CHAR(1) delete possible */ /* 37 A 40 - BIN(4) lg du nom de fichier */ /* 41 A -- - CHAR(??) nom du fichier */ /* */ /*********************************************************************/ /* EXTRACTION DES PARAMETRES */ CHGVAR VAR(&LGPATH) VALUE(%BIN(&PARAM 37 4)) IF COND(&LGPATH > 128) THEN(CHGVAR VAR(&LGPATH) + VALUE(128)) CHGVAR VAR(&UNICODE) VALUE(%SST(&PARAM 41 &LGPATH)) /* CVT UNICODE -> EBCDIC */ CALL UNICODE PARM(&UNICODE 128 &PATH) /* REFUS SI CHEMIN COMMENCE PAR QSYS.LIB */ IF (%SST(&PATH 1 9) = '/QSYS.LIB') CHGVAR &VALID '0' /* SINON OK */ ELSE CHGVAR &VALID '1' ENDPGM
puis le PRG associé : *********************************************************************** ** ** ** Ce pgm convertit des données UNICODE en EBCDIC. ** ** ** ** le premier paramètre contient la chaîne de caractères en UNICODE ** ** - chaque caractère est codé sur 2 octets (pour DBCS) ** ** 1er octet x'00' ** ** 2ème octet le caractère en ASCII ** ** - le deuxième paramètre donne la longueur du premier ** ** - le troisième paramètre est la variable qui contiendra ** ** le code EBCDIC (elle doit être de 2 fois plus petite) ** ** ** ** ATTENTION ** ** ** ** ce programme ne tient pas compte des paramètres nationaux ** ** (caractères accentués), il n'est donc fiables que pour ** ** la partie invariante des codes page ** ***********************************************************************
     Dinput            s           2048
     Doutput           s           1024
     Dunids            ds
     Dunicod                       2048
     Dunitab                          1    dim(2048) overlay(unicod)
     Debcds            ds
     Debcdic                       1024
     Debctab                          1    dim(1024) overlay(ebcdic)
     Dinl              s             15  5
     Dinl2             s              5  0
     Doutl             s              5  0
     Di                s              5  0
     Dqebcdic          s             10    inz('QEBCDIC')
     Dqebcdiclib       s             10    inz('*LIBL')
     C     *entry        plist
     C                   parm                    input
     C                   parm                    inl
     C                   parm                    output
      * la lg d'output doit être inl / 2
     c                   eval      inl2 = inl
     C                   eval      unicod = %subst(input:1:inl2)
     c                   eval      outl = inl2 / 2
                    * ignorer tous les octets impaires (1,3,5,...)
     c                   do        inl2          z                 4 0
     c     z             div       2             result            4 0
     c                   mvr                     reste             1 0
     c                   if        reste = 0
     c                   eval      i = i + 1
     c                   eval      ebctab(i) = unitab(z)
     c                   endif
     c                   enddo
      * cvt ascii / ebcdic
     c                   call      'QDCXLATE'
     C                   PARM                    outl
     C                   PARM                    ebcdic
     C                   PARM                    qebcdic
     C                   PARM                    qebcdiclib
     c                   eval       %subst(output:1:outl) = ebcdic
     c                   eval       *inlr = *on
              
              
 QIBM_QTF_Transfert : Transfert de fichiers
 Format TRAN0100 :   - CHAR(10)   Profil utilisateur
                     - CHAR(10)   fonction = '*TFRCTL'
                     - CHAR(10)   action 'SELECT'
                                         'JOIN'
                                         'REPLACE'
                                         'EXTRACT'
                     - CHAR(10)   fichier
                     - CHAR(10)   bibliothèque
                     - CHAR(10)   membre
                     - CHAR(8)    format = 'TRAN0100'
                     - BIN(4)     lg zone suivante
                     - CHAR(??)   requête.
              
              QIBM_QZDA_INIT : lancement de la fonction serveur de données (ODBC) Format ZDAI0100 - CHAR(10) Profil utilisateur - CHAR(10) fonction = '*SQL' - CHAR(8) format = 'ZDAI0100' - BIN(4) toujours à 0 QIBM_QZDA_NDB1 : fonction serveur de données (ODBC): Format ZDAD0100 : (gestion de la base de données) - CHAR(10) Profil utilisateur - CHAR(10) fonction = '*NDB' - CHAR(8) format = 'ZDAD0100' - BIN(4) action
             actions possibles : 6144 CRTSRCPF
                                 6145 Création d'un fichier (basé sur
                                       un fichier modèle)
                                 6146 Ajout de membre
                                 6147 Mise à blanc d'un membre
                                 6148 Supression d'un membre
                                 6149 OVRDBF
                                 6150 DLTOVR
                                 6153 DLTF
                     - CHAR(128)  Nom du fichier(support des noms longs SQL)
                     - CHAR(10)   Bibliothèque
                     - CHAR(10)   Membre
                     - CHAR(10)   Autorisations (si création)
                     - CHAR(128)  Nom du fichier sur modèle (création)
              
                                   - CHAR(10)   Bibliothèque
                     - CHAR(10)   Nom du fichier de substitution
                     - CHAR(10)   Bibliothèque de subsitution
                     - CHAR(10)   membre de substitution
 Format ZDAD0200 : (gestion de la liste de bibliothèques)
                     - CHAR(10)   Profil utilisateur
                     - CHAR(10)   fonction = '*NDB'
                     - CHAR(8)    format = 'ZDAD0200'
                     - BIN(4)     action : 6156 = ADDLIBLE
                     - BIN(4)     nombre de bibliothèques ajoutées
                     - CHAR(??)    liste des bibliothèques ajoutées.
              
              QIBM_QZDA_SQL1 : fonction serveur de données (ODBC): Format ZDAQ0100 : (Requêtes SQL via ODBC) - CHAR(10) Profil utilisateur - CHAR(10) fonction = '*SQLSRV' - CHAR(8) format = 'ZDAQ0100' - BIN(4) action actions possibles : code| instruction SQL 6147 prepare & describe 6148 open 6149 execute 6150 execute immediate 6153 connect (DRDA) 6157 prepare & execute ou prepare & open 6158 open & fetch A suivre ...
                                 6159 create package
                                 6160 clear package
                                 6161 delete package
                                 6162 execute & open
                                 6166 prepare
                                 6158 open & fetch
                     - CHAR(18)  Nom de l'instruction
                     - CHAR(18)  Nom du curseur
                     - CHAR(2)   options pour PREPARE
                     - CHAR(2)   options pour OPEN
                     - CHAR(10)  Nom du SQL Package
                     - CHAR(10)   Bibliothèque du SQL Package
                     - BIN(2)    DRDA 0 = base locale
                                      1 = remote database
              
              
                     - CHAR(1)   Type de validation et verrouillage
                                 A = *ALL
                                 C = *CHANGE
                                 N = *NONE
                                 S = *CS
                     - CHAR(512)  512 premiers caractères de la requête.
 QIBM_QZRC_RNT : Remote commande et procédures cataloguées.
 Format CZRC0100 :
                     - CHAR(10)   Profil utilisateur
                     - CHAR(10)   fonction = '*RMTSRV'
                     - CHAR(8)    format = 'CZRC0100'
                     - BIN(4)     action : 1002  remote commande
                                           1003  remote procedure call
              
              pour action 1002 (remote commande) - CHAR(10) réservé. - BIN(4) lg de la commande - CHAR(??) la commande pour action 1003 (remote procedure call) - CHAR(10) programme - CHAR(10) bibliothèque - BIN(4) nombre de paramètre - CHAR(??) paramètres /x fois le découpage suivant: . BIN(4) lg de la zone . BIN(4) lg maxi . BIN(2) 1=input,2=output,3=I/O . CHAR(??) paramètre
             PGM        PARM(&VALID &PARAM)
             DCL        VAR(&VALID) TYPE(*CHAR) LEN(1)
             DCL        VAR(&PARAM) TYPE(*CHAR) LEN(2028)
             DCL        VAR(&message) TYPE(*CHAR) LEN(512)
/*********************************************************************/
/*QIBM_QZDA_... :  serveur de BASE DE DONNéES (TFR ET ODBC)          */
/*                                                                   */
/*                                                                   */
/*********************************************************************/
             CALLPRC    PRC(FILSRVS2) PARM(&PARAM &message)
             if (&message = ' ') then(chgvar &message ¶m)
             SNDMSG     MSG(&MESSAGE) TOUSR(*SYSOPR)
/* REFUS                                                             */
/*            CHGVAR &VALID '0'                                      */
/* SINON OK                                                          */
             CHGVAR &VALID '1'
             ENDPGM
              
                    * =============== copier le source de QSYSINC ======================
      /copy qsysinc.qrpglesrc,EZDAEP
      *===================================================================
         ...  /  ...
      * =============== fin de copie======================================
     Dparam            DS
     D profil                        10
     D serverID                      10
     D format                         8
     D filler                      2000
     dtblaction        s              9B 0 dim(8)
     d                                     ctdata perrcd(1)
     dtblcde           s             10    dim(8)
     d                                     ctdata perrcd(1)
     D i               s              2  0
              
              
     C     *entry        plist
     C                   parm                    param
     C                   parm                    msg             512
     c                   select
      * connection
     c                   when      format = 'ZDAI0100'
     c                   eval      ezdqif = param
     c                   exsr      connectSR
      * gestion des fichiers
     c                   when      format = 'ZDAD0100'
     c                   eval      ezdndbf1 = param
     c                   exsr      wrkbaseSR
      * gestion de *libl
     c                   when      format = 'ZDAD0200'
     c                   eval      ezdndbf2 = param
     c                   exsr      addliblSR
              
              * extraction d'informations/fichier c when format = 'ZDAR0100' c eval ezdroif1 = param c exsr dspffdSR * extraction d'informations(clé primaire) c when format = 'ZDAR0200' c eval ezdroif2 = param c exsr pfcstSR * requete SQL (<= 512 octets) c when format = 'ZDAQ0100' c eval ezdqsqlf = param c exsr sql1SR * requete SQL (> 512 octets) c when format = 'ZDAQ0200' c eval ezdsqlf2 = param c exsr sql2SR c endsl c return
      *+++
      *+++  sous/pgms
      *+++
     c     connectSR     begsr
     c                   eval      msg = profil + ' se connecte'
     c                   endsr
     c     wrkbaseSR     begsr
     c                   eval      i = 1
     c     EZDFID00      lookup    tblaction(i)                           50
     c                   eval      msg = profil + ' lance la commande ' +
     c                              tblcde(i)
     c                   endsr
     c     addliblSR     begsr
     c                   eval      msg = profil + ' ajoute ' +
     c                              EZDLN00(1) + ' à *libl'
     c                   endsr
              
              c dspffdSR begsr c eval msg = profil + ' extrait des infos sur ' c + EZDFILN00 c endsr c pfcstSR begsr c eval msg = profil + ' demande la clé de ' c + EZDPKN c endsr c sql1SR begsr c eval msg = profil + ' exécute la requête ' c + EZDSQLST c endsr c sql2SR begsr c eval msg = profil + ' exécute la requête ' c + EZDSQLST00 c endsr
** tblaction
000006144
000006145
000006146
000006147
000006148
000006149
000006150
000006153
** tblcde
CRTSRCPF
CRTPF
ADDPFM
CLRPFM
RMVM
OVRDBF
DLTOVR
DLTF
              
              
 En V4R2 : il y a de nombreux nouveaux points d'exit basés sur TCP/IP
    remarquons QIBM_QTG_DEVINIT démarrage d'une session Telnet
               QIBM_QTG_DEVTERM clôture d'une session Telnet
 QIBM_QTG_DEVINIT
      paramètres recus :
                    1/ User      -> c'est un structure indiquant les
                                     caractèristiques d'une ouverture avec
                                     saut de signon
                       + Binaire (4)   lg de la structure
                       + CHAR(10)      profil à utiliser
                       + CHAR(10)      curlib [val. *USRPRF admise]
                       + CHAR(10)      pgm    [val. *USRPRF admise]
                       + CHAR(10)      menu   [val. *USRPRF admise]
              
              
                      2/ Device    -> c'est un structure indiquant les
                                       caractèristiques de l'unité à utiliser
                         + CHAR(10)      nom de l'unité
                         + CHAR(8)       format
                                          DSPD0100 = Ecran (seul en V4R2)
                         + CHAR(2)       réservé
                         + BIN(4)        OFFSET pour dspd0100 = 29
                         + BIN(4)        lg de dspd0100 = 12
                         + CHAR(16)      structure DSPD0100 contenant
                                         ° CHAR(3) clavier = FAB en france
                                         ° CHAR(1) réservé
                                         ° BIN(4)  code page = 297
                                         ° BIN(4)  jeux de car. = 697
              
              3/ infos de connexion (structure) + BIN(4) lg de la structure à suivre + sous-structure contenant l'adresse IP ° CHAR(1) taille de l'adresse en binaire ° CHAR(1) type d'adresse x'02' = IP x'06' = IPX ° BIN(2) n° de port ° CHAR(16) adresse IP constituée de 4 fois 4 octets binaires. + le mot de passe est-il validé ? - 0 = non - 1 = oui (transmis en clair) - 2 = oui (transmis crypté)
                      4/ environnement
                         selon la RFC1572 il est possible de fixer des
                          variables d'environnement pour TELNET
                         (particulièrement dans le monde Unix)
                         cette zone contient en clair les variables
                          d'environnement et leur contenu.
                      5/ lg de la zone environnement
                      6/ connexion
                         0 = rejeté
                         1 = autorisée
                      7/ saut du signon
                         0 = rejeté
                         1 = autorisée
              
              
  QIBM_QTG_DEVTERM     clôture d'une session TELNET
       paramètres recus :
                     1/ CHAR(10)  nom de l'unité
  Voici un exemple de programme associé à l'initialisation d'une session
   TELNET.
   Il s'agit ici de refuser toute station dont l'adresse IP ne commence
      PAS par 10.3.*
   et d'attribuer des noms significatifs à certains postes (NS en autre)
      (JUIN 98, cela ne marche pas en VT/100  ???)
              
              
     Dbinaire          S             10I 0
     Dnomvalide        S             10
     Duser             ds
     D  userlg                             like(binaire)
     D  profil                             like(nomvalide)
     D  curlib                             like(nomvalide)
     D  menu                               like(nomvalide)
     Ddevice           ds
     D  unite                              like(nomvalide)
     D  format                        8
     D    filler                      2
     D  offset                             like(binaire)
     D  dspd0100lg                         like(binaire)
     d  dspd0100                     12
     d    clavier                     3    overlay(dspd0100)
     d    codepage                         overlay(dspd0100:5) like(binaire)
     d    charset                          overlay(dspd0100:9) like(binaire)
              
              
     Dconnection       ds
     D  connectlg                          like(binaire)
     D  adresseclient                20
     D     adrtaille                  1    overlay(adresseclient)
     D     adrtype                    1    overlay(adresseclient:2)
     D     adrport                    2    overlay(adresseclient:3)
     D     adresse                   16    overlay(adresseclient:5)
     D       ip12                     5I 0 overlay(adresse)
     D       ip34                     5I 0 overlay(adresse:3)
     D  password                      1
     D adresseip       c                   x'02'
     D adresseipx      c                   x'06'
     D pas_de_pwd      c                   0
     D pwd_en_clair    c                   1
     D pwd_crypte      c                   2
     Denv              S             32
     Denvlg            S                   like(binaire)
              
                   Dconnect          S              1
     D connect_refus   c                   '0'
     D connect_ok      c                   '1'
     Dsaut_signon      S              1
     D saut_refus      c                   '0'
     D saut_ok         c                   '1'
     Dmessage          s           1024
     Dmessagelg        s                   inz(%size(message)) like(binaire)
     Dmessagetype      s             10    inz('*INFO')
     Dmessageq         s             20    inz('PCAF4     *LIBL')
     Dmessageqnb       s                   inz(1) like(binaire)
     DCODERR           DS
     D  LGCOD                              like(binaire)   INZ(16)
     D  LGUTIL                             like(binaire)
     D  MSGID                         7
     D  RESERV                        1
     Dadrchar          ds
     D  dec1                          3  0
     D  dec2                          3  0
              D dec3 3 0 D dec4 3 0 C *entry plist C parm user C parm device C parm connection C parm env C parm envlg C parm connect C parm saut_signon c ip12 div 256 dec1 c mvr dec2 c ip34 div 256 dec3 c mvr dec4 c if dec1 <> 10 or dec2 <> 3 c eval connect = connect_refus
     c                   else
     c                   eval      connect = connect_ok
     c                   eval      saut_signon = saut_refus
     c                   eval      format = 'DSPD0100'
     c                   eval      offset = 29
     c                   eval      dspd0100lg = 12
     c                   eval      clavier = 'FAB'
     c                   eval      codepage = 297
     c                   eval      charset = 697
     c                   if        dec3 = 1 and dec4 = 5
     c                   eval      unite = 'VTNT'
     c                   endif
     c                   if        dec3 = 1 and dec4 = 9
     c                   eval      unite = 'VTLINUX'
     c                   endif
     c                   if        dec3 = 2 and dec4 = 1
     c                   eval      unite = 'DSPNS'
     c                   endif
     c                   endif
              
              c* c* envoi d'un message (voir plus haut) lors de la mise au point . c* c* eval message = user + '/' + device + '/' + c* connection + '/' + adrchar c* call 'QMHSNDBM' c* parm message c* parm messagelg c* parm messagetype c* parm messageq c* parm messageqnb c* parm messageq c* parm coderr c eval *inlr = *on début
              
