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