1*57718be8SEnji Cooper /* $NetBSD: h_reconcli.c,v 1.2 2011/02/19 09:56:45 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 <rump/rumpclient.h>
7*57718be8SEnji Cooper #include <rump/rump_syscalls.h>
8*57718be8SEnji Cooper
9*57718be8SEnji Cooper #include <err.h>
10*57718be8SEnji Cooper #include <pthread.h>
11*57718be8SEnji Cooper #include <stdio.h>
12*57718be8SEnji Cooper #include <stdlib.h>
13*57718be8SEnji Cooper #include <string.h>
14*57718be8SEnji Cooper #include <unistd.h>
15*57718be8SEnji Cooper
16*57718be8SEnji Cooper static volatile int quit, riseandwhine;
17*57718be8SEnji Cooper
18*57718be8SEnji Cooper static pthread_mutex_t closermtx;
19*57718be8SEnji Cooper static pthread_cond_t closercv;
20*57718be8SEnji Cooper
21*57718be8SEnji Cooper static void *
closer(void * arg)22*57718be8SEnji Cooper closer(void *arg)
23*57718be8SEnji Cooper {
24*57718be8SEnji Cooper
25*57718be8SEnji Cooper pthread_mutex_lock(&closermtx);
26*57718be8SEnji Cooper while (!quit) {
27*57718be8SEnji Cooper while (!riseandwhine)
28*57718be8SEnji Cooper pthread_cond_wait(&closercv, &closermtx);
29*57718be8SEnji Cooper riseandwhine = 0;
30*57718be8SEnji Cooper pthread_mutex_unlock(&closermtx);
31*57718be8SEnji Cooper
32*57718be8SEnji Cooper /* try to catch a random slot */
33*57718be8SEnji Cooper usleep(random() % 100000);
34*57718be8SEnji Cooper
35*57718be8SEnji Cooper /*
36*57718be8SEnji Cooper * wide-angle disintegration beam, but takes care
37*57718be8SEnji Cooper * of the client rumpkernel communication socket.
38*57718be8SEnji Cooper */
39*57718be8SEnji Cooper closefrom(3);
40*57718be8SEnji Cooper
41*57718be8SEnji Cooper pthread_mutex_lock(&closermtx);
42*57718be8SEnji Cooper }
43*57718be8SEnji Cooper pthread_mutex_unlock(&closermtx);
44*57718be8SEnji Cooper
45*57718be8SEnji Cooper return NULL;
46*57718be8SEnji Cooper }
47*57718be8SEnji Cooper
48*57718be8SEnji Cooper static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
49*57718be8SEnji Cooper static char goodhostname[128];
50*57718be8SEnji Cooper
51*57718be8SEnji Cooper static void *
worker(void * arg)52*57718be8SEnji Cooper worker(void *arg)
53*57718be8SEnji Cooper {
54*57718be8SEnji Cooper char hostnamebuf[128];
55*57718be8SEnji Cooper size_t blen;
56*57718be8SEnji Cooper
57*57718be8SEnji Cooper pthread_mutex_lock(&closermtx);
58*57718be8SEnji Cooper while (!quit) {
59*57718be8SEnji Cooper pthread_mutex_unlock(&closermtx);
60*57718be8SEnji Cooper if (rump_sys_getpid() == -1)
61*57718be8SEnji Cooper err(1, "getpid");
62*57718be8SEnji Cooper
63*57718be8SEnji Cooper blen = sizeof(hostnamebuf);
64*57718be8SEnji Cooper memset(hostnamebuf, 0, sizeof(hostnamebuf));
65*57718be8SEnji Cooper if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
66*57718be8SEnji Cooper hostnamebuf, &blen, NULL, 0) == -1)
67*57718be8SEnji Cooper err(1, "sysctl");
68*57718be8SEnji Cooper if (strcmp(hostnamebuf, goodhostname) != 0)
69*57718be8SEnji Cooper exit(1);
70*57718be8SEnji Cooper pthread_mutex_lock(&closermtx);
71*57718be8SEnji Cooper riseandwhine = 1;
72*57718be8SEnji Cooper pthread_cond_signal(&closercv);
73*57718be8SEnji Cooper }
74*57718be8SEnji Cooper riseandwhine = 1;
75*57718be8SEnji Cooper pthread_cond_signal(&closercv);
76*57718be8SEnji Cooper pthread_mutex_unlock(&closermtx);
77*57718be8SEnji Cooper
78*57718be8SEnji Cooper return NULL;
79*57718be8SEnji Cooper }
80*57718be8SEnji Cooper
81*57718be8SEnji Cooper int
main(int argc,char * argv[])82*57718be8SEnji Cooper main(int argc, char *argv[])
83*57718be8SEnji Cooper {
84*57718be8SEnji Cooper pthread_t pt, w1, w2, w3, w4;
85*57718be8SEnji Cooper size_t blen;
86*57718be8SEnji Cooper int timecount;
87*57718be8SEnji Cooper
88*57718be8SEnji Cooper if (argc != 2)
89*57718be8SEnji Cooper errx(1, "need timecount");
90*57718be8SEnji Cooper timecount = atoi(argv[1]);
91*57718be8SEnji Cooper if (timecount <= 0)
92*57718be8SEnji Cooper errx(1, "invalid timecount %d\n", timecount);
93*57718be8SEnji Cooper
94*57718be8SEnji Cooper srandom(time(NULL));
95*57718be8SEnji Cooper
96*57718be8SEnji Cooper rumpclient_setconnretry(RUMPCLIENT_RETRYCONN_INFTIME);
97*57718be8SEnji Cooper if (rumpclient_init() == -1)
98*57718be8SEnji Cooper err(1, "init");
99*57718be8SEnji Cooper
100*57718be8SEnji Cooper blen = sizeof(goodhostname);
101*57718be8SEnji Cooper if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
102*57718be8SEnji Cooper goodhostname, &blen, NULL, 0) == -1)
103*57718be8SEnji Cooper err(1, "sysctl");
104*57718be8SEnji Cooper
105*57718be8SEnji Cooper pthread_create(&pt, NULL, closer, NULL);
106*57718be8SEnji Cooper pthread_create(&w1, NULL, worker, NULL);
107*57718be8SEnji Cooper pthread_create(&w2, NULL, worker, NULL);
108*57718be8SEnji Cooper pthread_create(&w3, NULL, worker, NULL);
109*57718be8SEnji Cooper pthread_create(&w4, NULL, worker, NULL);
110*57718be8SEnji Cooper
111*57718be8SEnji Cooper sleep(timecount);
112*57718be8SEnji Cooper quit = 1;
113*57718be8SEnji Cooper
114*57718be8SEnji Cooper pthread_join(pt, NULL);
115*57718be8SEnji Cooper pthread_join(w1, NULL);
116*57718be8SEnji Cooper pthread_join(w2, NULL);
117*57718be8SEnji Cooper pthread_join(w3, NULL);
118*57718be8SEnji Cooper pthread_join(w4, NULL);
119*57718be8SEnji Cooper
120*57718be8SEnji Cooper exit(0);
121*57718be8SEnji Cooper }
122