/* No OS/400 header file defines u_int32_t. */
typedef unsigned long u_int32_t;
+/* OS/400 has no idea of a tty! */
+#define isatty(fd) 0
+
/* System API wrapper prototypes & definitions to support ASCII parameters. */
OS400/rpg-examples \
OS400/ccsidcurl.c \
OS400/ccsidcurl.h \
+ OS400/curlcl.c \
+ OS400/curlmain.c \
OS400/curl.inc.in \
OS400/initscript.sh \
OS400/make-include.sh \
OS400/make-tests.sh \
OS400/makefile.sh \
OS400/os400sys.c \
- OS400/os400sys.h
+ OS400/os400sys.h \
+ OS400/curl.cmd
CHECKSRC = $(CS_$(V))
CS_0 = @echo " RUN " $@;
is provided for that purpose: this allows storing a long value in the
curl_forms array. Please note the form API is deprecated and the MIME API
should be used instead.
+
+
+CLI tool:
+
+ The build system provides it as a bound program, an IFS link to it and a
+simple CL command. The latter however is not able to provide a different
+parameter for each option since there are too many of those; instead,
+parameters are entered in a single field subject to quoting and escaping, in
+the same form as expected by the standard CLI program.
+ Care must be taken about the program output encoding: by default, it is sent
+to the standard output and is thus subject to transcoding. It is therefore
+recommended to use option "--output" to redirect output to a specific IFS file.
+Similar problems may occur about the standard input encoding.
--- /dev/null
+/*****************************************************************************/
+/* _ _ ____ _ */
+/* Project ___| | | | _ \| | */
+/* / __| | | | |_) | | */
+/* | (__| |_| | _ <| |___ */
+/* \___|\___/|_| \_\_____| */
+/* */
+/* Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. */
+/* */
+/* This software is licensed as described in the file COPYING, which */
+/* you should have received as part of this distribution. The terms */
+/* are also available at https://curl.se/docs/copyright.html. */
+/* */
+/* You may opt to use, copy, modify, merge, publish, distribute and/or sell */
+/* copies of the Software, and permit persons to whom the Software is */
+/* furnished to do so, under the terms of the COPYING file. */
+/* */
+/* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY */
+/* KIND, either express or implied. */
+/* */
+/* SPDX-License-Identifier: curl */
+/* */
+/* */
+/*****************************************************************************/
+
+/* Use program CURLCL as interface to the curl command line tool */
+
+ CMD PROMPT('File transfer utility')
+
+ PARM KWD(CMDARGS) TYPE(*CHAR) LEN(5000) VARY(*YES *INT2) +
+ CASE(*MIXED) EXPR(*YES) MIN(1) +
+ PROMPT('Curl command arguments')
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ *
+ ***************************************************************************/
+
+/* CL interface program to curl cli tool. */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <milib.h>
+#include <miptrnam.h>
+#include <mih/callpgmv.h>
+
+
+/* Variable-length string, with 16-bit length. */
+typedef struct {
+ short len;
+ char string[5000];
+} vary2;
+
+
+/* Arguments from CL command. */
+typedef struct {
+ char * pgm; /* Program name. */
+ vary2 * cmdargs; /* Command line arguments. */
+} arguments;
+
+
+static int
+is_ifs(char c)
+{
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+}
+
+static int
+parse_command_line(const char *cmdargs, size_t len,
+ size_t *argc, char **argv,
+ size_t *argsize, char *argbuf)
+{
+ const char *endline = cmdargs + len;
+ char quote = '\0';
+ int inarg = 0;
+
+ *argc = 0;
+ *argsize = 0;
+
+ while(cmdargs < endline) {
+ char c = *cmdargs++;
+
+ if(!inarg) {
+ /* Skip argument separator. */
+ if(is_ifs(c))
+ continue;
+
+ /* Start a new argument. */
+ ++*argc;
+ if(argv)
+ *argv++ = argbuf;
+ inarg = 1;
+ }
+
+ /* Check for quoting end. */
+ if(quote && quote == c) {
+ quote = '\0';
+ continue;
+ }
+
+ /* Check for backslash-escaping. */
+ if(quote != '\'' && c == '\\') {
+ if(cmdargs >= endline) {
+ fputs("Trailing backslash in command\n", stderr);
+ return -1;
+ }
+ c = *cmdargs++;
+ }
+ else if(!quote && is_ifs(c)) { /* Check for end of argument. */
+ inarg = 0;
+ c = '\0'; /* Will store a string terminator. */
+ }
+
+ /* Store argument character and count it. */
+ if(argbuf)
+ *argbuf++ = c;
+ ++*argsize;
+ }
+
+ if(quote) {
+ fprintf(stderr, "Unterminated quote: %c\n", quote);
+ return -1;
+ }
+
+ /* Terminate last argument. */
+ if(inarg) {
+ if(argbuf)
+ *argbuf = '\0';
+ ++*argsize;
+ }
+
+ /* Terminate argument list. */
+ if(argv)
+ *argv = NULL;
+
+ return 0;
+}
+
+
+int
+main(int argsc, arguments *args)
+{
+ size_t argc;
+ char **argv;
+ size_t argsize;
+ int i;
+ int exitcode;
+ char library[11];
+
+ /* Extract current program library name. */
+ for(i = 0; i < 10; i++) {
+ char c = args->pgm[i];
+
+ if(!c || c == '/')
+ break;
+
+ library[i] = c;
+ }
+ library[i] = '\0';
+
+ /* Measure arguments size. */
+ exitcode = parse_command_line(args->cmdargs->string, args->cmdargs->len,
+ &argc, NULL, &argsize, NULL);
+
+ if(!exitcode) {
+ /* Allocate space for parsed arguments. */
+ argv = (char **) malloc((argc + 1) * sizeof(*argv) + argsize);
+ if(!argv) {
+ fputs("Memory allocation error\n", stderr);
+ exitcode = -2;
+ }
+ else {
+ _SYSPTR pgmptr = rslvsp(WLI_PGM, (char *) "CURL", library, _AUTH_NONE);
+ _LU_Work_Area_T *luwrka = (_LU_Work_Area_T *) _LUWRKA();
+
+ parse_command_line(args->cmdargs->string, args->cmdargs->len,
+ &argc, argv, &argsize, (char *) (argv + argc + 1));
+
+ /* Call program. */
+ _CALLPGMV((void *) &pgmptr, argv, argc);
+ exitcode = luwrka->LU_RC;
+
+ free(argv);
+ }
+ }
+
+ return exitcode;
+}
--- /dev/null
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
+ *
+ * This software is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at https://curl.se/docs/copyright.html.
+ *
+ * You may opt to use, copy, modify, merge, publish, distribute and/or sell
+ * copies of the Software, and permit persons to whom the Software is
+ * furnished to do so, under the terms of the COPYING file.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ * SPDX-License-Identifier: curl
+ *
+ *
+ ***************************************************************************/
+
+/*
+ * QADRT/QADRTMAIN2 substitution program.
+ * This is needed because the IBM-provided QADRTMAIN2 does not
+ * properly translate arguments by default or if no locale is provided.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <iconv.h>
+#include <errno.h>
+#include <locale.h>
+
+/* Do not use qadrt.h since it defines unneeded static procedures. */
+extern void QadrtInit(void);
+extern int QadrtFreeConversionTable(void);
+extern int QadrtFreeEnviron(void);
+extern char * setlocale_a(int, const char *);
+
+
+/* The ASCII main program. */
+extern int main_a(int argc, char * * argv);
+
+/* Global values of original EBCDIC arguments. */
+int ebcdic_argc;
+char ** ebcdic_argv;
+
+
+int
+main(int argc, char **argv)
+
+{
+ int i;
+ int j;
+ iconv_t cd;
+ size_t bytecount = 0;
+ char * inbuf;
+ char * outbuf;
+ size_t inbytesleft;
+ size_t outbytesleft;
+ char dummybuf[128];
+ char tocode[32];
+ char fromcode[32];
+
+ ebcdic_argc = argc;
+ ebcdic_argv = argv;
+
+ /* Build the encoding converter. */
+ strncpy(tocode, "IBMCCSID01208", sizeof tocode); /* Use UTF-8. */
+ strncpy(fromcode, "IBMCCSID000000000010", sizeof fromcode);
+ cd = iconv_open(tocode, fromcode);
+
+ /* Measure the arguments. */
+ for(i = 0; i < argc; i++) {
+ inbuf = argv[i];
+ do {
+ inbytesleft = 0;
+ outbuf = dummybuf;
+ outbytesleft = sizeof dummybuf;
+ j = iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ bytecount += outbuf - dummybuf;
+ } while(j == -1 && errno == E2BIG);
+
+ /* Reset the shift state. */
+ iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
+ }
+
+ /* Allocate memory for the ASCII arguments and vector. */
+ argv = (char **) malloc((argc + 1) * sizeof *argv + bytecount);
+
+ /* Build the vector and convert argument encoding. */
+ outbuf = (char *) (argv + argc + 1);
+ outbytesleft = bytecount;
+
+ for(i = 0; i < argc; i++) {
+ argv[i] = outbuf;
+ inbuf = ebcdic_argv[i];
+ inbytesleft = 0;
+ iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+ iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
+ }
+
+ iconv_close(cd);
+ argv[argc] = NULL;
+
+ /* Try setting the locale regardless of QADRT_ENV_LOCALE. */
+ setlocale_a(LC_ALL, "");
+
+ /* Call the program. */
+ i = main_a(argc, argv);
+
+ /* Clean-up allocated items. */
+ free((char *) argv);
+ QadrtFreeConversionTable();
+ QadrtFreeEnviron();
+
+ /* Terminate. */
+ return i;
+}
setenv TGTRLS '*CURRENT' # Target OS release.
setenv IFSDIR '/curl' # Installation IFS directory.
setenv QADRTDIR '/QIBM/ProdData/qadrt' # QADRT IFS directory.
-setenv QADRTLIB 'QADRT' # QADRT object library.
# Define ZLIB availability and locations.
CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
CMD="${CMD} DBGVIEW(${DEBUG})"
- DEFINES="${3} BUILDING_LIBCURL 'qadrt_use_inline'"
+ DEFINES="${3} 'qadrt_use_inline'"
if [ "${WITH_ZLIB}" != "0" ]
then DEFINES="${DEFINES} HAVE_LIBZ"
tr 'a-z-' 'A-Z_' |
sed -e 's/\..*//' \
-e 's/^CURL_*/C/' \
+ -e 's/^TOOL_*/T/' \
-e 's/^\(.\).*\(.........\)$/\1\2/'
fi
}
-e "s/@LIBCURL_TIMESTAMP@/${LIBCURL_TIMESTAMP}/g" \
< "${1}" > "${2}"
}
+
+
+# Get definitions from a make file.
+# The `sed' statement works as follows:
+# - Join \nl-separated lines.
+# - Retain only lines that begins with "identifier =".
+# - Turn these lines into shell variable assignments.
+
+get_make_vars()
+
+{
+ eval "`sed -e ': begin' \
+ -e '/\\\\$/{' \
+ -e 'N' \
+ -e 's/\\\\\\n/ /' \
+ -e 'b begin' \
+ -e '}' \
+ -e '/^[A-Za-z_][A-Za-z0-9_]*[[:space:]]*=/!d' \
+ -e 's/[[:space:]]*=[[:space:]]*/=/' \
+ -e 's/=\\(.*[^[:space:]]\\)[[:space:]]*$/=\\"\\1\\"/' \
+ -e 's/\\\$(\\([^)]*\\))/\${\\1}/g' \
+ < \"${1}\"`"
+}
echo '#pragma comment(user, __DATE__)' >> os400.c
echo '#pragma comment(user, __TIME__)' >> os400.c
echo '#pragma comment(copyright, "Copyright (C) Daniel Stenberg et al. OS/400 version by P. Monnerat")' >> os400.c
-make_module OS400 os400.c
+make_module OS400 os400.c BUILDING_LIBCURL
LINK= # No need to rebuild service program yet.
MODULES=
-# Get source list.
+# Get source list (CSOURCES variable).
-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' \
- < Makefile.inc > tmpscript.sh
-. ./tmpscript.sh
+get_make_vars Makefile.inc
# Compile the sources into modules.
INCLUDES="'`pwd`'"
-make_module OS400SYS "${SCRIPTDIR}/os400sys.c"
-make_module CCSIDCURL "${SCRIPTDIR}/ccsidcurl.c"
+make_module OS400SYS "${SCRIPTDIR}/os400sys.c" BUILDING_LIBCURL
+make_module CCSIDCURL "${SCRIPTDIR}/ccsidcurl.c" BUILDING_LIBCURL
for SRC in ${CSOURCES}
do MODULE=`db2_name "${SRC}"`
- make_module "${MODULE}" "${SRC}"
+ make_module "${MODULE}" "${SRC}" BUILDING_LIBCURL
done
#
###########################################################################
#
-#
-# Not implemented yet on OS/400.
+# Command line interface tool compilation script for the OS/400.
+
+SCRIPTDIR=`dirname "${0}"`
+. "${SCRIPTDIR}/initscript.sh"
+cd "${TOPDIR}/src"
+
+
+# Get source lists.
+# CURL_CFILES are in the current directory.
+# CURLX_CFILES are in the lib directory and need to be recompiled because
+# some function names change using macros.
+
+get_make_vars Makefile.inc
+
+
+# Compile the sources into modules.
+
+LINK=
+MODULES=
+INCLUDES="'${TOPDIR}/lib'"
+
+for SRC in ${CURLX_CFILES}
+do MODULE=`db2_name "${SRC}"`
+ MODULE=`db2_name "X${MODULE}"`
+ make_module "${MODULE}" "${SRC}"
+done
+
+for SRC in ${CURL_CFILES}
+do MODULE=`db2_name "${SRC}"`
+ make_module "${MODULE}" "${SRC}"
+done
+
+
+# Link modules into program.
+
+MODULES="`echo \"${MODULES}\" | sed \"s/[^ ][^ ]*/${TARGETLIB}\/&/g\"`"
+CMD="CRTPGM PGM(${TARGETLIB}/CURL)"
+CMD="${CMD} ENTMOD(${TARGETLIB}/CURLMAIN)"
+CMD="${CMD} MODULE(${MODULES})"
+CMD="${CMD} BNDSRVPGM(${TARGETLIB}/${SRVPGM} QADRTTS)"
+CMD="${CMD} TGTRLS(${TGTRLS})"
+CLcommand "${CMD}"
+
+
+# Create the IFS command.
+
+IFSBIN="${IFSDIR}/bin"
+
+if action_needed "${IFSBIN}"
+then mkdir -p "${IFSBIN}"
+fi
+
+rm -f "${IFSBIN}/curl"
+ln -s "/QSYS.LIB/${TARGETLIB}.LIB/CURL.PGM" "${IFSBIN}/curl"
+
+
+# Create the CL interface program.
+
+if action_needed "${LIBIFSNAME}/CURLCL.PGM" "${SCRIPTDIR}/curlcl.c"
+then CMD="CRTBNDC PGM(${TARGETLIB}/CURLCL)"
+ CMD="${CMD} SRCSTMF('${SCRIPTDIR}/curlcl.c')"
+ CMD="${CMD} TGTCCSID(${TGTCCSID})"
+ CLcommand "${CMD}"
+fi
+
+
+# Create the CL command.
+
+if action_needed "${LIBIFSNAME}/CURL.CMD" "${SCRIPTDIR}/curl.cmd"
+then CMD="CRTCMD CMD(${TARGETLIB}/CURL) PGM(${TARGETLIB}/CURLCL)"
+ CMD="${CMD} SRCSTMF('${SCRIPTDIR}/curl.cmd')"
+ CLcommand "${CMD}"
+fi
cd libtest
# Get definitions from the Makefile.inc file.
-# The `sed' statement works as follows:
-# _ Join \nl-separated lines.
-# _ Retain only lines that begins with "identifier =".
-# _ Turn these lines into shell variable assignments.
-
-eval "`sed -e ': begin' \
- -e '/\\\\$/{' \
- -e 'N' \
- -e 's/\\\\\\n/ /' \
- -e 'b begin' \
- -e '}' \
- -e '/^[A-Za-z_][A-Za-z0-9_]*[[:space:]]*[=]/b keep' \
- -e 'd' \
- -e ': keep' \
- -e 's/[[:space:]]*=[[:space:]]*/=/' \
- -e 's/=\\(.*[^[:space:]]\\)[[:space:]]*$/=\\"\\1\\"/' \
- -e 's/\\$(\\([^)]*\\))/${\\1}/g' \
- < Makefile.inc`"
+
+get_make_vars Makefile.inc
# Special case: redefine chkhostname compilation parameters.
MODULES="`echo \"${MODULES}\" |
sed \"s/[^ ][^ ]*/${TARGETLIB}\/&/g\"`"
CMD="CRTPGM PGM(${TARGETLIB}/${DB2PGM})"
- CMD="${CMD} ENTMOD(${QADRTLIB}/QADRTMAIN2)"
+ CMD="${CMD} ENTMOD(${TARGETLIB}/CURLMAIN)"
CMD="${CMD} MODULE(${MODULES})"
CMD="${CMD} BNDSRVPGM(${TARGETLIB}/${SRVPGM} QADRTTS)"
CMD="${CMD} TGTRLS(${TGTRLS})"
done
+# Compile the QADRTMAIN2 replacement module.
+
+if action_needed "${LIBIFSNAME}/CURLMAIN.MODULE" "${SCRIPTDIR}/curlmain.c"
+then CMD="CRTCMOD MODULE(${TARGETLIB}/CURLMAIN)"
+ CMD="${CMD} SRCSTMF('${SCRIPTDIR}/curlmain.c')"
+ CMD="${CMD} SYSIFCOPT(*IFS64IO) LOCALETYPE(*LOCALE) FLAG(10)"
+ CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})"
+ CMD="${CMD} OUTPUT(${OUTPUT})"
+ CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
+ CMD="${CMD} DBGVIEW(${DEBUG})"
+ CLcommand "${CMD}"
+fi
+
+
# Build in each directory.
# for SUBDIR in include lib src tests