xref: /openbmc/linux/tools/testing/vsock/util.c (revision df7e0e0d)
1df7e0e0dSStefan Hajnoczi // SPDX-License-Identifier: GPL-2.0-only
2df7e0e0dSStefan Hajnoczi /*
3df7e0e0dSStefan Hajnoczi  * vsock test utilities
4df7e0e0dSStefan Hajnoczi  *
5df7e0e0dSStefan Hajnoczi  * Copyright (C) 2017 Red Hat, Inc.
6df7e0e0dSStefan Hajnoczi  *
7df7e0e0dSStefan Hajnoczi  * Author: Stefan Hajnoczi <stefanha@redhat.com>
8df7e0e0dSStefan Hajnoczi  */
9df7e0e0dSStefan Hajnoczi 
10df7e0e0dSStefan Hajnoczi #include <errno.h>
11df7e0e0dSStefan Hajnoczi #include <stdio.h>
12df7e0e0dSStefan Hajnoczi #include <stdlib.h>
13df7e0e0dSStefan Hajnoczi #include <signal.h>
14df7e0e0dSStefan Hajnoczi 
15df7e0e0dSStefan Hajnoczi #include "timeout.h"
16df7e0e0dSStefan Hajnoczi #include "util.h"
17df7e0e0dSStefan Hajnoczi 
18df7e0e0dSStefan Hajnoczi /* Install signal handlers */
19df7e0e0dSStefan Hajnoczi void init_signals(void)
20df7e0e0dSStefan Hajnoczi {
21df7e0e0dSStefan Hajnoczi 	struct sigaction act = {
22df7e0e0dSStefan Hajnoczi 		.sa_handler = sigalrm,
23df7e0e0dSStefan Hajnoczi 	};
24df7e0e0dSStefan Hajnoczi 
25df7e0e0dSStefan Hajnoczi 	sigaction(SIGALRM, &act, NULL);
26df7e0e0dSStefan Hajnoczi 	signal(SIGPIPE, SIG_IGN);
27df7e0e0dSStefan Hajnoczi }
28df7e0e0dSStefan Hajnoczi 
29df7e0e0dSStefan Hajnoczi /* Parse a CID in string representation */
30df7e0e0dSStefan Hajnoczi unsigned int parse_cid(const char *str)
31df7e0e0dSStefan Hajnoczi {
32df7e0e0dSStefan Hajnoczi 	char *endptr = NULL;
33df7e0e0dSStefan Hajnoczi 	unsigned long n;
34df7e0e0dSStefan Hajnoczi 
35df7e0e0dSStefan Hajnoczi 	errno = 0;
36df7e0e0dSStefan Hajnoczi 	n = strtoul(str, &endptr, 10);
37df7e0e0dSStefan Hajnoczi 	if (errno || *endptr != '\0') {
38df7e0e0dSStefan Hajnoczi 		fprintf(stderr, "malformed CID \"%s\"\n", str);
39df7e0e0dSStefan Hajnoczi 		exit(EXIT_FAILURE);
40df7e0e0dSStefan Hajnoczi 	}
41df7e0e0dSStefan Hajnoczi 	return n;
42df7e0e0dSStefan Hajnoczi }
43df7e0e0dSStefan Hajnoczi 
44df7e0e0dSStefan Hajnoczi /* Run test cases.  The program terminates if a failure occurs. */
45df7e0e0dSStefan Hajnoczi void run_tests(const struct test_case *test_cases,
46df7e0e0dSStefan Hajnoczi 	       const struct test_opts *opts)
47df7e0e0dSStefan Hajnoczi {
48df7e0e0dSStefan Hajnoczi 	int i;
49df7e0e0dSStefan Hajnoczi 
50df7e0e0dSStefan Hajnoczi 	for (i = 0; test_cases[i].name; i++) {
51df7e0e0dSStefan Hajnoczi 		void (*run)(const struct test_opts *opts);
52df7e0e0dSStefan Hajnoczi 
53df7e0e0dSStefan Hajnoczi 		printf("%s...", test_cases[i].name);
54df7e0e0dSStefan Hajnoczi 		fflush(stdout);
55df7e0e0dSStefan Hajnoczi 
56df7e0e0dSStefan Hajnoczi 		if (opts->mode == TEST_MODE_CLIENT)
57df7e0e0dSStefan Hajnoczi 			run = test_cases[i].run_client;
58df7e0e0dSStefan Hajnoczi 		else
59df7e0e0dSStefan Hajnoczi 			run = test_cases[i].run_server;
60df7e0e0dSStefan Hajnoczi 
61df7e0e0dSStefan Hajnoczi 		if (run)
62df7e0e0dSStefan Hajnoczi 			run(opts);
63df7e0e0dSStefan Hajnoczi 
64df7e0e0dSStefan Hajnoczi 		printf("ok\n");
65df7e0e0dSStefan Hajnoczi 	}
66df7e0e0dSStefan Hajnoczi }
67