157257Sdufault/* $FreeBSD$ */
257257Sdufault#include <stdio.h>
3289954Sngie#include <string.h>
457257Sdufault
557257Sdufaultint fifo(int argc, char *argv[]);
657257Sdufaultint memlock(int argc, char *argv[]);
757257Sdufaultint p26(int argc, char *argv[]);
857257Sdufaultint sched(int argc, char *argv[]);
957257Sdufaultint yield(int argc, char *argv[]);
1057257Sdufault
1157257Sdufaultstatic struct {
1257257Sdufault	const char *t;
1357257Sdufault	int (*f)(int, char *[]);
1457257Sdufault	int works;
1557257Sdufault} tab[] = {
1657257Sdufault	{ "fifo", fifo, 1 },
1757257Sdufault	{ "memlock", memlock, 0 },
1857257Sdufault	{ "p26", p26, 1 },
1957257Sdufault	{ "sched", sched, 1 },
2057257Sdufault	{ "yield", yield, 1 },
2157257Sdufault};
2257257Sdufault
2357257Sdufault#define N(T) (sizeof (T)/ sizeof(T[0]))
2457257Sdufault
2557257Sdufaultstatic int usage(int argc, char *argv[])
2657257Sdufault{
2757257Sdufault	int i;
2857257Sdufault	if (argc > 1)
2957257Sdufault		fprintf(stderr, "%s is unknown\n", argv[1]);
3057257Sdufault
3157257Sdufault	fprintf(stderr, "usage: %s [-a] or one of [", argv[0]);
3257257Sdufault	for (i = 0; i < (sizeof(tab) / sizeof(tab[0])); i++)
3357257Sdufault		fprintf(stderr, "%s%s", (i)? " | " : "", tab[i].t);
3457257Sdufault	fprintf(stderr, "]\n");
3557257Sdufault
3657257Sdufault	return -1;
3757257Sdufault}
3857257Sdufault
3957257Sdufaultint main(int argc, char *argv[])
4057257Sdufault{
4157257Sdufault	int i;
4257257Sdufault
4357257Sdufault	if (argc == 2 && strcmp(argv[1], "-a") == 0) {
4457257Sdufault#if 1
4557257Sdufault		fprintf(stderr,
4657257Sdufault			"-a should but doesn't really work"
4757257Sdufault			" (my notes say \"because things detach\");\n"
4857257Sdufault			"meanwhile do these individual tests and look"
4957257Sdufault			" for a non-zero exit code:\n");
5057257Sdufault		for (i = 0; i < N(tab); i++)
5157257Sdufault			if (tab[i].works)
5257257Sdufault				fprintf(stderr, "p1003_1b %s\n", tab[i].t);
5357257Sdufault		return -1;
5457257Sdufault#else
5557257Sdufault		{
5657257Sdufault			int r;
5757257Sdufault			for (i = 0; i < N(tab); i++) {
5857257Sdufault				if (tab[i].works) {
5957257Sdufault					if ( (r =
6057257Sdufault					(*tab[i].f)(argc - 1, argv + 1)) ) {
6157257Sdufault						fprintf(stderr,
6257257Sdufault						"%s failed\n", tab[i].t);
6357257Sdufault						return r;
6457257Sdufault					}
6557257Sdufault				}
6657257Sdufault			}
6757257Sdufault			return 0;
6857257Sdufault		}
6957257Sdufault#endif
7057257Sdufault	}
7157257Sdufault
7257257Sdufault	if (argc > 1) {
7357257Sdufault		for (i = 0; i < N(tab); i++)
7457257Sdufault			if (strcmp(tab[i].t, argv[1]) == 0)
7557257Sdufault				return (*tab[i].f)(argc - 1, argv + 1);
7657257Sdufault	}
7757257Sdufault
7857257Sdufault	return usage(argc, argv);
7957257Sdufault}
80