adding a test case
[IRC.git] / Robust / src / Runtime / DSTM / interface / ip.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "ip.h"
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include <netdb.h>
7 #include <netinet/in.h>
8 #include <string.h>
9 #include <sys/ioctl.h>
10 #include <net/if.h>
11
12 #define LISTEN_PORT 2156
13
14 unsigned int iptoMid(char *addr) {
15   ip_t i;
16   unsigned int mid;
17
18   sscanf(addr, "%d.%d.%d.%d", &i.a, &i.b, &i.c, &i.d);
19   mid = (i.a << 24) | (i.b << 16) | (i.c << 8) | i.d;
20   fflush(stdout);
21   return mid;
22 }
23
24 void midtoIP(unsigned int mid, char *ptr) {
25   ip_t i;
26
27   i.a = (mid & 0xff000000) >> 24;
28   i.b = (mid & 0x00ff0000) >> 16;
29   i.c = (mid & 0x0000ff00) >> 8;
30   i.d = mid & 0x000000ff;
31   sprintf(ptr, "%d.%d.%d.%d", i.a, i.b, i.c, i.d);
32 #ifdef DEBUG
33   printf("DEBUG-> midtoIP() mid = %d.%d.%d.%d\n", i.a, i.b, i.c, i.d);
34 #endif
35   return;
36 }
37
38 /********** for DEBUGGING **************/
39 char ip[16];      // for debugging purpose
40 char* midtoIPString(unsigned int mid) {
41   midtoIP(mid, ip);
42   return ip;
43 }
44
45 /******************************/
46
47
48
49 int checkServer(int mid, char *machineip) {
50   int tmpsd;
51   struct sockaddr_in serv_addr;
52   char m[20];
53
54   strncpy(m, machineip, strlen(machineip));
55   // Foreach machine you want to transact with
56   // check if its up and running
57   if ((tmpsd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
58     perror("");
59     return(-1);
60   }
61   bzero((char*) &serv_addr, sizeof(serv_addr));
62   serv_addr.sin_family = AF_INET;
63   serv_addr.sin_port = htons(LISTEN_PORT);
64   midtoIP(mid, m);
65   m[15] = '\0';
66   serv_addr.sin_addr.s_addr = inet_addr(m);
67   while (connect(tmpsd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) < 0) {
68     sleep(1);
69   }
70   close(tmpsd);
71   return 0;
72 }
73
74 unsigned int getMyIpAddr(const char *interfaceStr) {
75   int sock;
76   struct ifreq interfaceInfo;
77   struct sockaddr_in *myAddr = (struct sockaddr_in *)&interfaceInfo.ifr_addr;
78
79   memset(&interfaceInfo, 0, sizeof(struct ifreq));
80
81   if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
82     perror("getMyIpAddr():socket()");
83     return 1;
84   }
85
86   strcpy(interfaceInfo.ifr_name, interfaceStr);
87   myAddr->sin_family = AF_INET;
88
89   if(ioctl(sock, SIOCGIFADDR, &interfaceInfo) != 0) {
90     perror("getMyIpAddr():ioctl()");
91     return 1;
92   }
93
94   close(sock);
95
96   return ntohl(myAddr->sin_addr.s_addr);
97 }
98
99 /*
100    main() {
101         unsigned int mid;
102         ip_t i;
103         char ip[16];
104
105         memset(ip, 0, 16);
106         mid = iptoMid("192.10.0.1");
107         printf("mid = %x\n", mid);
108         midtoIP(mid, ip);
109         ip[15] = '\0';
110         printf("%s\n",ip);
111    }
112  */