change
[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 int checkServer(int mid, char *machineip) {
39   int tmpsd;
40   struct sockaddr_in serv_addr;
41   char m[20];
42
43   strncpy(m, machineip, strlen(machineip));
44   // Foreach machine you want to transact with
45   // check if its up and running
46   if ((tmpsd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
47     perror("");
48     return(-1);
49   }
50   bzero((char*) &serv_addr, sizeof(serv_addr));
51   serv_addr.sin_family = AF_INET;
52   serv_addr.sin_port = htons(LISTEN_PORT);
53   midtoIP(mid, m);
54   m[15] = '\0';
55   serv_addr.sin_addr.s_addr = inet_addr(m);
56   while (connect(tmpsd, (struct sockaddr *) &serv_addr, sizeof(struct sockaddr)) < 0) {
57     sleep(1);
58   }
59   close(tmpsd);
60   return 0;
61 }
62
63 unsigned int getMyIpAddr(const char *interfaceStr) {
64   int sock;
65   struct ifreq interfaceInfo;
66   struct sockaddr_in *myAddr = (struct sockaddr_in *)&interfaceInfo.ifr_addr;
67
68   memset(&interfaceInfo, 0, sizeof(struct ifreq));
69
70   if((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
71     perror("getMyIpAddr():socket()");
72     return 1;
73   }
74
75   strcpy(interfaceInfo.ifr_name, interfaceStr);
76   myAddr->sin_family = AF_INET;
77
78   if(ioctl(sock, SIOCGIFADDR, &interfaceInfo) != 0) {
79     perror("getMyIpAddr():ioctl()");
80     return 1;
81   }
82
83   close(sock);
84
85   return ntohl(myAddr->sin_addr.s_addr);
86 }
87
88 /*
89    main() {
90         unsigned int mid;
91         ip_t i;
92         char ip[16];
93
94         memset(ip, 0, 16);
95         mid = iptoMid("192.10.0.1");
96         printf("mid = %x\n", mid);
97         midtoIP(mid, ip);
98         ip[15] = '\0';
99         printf("%s\n",ip);
100    }
101  */