1/* $FreeBSD$ */
2
3#include <sys/param.h>
4
5#include <stdio.h>
6#include <string.h>
7
8int fifo(int argc, char *argv[]);
9int memlock(int argc, char *argv[]);
10int p26(int argc, char *argv[]);
11int sched(int argc, char *argv[]);
12int yield(int argc, char *argv[]);
13
14static 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
26static 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
40int 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