WhiteBoard Project using C RPC
A Project in Distributed Computing at IIIT-Delhi
transient.c
Go to the documentation of this file.
1 
2 #include "wb.h"
3 
4 /*
5  * Find a vacant RPC server program number.
6  */
7 
8 #define NPROGNUMSTOTRY 1000
9 #define NATTEMPTS 10
10 
11 static unsigned long findTransient(int version)
12 {
13  int skt = socket(AF_INET, SOCK_STREAM, 0), nerrors = 0;
14  if (skt < 0) {
15  fprintf(stderr, "transient.c: socket errno=%d\n", errno);
16  nerrors ++;
17  }
18 
19  struct sockaddr_in ad;
20  ad.sin_addr.s_addr = 0;
21  ad.sin_family = AF_INET;
22  ad.sin_port = 0;
23  unsigned int len = sizeof(ad);
24  if (bind(skt, (struct sockaddr *) &ad, len) < 0) {
25  fprintf(stderr, "transient.c: bind socket errno=%d.\n", errno);
26  nerrors ++;
27  }
28  if (getsockname(skt, (struct sockaddr *) &ad, &len) < 0) {
29  fprintf(stderr, "transient.c: getsockname errno=%d.\n", errno);
30  nerrors ++;
31  }
32 
33  for (unsigned long prognum = 0x40000000;
34  prognum < 0x40000000 + NPROGNUMSTOTRY; prognum ++)
35  if (pmap_set(prognum, version, IPPROTO_TCP, ad.sin_port))
36  return prognum;
37 
38  if (skt > 0 && nerrors > 0)
39  close(skt);
40  return 0;
41 }
42 
43 int getTransientProgNumber(int version)
44 {
45  unsigned long prognum, i;
46  for (i = 0; i < NATTEMPTS;) {
47  prognum = findTransient(version);
48  if (prognum > 0)
49  return prognum;
50 
51  fprintf(stderr, "transient.c: attempt %lu\n", ++ i);
52  sleep(1); /* might work later */
53  }
54  return 0;
55 }
56 
57 /* -eof- */
#define NPROGNUMSTOTRY
Definition: transient.c:8
static unsigned long findTransient(int version)
Definition: transient.c:11
int getTransientProgNumber(int version)
Definition: transient.c:43
#define NATTEMPTS
Definition: transient.c:9