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.
14 #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 assert(server
&& port
);
33 memset(&ai_ss
, 0, sizeof(ai_ss
));
35 memset(&hints
, 0, sizeof(hints
));
36 hints
.ai_family
= PF_UNSPEC
;
37 hints
.ai_socktype
= SOCK_STREAM
;
38 hints
.ai_protocol
= IPPROTO_TCP
;
39 hints
.ai_flags
= AI_NUMERICSERV
;
41 /* This function is really fucked up and seems to have high-stack
42 * usage since it provokes segfaults in some situations when it is
43 * directly included in aslookup! */
44 ret
= getaddrinfo(server
, port
, &hints
, &ahead
);
46 whine("Cannot get address info!\n");
50 for (ai
= ahead
; ai
!= NULL
&& fd
< 0; ai
= ai
->ai_next
) {
51 if (ai
->ai_family
== PF_INET6
)
52 saddr6
= (struct sockaddr_in6
*) ai
->ai_addr
;
53 fd
= socket(ai
->ai_family
, ai
->ai_socktype
, ai
->ai_protocol
);
56 ret
= connect(fd
, ai
->ai_addr
, ai
->ai_addrlen
);
58 whine("Cannot connect to remote, try %d: %s!\n",
59 try++, strerror(errno
));
65 ai_family
= ai
->ai_family
;
66 ai_socktype
= ai
->ai_socktype
;
67 ai_protocol
= ai
->ai_protocol
;
68 memcpy(&ai_ss
, ai
->ai_addr
, ai
->ai_addrlen
);
78 int aslookup(const char *lhost
, struct asrecord
*rec
)
80 int ret
, err
, fd
= -1;
84 assert(strlen(lhost
) + 8 < len
);
86 fd
= socket(ai_family
, ai_socktype
, ai_protocol
);
89 ret
= connect(fd
, (struct sockaddr
*) &ai_ss
, sizeof(ai_ss
));
94 slprintf(buff
, len
, "-v -f %s\r\n", lhost
);
96 err
= write(fd
, buff
, strlen(buff
));
97 if (unlikely(err
< 0)) {
98 whine("Cannot write to socket!\n");
104 memset(buff
, 0, len
);
105 while ((err
= read(fd
, buff
, len
)) > 0) {
107 char *ptr
= skips(buff
), *ptr2
;
108 for (i
= 0; i
< len
; ++i
) {
109 if (buff
[i
] == '|' && state
== 0) {
112 while (*ptr2
== ' ' && ptr2
> ptr
) {
116 strlcpy(rec
->number
, ptr
, strlen(ptr
) + 1);
117 ptr
= skips(&buff
[i
] + 1);
119 } else if (buff
[i
] == '|' && state
== 1) {
122 while (*ptr2
== ' ' && ptr2
> ptr
) {
126 strlcpy(rec
->ip
, ptr
, strlen(ptr
) + 1);
127 ptr
= skips(&buff
[i
] + 1);
129 } else if (buff
[i
] == '|' && state
== 2) {
132 while (*ptr2
== ' ' && ptr2
> ptr
) {
136 strlcpy(rec
->prefix
, ptr
, strlen(ptr
) + 1);
137 ptr
= skips(&buff
[i
] + 1);
139 } else if (buff
[i
] == '|' && state
== 3) {
142 while (*ptr2
== ' ' && ptr2
> ptr
) {
146 strlcpy(rec
->country
, ptr
, strlen(ptr
) + 1);
147 ptr
= skips(&buff
[i
] + 1);
149 } else if (buff
[i
] == '|' && state
== 4) {
152 while (*ptr2
== ' ' && ptr2
> ptr
) {
156 strlcpy(rec
->registry
, ptr
, strlen(ptr
) + 1);
157 ptr
= skips(&buff
[i
] + 1);
159 } else if (buff
[i
] == '|' && state
== 5) {
162 while (*ptr2
== ' ' && ptr2
> ptr
) {
166 strlcpy(rec
->since
, ptr
, strlen(ptr
) + 1);
167 ptr
= skips(&buff
[i
] + 1);
169 } else if (buff
[i
] == '\n' && state
== 6) {
172 while (*ptr2
== ' ' && ptr2
> ptr
) {
176 strlcpy(rec
->name
, ptr
, strlen(ptr
) + 1);
180 memset(buff
, 0, len
);