-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilling.c
84 lines (73 loc) · 2.09 KB
/
filling.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "root.h"
int set_ifa(int i) {
int j;
struct ifaddrs *ifa;
ifc.index = i;
if (getifaddrs(&ifa) == -1)
perror("bad address");
for (ifa, j = 0; j != i; ifa=ifa->ifa_next, j++);
sprintf(ifc.name, "%s", ifa->ifa_name);
return 1;
}
int set_field() {
int fd;
struct ifreq ifr;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) return (-1);
sprintf(ifr.ifr_name, "%s", ifc.name);
if (ioctl(fd, SIOCGIFADDR, &ifr) < 0) {
perror("ioctl SIOCGI");
exit(EXIT_FAILURE);
}
struct sockaddr_in *ip = (struct sockaddr_in *)&ifr.ifr_addr;
sprintf(ifc.ip, "%s", inet_ntoa((struct in_addr)ip->sin_addr));
ioctl(fd, SIOCGIFNETMASK, &ifr);
ip = (struct sockaddr_in *)&ifr.ifr_netmask;
sprintf(ifc.mask, "%s", inet_ntoa((struct in_addr)ip->sin_addr));
ioctl(fd, SIOCGIFHWADDR, &ifr);
unsigned char *tmp = calloc(6, sizeof(unsigned char));
memcpy(tmp, ifr.ifr_hwaddr.sa_data, 6);
sprintf(ifc.mac, "%2x:%2x:%2x:%2x:%2x:%2x", tmp[0], tmp[1], tmp[2], tmp[3], tmp[4], tmp[5]);
free(tmp);
ioctl(fd, SIOCGIFMTU, &ifr);
ifc.mtu = ifr.ifr_mtu;
return 1;
}
int set_extip() {
struct hostent *hp;
struct sockaddr_in addr;
int sock, on = 1, i;
const char *host = "icanhazip.com";
in_port_t port = 80;
if ((hp = gethostbyname(host)) == NULL) {
herror("gethostbyname");
exit(EXIT_FAILURE);
}
bcopy(hp->h_addr, &addr.sin_addr, (size_t)hp->h_length);
addr.sin_port = htons(port);
addr.sin_family = AF_INET;
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&on, sizeof(int));
if (sock == -1) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
if (connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
char msg[IP_LEN];
write(sock, "GET /\r\n", strlen("GET /\r\n"));
while (read(sock, msg, IP_LEN-2) != 0) {
memcpy(ifc.ext_ip, msg, strlen(msg));
}
shutdown(sock, SHUT_RDWR);
ifc.ext_ip[0] = '\b';
close(sock);
return 1;
}
int set_all() {
set_ifa(choose_if());
set_field();
set_extip();
return 1;
}