11.3Spooka/*	$NetBSD: h_sigcli.c,v 1.3 2011/02/07 20:05:09 pooka Exp $	*/
21.1Spooka
31.1Spooka#include <sys/types.h>
41.1Spooka#include <sys/sysctl.h>
51.1Spooka
61.1Spooka#include <err.h>
71.1Spooka#include <stdlib.h>
81.1Spooka#include <stdio.h>
91.1Spooka#include <string.h>
101.1Spooka#include <unistd.h>
111.1Spooka
121.1Spooka#include <rump/rump_syscalls.h>
131.1Spooka#include <rump/rumpclient.h>
141.1Spooka
151.1Spookastatic const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
161.1Spookastatic char hostnamebuf[128];
171.1Spooka
181.2Spookastatic volatile sig_atomic_t sigexecs;
191.2Spooka
201.1Spookastatic void
211.1Spookasighand(int sig)
221.1Spooka{
231.1Spooka	char buf[128];
241.1Spooka	size_t blen = sizeof(buf);
251.1Spooka
261.1Spooka	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
271.1Spooka	    buf, &blen, NULL, 0) == -1)
281.1Spooka		err(1, "sighand sysctl");
291.1Spooka	if (strcmp(buf, hostnamebuf) != 0)
301.1Spooka		errx(1, "sighandler hostname");
311.2Spooka	sigexecs++;
321.1Spooka}
331.1Spooka
341.1Spookaint
351.1Spookamain(void)
361.1Spooka{
371.1Spooka	char buf[128];
381.3Spooka	time_t tstart;
391.1Spooka	struct itimerval itv;
401.1Spooka	size_t hnbsize;
411.1Spooka	int i;
421.1Spooka	size_t blen;
431.1Spooka
441.1Spooka	if (rumpclient_init() == -1)
451.1Spooka		err(1, "rumpclient init");
461.1Spooka
471.1Spooka	hnbsize = sizeof(hostnamebuf);
481.1Spooka	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
491.1Spooka	    hostnamebuf, &hnbsize, NULL, 0) == -1)
501.1Spooka		err(1, "sysctl");
511.1Spooka
521.1Spooka	if (signal(SIGALRM, sighand) == SIG_ERR)
531.1Spooka		err(1, "signal");
541.1Spooka
551.1Spooka	itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
561.1Spooka	itv.it_interval.tv_usec = itv.it_value.tv_usec = 10000; /* 10ms */
571.1Spooka
581.1Spooka	if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
591.1Spooka		err(1, "itimer");
601.1Spooka
611.3Spooka	tstart = time(NULL);
621.3Spooka	for (i = 0;; i++) {
631.1Spooka		blen = sizeof(buf);
641.1Spooka		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
651.1Spooka		    buf, &blen, NULL, 0) == -1)
661.1Spooka			err(1, "sysctl");
671.1Spooka		if (strcmp(buf, hostnamebuf) != 0)
681.1Spooka			errx(1, "main hostname");
691.3Spooka
701.3Spooka		/*
711.3Spooka		 * check every 100 cycles to avoid doing
721.3Spooka		 * nothing but gettimeofday()
731.3Spooka		 */
741.3Spooka		if (i == 100) {
751.3Spooka			if (time(NULL) - tstart > 5)
761.3Spooka				break;
771.3Spooka			i = 0;
781.3Spooka		}
791.1Spooka	}
801.2Spooka
811.2Spooka	if (!sigexecs) {
821.2Spooka		printf("no signal handlers run.  test busted?\n");
831.2Spooka	}
841.1Spooka}
85