From 42287004610f0d3386b1c08a0fff8ed149f76c4e Mon Sep 17 00:00:00 2001 From: Jon Rumsey Date: Mon, 27 Jan 2020 09:23:43 +0100 Subject: urldata: do string enums without #ifdefs for build scripts ... and check for inconsistencies for OS400 at build time with the new chkstrings tool. Closes #4822 --- lib/urldata.h | 27 ++++++++++++-------- packages/OS400/ccsidcurl.c | 16 ------------ packages/OS400/chkstrings.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ packages/OS400/make-lib.sh | 20 +++++++++++++++ 4 files changed, 99 insertions(+), 26 deletions(-) create mode 100644 packages/OS400/chkstrings.c diff --git a/lib/urldata.h b/lib/urldata.h index 6882e0a65..208ae0f42 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1450,6 +1450,14 @@ struct DynamicStatic { struct Curl_multi; /* declared and used only in multi.c */ +/* + * This enumeration MUST not use conditional directives (#ifdefs), new + * null terminated strings MUST be added to the enumeration immediately + * before STRING_LASTZEROTERMINATED, binary fields immediately before + * STRING_LAST. When doing so, ensure that the packages/OS400/chkstring.c + * test is updated and applicable changes for EBCDIC to ASCII conversion + * are catered for in curl_easy_setopt_ccsid() + */ enum dupstring { STRING_CERT_ORIG, /* client certificate file name */ STRING_CERT_PROXY, /* client certificate file name */ @@ -1506,36 +1514,35 @@ enum dupstring { STRING_RTSP_SESSION_ID, /* Session ID to use */ STRING_RTSP_STREAM_URI, /* Stream URI for this request */ STRING_RTSP_TRANSPORT, /* Transport for this session */ -#ifdef USE_SSH + STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */ STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */ STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */ STRING_SSH_KNOWNHOSTS, /* file name of knownhosts file */ -#endif + STRING_PROXY_SERVICE_NAME, /* Proxy service name */ STRING_SERVICE_NAME, /* Service name */ STRING_MAIL_FROM, STRING_MAIL_AUTH, -#ifdef USE_TLS_SRP STRING_TLSAUTH_USERNAME_ORIG, /* TLS auth */ STRING_TLSAUTH_USERNAME_PROXY, /* TLS auth */ STRING_TLSAUTH_PASSWORD_ORIG, /* TLS auth */ STRING_TLSAUTH_PASSWORD_PROXY, /* TLS auth */ -#endif + STRING_BEARER, /* , if used */ -#ifdef USE_UNIX_SOCKETS + STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */ -#endif + STRING_TARGET, /* CURLOPT_REQUEST_TARGET */ STRING_DOH, /* CURLOPT_DOH_URL */ -#ifdef USE_ALTSVC + STRING_ALTSVC, /* CURLOPT_ALTSVC */ -#endif + STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */ -#ifndef CURL_DISABLE_PROXY + STRING_TEMP_URL, /* temp URL storage for proxy use */ -#endif + /* -- end of zero-terminated strings -- */ STRING_LASTZEROTERMINATED, diff --git a/packages/OS400/ccsidcurl.c b/packages/OS400/ccsidcurl.c index 11e4c777e..64fb7393d 100644 --- a/packages/OS400/ccsidcurl.c +++ b/packages/OS400/ccsidcurl.c @@ -1130,22 +1130,6 @@ curl_easy_setopt_ccsid(CURL *curl, CURLoption tag, ...) char *cp; unsigned int ccsid; curl_off_t pfsize; - static char testwarn = 1; - - /* Warns if this procedure has not been updated when the dupstring enum - changes. - We (try to) do it only once: there is no need to issue several times - the same message; but since threadsafeness is not handled here, - this may occur (and we don't care!). */ - - if(testwarn) { - testwarn = 0; - - if((int) STRING_LASTZEROTERMINATED != (int) STRING_SASL_AUTHZID + 1 || - (int) STRING_LAST != (int) STRING_COPYPOSTFIELDS + 1) - curl_mfprintf(stderr, - "*** WARNING: curl_easy_setopt_ccsid() should be reworked ***\n"); - } data = (struct Curl_easy *) curl; va_start(arg, tag); diff --git a/packages/OS400/chkstrings.c b/packages/OS400/chkstrings.c new file mode 100644 index 000000000..613540e42 --- /dev/null +++ b/packages/OS400/chkstrings.c @@ -0,0 +1,62 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2020, Daniel Stenberg, , 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.haxx.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. + * + ***************************************************************************/ + +#include +#pragma enum(int) +#include "curl_setup.h" +#include "urldata.h" + +/* The following defines indicate the expected dupstring enum values + * in curl_easy_setopt_ccsid() in packages/OS400/ccsidcurl.c. If a + * mismatch is flagged during the build, it indicates that curl_easy_setopt_ccsid() + * may need updating to perform data EBCDIC to ASCII data conversion on + * the string. + * Once any applicable changes to curl_easy_setopt_ccsid() have been + * made, the EXPECTED_STRING_LASTZEROTERMINATED/EXPECTED_STRING_LAST + * values can be updated to match the latest enum values in urldata.h. + */ +#define EXPECTED_STRING_LASTZEROTERMINATED (STRING_TEMP_URL + 1) +#define EXPECTED_STRING_LAST (STRING_COPYPOSTFIELDS + 1) + +int main(int argc, char *argv[]) +{ + int rc = 0; + + if (STRING_LASTZEROTERMINATED != EXPECTED_STRING_LASTZEROTERMINATED) + { + fprintf(stderr,"STRING_LASTZEROTERMINATED(%d) is not expected value(%d).\n", + STRING_LASTZEROTERMINATED, EXPECTED_STRING_LASTZEROTERMINATED); + rc += 1; + } + if (STRING_LAST != EXPECTED_STRING_LAST) + { + fprintf(stderr,"STRING_LAST(%d) is not expected value(%d).\n", + STRING_LAST, EXPECTED_STRING_LAST); + rc += 2; + } + if (rc != 0) + { + fprintf(stderr,"curl_easy_setopt_ccsid() in packages/OS400/ccsidcurl.c" + " may need updating if new strings are provided as input via the curl API.\n"); + } + return rc; +} \ No newline at end of file diff --git a/packages/OS400/make-lib.sh b/packages/OS400/make-lib.sh index 410bef05b..fadb4c5f6 100644 --- a/packages/OS400/make-lib.sh +++ b/packages/OS400/make-lib.sh @@ -46,6 +46,26 @@ sed -e ':begin' \ INCLUDES="'`pwd`'" +# Create a small C program to check ccsidcurl.c is up to date +if action_needed "${LIBIFSNAME}/CHKSTRINGS.PGM" +then + CMD="CRTBNDC PGM(${TARGETLIB}/CHKSTRINGS) SRCSTMF('${SCRIPTDIR}/chkstrings.c')" + CMD="${CMD} INCDIR('${TOPDIR}/include/curl' '${TOPDIR}/include' '${SRCDIR}' ${INCLUDES})" + system -i "${CMD}" + if [ $? -ne 0 ] + then + echo "ERROR: Failed to build CHKSTRINGS *PGM object!" + exit 2 + else + ${LIBIFSNAME}/CHKSTRINGS.PGM + if [ $? -ne 0 ] + then + echo "ERROR: CHKSTRINGS failed!" + exit 2 + fi + fi +fi + make_module OS400SYS "${SCRIPTDIR}/os400sys.c" make_module CCSIDCURL "${SCRIPTDIR}/ccsidcurl.c" -- cgit v1.2.1