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