xref: /freebsd/tools/regression/p1003_1b/main.c (revision 63d1fd5970ec814904aa0f4580b10a0d302d08b2)
1 /* $FreeBSD$ */
2 
3 #include <sys/param.h>
4 
5 #include <stdio.h>
6 #include <string.h>
7 
8 int fifo(int argc, char *argv[]);
9 int memlock(int argc, char *argv[]);
10 int p26(int argc, char *argv[]);
11 int sched(int argc, char *argv[]);
12 int yield(int argc, char *argv[]);
13 
14 static struct {
15 	const char *t;
16 	int (*f)(int, char *[]);
17 	int works;
18 } tab[] = {
19 	{ "fifo", fifo, 1 },
20 	{ "memlock", memlock, 0 },
21 	{ "p26", p26, 1 },
22 	{ "sched", sched, 1 },
23 	{ "yield", yield, 1 },
24 };
25 
26 static int usage(int argc, char *argv[])
27 {
28 	int i;
29 	if (argc > 1)
30 		fprintf(stderr, "%s is unknown\n", argv[1]);
31 
32 	fprintf(stderr, "usage: %s [-a] or one of [", argv[0]);
33 	for (i = 0; i < (sizeof(tab) / sizeof(tab[0])); i++)
34 		fprintf(stderr, "%s%s", (i)? " | " : "", tab[i].t);
35 	fprintf(stderr, "]\n");
36 
37 	return -1;
38 }
39 
40 int main(int argc, char *argv[])
41 {
42 	int i;
43 
44 	if (argc == 2 && strcmp(argv[1], "-a") == 0) {
45 #if 1
46 		fprintf(stderr,
47 			"-a should but doesn't really work"
48 			" (my notes say \"because things detach\");\n"
49 			"meanwhile do these individual tests and look"
50 			" for a non-zero exit code:\n");
51 		for (i = 0; i < nitems(tab); i++)
52 			if (tab[i].works)
53 				fprintf(stderr, "p1003_1b %s\n", tab[i].t);
54 		return -1;
55 #else
56 		{
57 			int r;
58 			for (i = 0; i < nitems(tab); i++) {
59 				if (tab[i].works) {
60 					if ( (r =
61 					(*tab[i].f)(argc - 1, argv + 1)) ) {
62 						fprintf(stderr,
63 						"%s failed\n", tab[i].t);
64 						return r;
65 					}
66 				}
67 			}
68 			return 0;
69 		}
70 #endif
71 	}
72 
73 	if (argc > 1) {
74 		for (i = 0; i < nitems(tab); i++)
75 			if (strcmp(tab[i].t, argv[1]) == 0)
76 				return (*tab[i].f)(argc - 1, argv + 1);
77 	}
78 
79 	return usage(argc, argv);
80 }
81