- use `$()` instead of backticks, and re-arrange double-quotes inside.
- add missing `|| exit 1` to `cd` calls. (could be dropped by using `set -eu`.)
- add `-n` to a few `if`s.
- shorten redirections by using `{} >` (as shellcheck recommended).
- silence warnings where variables were detected as unused (SC2034).
- a couple misc updates to silence warnings.
- switch to bash shebang for `-ot` feature.
- split two lines to unbreak syntax highlighting in my editor. (`$(expr \`, `$(dirname \`)
Also enable CI checks for OS/400 shell scripts.
Ref: #13307
Closes #13309
#
# SPDX-License-Identifier: curl
-# FIXME: packages/OS400/* scripts
-
shellcheck --version
# shellcheck disable=SC2046
shellcheck --exclude=1091 \
--enable=avoid-nullary-conditions,deprecate-which \
- $(grep -l -E '^#!(/usr/bin/env bash|/bin/sh|/bin/bash)' $(git ls-files | grep -v -F 'packages/OS400/'))
+ $(grep -l -E '^#!(/usr/bin/env bash|/bin/sh|/bin/bash)' $(git ls-files))
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
{
# Define and export.
- eval ${1}="${2}"
- export ${1}
+ eval "${1}=${2}"
+ export "${1?}"
}
case "${SCRIPTDIR}" in
/*) ;;
-*) SCRIPTDIR="`pwd`/${SCRIPTDIR}"
+*) SCRIPTDIR="$(pwd)/${SCRIPTDIR}"
esac
while true
# The script directory is supposed to be in $TOPDIR/packages/os400.
-TOPDIR=`dirname "${SCRIPTDIR}"`
-TOPDIR=`dirname "${TOPDIR}"`
+TOPDIR=$(dirname "${SCRIPTDIR}")
+TOPDIR=$(dirname "${TOPDIR}")
export SCRIPTDIR TOPDIR
# Extract the SONAME from the library makefile.
-SONAME=`sed -e '/^VERSIONCHANGE=/!d;s/^.*=\([0-9]*\).*/\1/' \
- < "${TOPDIR}/lib/Makefile.soname"`
+SONAME="$(sed -e '/^VERSIONCHANGE=/!d;s/^.*=\([0-9]*\).*/\1/' \
+ < "${TOPDIR}/lib/Makefile.soname")"
export SONAME
# Get OS/400 configuration parameters.
# Need to get the version definitions.
-LIBCURL_VERSION=`grep '^#define *LIBCURL_VERSION ' \
+LIBCURL_VERSION=$(grep '^#define *LIBCURL_VERSION ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/.*"\(.*\)".*/\1/'`
-LIBCURL_VERSION_MAJOR=`grep '^#define *LIBCURL_VERSION_MAJOR ' \
+ sed 's/.*"\(.*\)".*/\1/')
+LIBCURL_VERSION_MAJOR=$(grep '^#define *LIBCURL_VERSION_MAJOR ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/^#define *LIBCURL_VERSION_MAJOR *\([^ ]*\).*/\1/'`
-LIBCURL_VERSION_MINOR=`grep '^#define *LIBCURL_VERSION_MINOR ' \
+ sed 's/^#define *LIBCURL_VERSION_MAJOR *\([^ ]*\).*/\1/')
+LIBCURL_VERSION_MINOR=$(grep '^#define *LIBCURL_VERSION_MINOR ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/^#define *LIBCURL_VERSION_MINOR *\([^ ]*\).*/\1/'`
-LIBCURL_VERSION_PATCH=`grep '^#define *LIBCURL_VERSION_PATCH ' \
+ sed 's/^#define *LIBCURL_VERSION_MINOR *\([^ ]*\).*/\1/')
+LIBCURL_VERSION_PATCH=$(grep '^#define *LIBCURL_VERSION_PATCH ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/^#define *LIBCURL_VERSION_PATCH *\([^ ]*\).*/\1/'`
-LIBCURL_VERSION_NUM=`grep '^#define *LIBCURL_VERSION_NUM ' \
+ sed 's/^#define *LIBCURL_VERSION_PATCH *\([^ ]*\).*/\1/')
+LIBCURL_VERSION_NUM=$(grep '^#define *LIBCURL_VERSION_NUM ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/^#define *LIBCURL_VERSION_NUM *0x\([^ ]*\).*/\1/'`
-LIBCURL_TIMESTAMP=`grep '^#define *LIBCURL_TIMESTAMP ' \
+ sed 's/^#define *LIBCURL_VERSION_NUM *0x\([^ ]*\).*/\1/')
+LIBCURL_TIMESTAMP=$(grep '^#define *LIBCURL_TIMESTAMP ' \
"${TOPDIR}/include/curl/curlver.h" |
- sed 's/.*"\(.*\)".*/\1/'`
+ sed 's/.*"\(.*\)".*/\1/')
export LIBCURL_VERSION
export LIBCURL_VERSION_MAJOR LIBCURL_VERSION_MINOR LIBCURL_VERSION_PATCH
export LIBCURL_VERSION_NUM LIBCURL_TIMESTAMP
{
[ ! -e "${1}" ] && return 0
- [ "${2}" ] || return 1
+ [ -n "${2}" ] || return 1
[ "${1}" -ot "${2}" ] && return 0
return 1
}
{
if expr "${1}" : '^/' > /dev/null
then P="${1}"
- else P="`pwd`/${1}"
+ else P="$(pwd)/${1}"
fi
R=
do IFS="${IFSSAVE}"
case "${C}" in
.) ;;
- ..) R=`expr "${R}" : '^\(.*/\)..*'`
+ ..) R=$(expr \
+ "${R}" : '^\(.*/\)..*')
;;
?*) R="${R}${C}/"
;;
done
IFS="${IFSSAVE}"
- echo "/`expr "${R}" : '^\(.*\)/'`"
+ echo "/$(expr "${R}" : '^\(.*\)/')"
}
MODULES="${MODULES} ${1}"
MODIFSNAME="${LIBIFSNAME}/${1}.MODULE"
action_needed "${MODIFSNAME}" "${2}" || return 0;
- SRCDIR=`dirname \`canonicalize_path "${2}"\``
+ 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
# 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
+ {
+ echo "#line 1 \"${2}\""
+ echo "#pragma convert(819)"
+ echo "#line 1"
+ cat "${2}"
+ } > __tmpsrcf.c
CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('__tmpsrcf.c')"
CMD="${CMD} SYSIFCOPT(*IFS64IO *ASYNCSIGNAL)"
# CMD="${CMD} OPTION(*INCDIRFIRST *SHOWINC *SHOWSYS)"
then DEFINES="${DEFINES} USE_LIBSSH2"
fi
- if [ "${DEFINES}" ]
+ if [ -n "${DEFINES}" ]
then CMD="${CMD} DEFINE(${DEFINES})"
fi
CLcommand "${CMD}"
rm -f __tmpsrcf.c
+ # shellcheck disable=SC2034
LINK=YES
}
get_make_vars()
{
- eval "`sed -e ': begin' \
+ eval "$(sed -e ': begin' \
-e '/\\\\$/{' \
-e 'N' \
-e 's/\\\\\\n/ /' \
-e 's/[[:space:]]*=[[:space:]]*/=/' \
-e 's/=\\(.*[^[:space:]]\\)[[:space:]]*$/=\\"\\1\\"/' \
-e 's/\\\$(\\([^)]*\\))/\${\\1}/g' \
- < \"${1}\"`"
+ < \""${1}"\")"
}
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# Installation of the header files in the OS/400 library.
#
-SCRIPTDIR=`dirname "${0}"`
+SCRIPTDIR=$(dirname "${0}")
. "${SCRIPTDIR}/initscript.sh"
-cd "${TOPDIR}/include"
+cd "${TOPDIR}/include" || exit 1
# Create the OS/400 source program file for the header files.
# Copy the header files.
for HFILE in curl/*.h ${SCRIPTDIR}/ccsidcurl.h
-do case "`basename \"${HFILE}\" .h`" in
+do case "$(basename "${HFILE}" .h)" in
stdcheaders|typecheck-gcc)
continue;;
esac
- DEST="${SRCPF}/`db2_name \"${HFILE}\" nomangle`.MBR"
+ DEST="${SRCPF}/$(db2_name "${HFILE}" nomangle).MBR"
if action_needed "${DEST}" "${HFILE}"
then copy_hfile "${DEST}" "${HFILE}"
- IFSDEST="${IFSINCLUDE}/`basename \"${HFILE}\"`"
+ IFSDEST="${IFSINCLUDE}/$(basename "${HFILE}")"
rm -f "${IFSDEST}"
ln -s "${DEST}" "${IFSDEST}"
fi
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
# libcurl compilation script for the OS/400.
#
-SCRIPTDIR=`dirname "${0}"`
+SCRIPTDIR=$(dirname "${0}")
. "${SCRIPTDIR}/initscript.sh"
-cd "${TOPDIR}/lib"
+cd "${TOPDIR}/lib" || exit 1
# Need to have IFS access to the mih/cipher header file.
# Create and compile the identification source file.
-echo '#pragma comment(user, "libcurl version '"${LIBCURL_VERSION}"'")' > os400.c
-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
+{
+ echo '#pragma comment(user, "libcurl version '"${LIBCURL_VERSION}"'")'
+ echo '#pragma comment(user, __DATE__)'
+ echo '#pragma comment(user, __TIME__)'
+ echo '#pragma comment(copyright, "Copyright (C) Daniel Stenberg et al. OS/400 version by P. Monnerat")'
+} > os400.c
make_module OS400 os400.c BUILDING_LIBCURL
LINK= # No need to rebuild service program yet.
MODULES=
# Compile the sources into modules.
-INCLUDES="'`pwd`'"
+# shellcheck disable=SC2034
+INCLUDES="'$(pwd)'"
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}"`
+do MODULE=$(db2_name "${SRC}")
make_module "${MODULE}" "${SRC}" BUILDING_LIBCURL
done
then LINK=YES
fi
-if [ "${LINK}" ]
+if [ -n "${LINK}" ]
then rm -rf "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})"
CMD="${CMD} TEXT('LibCurl API static binding directory')"
# - Unfold lines from the header files so that they contain a semicolon.
# - Keep only CURL_EXTERN definitions.
# - Remove the CURL_DEPRECATED and CURL_TEMP_PRINTF macro calls.
-# - Drop the parenthesized function arguments and what follows.
+# - Drop the parenthesized function arguments and what follows.
# - Keep the trailing function name only.
-EXPORTS=`cat "${TOPDIR}"/include/curl/*.h "${SCRIPTDIR}/ccsidcurl.h" |
+EXPORTS=$(cat "${TOPDIR}"/include/curl/*.h "${SCRIPTDIR}/ccsidcurl.h" |
sed -e 'H;s/.*//;x;s/\n//;s/.*/& /' \
-e '/^CURL_EXTERN[[:space:]]/!d' \
-e '/\;/!{x;d;}' \
-e 's/ CURL_DEPRECATED([^)]*)//g' \
-e 's/ CURL_TEMP_PRINTF([^)]*)//g' \
-e 's/[[:space:]]*(.*$//' \
- -e 's/^.*[^A-Za-z0-9_]\([A-Za-z0-9_]*\)$/\1/'`
+ -e 's/^.*[^A-Za-z0-9_]\([A-Za-z0-9_]*\)$/\1/')
# Create the service program exportation file in DB2 member if needed.
then LINK=YES
fi
-if [ "${LINK}" ]
+if [ -n "${LINK}" ]
then echo " STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('LIBCURL_${SONAME}')" \
> "${BSF}"
for EXPORT in ${EXPORTS}
then LINK=YES
fi
-if [ "${LINK}" ]
+if [ -n "${LINK}" ]
then CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})"
CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)"
CMD="${CMD} MODULE(${TARGETLIB}/OS400)"
then LINK=YES
fi
-if [ "${LINK}" ]
+if [ -n "${LINK}" ]
then rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
CMD="${CMD} TEXT('LibCurl API dynamic binding directory')"
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
#
# Command line interface tool compilation script for the OS/400.
-SCRIPTDIR=`dirname "${0}"`
+SCRIPTDIR=$(dirname "${0}")
. "${SCRIPTDIR}/initscript.sh"
-cd "${TOPDIR}/src"
+cd "${TOPDIR}/src" || exit 1
# Get source lists.
# Compile the sources into modules.
+# shellcheck disable=SC2034
LINK=
MODULES=
+# shellcheck disable=SC2034
INCLUDES="'${TOPDIR}/lib'"
for SRC in ${CURLX_CFILES}
-do MODULE=`db2_name "${SRC}"`
- MODULE=`db2_name "X${MODULE}"`
+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}"`
+do MODULE=$(db2_name "${SRC}")
make_module "${MODULE}" "${SRC}"
done
# Link modules into program.
-MODULES="`echo \"${MODULES}\" | sed \"s/[^ ][^ ]*/${TARGETLIB}\/&/g\"`"
+MODULES="$(echo "${MODULES}" | sed "s/[^ ][^ ]*/${TARGETLIB}\/&/g")"
CMD="CRTPGM PGM(${TARGETLIB}/${CURLPGM})"
CMD="${CMD} ENTMOD(${TARGETLIB}/CURLMAIN)"
CMD="${CMD} MODULE(${MODULES})"
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
#
-SCRIPTDIR=`dirname "${0}"`
+SCRIPTDIR=$(dirname "${0}")
. "${SCRIPTDIR}/initscript.sh"
-cd "${TOPDIR}/tests"
+cd "${TOPDIR}/tests" || exit 1
# Build programs in a directory.
# Compile all programs.
# The list is found in variable "noinst_PROGRAMS"
- INCLUDES="'`pwd`' '${TOPDIR}/lib' '${TOPDIR}/src'"
+ # shellcheck disable=SC2034
+ INCLUDES="'$(pwd)' '${TOPDIR}/lib' '${TOPDIR}/src'"
MODS="${1}"
SRVPGMS="${2}"
+ # shellcheck disable=SC2154
for PGM in ${noinst_PROGRAMS}
- do DB2PGM=`db2_name "${PGM}"`
+ do DB2PGM=$(db2_name "${PGM}")
PGMIFSNAME="${LIBIFSNAME}/${DB2PGM}.PGM"
# Extract preprocessor symbol definitions from
# compilation options for the program.
- PGMCFLAGS="`eval echo \"\\${${PGM}_CFLAGS}\"`"
+ PGMCFLAGS="$(eval echo "\${${PGM}_CFLAGS}")"
PGMDFNS=
for FLAG in ${PGMCFLAGS}
do case "${FLAG}" in
- -D?*) DEFINE="`echo \"${FLAG}\" | sed 's/^..//'`"
+ -D?*) # shellcheck disable=SC2001
+ DEFINE="$(echo "${FLAG}" | sed 's/^..//')"
PGMDFNS="${PGMDFNS} '${DEFINE}'"
;;
esac
# Compile all C sources for the program into modules.
- PGMSOURCES="`eval echo \"\\${${PGM}_SOURCES}\"`"
+ PGMSOURCES="$(eval echo "\${${PGM}_SOURCES}")"
LINK=
MODULES=
case "${SOURCE}" in
lib*.c) MODULE="${DB2PGM}"
;;
- *) MODULE=`db2_name "${SOURCE}"`
+ *) MODULE=$(db2_name "${SOURCE}")
;;
esac
# prefix module name with 'X'.
case "${SOURCE}" in
- ../*) MODULE=`db2_name "X${MODULE}"`
+ ../*) MODULE=$(db2_name "X${MODULE}")
;;
esac
# Link program if needed.
- if [ "${LINK}" ]
- then PGMLDADD="`eval echo \"\\${${PGM}_LDADD}\"`"
+ if [ -n "${LINK}" ]
+ then PGMLDADD="$(eval echo "\${${PGM}_LDADD}")"
for ARG in ${PGMLDADD}
do case "${ARG}" in
-*) ;; # Ignore non-module.
- *) MODULES="${MODULES} "`db2_name "${ARG}"`
+ *) MODULES="${MODULES} $(db2_name "${ARG}")"
;;
esac
done
- MODULES="`echo \"${MODULES}\" |
- sed \"s/[^ ][^ ]*/${TARGETLIB}\/&/g\"`"
+ MODULES="$(echo "${MODULES}" |
+ sed "s/[^ ][^ ]*/${TARGETLIB}\/&/g")"
CMD="CRTPGM PGM(${TARGETLIB}/${DB2PGM})"
CMD="${CMD} ENTMOD(${TARGETLIB}/CURLMAIN)"
CMD="${CMD} MODULE(${MODULES} ${MODS})"
# Build programs in the server directory.
(
- cd server
+ cd server || exit 1
get_make_vars Makefile.inc
build_all_programs "${TARGETLIB}/OS400SYS"
)
# Build all programs in the libtest subdirectory.
(
- cd libtest
+ cd libtest || exit 1
get_make_vars Makefile.inc
# Special case: redefine chkhostname compilation parameters.
+ # shellcheck disable=SC2034
chkhostname_SOURCES=chkhostname.c
+ # shellcheck disable=SC2034
chkhostname_LDADD=curl_gethostname.o
+ # shellcheck disable=SC2153
build_all_programs "" "${TARGETLIB}/${SRVPGM}"
)
-#!/bin/sh
+#!/usr/bin/env bash
#***************************************************************************
# _ _ ____ _
# Project ___| | | | _ \| |
#
# This is a shell script since make is not a standard component of OS/400.
-SCRIPTDIR=`dirname "${0}"`
+SCRIPTDIR=$(dirname "${0}")
. "${SCRIPTDIR}/initscript.sh"
-cd "${TOPDIR}"
+cd "${TOPDIR}" || exit 1
# Create the OS/400 library if it does not exist.
"${TOPDIR}/docs/FEATURES" "${TOPDIR}/docs/SSLCERTS.md" \
"${TOPDIR}/docs/RESOURCES" "${TOPDIR}/docs/VERSIONS.md" \
"${TOPDIR}/docs/HISTORY.md"
-do MEMBER="`basename \"${TEXT}\" .OS400`"
- MEMBER="`basename \"${MEMBER}\" .md`"
- MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${MEMBER}\"`.MBR"
+do MEMBER="$(basename "${TEXT}" .OS400)"
+ MEMBER="$(basename "${MEMBER}" .md)"
+ MEMBER="${LIBIFSNAME}/DOCS.FILE/$(db2_name "${MEMBER}").MBR"
[ -e "${TEXT}" ] || continue
# Copy RPG examples if needed.
for EXAMPLE in "${SCRIPTDIR}/rpg-examples"/*
-do MEMBER="`basename \"${EXAMPLE}\"`"
- IFSMEMBER="${LIBIFSNAME}/RPGXAMPLES.FILE/`db2_name \"${MEMBER}\"`.MBR"
+do MEMBER="$(basename "${EXAMPLE}")"
+ IFSMEMBER="${LIBIFSNAME}/RPGXAMPLES.FILE/$(db2_name "${MEMBER}").MBR"
[ -e "${EXAMPLE}" ] || continue
then CMD="CPY OBJ('${EXAMPLE}') TOOBJ('${IFSMEMBER}')"
CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
CLcommand "${CMD}"
- MBRTEXT=`sed -e '1!d;/^ \*/!d;s/^ *\* *//' \
- -e 's/ *$//;s/'"'"'/&&/g' < "${EXAMPLE}"`
+ MBRTEXT=$(sed -e '1!d;/^ \*/!d;s/^ *\* *//' \
+ -e 's/ *$//;s/'"'"'/&&/g' < "${EXAMPLE}")
CMD="CHGPFM FILE(${TARGETLIB}/RPGXAMPLES) MBR(${MEMBER})"
CMD="${CMD} SRCTYPE(RPGLE) TEXT('${MBRTEXT}')"
CLcommand "${CMD}"