diff --git a/ci/run_build.sh b/ci/run_build.sh index 3752090..543aeea 100755 --- a/ci/run_build.sh +++ b/ci/run_build.sh @@ -71,6 +71,9 @@ if [[ -n "${ARCH_NATIVE:=}" ]]; then # Smoke tests (actual tests need Docker to run; they don't run within the CI environment) for tini in "${BUILD_DIR}/tini" "${BUILD_DIR}/tini-static"; do + echo "Testing ${tini} --version" + "$tini" --version | grep "tini version" + if [[ -n "${NO_ARGS:-}" ]]; then echo "Testing $tini with: true" "${tini}" true @@ -88,6 +91,12 @@ if [[ -n "${ARCH_NATIVE:=}" ]]; then cp "$(which true)" "${BIN_TEST_DIR}/${bin}" "$tini" "$bin" done + + echo "Testing $tini can run binary --version if args are given" + cp "$(which true)" "${BIN_TEST_DIR}/--version" + if "$tini" "--version" --foo | grep "tini version"; then + exit 1 + fi else echo "Smoke test for $tini" "${tini}" -h diff --git a/src/tini.c b/src/tini.c index d189d24..fa86254 100644 --- a/src/tini.c +++ b/src/tini.c @@ -41,6 +41,8 @@ typedef struct { #define OPT_STRING "hvgl" #endif +#define TINI_VERSION_STRING "tini version " TINI_VERSION TINI_GIT + #if HAS_SUBREAPER static unsigned int subreaper = 0; @@ -141,9 +143,8 @@ int spawn(const signal_configuration_t* const sigconf_ptr, char* const argv[], i } } - void print_usage(char* const name, FILE* const file) { - fprintf(file, "%s (version %s%s)\n", basename(name), TINI_VERSION, TINI_GIT); + fprintf(file, "%s (%s)\n", basename(name), TINI_VERSION_STRING); fprintf(file, "Usage: %s [OPTIONS] PROGRAM -- [ARGS]\n\n", basename(name)); fprintf(file, "Execute a program under the supervision of a valid init process (%s)\n\n", basename(name)); fprintf(file, " -h: Show this help message and exit.\n"); @@ -164,6 +165,13 @@ void print_license(FILE* const file) { int parse_args(const int argc, char* const argv[], char* (**child_args_ptr_ptr)[], int* const parse_fail_exitcode_ptr) { char* name = argv[0]; + // We handle --version if it's the *only* argument provided. + if (argc == 2 && strcmp("--version", argv[1]) == 0) { + *parse_fail_exitcode_ptr = 0; + fprintf(stdout, "%s\n", TINI_VERSION_STRING); + return 1; + } + #if TINI_NO_ARGS *parse_fail_exitcode_ptr = 0; #else