xref: /aosp_15_r20/external/tpm2-tss/test/integration/sapi-test-options.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /***********************************************************************
3*758e9fbaSOystein Eftevaag  * Copyright (c) 2017-2018, Intel Corporation
4*758e9fbaSOystein Eftevaag  *
5*758e9fbaSOystein Eftevaag  * All rights reserved.
6*758e9fbaSOystein Eftevaag  ***********************************************************************/
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag 
11*758e9fbaSOystein Eftevaag #include <stdio.h>
12*758e9fbaSOystein Eftevaag #include <stdlib.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag 
15*758e9fbaSOystein Eftevaag #include "test-options.h"
16*758e9fbaSOystein Eftevaag 
17*758e9fbaSOystein Eftevaag /*
18*758e9fbaSOystein Eftevaag  * A structure to map a string name to an element in the TCTI_TYPE
19*758e9fbaSOystein Eftevaag  * enumeration.
20*758e9fbaSOystein Eftevaag  */
21*758e9fbaSOystein Eftevaag typedef struct {
22*758e9fbaSOystein Eftevaag     char *name;
23*758e9fbaSOystein Eftevaag     TCTI_TYPE type;
24*758e9fbaSOystein Eftevaag } tcti_map_entry_t;
25*758e9fbaSOystein Eftevaag /*
26*758e9fbaSOystein Eftevaag  * A table of tcti_map_entry_t structures. This is how we map a string
27*758e9fbaSOystein Eftevaag  * provided on the command line to the enumeration.
28*758e9fbaSOystein Eftevaag  */
29*758e9fbaSOystein Eftevaag tcti_map_entry_t tcti_map_table[] = {
30*758e9fbaSOystein Eftevaag     {
31*758e9fbaSOystein Eftevaag      .name = "device",
32*758e9fbaSOystein Eftevaag      .type = DEVICE_TCTI,
33*758e9fbaSOystein Eftevaag      },
34*758e9fbaSOystein Eftevaag     {
35*758e9fbaSOystein Eftevaag      .name = "socket",
36*758e9fbaSOystein Eftevaag      .type = SOCKET_TCTI,
37*758e9fbaSOystein Eftevaag      },
38*758e9fbaSOystein Eftevaag     {
39*758e9fbaSOystein Eftevaag      .name = "fuzzing",
40*758e9fbaSOystein Eftevaag      .type = FUZZING_TCTI,
41*758e9fbaSOystein Eftevaag      },
42*758e9fbaSOystein Eftevaag     {
43*758e9fbaSOystein Eftevaag      .name = "unknown",
44*758e9fbaSOystein Eftevaag      .type = UNKNOWN_TCTI,
45*758e9fbaSOystein Eftevaag      },
46*758e9fbaSOystein Eftevaag };
47*758e9fbaSOystein Eftevaag 
48*758e9fbaSOystein Eftevaag /*
49*758e9fbaSOystein Eftevaag  * Convert from a string to an element in the TCTI_TYPE enumeration.
50*758e9fbaSOystein Eftevaag  * An unknown name / string will map to UNKNOWN_TCTI.
51*758e9fbaSOystein Eftevaag  */
52*758e9fbaSOystein Eftevaag TCTI_TYPE
tcti_type_from_name(char const * tcti_str)53*758e9fbaSOystein Eftevaag tcti_type_from_name(char const *tcti_str)
54*758e9fbaSOystein Eftevaag {
55*758e9fbaSOystein Eftevaag     int i;
56*758e9fbaSOystein Eftevaag     for (i = 0; i < N_TCTI; ++i)
57*758e9fbaSOystein Eftevaag         if (strcmp(tcti_str, tcti_map_table[i].name) == 0)
58*758e9fbaSOystein Eftevaag             return tcti_map_table[i].type;
59*758e9fbaSOystein Eftevaag     return UNKNOWN_TCTI;
60*758e9fbaSOystein Eftevaag }
61*758e9fbaSOystein Eftevaag 
62*758e9fbaSOystein Eftevaag /*
63*758e9fbaSOystein Eftevaag  * Convert from an element in the TCTI_TYPE enumeration to a string
64*758e9fbaSOystein Eftevaag  * representation.
65*758e9fbaSOystein Eftevaag  */
66*758e9fbaSOystein Eftevaag const char *
tcti_name_from_type(TCTI_TYPE tcti_type)67*758e9fbaSOystein Eftevaag tcti_name_from_type(TCTI_TYPE tcti_type)
68*758e9fbaSOystein Eftevaag {
69*758e9fbaSOystein Eftevaag     int i;
70*758e9fbaSOystein Eftevaag     for (i = 0; i < N_TCTI; ++i)
71*758e9fbaSOystein Eftevaag         if (tcti_type == tcti_map_table[i].type)
72*758e9fbaSOystein Eftevaag             return tcti_map_table[i].name;
73*758e9fbaSOystein Eftevaag     return NULL;
74*758e9fbaSOystein Eftevaag }
75*758e9fbaSOystein Eftevaag 
76*758e9fbaSOystein Eftevaag /*
77*758e9fbaSOystein Eftevaag  * return 0 if sanity test passes
78*758e9fbaSOystein Eftevaag  * return 1 if sanity test fails
79*758e9fbaSOystein Eftevaag  */
80*758e9fbaSOystein Eftevaag int
sanity_check_test_opts(test_opts_t * opts)81*758e9fbaSOystein Eftevaag sanity_check_test_opts(test_opts_t * opts)
82*758e9fbaSOystein Eftevaag {
83*758e9fbaSOystein Eftevaag     switch (opts->tcti_type) {
84*758e9fbaSOystein Eftevaag     case DEVICE_TCTI:
85*758e9fbaSOystein Eftevaag         if (opts->device_file == NULL) {
86*758e9fbaSOystein Eftevaag             fprintf(stderr, "device-path is NULL, check env\n");
87*758e9fbaSOystein Eftevaag             return 1;
88*758e9fbaSOystein Eftevaag         }
89*758e9fbaSOystein Eftevaag         break;
90*758e9fbaSOystein Eftevaag     case SOCKET_TCTI:
91*758e9fbaSOystein Eftevaag         if (opts->socket_address == NULL || opts->socket_port == 0) {
92*758e9fbaSOystein Eftevaag             fprintf(stderr,
93*758e9fbaSOystein Eftevaag                     "socket_address or socket_port is NULL, check env\n");
94*758e9fbaSOystein Eftevaag             return 1;
95*758e9fbaSOystein Eftevaag         }
96*758e9fbaSOystein Eftevaag         break;
97*758e9fbaSOystein Eftevaag     case FUZZING_TCTI:
98*758e9fbaSOystein Eftevaag         break;
99*758e9fbaSOystein Eftevaag     default:
100*758e9fbaSOystein Eftevaag         fprintf(stderr, "unknown TCTI type, check env\n");
101*758e9fbaSOystein Eftevaag         return 1;
102*758e9fbaSOystein Eftevaag     }
103*758e9fbaSOystein Eftevaag     return 0;
104*758e9fbaSOystein Eftevaag }
105*758e9fbaSOystein Eftevaag 
106*758e9fbaSOystein Eftevaag /*
107*758e9fbaSOystein Eftevaag  * Parse command line options from argv extracting test options. These are
108*758e9fbaSOystein Eftevaag  * returned to the caller in the provided options structure.
109*758e9fbaSOystein Eftevaag  */
110*758e9fbaSOystein Eftevaag int
get_test_opts_from_env(test_opts_t * test_opts)111*758e9fbaSOystein Eftevaag get_test_opts_from_env(test_opts_t * test_opts)
112*758e9fbaSOystein Eftevaag {
113*758e9fbaSOystein Eftevaag     char *env_str, *end_ptr;
114*758e9fbaSOystein Eftevaag 
115*758e9fbaSOystein Eftevaag     if (test_opts == NULL)
116*758e9fbaSOystein Eftevaag         return 1;
117*758e9fbaSOystein Eftevaag     env_str = getenv(ENV_TCTI_NAME);
118*758e9fbaSOystein Eftevaag     if (env_str != NULL)
119*758e9fbaSOystein Eftevaag         test_opts->tcti_type = tcti_type_from_name(env_str);
120*758e9fbaSOystein Eftevaag     env_str = getenv(ENV_DEVICE_FILE);
121*758e9fbaSOystein Eftevaag     if (env_str != NULL)
122*758e9fbaSOystein Eftevaag         test_opts->device_file = env_str;
123*758e9fbaSOystein Eftevaag     env_str = getenv(ENV_SOCKET_ADDRESS);
124*758e9fbaSOystein Eftevaag     if (env_str != NULL)
125*758e9fbaSOystein Eftevaag         test_opts->socket_address = env_str;
126*758e9fbaSOystein Eftevaag     env_str = getenv(ENV_SOCKET_PORT);
127*758e9fbaSOystein Eftevaag     if (env_str != NULL)
128*758e9fbaSOystein Eftevaag         test_opts->socket_port = strtol(env_str, &end_ptr, 10);
129*758e9fbaSOystein Eftevaag     return 0;
130*758e9fbaSOystein Eftevaag }
131*758e9fbaSOystein Eftevaag 
132*758e9fbaSOystein Eftevaag /*
133*758e9fbaSOystein Eftevaag  * Dump the contents of the test_opts_t structure to stdout.
134*758e9fbaSOystein Eftevaag  */
135*758e9fbaSOystein Eftevaag void
dump_test_opts(test_opts_t * opts)136*758e9fbaSOystein Eftevaag dump_test_opts(test_opts_t * opts)
137*758e9fbaSOystein Eftevaag {
138*758e9fbaSOystein Eftevaag     printf("test_opts_t:\n");
139*758e9fbaSOystein Eftevaag     printf("  tcti_type:      %s\n", tcti_name_from_type(opts->tcti_type));
140*758e9fbaSOystein Eftevaag     printf("  device_file:    %s\n", opts->device_file);
141*758e9fbaSOystein Eftevaag     printf("  socket_address: %s\n", opts->socket_address);
142*758e9fbaSOystein Eftevaag     printf("  socket_port:    %d\n", opts->socket_port);
143*758e9fbaSOystein Eftevaag }
144