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>