Annotation of embedaddon/curl/packages/OS400/README.OS400, revision 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>