os400: add compilation scripts
diff --git a/os400/initscript.sh b/os400/initscript.sh
new file mode 100644
index 0000000..1d47a1d
--- /dev/null
+++ b/os400/initscript.sh
@@ -0,0 +1,243 @@
+#!/bin/sh
+
+
+setenv()
+
+{
+        #       Define and export.
+
+        eval ${1}="${2}"
+        export ${1}
+}
+
+
+case "${SCRIPTDIR}" in
+/*)     ;;
+*)      SCRIPTDIR="`pwd`/${SCRIPTDIR}"
+esac
+
+while true
+do      case "${SCRIPTDIR}" in
+        */.)    SCRIPTDIR="${SCRIPTDIR%/.}";;
+        *)      break;;
+        esac
+done
+
+#  The script directory is supposed to be in $TOPDIR/os400.
+
+TOPDIR=`dirname "${SCRIPTDIR}"`
+export SCRIPTDIR TOPDIR
+
+#  Extract the SONAME from the library makefile.
+
+SONAME=`sed -e '/^VERSION=/!d' -e 's/^.* \([0-9]*\):.*$/\1/' -e 'q'     \
+                                                < "${TOPDIR}/src/Makefile.am"`
+export SONAME
+
+
+################################################################################
+#
+#                       Tunable configuration parameters.
+#
+################################################################################
+
+setenv TARGETLIB        'LIBSSH2'               # Target OS/400 program library.
+setenv STATBNDDIR       'LIBSSH2_A'             # Static binding directory.
+setenv DYNBNDDIR        'LIBSSH2'               # Dynamic binding directory.
+setenv SRVPGM           "LIBSSH2.${SONAME}"     # Service program.
+setenv TGTCCSID         '500'                   # Target CCSID of objects.
+setenv DEBUG            '*ALL'                  # Debug level.
+setenv OPTIMIZE         '10'                    # Optimisation level
+setenv OUTPUT           '*NONE'                 # Compilation output option.
+setenv TGTRLS           'V5R3M0'                # Target OS release.
+setenv IFSDIR           '/libssh2'              # Installation IFS directory.
+
+#       Define ZLIB availability and locations.
+
+setenv WITH_ZLIB        0                       # Define to 1 to enable.
+setenv ZLIB_INCLUDE     '/zlib/include'         # ZLIB include IFS directory.
+setenv ZLIB_LIB         'ZLIB'                  # ZLIB library.
+setenv ZLIB_BNDDIR      'ZLIB_A'                # ZLIB binding directory.
+
+
+################################################################################
+
+#       Need to get the version definitions.
+
+LIBSSH2_VERSION=`grep '^#define  *LIBSSH2_VERSION '                     \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/.*"\(.*\)".*/\1/'`
+LIBSSH2_VERSION_MAJOR=`grep '^#define  *LIBSSH2_VERSION_MAJOR '         \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/^#define  *LIBSSH2_VERSION_MAJOR  *\([^ ]*\).*/\1/'`
+LIBSSH2_VERSION_MINOR=`grep '^#define  *LIBSSH2_VERSION_MINOR '         \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/^#define  *LIBSSH2_VERSION_MINOR  *\([^ ]*\).*/\1/'`
+LIBSSH2_VERSION_PATCH=`grep '^#define  *LIBSSH2_VERSION_PATCH '         \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/^#define  *LIBSSH2_VERSION_PATCH  *\([^ ]*\).*/\1/'`
+LIBSSH2_VERSION_NUM=`grep '^#define  *LIBSSH2_VERSION_NUM '             \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/^#define  *LIBSSH2_VERSION_NUM  *0x\([^ ]*\).*/\1/'`
+LIBSSH2_TIMESTAMP=`grep '^#define  *LIBSSH2_TIMESTAMP '                 \
+                        "${TOPDIR}/include/libssh2.h"                   |
+                sed 's/.*"\(.*\)".*/\1/'`
+export LIBSSH2_VERSION
+export LIBSSH2_VERSION_MAJOR LIBSSH2_VERSION_MINOR LIBSSH2_VERSION_PATCH
+export LIBSSH2_VERSION_NUM LIBSSH2_TIMESTAMP
+
+################################################################################
+#
+#                       OS/400 specific definitions.
+#
+################################################################################
+
+LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB"
+
+
+################################################################################
+#
+#                               Procedures.
+#
+################################################################################
+
+#       action_needed dest [src]
+#
+#       dest is an object to build
+#       if specified, src is an object on which dest depends.
+#
+#       exit 0 (succeeds) if some action has to be taken, else 1.
+
+action_needed()
+
+{
+        [ ! -e "${1}" ] && return 0
+        [ "${2}" ] || return 1
+        [ "${1}" -ot "${2}" ] && return 0
+        return 1
+}
+
+
+#       canonicalize_path path
+#
+#       Return canonicalized path as:
+#       - Absolute
+#       - No . or .. component.
+
+canonicalize_path()
+
+{
+        if expr "${1}" : '^/' > /dev/null
+        then    P="${1}"
+        else    P="`pwd`/${1}"
+        fi
+
+        R=
+        IFSSAVE="${IFS}"
+        IFS="/"
+
+        for C in ${P}
+        do      IFS="${IFSSAVE}"
+                case "${C}" in
+                .)      ;;
+                ..)     R=`expr "${R}" : '^\(.*/\)..*'`
+                        ;;
+                ?*)     R="${R}${C}/"
+                        ;;
+                *)      ;;
+                esac
+        done
+
+        IFS="${IFSSAVE}"
+        echo "/`expr "${R}" : '^\(.*\)/'`"
+}
+
+
+#       make_module module_name source_name [additional_definitions]
+#
+#       Compile source name into ASCII module if needed.
+#       As side effect, append the module name to variable MODULES.
+#       Set LINK to "YES" if the module has been compiled.
+
+make_module()
+
+{
+        MODULES="${MODULES} ${1}"
+        MODIFSNAME="${LIBIFSNAME}/${1}.MODULE"
+        action_needed "${MODIFSNAME}" "${2}" || return 0;
+        SRCDIR=`dirname \`canonicalize_path "${2}"\``
+
+        #       #pragma convert has to be in the source file itself, i.e.
+        #               putting it in an include file makes it only active
+        #               for that include file.
+        #       Thus we build a temporary file with the pragma prepended to
+        #               the source file and we compile that temporary file.
+
+        echo "#line 1 \"${2}\"" > __tmpsrcf.c
+        echo "#pragma convert(819)" >> __tmpsrcf.c
+        echo "#line 1" >> __tmpsrcf.c
+        cat "${2}" >> __tmpsrcf.c
+        CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')"
+#       CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)"
+        CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)"
+        CMD="${CMD} LOCALETYPE(*LOCALE)"
+        CMD="${CMD} INCDIR('${TOPDIR}/os400/include'"
+        CMD="${CMD} '/QIBM/ProdData/qadrt/include' '${TOPDIR}/include'"
+        CMD="${CMD} '${TOPDIR}/os400' '${SRCDIR}'"
+
+        if [ "${WITH_ZLIB}" != "0" ]
+        then    CMD="${CMD} '${ZLIB_INCLUDE}'"
+        fi
+
+        CMD="${CMD} ${INCLUDES})"
+        CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})"
+        CMD="${CMD} OUTPUT(${OUTPUT})"
+        CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
+        CMD="${CMD} DBGVIEW(${DEBUG})"
+
+        DEFINES="${3}"
+
+        if [ "${WITH_ZLIB}" != "0" ]
+        then    DEFINES="${DEFINES} HAVE_LIBZ LIBSSH2_HAVE_ZLIB"
+        fi
+
+        if [ "${DEFINES}" ]
+        then    CMD="${CMD} DEFINE(${DEFINES})"
+        fi
+
+        system "${CMD}"
+        rm -f __tmpsrcf.c
+        LINK=YES
+}
+
+
+#       Determine DB2 object name from IFS name.
+
+db2_name()
+
+{
+        if [ "${2}" = 'nomangle' ]
+        then    basename "${1}"                                         |
+                tr 'a-z-' 'A-Z_'                                        |
+                sed -e 's/\..*//;s/^\(.\).*\(.........\)$/\1\2/'
+        else    basename "${1}"                                         |
+                tr 'a-z-' 'A-Z_'                                        |
+                sed -e 's/\..*//;s/^LIBSSH2_/SSH2_/'                    \
+                    -e 's/^\(.\).*\(.........\)$/\1\2/'                 \
+                    -e 's/^SPUBLICKEY$/SSH2_PKEY/'
+        fi
+}
+
+
+#       Copy stream replacing version info.
+
+versioned_copy()
+
+{
+        sed -e "s/@LIBSSH2_VERSION@/${LIBSSH2_VERSION}/g"               \
+            -e "s/@LIBSSH2_VERSION_MAJOR@/${LIBSSH2_VERSION_MAJOR}/g"   \
+            -e "s/@LIBSSH2_VERSION_MINOR@/${LIBSSH2_VERSION_MINOR}/g"   \
+            -e "s/@LIBSSH2_VERSION_PATCH@/${LIBSSH2_VERSION_PATCH}/g"   \
+            -e "s/@LIBSSH2_VERSION_NUM@/${LIBSSH2_VERSION_NUM}/g"       \
+            -e "s/@LIBSSH2_TIMESTAMP@/${LIBSSH2_TIMESTAMP}/g"
+}
diff --git a/os400/make-include.sh b/os400/make-include.sh
new file mode 100644
index 0000000..d44980f
--- /dev/null
+++ b/os400/make-include.sh
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+#       Installation of the header files in the OS/400 library.
+#
+
+SCRIPTDIR=`dirname "${0}"`
+. "${SCRIPTDIR}/initscript.sh"
+cd "${TOPDIR}/include"
+
+
+#       Create the OS/400 source program file for the header files.
+
+SRCPF="${LIBIFSNAME}/H.FILE"
+
+if action_needed "${SRCPF}"
+then    CMD="CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)"
+        CMD="${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: Header files')"
+        system "${CMD}"
+fi
+
+
+#       Create the IFS directory for the header files.
+
+IFSINCLUDE="${IFSDIR}/include"
+
+if action_needed "${IFSINCLUDE}"
+then    mkdir -p "${IFSINCLUDE}"
+fi
+
+
+copy_hfile()
+
+{
+        destfile="${1}"
+        srcfile="${2}"
+        shift
+        shift
+        sed -e '1i\
+#pragma datamodel(P128)\
+' "${@}" -e '$a\
+#pragma datamodel(pop)\
+' < "${srcfile}" > "${destfile}"
+}
+
+#       Copy the header files.
+
+for HFILE in *.h
+do      DEST="${SRCPF}/`db2_name \"${HFILE}\"`.MBR"
+
+        if action_needed "${DEST}" "${HFILE}"
+        then    copy_hfile "${DEST}" "${HFILE}"
+                IFSDEST="${IFSINCLUDE}/`basename \"${HFILE}\"`"
+                rm -f "${IFSDEST}"
+                ln -s "${DEST}" "${IFSDEST}"
+        fi
+done
diff --git a/os400/make-rpg.sh b/os400/make-rpg.sh
new file mode 100644
index 0000000..c8a2647
--- /dev/null
+++ b/os400/make-rpg.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+#
+#       Installation of the ILE/RPG header files in the OS/400 library.
+#
+
+SCRIPTDIR=`dirname "${0}"`
+. "${SCRIPTDIR}/initscript.sh"
+cd "${TOPDIR}/os400/libssh2rpg"
+
+
+#       Create the OS/400 source program file for the ILE/RPG header files.
+
+SRCPF="${LIBIFSNAME}/LIBSSH2RPG.FILE"
+
+if action_needed "${SRCPF}"
+then    CMD="CRTSRCPF FILE(${TARGETLIB}/LIBSSH2RPG) RCDLEN(112)"
+        CMD="${CMD} CCSID(${TGTCCSID}) TEXT('libssh2: ILE/RPG header files')"
+        system "${CMD}"
+fi
+
+
+#       Map file names to DB2 name syntax.
+
+for HFILE in *.rpgle *.rpgle.in
+do      NAME="`basename \"${HFILE}\" .in`"
+        VAR="`basename \"${NAME}\" .rpgle`"
+        VAL="`db2_name \"${NAME}\"`"
+
+        eval "VAR_${VAR}=\"${VAL}\""
+        echo "${VAR} s/${VAR}/${VAL}/g"
+done > tmpsubstfile1
+
+#       Order substitution commands so that a prefix appears after all
+#               file names beginning with the prefix.
+
+sort -r tmpsubstfile1 | sed 's/^[^ ]*[ ]*//' > tmpsubstfile2
+
+
+change_include()
+
+{
+        sed -e '\#^....../include  *"libssh2rpg/#{'                     \
+            -e 's///'                                                   \
+            -e 's/".*//'                                                \
+            -f tmpsubstfile2                                            \
+            -e 's#.*#      /include libssh2rpg,&#'                      \
+            -e '}'
+}
+
+
+#       Create the IFS directory for the ILE/RPG header files.
+
+RPGIFSDIR="${IFSDIR}/include/libssh2rpg"
+
+if action_needed "${RPGIFSDIR}"
+then    mkdir -p "${RPGIFSDIR}"
+fi
+
+#       Copy the header files to IFS ILE/RPG include directory.
+#       Copy them with include path editing to the DB2 library.
+
+for HFILE in *.rpgle *.rpgle.in
+do      IFSCMD="cat \"${HFILE}\""
+        DB2CMD="change_include < \"${HFILE}\""
+        IFSFILE="`basename \"${HFILE}\" .in`"
+
+        case "${HFILE}" in
+
+        *.in)   IFSCMD="${IFSCMD} | versioned_copy"
+                DB2CMD="${DB2CMD} | versioned_copy"
+                ;;
+        esac
+
+        IFSDEST="${RPGIFSDIR}/${IFSFILE}"
+
+        if action_needed "${IFSDEST}" "${HFILE}"
+        then    eval "${IFSCMD}" > "${IFSDEST}"
+        fi
+
+        eval DB2MBR="\"\${VAR_`basename \"${IFSDEST}\" .rpgle`}\""
+        DB2DEST="${SRCPF}/${DB2MBR}.MBR"
+
+        if action_needed "${DB2DEST}" "${HFILE}"
+        then    eval "${DB2CMD}" | change_include > tmphdrfile
+
+                #       Need to translate to target CCSID.
+
+                CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DB2DEST}')"
+                CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
+                system "${CMD}"
+        fi
+done
diff --git a/os400/make-src.sh b/os400/make-src.sh
new file mode 100644
index 0000000..ef1b999
--- /dev/null
+++ b/os400/make-src.sh
@@ -0,0 +1,206 @@
+#!/bin/sh
+#
+#       libssh2 compilation script for the OS/400.
+#
+
+SCRIPTDIR=`dirname "${0}"`
+. "${SCRIPTDIR}/initscript.sh"
+cd "${TOPDIR}/src"
+
+
+#       Function to extract external prototypes from header files.
+#       Input: concatenated header files.
+#       Output: external prototypes, one per (long) line.
+
+extproto()
+{
+        sed -e 'x;G;s/^\n//;s/\n/ /g'                                   \
+            -e 's#[[:space:]]*/\*[^*]*\(\*\([^/*][^*]*\)\{0,1\}\)*\*/[[:space:]]*##g' \
+            -e 'h'                                                      \
+            -e '/\/\*/!{'                                               \
+            -e '/^#/{s/^.*[^\\]$//;h;d'                                 \
+            -e '}'                                                      \
+            -e 's/\\$//'                                                \
+            -e ':loop1'                                                 \
+            -e '/;/{'                                                   \
+            -e 's/^[^;]*;//;x;s/;.*//'                                  \
+            -e '/^[[:space:]]*LIBSSH2_API[[:space:]].*(/{'              \
+            -e 's/^[[:space:]]*LIBSSH2_API[[:space:]]*//'               \
+            -e 's/[[:space:]]*$//'                                      \
+            -e 's/[[:space:]][[:space:]]*/ /g'                          \
+            -e 'p'                                                      \
+            -e '}'                                                      \
+            -e 'g;bloop1'                                               \
+            -e '}'                                                      \
+            -e '}'                                                      \
+            -n
+}
+
+#       Need to have IFS access to the mih/modasa header file.
+
+if action_needed modasa.mih '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR'
+then    rm -f modasa.mih
+        ln -s '/QSYS.LIB/QSYSINC.LIB/MIH.FILE/MODASA.MBR' modasa.mih
+fi
+
+
+#      Create and compile the identification source file.
+
+echo '#pragma comment(user, "libssh2 version '"${LIBSSH2_VERSION}"'")' > os400.c
+echo '#pragma comment(user, __DATE__)' >> os400.c
+echo '#pragma comment(user, __TIME__)' >> os400.c
+echo '#pragma comment(copyright, "See COPYING file. OS/400 version by P. Monnerat")' >> os400.c
+make_module     OS400           os400.c
+LINK=                           # No need to rebuild service program yet.
+MODULES=
+
+
+#       Generate the procedures implementing macros.
+
+if action_needed macros.c "${TOPDIR}/os400/macros.h"
+then    (
+                echo '#include "libssh2_publickey.h"'
+                echo '#include "libssh2_sftp.h"'
+                extproto < "${TOPDIR}/os400/macros.h"                   |
+                sed -e 'h;s/^[^(]*[ *]\([^ (]*\) *(.*/\1/'              \
+                    -e 's/.*/#pragma map(_&, "&")/;p'                   \
+                    -e 'g;s/^\([^(]*[ *]\)\([^ (]*\)\( *(.*\)/\1_\2\3 {/;p' \
+                    -e 'g;s/^[^(]*(\(.*\))$/,\1,/;s/[^A-Za-z0-9_,]/ /g' \
+                    -e 's/  *,/,/g;s/,[^,]* \([^ ,]*\)/,\1/g'           \
+                    -e 's/ //g;s/^,void,$/,,/'                          \
+                    -e 's/^,\(.*\),$/(\1); }/;s/,/, /g'                 \
+                    -e 'x;s/(.*//;s/ *$//;G;s/\n//g'                    \
+                    -e 's/^void\([ *]\)/\1/;s/^ *//'                    \
+                    -e 's/^[^(]*[ *]\([A-Za-z][A-Za-z0-9_]* *(\)/return \1/' \
+                    -e 's/.*/    &/'
+        ) > macros.c
+fi
+
+#       Get source list.
+
+cat ../Makefile.inc ../Makefile.os400qc3.inc                            |
+  sed -e ':begin'                                                       \
+    -e '/\\$/{'                                                         \
+    -e 's/\\$/ /'                                                       \
+    -e 'N'                                                              \
+    -e 'bbegin'                                                         \
+    -e '}'                                                              \
+    -e 's/\n//g'                                                        \
+    -e 's/[[:space:]]*$//'                                              \
+    -e 's/^\([A-Za-z][A-Za-z0-9_]*\)[[:space:]]*=[[:space:]]*\(.*\)/\1="\2"/' \
+    -e 's/\$(\([A-Za-z][A-Za-z0-9_]*\))/${\1}/g'                        \
+        > tmpscript.sh
+. ./tmpscript.sh
+
+
+#       Compile the sources into modules.
+
+INCLUDES="'`pwd`'"
+
+for SRC in "${SCRIPTDIR}/os400sys.c" ${CSOURCES} ${CRYPTO_CSOURCES} macros.c
+do      MODULE=`db2_name "${SRC}"`
+        make_module "${MODULE}" "${SRC}"
+done
+
+
+#       If needed, (re)create the static binding directory.
+
+if action_needed "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
+then    LINK=YES
+fi
+
+if [ "${LINK}" ]
+then    rm -rf "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
+        CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+        CMD="${CMD} TEXT('libssh2 API static binding directory')"
+        system "${CMD}"
+
+        for MODULE in ${MODULES}
+        do      CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+                CMD="${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))"
+                system "${CMD}"
+        done
+
+#       V6R1M0 does not list system service program QC3PBEXT in the
+#       implicit binding directory: thus we add it here in ours.
+
+        CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+        CMD="${CMD} OBJ((QSYS/QC3PBEXT *SRVPGM))"
+        system "${CMD}"
+fi
+
+
+#       The exportation file for service program creation must be in a DB2
+#               source file, so make sure it exists.
+
+if action_needed "${LIBIFSNAME}/TOOLS.FILE"
+then    CMD="CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)"
+        CMD="${CMD} TEXT('libssh2: build tools')"
+        system "${CMD}"
+fi
+
+
+#       Gather the list of symbols to export.
+
+EXPORTS=`cat "${TOPDIR}"/include/*.h "${TOPDIR}"/os400/macros.h         |
+         extproto                                                       |
+         sed -e 's/(.*//;s/[^A-Za-z0-9_]/ /g;s/ *$//;s/^.* //'`
+
+#       Create the service program exportation file in DB2 member if needed.
+
+BSF="${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR"
+
+if action_needed "${BSF}" Makefile.am
+then    LINK=YES
+fi
+
+if [ "${LINK}" ]
+then    echo " STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('LIBSSH2_${SONAME}')" \
+            > "${BSF}"
+        for EXPORT in ${EXPORTS}
+        do      echo ' EXPORT    SYMBOL("'"${EXPORT}"'")' >> "${BSF}"
+        done
+
+        echo ' ENDPGMEXP' >> "${BSF}"
+fi
+
+
+#       Build the service program if needed.
+
+if action_needed "${LIBIFSNAME}/${SRVPGM}.SRVPGM"
+then    LINK=YES
+fi
+
+if [ "${LINK}" ]
+then    CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})"
+        CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)"
+        CMD="${CMD} MODULE(${TARGETLIB}/OS400)"
+        CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR}"
+        if [ "${WITH_ZLIB}" != 0 ]
+        then    CMD="${CMD} ${ZLIB_LIB}/${ZLIB_BNDDIR}"
+		liblist -a "${ZLIB_LIB}"
+        fi
+        CMD="${CMD})"
+        CMD="${CMD} BNDSRVPGM(QADRTTS)"
+        CMD="${CMD} TEXT('libssh2 API library')"
+        CMD="${CMD} TGTRLS(${TGTRLS})"
+        system "${CMD}"
+        LINK=YES
+fi
+
+
+#       If needed, (re)create the dynamic binding directory.
+
+if action_needed "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
+then    LINK=YES
+fi
+
+if [ "${LINK}" ]
+then    rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
+        CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
+        CMD="${CMD} TEXT('libssh2 API dynamic binding directory')"
+        system "${CMD}"
+        CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
+        CMD="${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))"
+        system "${CMD}"
+fi
diff --git a/os400/make.sh b/os400/make.sh
new file mode 100644
index 0000000..0c9e3de
--- /dev/null
+++ b/os400/make.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+#
+#       libssh2 compilation script for the OS/400.
+#
+#
+#       This is a shell script since make is not a standard component of OS/400.
+
+SCRIPTDIR=`dirname "${0}"`
+. "${SCRIPTDIR}/initscript.sh"
+cd "${TOPDIR}"
+
+
+#       Create the OS/400 library if it does not exist.
+
+if action_needed "${LIBIFSNAME}"
+then    CMD="CRTLIB LIB(${TARGETLIB}) TEXT('libssh2: SSH2 protocol API')"
+        system "${CMD}"
+fi
+
+
+#       Create the DOCS source file if it does not exist.
+
+if action_needed "${LIBIFSNAME}/DOCS.FILE"
+then    CMD="CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(240)"
+        CMD="${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')"
+        system "${CMD}"
+fi
+
+
+#       Copy some documentation files if needed.
+
+for TEXT in "${TOPDIR}/COPYING" "${SCRIPTDIR}/README400"                \
+    "${TOPDIR}/NEWS" "${TOPDIR}/README" "${TOPDIR}/docs/AUTHORS"        \
+    "${TOPDIR}/docs/BINDINGS"
+do      MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${TEXT}\"`.MBR"
+
+        if action_needed "${MEMBER}" "${TEXT}"
+        then    CMD="CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})"
+                CMD="${CMD} DTAFMT(*TEXT) REPLACE(*YES)"
+                system "${CMD}"
+        fi
+done
+
+
+#       Build in each directory.
+
+for SUBDIR in include rpg src
+do      "${SCRIPTDIR}/make-${SUBDIR}.sh"
+done