1309466Sngie/*	$NetBSD: h_simpleserver.c,v 1.4 2016/01/25 12:21:42 pooka Exp $	*/
2272343Sngie
3272343Sngie#include <sys/types.h>
4272343Sngie
5272343Sngie#include <rump/rump.h>
6272343Sngie
7272343Sngie#include <err.h>
8309466Sngie#include <stdbool.h>
9272343Sngie#include <stdio.h>
10272343Sngie#include <stdlib.h>
11272343Sngie#include <string.h>
12272343Sngie#include <unistd.h>
13272343Sngie
14272343Sngie#include "../../kernspace/kernspace.h"
15272343Sngie
16272343Sngie#define NOFAIL(e) do { int rv = e; if (rv) err(1, #e); } while (/*CONSTCOND*/0)
17272343Sngie
18272343Sngiestruct {
19272343Sngie	const char *str;
20272343Sngie	void (*dofun)(char *);
21272343Sngie} actions[] = {
22272343Sngie	{ "sendsig", rumptest_sendsig },
23272343Sngie};
24272343Sngie
25272343Sngieint
26272343Sngiemain(int argc, char *argv[])
27272343Sngie{
28272343Sngie	unsigned i;
29272343Sngie	bool match;
30272343Sngie
31272343Sngie	if (argc < 2)
32272343Sngie		exit(1);
33272343Sngie
34272343Sngie	NOFAIL(rump_daemonize_begin());
35272343Sngie	NOFAIL(rump_init());
36272343Sngie	NOFAIL(rump_init_server(argv[1]));
37272343Sngie	NOFAIL(rump_daemonize_done(RUMP_DAEMONIZE_SUCCESS));
38272343Sngie
39272343Sngie	if (argc > 2) {
40272343Sngie		char *arg = NULL;
41272343Sngie
42272343Sngie		if (argc == 4)
43272343Sngie			arg = argv[3];
44272343Sngie
45272343Sngie		for (i = 0; i < __arraycount(actions); i++) {
46272343Sngie			if (strcmp(actions[i].str, argv[2]) == 0) {
47272343Sngie				rump_schedule();
48272343Sngie				actions[i].dofun(arg);
49272343Sngie				rump_unschedule();
50272343Sngie				match = true;
51272343Sngie			}
52272343Sngie		}
53272343Sngie
54272343Sngie		if (!match) {
55272343Sngie			exit(1);
56272343Sngie		}
57272343Sngie		pause();
58272343Sngie	} else {
59272343Sngie		for (;;)
60272343Sngie			pause();
61272343Sngie	}
62272343Sngie
63272343Sngie	return 0;
64272343Sngie}
65