|  | /* | 
|  | * Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved. | 
|  | * | 
|  | * Licensed under the OpenSSL license (the "License").  You may not use | 
|  | * this file except in compliance with the License.  You can obtain a copy | 
|  | * in the file LICENSE in the source distribution or at | 
|  | * https://www.openssl.org/source/license.html | 
|  | */ | 
|  |  | 
|  | #include "../testutil.h" | 
|  | #include "internal/nelem.h" | 
|  | #include "output.h" | 
|  | #include "tu_local.h" | 
|  |  | 
|  | #include <string.h> | 
|  |  | 
|  | static size_t arg_count; | 
|  | static char **args; | 
|  | static unsigned char arg_used[1000]; | 
|  |  | 
|  | static void check_arg_usage(void) | 
|  | { | 
|  | size_t i, n = arg_count < OSSL_NELEM(arg_used) ? arg_count | 
|  | : OSSL_NELEM(arg_used); | 
|  |  | 
|  | for (i = 0; i < n; i++) | 
|  | if (!arg_used[i+1]) | 
|  | test_printf_stderr("Warning ignored command-line argument %d: %s\n", | 
|  | i, args[i+1]); | 
|  | if (i < arg_count) | 
|  | test_printf_stderr("Warning arguments %zu and later unchecked\n", i); | 
|  | } | 
|  |  | 
|  | int main(int argc, char *argv[]) | 
|  | { | 
|  | int ret = EXIT_FAILURE; | 
|  |  | 
|  | test_open_streams(); | 
|  |  | 
|  | if (!global_init()) { | 
|  | test_printf_stderr("Global init failed - aborting\n"); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | arg_count = argc - 1; | 
|  | args = argv; | 
|  |  | 
|  | setup_test_framework(); | 
|  |  | 
|  | if (setup_tests()) | 
|  | ret = run_tests(argv[0]); | 
|  | cleanup_tests(); | 
|  | check_arg_usage(); | 
|  |  | 
|  | ret = pulldown_test_framework(ret); | 
|  | test_close_streams(); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | const char *test_get_program_name(void) | 
|  | { | 
|  | return args[0]; | 
|  | } | 
|  |  | 
|  | char *test_get_argument(size_t n) | 
|  | { | 
|  | if (n > arg_count) | 
|  | return NULL; | 
|  | if (n + 1 < OSSL_NELEM(arg_used)) | 
|  | arg_used[n + 1] = 1; | 
|  | return args[n + 1]; | 
|  | } | 
|  |  | 
|  | size_t test_get_argument_count(void) | 
|  | { | 
|  | return arg_count; | 
|  | } | 
|  |  | 
|  | int test_has_option(const char *option) | 
|  | { | 
|  | size_t i; | 
|  |  | 
|  | for (i = 1; i <= arg_count; i++) | 
|  | if (strcmp(args[i], option) == 0) { | 
|  | arg_used[i] = 1; | 
|  | return 1; | 
|  | } | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | const char *test_get_option_argument(const char *option) | 
|  | { | 
|  | size_t i, n = strlen(option); | 
|  |  | 
|  | for (i = 1; i <= arg_count; i++) | 
|  | if (strncmp(args[i], option, n) == 0) { | 
|  | arg_used[i] = 1; | 
|  | if (args[i][n] == '\0' && i + 1 < arg_count) { | 
|  | arg_used[++i] = 1; | 
|  | return args[i]; | 
|  | } | 
|  | return args[i] + n; | 
|  | } | 
|  | return NULL; | 
|  | } | 
|  |  |