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