Annotation of embedaddon/curl/packages/OS400/README.OS400, revision 1.1.1.1

1.1       misho       1: 
                      2: Implementation notes:
                      3: 
                      4:   This is a true OS/400 implementation, not a PASE implementation (for PASE,
                      5: use AIX implementation).
                      6: 
                      7:   The biggest problem with OS/400 is EBCDIC. Libcurl implements an internal
                      8: conversion mechanism, but it has been designed for computers that have a
                      9: single native character set. OS/400 default native character set varies
                     10: depending on the country for which it has been localized. And more, a job
                     11: may dynamically alter its "native" character set.
                     12:   Several characters that do not have fixed code in EBCDIC variants are
                     13: used in libcurl strings. As a consequence, using the existing conversion
                     14: mechanism would have lead in a localized binary library - not portable across
                     15: countries.
                     16:   For this reason, and because libcurl was originally designed for ASCII based
                     17: operating systems, the current OS/400 implementation uses ASCII as internal
                     18: character set. This has been accomplished using the QADRT library and
                     19: include files, a C and system procedures ASCII wrapper library. See IBM QADRT
                     20: description for more information.
                     21:   This then results in libcurl being an ASCII library: any function string
                     22: argument is taken/returned in ASCII and a C/C++ calling program built around
                     23: QADRT may use libcurl functions as on any other platform.
                     24:   QADRT does not define ASCII wrappers for all C/system procedures: the
                     25: OS/400 configuration header file and an additional module (os400sys.c) define
                     26: some more of them, that are used by libcurl and that QADRT left out.
                     27:   To support all the different variants of EBCDIC, non-standard wrapper
                     28: procedures have been added to libcurl on OS/400: they provide an additional
                     29: CCSID (numeric Coded Character Set ID specific to OS/400) parameter for each
                     30: string argument. String values passed to callback procedures are NOT converted,
                     31: so text gathered this way is (probably !) ASCII.
                     32: 
                     33:   Another OS/400 problem comes from the fact that the last fixed argument of a
                     34: vararg procedure may not be of type char, unsigned char, short or unsigned
                     35: short. Enums that are internally implemented by the C compiler as one of these
                     36: types are also forbidden. Libcurl uses enums as vararg procedure tagfields...
                     37: Happily, there is a pragma forcing enums to type "int". The original libcurl
                     38: header files are thus altered during build process to use this pragma, in
                     39: order to force libcurl enums of being type int (the pragma disposition in use
                     40: before inclusion is restored before resuming the including unit compilation).
                     41: 
                     42:   Secure socket layer is provided by the IBM GSKit API: unlike other SSL
                     43: implementations, GSKit is based on "certificate stores" or keyrings
                     44: rather than individual certificate/key files. Certificate stores, as well as
                     45: "certificate labels" are managed by external IBM-defined applications.
                     46:   There are two ways to specify an SSL context:
                     47: - By an application identifier.
                     48: - By a keyring file pathname and (optionally) certificate label.
                     49:   To identify an SSL context by application identifier, use option
                     50: SETOPT_SSLCERT to specify the application identifier.
                     51:   To address an SSL context by keyring and certificate label, use CURLOPT_CAINFO
                     52: to set-up the keyring pathname, CURLOPT_SSLCERT to define the certificate label
                     53: (omitting it will cause the default certificate in keyring to be used) and
                     54: CURLOPT_KEYPASSWD to give the keyring password. If SSL is used without
                     55: defining any of these options, the default (i.e.: system) keyring is used for
                     56: server certificate validation.
                     57: 
                     58:   Non-standard EBCDIC wrapper prototypes are defined in an additional header
                     59: file: ccsidcurl.h. These should be self-explanatory to an OS/400-aware
                     60: designer. CCSID 0 can be used to select the current job's CCSID.
                     61:   Wrapper procedures with variable arguments are described below:
                     62: 
                     63: _ curl_easy_setopt_ccsid()
                     64:   Variable arguments are a string pointer and a CCSID (unsigned int) for
                     65: options:
                     66:         CURLOPT_ABSTRACT_UNIX_SOCKET
                     67:         CURLOPT_ALTSVC
                     68:         CURLOPT_CAINFO
                     69:         CURLOPT_CAPATH
                     70:         CURLOPT_COOKIE
                     71:         CURLOPT_COOKIEFILE
                     72:         CURLOPT_COOKIEJAR
                     73:         CURLOPT_COOKIELIST
                     74:         CURLOPT_COPYPOSTFIELDS
                     75:         CURLOPT_CRLFILE
                     76:         CURLOPT_CUSTOMREQUEST
                     77:         CURLOPT_DEFAULT_PROTOCOL
                     78:         CURLOPT_DNS_SERVERS
                     79:         CURLOPT_DOH_URL
                     80:         CURLOPT_EGDSOCKET
                     81:         CURLOPT_ENCODING
                     82:         CURLOPT_FTPPORT
                     83:         CURLOPT_FTP_ACCOUNT
                     84:         CURLOPT_FTP_ALTERNATIVE_TO_USER
                     85:         CURLOPT_INTERFACE
                     86:         CURLOPT_ISSUERCERT
                     87:         CURLOPT_KEYPASSWD
                     88:         CURLOPT_KRBLEVEL
                     89:         CURLOPT_LOGIN_OPTIONS
                     90:         CURLOPT_MAIL_AUTH
                     91:         CURLOPT_MAIL_FROM
                     92:         CURLOPT_NETRC_FILE
                     93:         CURLOPT_NOPROXY
                     94:         CURLOPT_PASSWORD
                     95:         CURLOPT_PINNEDPUBLICKEY
                     96:         CURLOPT_PRE_PROXY
                     97:         CURLOPT_PROXY
                     98:         CURLOPT_PROXYPASSWORD
                     99:         CURLOPT_PROXYUSERNAME
                    100:         CURLOPT_PROXYUSERPWD
                    101:         CURLOPT_PROXY_CAINFO
                    102:         CURLOPT_PROXY_CAPATH
                    103:         CURLOPT_PROXY_CRLFILE
                    104:         CURLOPT_PROXY_KEYPASSWD
                    105:         CURLOPT_PROXY_PINNEDPUBLICKEY
                    106:         CURLOPT_PROXY_SERVICE_NAME
                    107:         CURLOPT_PROXY_SSLCERT
                    108:         CURLOPT_PROXY_SSLCERTTYPE
                    109:         CURLOPT_PROXY_SSLKEY
                    110:         CURLOPT_PROXY_SSLKEYTYPE
                    111:         CURLOPT_PROXY_SSL_CIPHER_LIST
                    112:         CURLOPT_PROXY_TLS13_CIPHERS
                    113:         CURLOPT_PROXY_TLSAUTH_PASSWORD
                    114:         CURLOPT_PROXY_TLSAUTH_TYPE
                    115:         CURLOPT_PROXY_TLSAUTH_USERNAME
                    116:         CURLOPT_RANDOM_FILE
                    117:         CURLOPT_RANGE
                    118:         CURLOPT_REFERER
                    119:         CURLOPT_REQUEST_TARGET
                    120:         CURLOPT_RTSP_SESSION_UID
                    121:         CURLOPT_RTSP_STREAM_URI
                    122:         CURLOPT_RTSP_TRANSPORT
                    123:         CURLOPT_SASL_AUTHZID
                    124:         CURLOPT_SERVICE_NAME
                    125:         CURLOPT_SOCKS5_GSSAPI_SERVICE
                    126:         CURLOPT_SSH_HOST_PUBLIC_KEY_MD5
                    127:         CURLOPT_SSH_KNOWNHOSTS
                    128:         CURLOPT_SSH_PRIVATE_KEYFILE
                    129:         CURLOPT_SSH_PUBLIC_KEYFILE
                    130:         CURLOPT_SSLCERT
                    131:         CURLOPT_SSLCERTTYPE
                    132:         CURLOPT_SSLENGINE
                    133:         CURLOPT_SSLKEY
                    134:         CURLOPT_SSLKEYTYPE
                    135:         CURLOPT_SSL_CIPHER_LIST
                    136:         CURLOPT_TLS13_CIPHERS
                    137:         CURLOPT_TLSAUTH_PASSWORD
                    138:         CURLOPT_TLSAUTH_TYPE
                    139:         CURLOPT_TLSAUTH_USERNAME
                    140:         CURLOPT_UNIX_SOCKET_PATH
                    141:         CURLOPT_URL
                    142:         CURLOPT_USERAGENT
                    143:         CURLOPT_USERNAME
                    144:         CURLOPT_USERPWD
                    145:         CURLOPT_XOAUTH2_BEARER
                    146:   Else it is the same as for curl_easy_setopt().
                    147:   Note that CURLOPT_ERRORBUFFER is not in the list above, since it gives the
                    148: address of an (empty) character buffer, not the address of a string.
                    149: CURLOPT_POSTFIELDS stores the address of static binary data (of type void *) and
                    150: thus is not converted. If CURLOPT_COPYPOSTFIELDS is issued after
                    151: CURLOPT_POSTFIELDSIZE != -1, the data size is adjusted according to the
                    152: CCSID conversion result length.
                    153: 
                    154: _ curl_formadd_ccsid()
                    155:   In the variable argument list, string pointers should be followed by a (long)
                    156: CCSID for the following options:
                    157:         CURLFORM_FILENAME
                    158:         CURLFORM_CONTENTTYPE
                    159:         CURLFORM_BUFFER
                    160:         CURLFORM_FILE
                    161:         CURLFORM_FILECONTENT
                    162:         CURLFORM_COPYCONTENTS
                    163:         CURLFORM_COPYNAME
                    164:         CURLFORM_PTRNAME
                    165:   If taken from an argument array, an additional array entry must follow each
                    166: entry containing one of the above option. This additional entry holds the CCSID
                    167: in its value field, and the option field is meaningless.
                    168:   It is not possible to have a string pointer and its CCSID across a function
                    169: parameter/array boundary.
                    170:   Please note that CURLFORM_PTRCONTENTS and CURLFORM_BUFFERPTR are considered
                    171: unconvertible strings and thus are NOT followed by a CCSID.
                    172: 
                    173: _ curl_easy_getinfo_ccsid()
                    174:   The following options are followed by a 'char * *' and a CCSID. Unlike
                    175: curl_easy_getinfo(), the value returned in the pointer should be freed after
                    176: use:
                    177:         CURLINFO_EFFECTIVE_URL
                    178:         CURLINFO_CONTENT_TYPE
                    179:         CURLINFO_FTP_ENTRY_PATH
                    180:         CURLINFO_REDIRECT_URL
                    181:         CURLINFO_PRIMARY_IP
                    182:         CURLINFO_RTSP_SESSION_ID
                    183:         CURLINFO_LOCAL_IP
                    184:         CURLINFO_SCHEME
                    185:   Likewise, the following options are followed by a struct curl_slist * * and a
                    186: CCSID.
                    187:         CURLINFO_SSL_ENGINES
                    188:         CURLINFO_COOKIELIST
                    189: Lists returned should be released with curl_slist_free_all() after use.
                    190:   Option CURLINFO_CERTINFO is followed by a struct curl_certinfo * * and a
                    191: CCSID. Returned structures should be free'ed using curl_certinfo_free_all()
                    192: after use.
                    193:   Other options are processed like in curl_easy_getinfo().
                    194: 
                    195: _ curl_pushheader_bynum_cssid() and curl_pushheader_byname_ccsid()
                    196:   Although the prototypes are self-explanatory, the returned string pointer
                    197: should be freed after use, as opposite to the non-ccsid versions of these
                    198: procedures.
                    199:   Please note that HTTP2 is not (yet) implemented on OS/400, thus these
                    200: functions will always return NULL.
                    201: 
                    202: 
                    203:   Standard compilation environment does support neither autotools nor make;
                    204: in fact, very few common utilities are available. As a consequence, the
                    205: config-os400.h has been coded manually and the compilation scripts are
                    206: a set of shell scripts stored in subdirectory packages/OS400.
                    207: 
                    208:   The "curl" command and the test environment are currently not supported on
                    209: OS/400.
                    210: 
                    211: 
                    212: Protocols currently implemented on OS/400:
                    213: _ DICT
                    214: _ FILE
                    215: _ FTP
                    216: _ FTPS
                    217: _ FTP with secure transmission
                    218: _ GOPHER
                    219: _ HTTP
                    220: _ HTTPS
                    221: _ IMAP
                    222: _ IMAPS
                    223: _ IMAP with secure transmission
                    224: _ LDAP
                    225: _ POP3
                    226: _ POP3S
                    227: _ POP3 with secure transmission
                    228: _ RTSP
                    229: _ SCP if libssh2 is enabled
                    230: _ SFTP if libssh2 is enabled
                    231: _ SMTP
                    232: _ SMTPS
                    233: _ SMTP with secure transmission
                    234: _ TELNET
                    235: _ TFTP
                    236: 
                    237: 
                    238: 
                    239: Compiling on OS/400:
                    240: 
                    241:   These instructions targets people who knows about OS/400, compiling, IFS and
                    242: archive extraction. Do not ask questions about these subjects if you're not
                    243: familiar with.
                    244: 
                    245: _ As a prerequisite, QADRT development environment must be installed.
                    246: _ If data compression has to be supported, ZLIB development environment must
                    247:   be installed.
                    248: _ Likewise, if SCP and SFTP protocols have to be compiled in, LIBSSH2
                    249:   developent environment must be installed.
                    250: _ Install the curl source directory in IFS. Do NOT install it in the
                    251:   installation target directory (which defaults to /curl).
                    252: _ Enter shell (QSH)
                    253: _ Change current directory to the curl installation directory
                    254: _ Change current directory to ./packages/OS400
                    255: _ Edit file iniscript.sh. You may want to change tunable configuration
                    256:   parameters, like debug info generation, optimisation level, listing option,
                    257:   target library, ZLIB/LIBSSH2 availability and location, etc.
                    258: _ Copy any file in the current directory to makelog (i.e.:
                    259:   cp initscript.sh makelog): this is intended to create the makelog file with
                    260:   an ASCII CCSID!
                    261: _ Enter the command "sh makefile.sh > makelog 2>&1'
                    262: _ Examine the makelog file to check for compilation errors.
                    263: 
                    264:   Leaving file initscript.sh unchanged, this will produce the following OS/400
                    265: objects:
                    266: _ Library CURL. All other objects will be stored in this library.
                    267: _ Modules for all libcurl units.
                    268: _ Binding directory CURL_A, to be used at calling program link time for
                    269:   statically binding the modules (specify BNDSRVPGM(QADRTTS QGLDCLNT QGLDBRDR)
                    270:   when creating a program using CURL_A).
                    271: _ Service program CURL.<soname>, where <soname> is extracted from the
                    272:   lib/Makefile.am VERSION variable. To be used at calling program run-time
                    273:   when this program has dynamically bound curl at link time.
                    274: _ Binding directory CURL. To be used to dynamically bind libcurl when linking a
                    275:   calling program.
                    276: _ Source file H. It contains all the include members needed to compile a C/C++
                    277:   module using libcurl, and an ILE/RPG /copy member for support in this
                    278:   language.
                    279: _ Standard C/C++ libcurl include members in file H.
                    280: _ CCSIDCURL member in file H. This defines the non-standard EBCDIC wrappers for
                    281:   C and C++.
                    282: _ CURL.INC member in file H. This defines everything needed by an ILE/RPG
                    283:   program using libcurl.
                    284: _ LIBxxx modules and programs. Although the test environment is not supported
                    285:   on OS/400, the libcurl test programs are compiled for manual tests.
                    286: _ IFS directory /curl/include/curl containing the C header files for IFS source
                    287:   C/C++ compilation and curl.inc.rpgle for IFS source ILE/RPG compilation.
                    288: 
                    289: 
                    290: 
                    291: Special programming consideration:
                    292: 
                    293: QADRT being used, the following points must be considered:
                    294: _ If static binding is used, service program QADRTTS must be linked too.
                    295: _ The EBCDIC CCSID used by QADRT is 37 by default, NOT THE JOB'S CCSID. If
                    296:   another EBCDIC CCSID is required, it must be set via a locale through a call
                    297:   to setlocale_a (QADRT's setlocale() ASCII wrapper) with category LC_ALL or
                    298:   LC_CTYPE, or by setting environment variable QADRT_ENV_LOCALE to the locale
                    299:   object path before executing the program.
                    300: _ Do not use original source include files unless you know what you are doing.
                    301:   Use the installed members instead (in /QSYS.LIB/CURL.LIB/H.FILE and
                    302:   /curl/include/curl).
                    303: 
                    304: 
                    305: 
                    306: ILE/RPG support:
                    307: 
                    308:   Since 95% of the OS/400 programmers use ILE/RPG exclusively, a definition
                    309:   /INCLUDE member is provided for this language. To include all libcurl
                    310:   definitions in an ILE/RPG module, line
                    311: 
                    312:      h bnddir('CURL/CURL')
                    313: 
                    314: must figure in the program header, and line
                    315: 
                    316:      d/include curl/h,curl.inc
                    317: 
                    318: in the global data section of the module's source code.
                    319: 
                    320:   No vararg procedure support exists in ILE/RPG: for this reason, the following
                    321: considerations apply:
                    322: _ Procedures curl_easy_setopt_long(), curl_easy_setopt_object(),
                    323:   curl_easy_setopt_function() and curl_easy_setopt_offset() are all alias
                    324:   prototypes to curl_easy_setopt(), but with different parameter lists.
                    325: _ Procedures curl_easy_getinfo_string(), curl_easy_getinfo_long(),
                    326:   curl_easy_getinfo_double(), curl_easy_getinfo_slist(),
                    327:   curl_easy_getinfo_ptr(), curl_easy_getinfo_socket() and
                    328:   curl_easy_getinfo_off_t() are all alias prototypes to curl_easy_getinfo(),
                    329:   but with different parameter lists.
                    330: _ Procedures curl_multi_setopt_long(), curl_multi_setopt_object(),
                    331:   curl_multi_setopt_function() and curl_multi_setopt_offset() are all alias
                    332:   prototypes to curl_multi_setopt(), but with different parameter lists.
                    333: _ The prototype of procedure curl_formadd() allows specifying a pointer option
                    334:   and the CURLFORM_END option. This makes possible to use an option array
                    335:   without any additional definition. If some specific incompatible argument
                    336:   list is used in the ILE/RPG program, the latter must define a specialised
                    337:   alias. The same applies to curl_formadd_ccsid() too.
                    338: 
                    339:   Since RPG cannot cast a long to a pointer, procedure curl_form_long_value()
                    340: is provided for that purpose: this allows storing a long value in the curl_forms
                    341: array.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>