1*1bc4cda8Spooka /* $NetBSD: h_reconcli.c,v 1.2 2011/02/19 09:56:45 pooka Exp $ */
273fa6b6fSpooka
373fa6b6fSpooka #include <sys/types.h>
473fa6b6fSpooka #include <sys/sysctl.h>
573fa6b6fSpooka
673fa6b6fSpooka #include <rump/rumpclient.h>
773fa6b6fSpooka #include <rump/rump_syscalls.h>
873fa6b6fSpooka
973fa6b6fSpooka #include <err.h>
1073fa6b6fSpooka #include <pthread.h>
1173fa6b6fSpooka #include <stdio.h>
1273fa6b6fSpooka #include <stdlib.h>
1373fa6b6fSpooka #include <string.h>
1473fa6b6fSpooka #include <unistd.h>
1573fa6b6fSpooka
1673fa6b6fSpooka static volatile int quit, riseandwhine;
1773fa6b6fSpooka
1873fa6b6fSpooka static pthread_mutex_t closermtx;
1973fa6b6fSpooka static pthread_cond_t closercv;
2073fa6b6fSpooka
2173fa6b6fSpooka static void *
closer(void * arg)2273fa6b6fSpooka closer(void *arg)
2373fa6b6fSpooka {
2473fa6b6fSpooka
2573fa6b6fSpooka pthread_mutex_lock(&closermtx);
2673fa6b6fSpooka while (!quit) {
2773fa6b6fSpooka while (!riseandwhine)
2873fa6b6fSpooka pthread_cond_wait(&closercv, &closermtx);
2973fa6b6fSpooka riseandwhine = 0;
3073fa6b6fSpooka pthread_mutex_unlock(&closermtx);
3173fa6b6fSpooka
3273fa6b6fSpooka /* try to catch a random slot */
3373fa6b6fSpooka usleep(random() % 100000);
3473fa6b6fSpooka
3573fa6b6fSpooka /*
3673fa6b6fSpooka * wide-angle disintegration beam, but takes care
3773fa6b6fSpooka * of the client rumpkernel communication socket.
3873fa6b6fSpooka */
3973fa6b6fSpooka closefrom(3);
4073fa6b6fSpooka
4173fa6b6fSpooka pthread_mutex_lock(&closermtx);
4273fa6b6fSpooka }
4373fa6b6fSpooka pthread_mutex_unlock(&closermtx);
4473fa6b6fSpooka
4573fa6b6fSpooka return NULL;
4673fa6b6fSpooka }
4773fa6b6fSpooka
4873fa6b6fSpooka static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
4973fa6b6fSpooka static char goodhostname[128];
5073fa6b6fSpooka
5173fa6b6fSpooka static void *
worker(void * arg)5273fa6b6fSpooka worker(void *arg)
5373fa6b6fSpooka {
5473fa6b6fSpooka char hostnamebuf[128];
5573fa6b6fSpooka size_t blen;
5673fa6b6fSpooka
5773fa6b6fSpooka pthread_mutex_lock(&closermtx);
5873fa6b6fSpooka while (!quit) {
5973fa6b6fSpooka pthread_mutex_unlock(&closermtx);
6073fa6b6fSpooka if (rump_sys_getpid() == -1)
6173fa6b6fSpooka err(1, "getpid");
6273fa6b6fSpooka
6373fa6b6fSpooka blen = sizeof(hostnamebuf);
6473fa6b6fSpooka memset(hostnamebuf, 0, sizeof(hostnamebuf));
6573fa6b6fSpooka if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
6673fa6b6fSpooka hostnamebuf, &blen, NULL, 0) == -1)
6773fa6b6fSpooka err(1, "sysctl");
6873fa6b6fSpooka if (strcmp(hostnamebuf, goodhostname) != 0)
6973fa6b6fSpooka exit(1);
7073fa6b6fSpooka pthread_mutex_lock(&closermtx);
7173fa6b6fSpooka riseandwhine = 1;
7273fa6b6fSpooka pthread_cond_signal(&closercv);
7373fa6b6fSpooka }
7473fa6b6fSpooka riseandwhine = 1;
7573fa6b6fSpooka pthread_cond_signal(&closercv);
7673fa6b6fSpooka pthread_mutex_unlock(&closermtx);
7773fa6b6fSpooka
7873fa6b6fSpooka return NULL;
7973fa6b6fSpooka }
8073fa6b6fSpooka
8173fa6b6fSpooka int
main(int argc,char * argv[])8273fa6b6fSpooka main(int argc, char *argv[])
8373fa6b6fSpooka {
8473fa6b6fSpooka pthread_t pt, w1, w2, w3, w4;
8573fa6b6fSpooka size_t blen;
8673fa6b6fSpooka int timecount;
8773fa6b6fSpooka
8873fa6b6fSpooka if (argc != 2)
8973fa6b6fSpooka errx(1, "need timecount");
9073fa6b6fSpooka timecount = atoi(argv[1]);
9173fa6b6fSpooka if (timecount <= 0)
9273fa6b6fSpooka errx(1, "invalid timecount %d\n", timecount);
9373fa6b6fSpooka
9473fa6b6fSpooka srandom(time(NULL));
9573fa6b6fSpooka
96*1bc4cda8Spooka rumpclient_setconnretry(RUMPCLIENT_RETRYCONN_INFTIME);
9773fa6b6fSpooka if (rumpclient_init() == -1)
9873fa6b6fSpooka err(1, "init");
9973fa6b6fSpooka
10073fa6b6fSpooka blen = sizeof(goodhostname);
10173fa6b6fSpooka if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
10273fa6b6fSpooka goodhostname, &blen, NULL, 0) == -1)
10373fa6b6fSpooka err(1, "sysctl");
10473fa6b6fSpooka
10573fa6b6fSpooka pthread_create(&pt, NULL, closer, NULL);
10673fa6b6fSpooka pthread_create(&w1, NULL, worker, NULL);
10773fa6b6fSpooka pthread_create(&w2, NULL, worker, NULL);
10873fa6b6fSpooka pthread_create(&w3, NULL, worker, NULL);
10973fa6b6fSpooka pthread_create(&w4, NULL, worker, NULL);
11073fa6b6fSpooka
11173fa6b6fSpooka sleep(timecount);
11273fa6b6fSpooka quit = 1;
11373fa6b6fSpooka
11473fa6b6fSpooka pthread_join(pt, NULL);
11573fa6b6fSpooka pthread_join(w1, NULL);
11673fa6b6fSpooka pthread_join(w2, NULL);
11773fa6b6fSpooka pthread_join(w3, NULL);
11873fa6b6fSpooka pthread_join(w4, NULL);
11973fa6b6fSpooka
12073fa6b6fSpooka exit(0);
12173fa6b6fSpooka }
122