| Implementation notes: | |
| This is a true OS/400 implementation, not a PASE implementation (for PASE, | |
| use AIX implementation). | |
| It uses ASCII as internal character set. This has been accomplished using the | |
| QADRT library and include files, a C and system procedures ASCII wrapper | |
| library. See IBM QADRT description for more information. | |
| This results in libssh2 being an ASCII library: any function string | |
| argument is taken/returned in ASCII and a C/C++ calling program built around | |
| QADRT may use libssh2 functions as on any other platform. | |
| QADRT does not define ASCII wrappers for all C/system procedures: an | |
| additional module (os400sys.c) define some more of them, that are used by | |
| libssh2 and that QADRT left out. | |
| Since standard library entry points expect and return ASCII character strings, | |
| additional procedures are provided for string transcoding (see below). No | |
| wrappers to standard procedures are provided: however, nested calls to | |
| transcoding procedures may be used. | |
| Crypto API is provided by the IBM QC3 API library. It supports RSA, but not DSA. | |
| Standard compilation environment does support neither autotools nor make; | |
| in fact, very few common utilities are available. As a consequence, the | |
| libssh2_config.h has been coded manually and the compilation scripts are | |
| a set of shell scripts stored in subdirectory os400. | |
| The test environment is currently not supported on OS/400. | |
| Compiling on OS/400: | |
| These instructions target people who knows about OS/400, compiling, IFS and | |
| archive extraction. Do not ask questions about these subjects if you're not | |
| familiar with. | |
| _ As a prerequisite, QADRT development environment must be installed. | |
| _ Install the libssh2 sources directory in IFS. | |
| _ Enter shell (QSH) | |
| _ Change current directory to the libssh2 sources installation directory | |
| _ Change current directory to os400 | |
| _ Edit file iniscript.sh. You may want to change tunable configuration | |
| parameters, like debug info generation, optimisation level, listing option, | |
| target library, zlib availability and location, etc. | |
| _ Copy any file in the current directory to makelog (i.e.: | |
| cp initscript.sh makelog): this is intended to create the makelog file with | |
| an ASCII CCSID! | |
| _ Enter the command "sh make.sh > makelog 2>&1' | |
| _ Examine the makelog file to check for compilation errors. | |
| Leaving file initscript.sh unchanged, this will produce the following OS/400 | |
| objects: | |
| _ Library LIBSSH2. All other objects will be stored in this library. | |
| _ Modules for all libssh2 units. | |
| _ Binding directory LIBSSH2_A, to be used at calling program link time for | |
| statically binding the modules (specify BNDSRVPGM(QADRTTS) when creating a | |
| program using LIBSSH2_A. Also give access to the zlib BNDDIR/SRVPGM if | |
| libssh2 is compiled with zlib). | |
| _ Service program LIBSSH2.<soname>, where <soname> is extracted from the | |
| src/Makefile.am VERSION variable. To be used at calling program run-time | |
| when this program has dynamically bound libssh2 at link time. | |
| _ Binding directory LIBSSH2. To be used to dynamically bind libssh2 when | |
| linking a calling program. | |
| _ Source file H. It contains all the include members needed to compile a C/C++ | |
| module using libssh2. | |
| _ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file H. These are the C/C++ header | |
| files. Original fames have been mangled to fit member name allowed syntax. | |
| _ Source file LIBSSH2RPG. It contains all the ILE/RPG /INCLUDE members | |
| needed to compile an ILE/RPG program calling libssh2 procedures. | |
| _ LIBSSH2, SSH2_PKEY, SSH2_SFTP members in file LIBSSH2RPG. These are | |
| ILE/RPG translations of the corresponding C header files. | |
| Special programming consideration: | |
| QADRT being used, the following points must be considered: | |
| _ If static binding is used, service program QADRTTS must be linked too. | |
| _ Likewise, if libssh2 has been compiled with zlib support, access to the | |
| zlib objects must be provided at link time. | |
| _ The EBCDIC CCSID used by QADRT is 37 by default, NOT THE JOB'S CCSID. If | |
| another EBCDIC CCSID is required, it must be set via a locale through a call | |
| to setlocale_a (QADRT's setlocale() ASCII wrapper) with category LC_ALL or | |
| LC_CTYPE, or by setting environment variable QADRT_ENV_LOCALE to the locale | |
| object path before executing the program. | |
| _ Do not use original source include files unless you know what you are doing. | |
| Use the installed members instead (in /QSYS.LIB/LIBSSH2.LIB/H.FILE). | |
| String transcoding support: | |
| To help passing arbitrarily encoded string arguments and/or receiving string | |
| values from/to the libssh2 API, three non-standard additional procedures are | |
| provided. They use a session pointer and a "string cache" pointer. | |
| Each time a string is transcoded, it is cached in the given cache. It is | |
| the responsibility of the caller to release the cache when its associted strings | |
| are no longer needed. These procedures and the string cache type are defined | |
| in a new libssh2_ccsid.h header file. | |
| To create a string cache, use: | |
| #include <libssh2_ccsid.h> | |
| libssh2_string_cache * cache = NULL; | |
| To release all strings in a cache, call: | |
| libssh2_release_string_cache(session, &cache); | |
| The transcoding procedures are: | |
| char * libssh2_from_ccsid(LIBSSH2_SESSION *session, | |
| libssh2_string_cache **cache, | |
| unsigned short ccsid, | |
| const char *string, ssize_t inlen, | |
| size_t *outlen); | |
| char * libssh2_to_ccsid(LIBSSH2_SESSION *session, | |
| libssh2_string_cache **cache, | |
| unsigned short ccsid, | |
| const char *string, ssize_t inlen, | |
| size_t *outlen); | |
| where: | |
| session is a libssh2 session used for memory allocation. | |
| cache is the address of a string cache. | |
| ccsid is the external (i.e.: non libssh2) coded character set id. | |
| 65535 means no conversion and 0 means the current job's CCSID. | |
| string is the string to convert. | |
| inlen is the source string length in bytes: set to -1 if | |
| null-terminated. | |
| outlen if not NULL, is the address of a variable that will receive | |
| the transcoded string length upon return. | |
| libssh2_from_ccsid() transcodes the string from the given CCSID to libssh2 | |
| internal encoding (UTF-8). It is intended to be used to convert API input | |
| parameters. | |
| libssh2_to_ccsid() transcodes the string from libssh2 internal encoding | |
| (UTF-8) to the given CCSID. This has been implemented to get standard API | |
| string results in a program's native encoding. | |
| Both these functions return a pointer to the null-terminated converted string, | |
| or NULL if an error occurred. In addition, the variable pointed by outlen | |
| receives the effective byte length of the (cached) translated string, or -1 | |
| in case of error. | |
| ILE/RPG support: | |
| Since 95% of the OS/400 programmers use ILE/RPG exclusively, a definition | |
| /INCLUDE member is provided for this language. To include libssh2 | |
| definitions in an ILE/RPG module, line | |
| h bnddir('LIBSSH2/LIBSSH2') | |
| must figure in the program header, and line | |
| d/include libssh2/libssh2rpg,libssh2 | |
| in the global data section of the module's source code. | |
| If required, members ssh2_sftp, ssh2_pkey and ssh2_ccsid may also be included. | |
| For IFS source compilations, include members are located in directory | |
| /libssh2/include/libssh2rpg and have their original names retained. | |
| ILE/RPG lacks a serious macro preprocessor, thus C macros requiring this | |
| feature have not been translated. However, function-like C macros have been | |
| implemented as procedures and therefore supported in ILE/RPG. |