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