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