TN5250SEC

TN5250SEC (RPGLE)



  X * SECUREENV BEGSR TN5250SEC 31  
  X * SECURESSN BEGSR TN5250SEC 15  
  X * SECUREGET BEGSR TN5250SEC 9  
  X * SECURECLOSE BEGSR TN5250SEC 9  
  X * RECVREAD BEGSR TN5250SEC 9  
  X * SENDWRITE BEGSR TN5250SEC 11  
  X * SENDWRITE2 BEGSR TN5250SEC 11  
  X * COUNTRC BEGSR TN5250SEC 8  
  X  
H  
H *COPYRIGHT JÜRGEN REULE 2019-2023
H  
H /IF NOT DEFINED(TN5250S)
H  
H DATFMT(*ISO) TIMFMT(*ISO)
H DFTACTGRP(*NO) ACTGRP('QILE')
H COPYRIGHT('COPYRIGHT JÜRGEN REULE 2019-2023')
H  
D SOCKET     PR   10 I 0   EXTPROC('socket')
D FAMILY         10 I 0   VALUE
D TYPE         10 I 0   VALUE
D PROTOCOL         10 I 0   VALUE
D                    
D CONNECT     PR   10 I 0   EXTPROC('connect')
D DESC         10 I 0   VALUE
D ADDR           *     VALUE
D ADDRLEN         10 I 0   VALUE
D                    
D RECV     PR   10 I 0   EXTPROC('recv')
D DESC         10 I 0   VALUE
D BUFFER           *     VALUE
D COUNT         10 I 0   VALUE
D FLAGS         10 I 0   VALUE
D                    
D SEND     PR   10 I 0   EXTPROC('send')
D DESC         10 I 0   VALUE
D BUFFER           *     VALUE
D COUNT         10 I 0   VALUE
D FLAGS         10 I 0   VALUE
D                    
D CLOSE     PR   10 I 0   EXTPROC('close')
D DESC         10 I 0   VALUE
D                    
D FCNTL     PR   10 I 0   EXTPROC('fcntl')
D DESC         10 I 0   VALUE
D COMMAND         10 I 0   VALUE
D ARG         10 I 0   VALUE OPTIONS(*NOPASS)
D                    
D NONBLOCK     C           CONST(128)
D                    
D GETFL     C           CONST(6)
D SETFL     C           CONST(7)
D                    
D AFUNSPEC     C           CONST(0)
D AFINET     C           CONST(2)
D AFINET6     C           CONST(24)
D                    
D AINUMERICSERV     C           CONST(8)
D AINUMERICHOST     C           CONST(4)
D                    
D SOCKSTREAM     C           CONST(1)
D                    
D IPPROTOIP     C           CONST(0)
D                    
D INADDRANY     C           CONST(*ZERO)
D INADDRNONE     C           CONST(*HIVAL)
D                    
D SERVERADDR     S   4 A     INZ
D SERVERADDR6     S   16 A     INZ
D                    
D SOCKADDR     S     *     INZ
D SOCKADDRINLEN     C           CONST(%SIZE(SOCKADDRIN))
D SOCKADDRIN6LEN     C           CONST(%SIZE(SOCKADDRIN6))
D                    
D SOCKADDRIN     DS           BASED(SOCKADDR)
D SINFAMILY         5 I 0    
D SINPORT         5 U 0    
D SINADDR         10 U 0    
D SINZERO         8 A      
D                    
D SOCKADDRIN6     DS           BASED(SOCKADDR)
D SIN6FAMILY         5 I 0    
D SIN6PORT         5 U 0    
D SIN6FLOWINFO         10 U 0    
D SIN6ADDR         16 A      
D SIN6SCOPEID         10 U 0    
D                    
D SIN     S           LIKE(SOCKADDRIN)
D SINPTR     C           CONST(%ADDR(SIN))
D                    
D SIN6     S           LIKE(SOCKADDRIN6)
D SIN6PTR     C           CONST(%ADDR(SIN6))
D                    
D RESX     S     *     INZ
D                    
D RESDS     DS           BASED(RESX)
D RESFLAGS         10 I 0    
D RESFAMILY         10 I 0    
D RESSOCKTYPE         10 I 0    
D RESPROTOCOL         10 I 0    
D RESADDRLEN         10 I 0    
D RESCANONNAME           *      
D RESADDR           *      
D RESNEXT           *      
D                    
D HINTS     DS            
D HINTSFLAGS         10 I 0   INZ
D HINTSFAMILY         10 I 0   INZ
D HINTSSOCKTYPE         10 I 0   INZ
D HINTSPROTOCOL         10 I 0   INZ
D HINTSADDRLEN         10 I 0   INZ
D HINTSCANONNAME           *     INZ
D HINTSADDR           *     INZ
D HINTSNEXT           *     INZ
D                    
D INETADDR     PR   10 U 0   EXTPROC('inet_addr')
D ADDRESSSTR           *     VALUE OPTIONS(*STRING)
D                    
D INETPTON     PR   10 I 0   EXTPROC('inet_pton')
D FAMILY         10 I 0   VALUE
D SRC           *     VALUE OPTIONS(*STRING)
D DST         128 A     OPTIONS(*VARSIZE)
D                    
D GETHOSTBYNAME     PR     *     EXTPROC('gethostbyname')
D HOSTNAME           *     VALUE OPTIONS(*STRING)
D                    
D GETADDRINFO     PR   10 I 0   EXTPROC('getaddrinfo')
D NODENAME           *     VALUE OPTIONS(*STRING)
D SERVNAME           *     VALUE OPTIONS(*STRING)
D HINTS                 LIKE(HINTS) OPTIONS(*OMIT)
D RES           *      
D                    
D FREEADDRINFO     PR           EXTPROC('freeaddrinfo')
D LIST           *     VALUE
D                    
D ADDRX     S   10 U 0   INZ
D                    
D HOSTX     S     *     INZ
D                    
D HOSTDS     DS           BASED(HOSTX)
D HOSTNAME           *      
D HOSTALIASES           *      
D HOSTADDRTYPE         10 I 0    
D HOSTLENGTH         10 I 0    
D HOSTADDRLIST           *      
D HOSTADDR     S     *     BASED(HOSTADDRLIST)
D HOSTADDRENTRY     S   10 U 0   BASED(HOSTADDR)
D                    
D SD     S   10 I 0   INZ
D RC     S   10 I 0   INZ
D COUNT     S   10 I 0   INZ
D FLAGS     S   10 I 0   INZ
D                    
D       DS            
D BUF2         32767 A     INZ VARYING
D BUF2LEN         5 U 0   OVERLAY(BUF2)
D BUF2TEXT         32767 A     OVERLAY(BUF2:*NEXT)
D BUF2TEXTLEN     C           CONST(%SIZE(BUF2TEXT))
D BUF2TEXTPTR     C           CONST(%ADDR(BUF2TEXT))
D                    
D CHAR     S   1 A     INZ
D CHARPTR     C           CONST(%ADDR(CHAR))
D                    
D CHARDS     DS           INZ
D CHAR1         1 A     INZ
D CHAR2                 INZ
D CHAR21         1 A     INZ OVERLAY(CHAR2)
D CHAR22         1 A     INZ OVERLAY(CHAR2:*NEXT)
D CHARDSPTR     C           CONST(%ADDR(CHARDS))
D                    
D RMTHOST     S   255 A     INZ('LOOPBACK') VARYING
D RMTPORT     S   5 U 0   INZ(992)
D RMTSECURE     S   1 A     INZ('X')
D                    
D /ENDIF
D                    
D /IF NOT DEFINED(TN5250S2)
D /IF NOT DEFINED(TN5250SNO)
D                    
D ENVOPEN     PR   10 I 0   EXTPROC('gsk_environment_open')
D ENV           *      
D ENVINIT     PR   10 I 0   EXTPROC('gsk_environment_init')
D ENV           *     VALUE
D ENVCLOSE     PR   10 I 0   EXTPROC('gsk_environment_close')
D ENV           *      
D                    
D SECOPEN     PR   10 I 0   EXTPROC('gsk_secure_soc_open')
D ENV           *     VALUE
D SSN           *      
D SECINIT     PR   10 I 0   EXTPROC('gsk_secure_soc_init')
D SSN           *     VALUE
D SECCLOSE     PR   10 I 0   EXTPROC('gsk_secure_soc_close')
D SSN           *      
D                    
D SECMISC     PR   10 I 0   EXTPROC('gsk_secure_soc_misc')
D SSN           *     VALUE
D MISCID         10 I 0   VALUE
D                    
D SECREAD     PR   10 I 0   EXTPROC('gsk_secure_soc_read')
D SSN           *     VALUE
D BUF           *     VALUE
D BUFSIZE         10 I 0   VALUE
D AMOUNT         10 I 0    
D                    
D SECWRITE     PR   10 I 0   EXTPROC('gsk_secure_soc_write')
D SSN           *     VALUE
D BUF           *     VALUE
D BUFSIZE         10 I 0   VALUE
D AMOUNT         10 I 0    
D                    
D GETBUFFER     PR   10 I 0   EXTPROC('gsk_attribute_get_buffer')
D ENVSSN           *     VALUE
D BUFID         10 I 0   VALUE
D BUF           *     VALUE
D BUFSIZE         10 I 0    
D                    
D SETBUFFER     PR   10 I 0   EXTPROC('gsk_attribute_set_buffer')
D ENVSSN           *     VALUE
D BUFID         10 I 0   VALUE
D BUF           *     VALUE OPTIONS(*STRING)
D BUFSIZE         10 I 0   VALUE
D                    
D GETENUM     PR   10 I 0   EXTPROC('gsk_attribute_get_enum')
D ENVSSN           *     VALUE
D ENUMID         10 I 0   VALUE
D ENUMVAL         10 I 0    
D                    
D SETENUM     PR   10 I 0   EXTPROC('gsk_attribute_set_enum')
D ENVSSN           *     VALUE
D ENUMID         10 I 0   VALUE
D ENUMVAL         10 I 0   VALUE
D                    
D GETNUMVAL     PR   10 I 0   EXTPROC('gsk_attribute_get_+
D                                  numeric_value')
D ENVSSN           *     VALUE
D NUMID         10 I 0   VALUE
D NUMVAL         10 I 0    
D                    
D SETNUMVAL     PR   10 I 0   EXTPROC('gsk_attribute_set_+
D                                  numeric_value')
D ENVSSN           *     VALUE
D NUMID         10 I 0   VALUE
D NUMVAL         10 I 0   VALUE
D                    
D ENV     S     *     INZ
D SSN     S     *     INZ
D PROTUSEDX     S   10 I 0   INZ
D                    
D PTR     S     *     INZ
D PTRPTR     S     *     INZ(%ADDR(PTR))
D PTRBUF     S   50 A     BASED(PTR)
D PTRLEN     S   10 I 0   INZ
D                    
D OK     C           CONST(0)
D ERROR     C           CONST(1)
D                    
D FALSE     C           CONST(0)
D TRUE     C           CONST(1)
D                    
D SECTYPE     C           CONST(208)
D                    
D FD     C           CONST(300)
D                    
D WOULDBLOCK     C           CONST(502)
D                    
D SESSIONTYPE     C           CONST(402)
D CLIENTSESSION     C           CONST(507)
D                    
D PROTSSL2     C           CONST(403)
D PROTSSL2ON     C           CONST(510)
D PROTSSL2OFF     C           CONST(511)
D                    
D PROTSSL3     C           CONST(404)
D PROTSSL3ON     C           CONST(512)
D PROTSSL3OFF     C           CONST(513)
D                    
D PROTTLS10     C           CONST(436)
D PROTTLS11     C           CONST(437)
D PROTTLS12     C           CONST(438)
D PROTTLS13     C           CONST(439)
D                    
D PROTUSED     C           CONST(405)
D PROTUSEDNULL     C           CONST(500)
D PROTUSEDSSL2     C           CONST(514)
D PROTUSEDSSL3     C           CONST(515)
D PROTUSEDTLS10     C           CONST(520)
D PROTUSEDTLS11     C           CONST(595)
D PROTUSEDTLS12     C           CONST(596)
D PROTUSEDTLS13     C           CONST(597)
D                    
D SERVERAUTH     C           CONST(410)
D SERVERPASSTHRU     C           CONST(535)
D                    
D APPLID     C           CONST(6999)
D                    
D CLIENT     C           CONST('QIBM_QTV_TELNET_CLIENT')
D CLIENTLEN     C           CONST(%SIZE(CLIENT))
D                    
D /ENDIF
D /ENDIF
D                    
D /IF NOT DEFINED(TN5250S)
D                    
C          
C /IF DEFINED(*V5R2M0)
C          
C     *BLANKS COMP RMTSECURE       11 11  
C       EVAL RC = OK
C          
C *     --------------------------------------
C *     Werte initialisieren
C *     --------------------------------------
C     *ZERO ADD -1 SD            
C       MOVE *NULL RESX            
C          
C *     --------------------------------------
C *     Hinweise einstellen
C *     --------------------------------------
C     *ZERO ADD AINUMERICSERV HINTSFLAGS            
C     *ZERO ADD AFUNSPEC HINTSFAMILY            
C     *ZERO ADD SOCKSTREAM HINTSSOCKTYPE            
C     *ZERO ADD IPPROTOIP HINTSPROTOCOL            
C          
C *     --------------------------------------
C *     Hinweise einstellen
C *     --------------------------------------
C       CLEAR   HINTSADDRLEN            
C       CLEAR   HINTSCANONNAME            
C       CLEAR   HINTSADDR            
C       CLEAR   HINTSNEXT            
C          
C *     --------------------------------------
C *     Adresse im IPv4-Format?
C *     --------------------------------------
C       IF INETPTON(AFINET:RMTHOST:SERVERADDR) = 1
C          
C       ADD AINUMERICHOST HINTSFLAGS            
C     *ZERO ADD AFINET HINTSFAMILY            
C          
C       ELSE                
C *     --------------------------------------
C *     Adresse im IPv6-Format?
C *     --------------------------------------
C       IF INETPTON(AFINET6:RMTHOST:SERVERADDR6) = 1
C          
C       ADD AINUMERICHOST HINTSFLAGS            
C     *ZERO ADD AFINET6 HINTSFAMILY            
C          
C       ENDIF                
C       ENDIF                
C *     --------------------------------------
C *     Adreßinformationen abrufen
C *     --------------------------------------
C       IF GETADDRINFO(RMTHOST:
C             %CHAR(RMTPORT):
C                   HINTS:RESX) = *ZERO
C          
C *     --------------------------------------
C *     Sichere Umgebung initialisieren
C *     --------------------------------------
C       EXSR SECUREENV              
C     OK IFEQ RC              
C          
C *     --------------------------------------
C *     Socket erstellen
C *     --------------------------------------
C       EVAL SD = SOCKET(RESFAMILY:
C                   RESSOCKTYPE:
C                   RESPROTOCOL)
C     *ZERO IFLE SD              
C *     --------------------------------------
C *     Verbinden
C *     --------------------------------------
C       IF CONNECT(SD:RESADDR:RESADDRLEN) >= *ZERO
C          
C *     --------------------------------------
C *     Nicht blockieren
C *     --------------------------------------
C       EVAL FLAGS = FCNTL ( SD:GETFL)
C     *ZERO IFLE FLAGS              
C       ADD NONBLOCK FLAGS            
C       IF FCNTL(SD:SETFL:FLAGS) >= *ZERO
C          
C *     --------------------------------------
C *     Sichere Session initialisieren
C *     --------------------------------------
C       EXSR SECURESSN              
C     OK IFEQ RC              
C          
C *     --------------------------------------
C *     Sichere Werte ermitteln
C *     --------------------------------------
C       EXSR SECUREGET              
C          
C *     --------------------------------------
C *     Empfangen
C *     --------------------------------------
C       EXSR RECVREAD              
C       EXSR SENDWRITE              
C       EXSR SENDWRITE2              
C          
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C *     --------------------------------------
C *     Sichere Session und Umgebung schließen
C *     --------------------------------------
C       EXSR SECURECLOSE              
C          
C *     --------------------------------------
C *     Socket schließen
C *     --------------------------------------
C     -1 IFNE SD              
C       EVAL RC = CLOSE(SD)
C       ENDIF                
C          
C       ENDIF                
C       ENDIF                
C *     --------------------------------------
C *     Adreßinformationen freigeben
C *     --------------------------------------
C     *NULL IFNE RESX              
C       CALLP(E) FREEADDRINFO(RESX)
C       ENDIF                
C          
C /ELSE
C          
C     *BLANKS COMP RMTSECURE       11 11  
C       EVAL RC = OK
C          
C *     --------------------------------------
C *     Werte initialisieren
C *     --------------------------------------
C     *ZERO ADD -1 SD            
C          
C *     --------------------------------------
C *     Host-Adresse ermitteln
C *     --------------------------------------
C       EVAL ADDRX = INETADDR(RMTHOST)
C     INADDRNONE IFEQ ADDRX              
C       EVAL HOSTX = GETHOSTBYNAME(RMTHOST)
C     *NULL IFNE HOSTX              
C       EVAL ADDRX = HOSTADDRENTRY
C       ENDIF                
C       ENDIF                
C          
C     INADDRNONE IFNE ADDRX              
C *     --------------------------------------
C *     Sichere Umgebung initialisieren
C *     --------------------------------------
C       EXSR SECUREENV              
C     OK IFEQ RC              
C          
C *     --------------------------------------
C *     Socket erstellen
C *     --------------------------------------
C       EVAL SD = SOCKET(AFINET:SOCKSTREAM:IPPROTOIP)
C     *ZERO IFLE SD              
C          
C       EVAL SOCKADDR = SINPTR
C          
C     *ZERO ADD AFINET SINFAMILY            
C     *ZERO ADD RMTPORT SINPORT            
C     *ZERO ADD ADDRX SINADDR            
C       MOVEL(P) *ALLX'00' SINZERO            
C          
C *     --------------------------------------
C *     Verbinden
C *     --------------------------------------
C       IF CONNECT(SD:SOCKADDR:SOCKADDRINLEN) >= *ZERO
C          
C *     --------------------------------------
C *     Nicht blockieren
C *     --------------------------------------
C       EVAL FLAGS = FCNTL ( SD:GETFL)
C     *ZERO IFLE FLAGS              
C       ADD NONBLOCK FLAGS            
C       IF FCNTL(SD:SETFL:FLAGS) >= *ZERO
C          
C *     --------------------------------------
C *     Sichere Session initialisieren
C *     --------------------------------------
C       EXSR SECURESSN              
C     OK IFEQ RC              
C          
C *     --------------------------------------
C *     Sichere Werte ermitteln
C *     --------------------------------------
C       EXSR SECUREGET              
C          
C *     --------------------------------------
C *     Empfangen
C *     --------------------------------------
C       EXSR RECVREAD              
C       EXSR SENDWRITE              
C       EXSR SENDWRITE2              
C          
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C *     --------------------------------------
C *     Sichere Session und Umgebung schließen
C *     --------------------------------------
C       EXSR SECURECLOSE              
C          
C *     --------------------------------------
C *     Socket schließen
C *     --------------------------------------
C     -1 IFNE SD              
C       EVAL RC = CLOSE(SD)
C       ENDIF                
C          
C       ENDIF                
C       ENDIF                
C          
C /ENDIF
C          
C       SETON         LR  
C          
C /ENDIF
C          
C /IF NOT DEFINED(TN5250S1)
C /IF NOT DEFINED(TN5250SNO)
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SECUREENV BEGSR                
C     *IN11 IFEQ *ON              
C *     --------------------------------------
C *     Sichere Umgebung initialisieren
C *     --------------------------------------
C       EVAL RC = ERROR
C       IF ENVOPEN(ENV) = OK
C       IF SETBUFFER(ENV:APPLID:CLIENT:CLIENTLEN) = OK
C       IF SETENUM(ENV:SESSIONTYPE:CLIENTSESSION) = OK
C       IF SETENUM(ENV:SERVERAUTH:SERVERPASSTHRU) = OK
C **     IF SETENUM(ENV:PROTSSL2:PROTSSL2OFF) = OK
C **     IF SETENUM(ENV:PROTSSL3:PROTSSL3OFF) = OK
C **     IF SETENUM(ENV:PROTTLS10:FALSE) = OK
C **     IF SETENUM(ENV:PROTTLS11:FALSE) = OK
C **     IF SETENUM(ENV:PROTTLS12:FALSE) = OK
C **     IF SETENUM(ENV:PROTTLS13:FALSE) = OK
C       IF ENVINIT(ENV) = OK
C       EVAL RC = OK
C       ENDIF                
C **     ENDIF                
C **     ENDIF                
C **     ENDIF                
C **     ENDIF                
C **     ENDIF                
C **     ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SECURESSN BEGSR                
C     *IN11 IFEQ *ON              
C *     --------------------------------------
C *     Sichere Session initialisieren
C *     --------------------------------------
C       EVAL RC = ERROR
C       IF SECOPEN(ENV:SSN) = OK
C       IF SETNUMVAL(SSN:FD:SD) = OK
C       IF SECINIT(SSN) = OK
C       EVAL RC = OK
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDIF                
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SECUREGET BEGSR                
C     *IN11 IFEQ *ON              
C *     --------------------------------------
C *     Sichere Werte ermitteln
C *     --------------------------------------
C       EVAL RC = GETENUM(SSN:PROTUSED:PROTUSEDX)
C       EVAL RC = GETBUFFER(SSN:SECTYPE:PTRPTR:PTRLEN)
C       ENDIF                
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SECURECLOSE BEGSR                
C     *IN11 IFEQ *ON              
C *     --------------------------------------
C *     Sichere Session und Umgebung schließen
C *     --------------------------------------
C       EVAL RC = SECCLOSE ( SSN)
C       EVAL RC = ENVCLOSE ( ENV)
C       ENDIF                
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     RECVREAD BEGSR                
C *     --------------------------------------
C *     Lesen
C *     --------------------------------------
C   11   EVAL RC = SECREAD ( SSN:CHARPTR:1:COUNT)
C   N11   EVAL COUNT = RECV  (SD:CHARPTR:1:0)
C     *ZERO COMP COUNT       71 71  
C   N71 OK COMP RC       71 71  
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SENDWRITE BEGSR                
C *     --------------------------------------
C *     Schreiben
C *     --------------------------------------
C   11   EVAL RC = SECWRITE ( SSN:CHARDSPTR:3:COUNT)
C   N11   EVAL COUNT = SEND  (SD:CHARDSPTR:3:0)
C     3 IFGT COUNT              
C     OK ORNE RC              
C     'SENDWRITE' DSPLY                
C       ENDIF                
C       ENDSR                
C          
  X * *MAIN* EXSR TN5250SEC    
  X * *MAIN* EXSR TN5250SEC    
  X  
C     SENDWRITE2 BEGSR                
C *     --------------------------------------
C *     Schreiben 2
C *     --------------------------------------
C   11   EVAL RC = SECWRITE ( SSN:BUF2TEXTPTR:BUF2LEN:COUNT)
C   N11   EVAL COUNT = SEND  (SD:BUF2TEXTPTR:BUF2LEN:0)
C     BUF2LEN IFGT COUNT              
C     OK ORNE RC              
C     'SENDWRITE2' DSPLY                
C       ENDIF                
C       ENDSR                
C          
C     COUNTRC BEGSR                
C *     --------------------------------------
C *     Anzahl
C *     --------------------------------------
C     *ZERO COMP COUNT       77  
C   77 OK COMP RC       77  
C   77   SETON         72  
C       ENDSR                
C          
C          
C *        RECV / COUNT<0 / COUNT=0 / COUNT>0
C *     SECREAD / COUNT - / COUNT=0 / COUNT>0
C *     SECREAD / RC<>OK  / RC=OK   / RC=OK
C          
C          
C /ENDIF
C /ENDIF

570 ms | Contact | Information | Aibo-Bar © 2005-2024