h_sigcli.c revision 1.2
11.2Spooka/*	$NetBSD: h_sigcli.c,v 1.2 2011/01/10 19:30:21 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.1Spooka	struct itimerval itv;
391.1Spooka	size_t hnbsize;
401.1Spooka	int i;
411.1Spooka	size_t blen;
421.1Spooka
431.1Spooka	if (rumpclient_init() == -1)
441.1Spooka		err(1, "rumpclient init");
451.1Spooka
461.1Spooka	hnbsize = sizeof(hostnamebuf);
471.1Spooka	if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
481.1Spooka	    hostnamebuf, &hnbsize, NULL, 0) == -1)
491.1Spooka		err(1, "sysctl");
501.1Spooka
511.1Spooka	if (signal(SIGALRM, sighand) == SIG_ERR)
521.1Spooka		err(1, "signal");
531.1Spooka
541.1Spooka	itv.it_interval.tv_sec = itv.it_value.tv_sec = 0;
551.1Spooka	itv.it_interval.tv_usec = itv.it_value.tv_usec = 10000; /* 10ms */
561.1Spooka
571.1Spooka	if (setitimer(ITIMER_REAL, &itv, NULL) == -1)
581.1Spooka		err(1, "itimer");
591.1Spooka
601.1Spooka	for (i = 0; i < 20000; i++) {
611.1Spooka		blen = sizeof(buf);
621.1Spooka		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
631.1Spooka		    buf, &blen, NULL, 0) == -1)
641.1Spooka			err(1, "sysctl");
651.1Spooka		if (strcmp(buf, hostnamebuf) != 0)
661.1Spooka			errx(1, "main hostname");
671.1Spooka	}
681.2Spooka
691.2Spooka	if (!sigexecs) {
701.2Spooka		printf("no signal handlers run.  test busted?\n");
711.2Spooka	}
721.1Spooka}
73