1272343Sngie/*	$NetBSD: h_sigcli.c,v 1.3 2011/02/07 20:05:09 pooka Exp $	*/
2272343Sngie
3272343Sngie#include <sys/types.h>
4272343Sngie#include <sys/sysctl.h>
5272343Sngie
6272343Sngie#include <err.h>
7272343Sngie#include <stdlib.h>
8272343Sngie#include <stdio.h>
9272343Sngie#include <string.h>
10272343Sngie#include <unistd.h>
11272343Sngie
12272343Sngie#include <rump/rump_syscalls.h>
13272343Sngie#include <rump/rumpclient.h>
14272343Sngie
15272343Sngiestatic const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
16272343Sngiestatic char hostnamebuf[128];
17272343Sngie
18272343Sngiestatic volatile sig_atomic_t sigexecs;
19272343Sngie
20272343Sngiestatic void
21272343Sngiesighand(int sig)
22272343Sngie{
23272343Sngie	char buf[128];
24272343Sngie	size_t blen = sizeof(buf);
25272343Sngie
26272343Sngie	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
27272343Sngie	    buf, &blen, NULL, 0) == -1)
28272343Sngie		err(1, "sighand sysctl");
29272343Sngie	if (strcmp(buf, hostnamebuf) != 0)
30272343Sngie		errx(1, "sighandler hostname");
31272343Sngie	sigexecs++;
32272343Sngie}
33272343Sngie
34272343Sngieint
35272343Sngiemain(void)
36272343Sngie{
37272343Sngie	char buf[128];
38272343Sngie	time_t tstart;
39272343Sngie	struct itimerval itv;
40272343Sngie	size_t hnbsize;
41272343Sngie	int i;
42272343Sngie	size_t blen;
43272343Sngie
44272343Sngie	if (rumpclient_init() == -1)
45272343Sngie		err(1, "rumpclient init");
46272343Sngie
47272343Sngie	hnbsize = sizeof(hostnamebuf);
48272343Sngie	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
49272343Sngie	    hostnamebuf, &hnbsize, NULL, 0) == -1)
50272343Sngie		err(1, "sysctl");
51272343Sngie
52272343Sngie	if (signal(SIGALRM, sighand) == SIG_ERR)
53272343Sngie		err(1, "signal");
54272343Sngie
55272343Sngie	itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
56272343Sngie	itv.it_interval.tv_usec = itv.it_value.tv_usec = 10000; /* 10ms */
57272343Sngie
58272343Sngie	if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
59272343Sngie		err(1, "itimer");
60272343Sngie
61272343Sngie	tstart = time(NULL);
62272343Sngie	for (i = 0;; i++) {
63272343Sngie		blen = sizeof(buf);
64272343Sngie		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
65272343Sngie		    buf, &blen, NULL, 0) == -1)
66272343Sngie			err(1, "sysctl");
67272343Sngie		if (strcmp(buf, hostnamebuf) != 0)
68272343Sngie			errx(1, "main hostname");
69272343Sngie
70272343Sngie		/*
71272343Sngie		 * check every 100 cycles to avoid doing
72272343Sngie		 * nothing but gettimeofday()
73272343Sngie		 */
74272343Sngie		if (i == 100) {
75272343Sngie			if (time(NULL) - tstart > 5)
76272343Sngie				break;
77272343Sngie			i = 0;
78272343Sngie		}
79272343Sngie	}
80272343Sngie
81272343Sngie	if (!sigexecs) {
82272343Sngie		printf("no signal handlers run.  test busted?\n");
83272343Sngie	}
84272343Sngie}
85