1*57718be8SEnji Cooper /*	$NetBSD: h_sigcli.c,v 1.3 2011/02/07 20:05:09 pooka Exp $	*/
2*57718be8SEnji Cooper 
3*57718be8SEnji Cooper #include <sys/types.h>
4*57718be8SEnji Cooper #include <sys/sysctl.h>
5*57718be8SEnji Cooper 
6*57718be8SEnji Cooper #include <err.h>
7*57718be8SEnji Cooper #include <stdlib.h>
8*57718be8SEnji Cooper #include <stdio.h>
9*57718be8SEnji Cooper #include <string.h>
10*57718be8SEnji Cooper #include <unistd.h>
11*57718be8SEnji Cooper 
12*57718be8SEnji Cooper #include <rump/rump_syscalls.h>
13*57718be8SEnji Cooper #include <rump/rumpclient.h>
14*57718be8SEnji Cooper 
15*57718be8SEnji Cooper static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
16*57718be8SEnji Cooper static char hostnamebuf[128];
17*57718be8SEnji Cooper 
18*57718be8SEnji Cooper static volatile sig_atomic_t sigexecs;
19*57718be8SEnji Cooper 
20*57718be8SEnji Cooper static void
sighand(int sig)21*57718be8SEnji Cooper sighand(int sig)
22*57718be8SEnji Cooper {
23*57718be8SEnji Cooper 	char buf[128];
24*57718be8SEnji Cooper 	size_t blen = sizeof(buf);
25*57718be8SEnji Cooper 
26*57718be8SEnji Cooper 	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
27*57718be8SEnji Cooper 	    buf, &blen, NULL, 0) == -1)
28*57718be8SEnji Cooper 		err(1, "sighand sysctl");
29*57718be8SEnji Cooper 	if (strcmp(buf, hostnamebuf) != 0)
30*57718be8SEnji Cooper 		errx(1, "sighandler hostname");
31*57718be8SEnji Cooper 	sigexecs++;
32*57718be8SEnji Cooper }
33*57718be8SEnji Cooper 
34*57718be8SEnji Cooper int
main(void)35*57718be8SEnji Cooper main(void)
36*57718be8SEnji Cooper {
37*57718be8SEnji Cooper 	char buf[128];
38*57718be8SEnji Cooper 	time_t tstart;
39*57718be8SEnji Cooper 	struct itimerval itv;
40*57718be8SEnji Cooper 	size_t hnbsize;
41*57718be8SEnji Cooper 	int i;
42*57718be8SEnji Cooper 	size_t blen;
43*57718be8SEnji Cooper 
44*57718be8SEnji Cooper 	if (rumpclient_init() == -1)
45*57718be8SEnji Cooper 		err(1, "rumpclient init");
46*57718be8SEnji Cooper 
47*57718be8SEnji Cooper 	hnbsize = sizeof(hostnamebuf);
48*57718be8SEnji Cooper 	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
49*57718be8SEnji Cooper 	    hostnamebuf, &hnbsize, NULL, 0) == -1)
50*57718be8SEnji Cooper 		err(1, "sysctl");
51*57718be8SEnji Cooper 
52*57718be8SEnji Cooper 	if (signal(SIGALRM, sighand) == SIG_ERR)
53*57718be8SEnji Cooper 		err(1, "signal");
54*57718be8SEnji Cooper 
55*57718be8SEnji Cooper 	itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
56*57718be8SEnji Cooper 	itv.it_interval.tv_usec = itv.it_value.tv_usec = 10000; /* 10ms */
57*57718be8SEnji Cooper 
58*57718be8SEnji Cooper 	if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
59*57718be8SEnji Cooper 		err(1, "itimer");
60*57718be8SEnji Cooper 
61*57718be8SEnji Cooper 	tstart = time(NULL);
62*57718be8SEnji Cooper 	for (i = 0;; i++) {
63*57718be8SEnji Cooper 		blen = sizeof(buf);
64*57718be8SEnji Cooper 		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
65*57718be8SEnji Cooper 		    buf, &blen, NULL, 0) == -1)
66*57718be8SEnji Cooper 			err(1, "sysctl");
67*57718be8SEnji Cooper 		if (strcmp(buf, hostnamebuf) != 0)
68*57718be8SEnji Cooper 			errx(1, "main hostname");
69*57718be8SEnji Cooper 
70*57718be8SEnji Cooper 		/*
71*57718be8SEnji Cooper 		 * check every 100 cycles to avoid doing
72*57718be8SEnji Cooper 		 * nothing but gettimeofday()
73*57718be8SEnji Cooper 		 */
74*57718be8SEnji Cooper 		if (i == 100) {
75*57718be8SEnji Cooper 			if (time(NULL) - tstart > 5)
76*57718be8SEnji Cooper 				break;
77*57718be8SEnji Cooper 			i = 0;
78*57718be8SEnji Cooper 		}
79*57718be8SEnji Cooper 	}
80*57718be8SEnji Cooper 
81*57718be8SEnji Cooper 	if (!sigexecs) {
82*57718be8SEnji Cooper 		printf("no signal handlers run.  test busted?\n");
83*57718be8SEnji Cooper 	}
84*57718be8SEnji Cooper }
85