2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2011 Daniel Borkmann.
5 * Subject to the GPL, version 2.
13 #include <netinet/in.h>
21 static int ai_family
= 0;
22 static int ai_socktype
= 0;
23 static int ai_protocol
= 0;
24 static struct sockaddr_storage ai_ss
;
26 int aslookup_prepare(const char *server
, const char *port
)
28 int ret
, fd
= -1, try = 1;
29 struct addrinfo hints
, *ahead
, *ai
;
30 struct sockaddr_in6
*saddr6
;
32 bug_on(!server
|| !port
);
34 memset(&ai_ss
, 0, sizeof(ai_ss
));
35 memset(&hints
, 0, sizeof(hints
));
37 hints
.ai_family
= PF_UNSPEC
;
38 hints
.ai_socktype
= SOCK_STREAM
;
39 hints
.ai_protocol
= IPPROTO_TCP
;
40 hints
.ai_flags
= AI_NUMERICSERV
;
42 ret
= getaddrinfo(server
, port
, &hints
, &ahead
);
44 whine("Cannot get address info!\n");
48 for (ai
= ahead
; ai
!= NULL
&& fd
< 0; ai
= ai
->ai_next
) {
49 if (ai
->ai_family
== PF_INET6
)
50 saddr6
= (struct sockaddr_in6
*) ai
->ai_addr
;
51 fd
= socket(ai
->ai_family
, ai
->ai_socktype
, ai
->ai_protocol
);
54 ret
= connect(fd
, ai
->ai_addr
, ai
->ai_addrlen
);
56 whine("Cannot connect to remote, try %d: %s!\n",
57 try++, strerror(errno
));
63 ai_family
= ai
->ai_family
;
64 ai_socktype
= ai
->ai_socktype
;
65 ai_protocol
= ai
->ai_protocol
;
66 memcpy(&ai_ss
, ai
->ai_addr
, ai
->ai_addrlen
);
76 int aslookup(const char *lhost
, struct asrecord
*rec
)
78 int ret
, err
, fd
= -1;
82 bug_on(strlen(lhost
) + 8 >= len
);
84 fd
= socket(ai_family
, ai_socktype
, ai_protocol
);
88 ret
= connect(fd
, (struct sockaddr
*) &ai_ss
, sizeof(ai_ss
));
93 slprintf(buff
, len
, "-v -f %s\r\n", lhost
);
95 err
= write(fd
, buff
, strlen(buff
));
96 if (unlikely(err
< 0)) {
97 whine("Cannot write to socket!\n");
103 memset(buff
, 0, len
);
104 while ((err
= read(fd
, buff
, len
)) > 0) {
106 char *ptr
= skips(buff
), *ptr2
;
108 for (i
= 0; i
< len
; ++i
) {
109 if (buff
[i
] == '|' && state
== 0) {
113 while (*ptr2
== ' ' && ptr2
> ptr
) {
118 strlcpy(rec
->number
, ptr
, strlen(ptr
) + 1);
119 ptr
= skips(&buff
[i
] + 1);
121 } else if (buff
[i
] == '|' && state
== 1) {
125 while (*ptr2
== ' ' && ptr2
> ptr
) {
130 strlcpy(rec
->ip
, ptr
, strlen(ptr
) + 1);
131 ptr
= skips(&buff
[i
] + 1);
133 } else if (buff
[i
] == '|' && state
== 2) {
137 while (*ptr2
== ' ' && ptr2
> ptr
) {
142 strlcpy(rec
->prefix
, ptr
, strlen(ptr
) + 1);
143 ptr
= skips(&buff
[i
] + 1);
145 } else if (buff
[i
] == '|' && state
== 3) {
149 while (*ptr2
== ' ' && ptr2
> ptr
) {
154 strlcpy(rec
->country
, ptr
, strlen(ptr
) + 1);
155 ptr
= skips(&buff
[i
] + 1);
157 } else if (buff
[i
] == '|' && state
== 4) {
161 while (*ptr2
== ' ' && ptr2
> ptr
) {
166 strlcpy(rec
->registry
, ptr
, strlen(ptr
) + 1);
167 ptr
= skips(&buff
[i
] + 1);
169 } else if (buff
[i
] == '|' && state
== 5) {
173 while (*ptr2
== ' ' && ptr2
> ptr
) {
178 strlcpy(rec
->since
, ptr
, strlen(ptr
) + 1);
179 ptr
= skips(&buff
[i
] + 1);
181 } else if (buff
[i
] == '\n' && state
== 6) {
185 while (*ptr2
== ' ' && ptr2
> ptr
) {
190 strlcpy(rec
->name
, ptr
, strlen(ptr
) + 1);
195 memset(buff
, 0, len
);