A whois client is a program that will simply fetch the whois information for a domain/ip address from the whois servers. The code over here works according to the algorithm discussed here.
Code
1 |
/* |
2 |
* @brief |
3 |
* Whois client program |
4 |
* |
5 |
* @details |
6 |
* This program shall perform whois for a domain and get you the whois data of that domain |
7 |
* |
8 |
* @author Silver Moon ( m00n.silv3r@gmail.com ) |
9 |
* */ |
10 |
11 |
#include<stdio.h> //scanf , printf |
12 |
#include<string.h> //strtok |
13 |
#include<stdlib.h> //realloc |
14 |
#include<sys/socket.h> //socket |
15 |
#include<netinet/in.h> //sockaddr_in |
16 |
#include<arpa/inet.h> //getsockname |
17 |
#include<netdb.h> //hostent |
18 |
#include<unistd.h> //close |
19 |
20 |
int get_whois_data( char * , char **); |
21 |
int hostname_to_ip( char * , char *); |
22 |
int whois_query( char * , char * , char **); |
23 |
char *str_replace( char *search , char *replace , char *subject ); |
24 |
25 |
int main( int argc , char *argv[]) |
26 |
{ |
27 |
char domain[100] , *data = NULL; |
28 |
|
29 |
printf ( "Enter domain name to whois : " ); |
30 |
scanf ( "%s" , domain); |
31 |
|
32 |
get_whois_data(domain , &data); |
33 |
|
34 |
//puts(data); |
35 |
return 0; |
36 |
} |
37 |
38 |
/* |
39 |
* Get the whois data of a domain |
40 |
* */ |
41 |
int get_whois_data( char *domain , char **data) |
42 |
{ |
43 |
char ext[1024] , *pch , *response = NULL , *response_2 = NULL , *wch , *dt; |
44 |
45 |
//remove "http://" and "www." |
46 |
domain = str_replace( "http://" , "" , domain); |
47 |
domain = str_replace( "www." , "" , domain); |
48 |
49 |
//get the extension , com , org , edu |
50 |
dt = strdup(domain); |
51 |
if (dt == NULL) |
52 |
{ |
53 |
printf ( "strdup failed" ); |
54 |
} |
55 |
pch = ( char *) strtok (dt , "." ); |
56 |
while (pch != NULL) |
57 |
{ |
58 |
strcpy (ext , pch); |
59 |
pch = strtok (NULL , "." ); |
60 |
} |
61 |
|
62 |
//This will tell the whois server for the particular TLD like com , org |
63 |
if (whois_query( "whois.iana.org" , ext , &response)) |
64 |
{ |
65 |
printf ( "Whois query failed" ); |
66 |
} |
67 |
|
68 |
//Now analysze the response :) |
69 |
pch = strtok (response , "\n" ); |
70 |
while (pch != NULL) |
71 |
{ |
72 |
//Check if whois line |
73 |
wch = strstr (pch , "whois." ); |
74 |
if (wch != NULL) |
75 |
{ |
76 |
break ; |
77 |
} |
78 |
79 |
//Next line please |
80 |
pch = strtok (NULL , "\n" ); |
81 |
} |
82 |
83 |
|
84 |
|
85 |
//Now we have the TLD whois server in wch , query again |
86 |
//This will provide minimal whois information along with the parent whois server of the specific domain :) |
87 |
free (response); |
88 |
//This should not be necessary , but segmentation fault without this , why ? |
89 |
response = NULL; |
90 |
if (wch != NULL) |
91 |
{ |
92 |
printf ( "\nTLD Whois server is : %s" , wch); |
93 |
if (whois_query(wch , domain , &response)) |
94 |
{ |
95 |
printf ( "Whois query failed" ); |
96 |
} |
97 |
} |
98 |
else |
99 |
{ |
100 |
printf ( "\nTLD whois server for %s not found" , ext); |
101 |
return 1; |
102 |
} |
103 |
|
104 |
response_2 = strdup(response); |
105 |
106 |
//Again search for a whois server in this response. :) |
107 |
pch = strtok (response , "\n" ); |
108 |
while (pch != NULL) |
109 |
{ |
110 |
//Check if whois line |
111 |
wch = strstr (pch , "whois." ); |
112 |
if (wch != NULL) |
113 |
{ |
114 |
break ; |
115 |
} |
116 |
117 |
//Next line please |
118 |
pch = strtok (NULL , "\n" ); |
119 |
} |
120 |
121 |
122 |
/* |
123 |
* If a registrar whois server is found then query it |
124 |
* */ |
125 |
if (wch) |
126 |
{ |
127 |
//Now we have the registrar whois server , this has the direct full information of the particular domain |
128 |
//so lets query again |
129 |
|
130 |
printf ( "\nRegistrar Whois server is : %s" , wch); |
131 |
|
132 |
if (whois_query(wch , domain , &response)) |
133 |
{ |
134 |
printf ( "Whois query failed" ); |
135 |
} |
136 |
|
137 |
printf ( "\n%s" , response); |
138 |
} |
139 |
|
140 |
/* |
141 |
* otherwise echo the output from the previous whois result |
142 |
* */ |
143 |
else |
144 |
{ |
145 |
printf ( "%s" , response_2); |
146 |
} |
147 |
return 0; |
148 |
} |
149 |
150 |
/* |
151 |
* Perform a whois query to a server and record the response |
152 |
* */ |
153 |
int whois_query( char *server , char *query , char **response) |
154 |
{ |
155 |
char ip[32] , message[100] , buffer[1500]; |
156 |
int sock , read_size , total_size = 0; |
157 |
struct sockaddr_in dest; |
158 |
|
159 |
sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); |
160 |
|
161 |
//Prepare connection structures :) |
162 |
memset ( &dest , 0 , sizeof (dest) ); |
163 |
dest.sin_family = AF_INET; |
164 |
|
165 |
printf ( "\nResolving %s..." , server); |
166 |
if (hostname_to_ip(server , ip)) |
167 |
{ |
168 |
printf ( "Failed" ); |
169 |
return 1; |
170 |
} |
171 |
printf ( "%s" , ip); |
172 |
dest.sin_addr.s_addr = inet_addr( ip ); |
173 |
dest.sin_port = htons( 43 ); |
174 |
175 |
//Now connect to remote server |
176 |
if (connect( sock , ( const struct sockaddr*) &dest , sizeof (dest) ) < 0) |
177 |
{ |
178 |
perror ( "connect failed" ); |
179 |
} |
180 |
|
181 |
//Now send some data or message |
182 |
printf ( "\nQuerying for ... %s ..." , query); |
183 |
sprintf (message , "%s\r\n" , query); |
184 |
if ( send(sock , message , strlen (message) , 0) < 0) |
185 |
{ |
186 |
perror ( "send failed" ); |
187 |
} |
188 |
|
189 |
//Now receive the response |
190 |
while ( (read_size = recv(sock , buffer , sizeof (buffer) , 0) ) ) |
191 |
{ |
192 |
*response = realloc (*response , read_size + total_size); |
193 |
if (*response == NULL) |
194 |
{ |
195 |
printf ( "realloc failed" ); |
196 |
} |
197 |
memcpy (*response + total_size , buffer , read_size); |
198 |
total_size += read_size; |
199 |
} |
200 |
printf ( "Done" ); |
201 |
fflush (stdout); |
202 |
|
203 |
*response = realloc (*response , total_size + 1); |
204 |
*(*response + total_size) = '\0' ; |
205 |
|
206 |
close(sock); |
207 |
return 0; |
208 |
} |
209 |
210 |
/* |
211 |
* @brief |
212 |
* Get the ip address of a given hostname |
213 |
* |
214 |
* */ |
215 |
int hostname_to_ip( char * hostname , char * ip) |
216 |
{ |
217 |
struct hostent *he; |
218 |
struct in_addr **addr_list; |
219 |
int i; |
220 |
|
221 |
if ( (he = gethostbyname( hostname ) ) == NULL) |
222 |
{ |
223 |
// get the host info |
224 |
herror( "gethostbyname" ); |
225 |
return 1; |
226 |
} |
227 |
228 |
addr_list = ( struct in_addr **) he->h_addr_list; |
229 |
|
230 |
for (i = 0; addr_list[i] != NULL; i++) |
231 |
{ |
232 |
//Return the first one; |
233 |
strcpy (ip , inet_ntoa(*addr_list[i]) ); |
234 |
return 0; |
235 |
} |
236 |
|
237 |
return 0; |
238 |
} |
239 |
240 |
/* |
241 |
* Search and replace a string with another string , in a string |
242 |
* */ |
243 |
char *str_replace( char *search , char *replace , char *subject) |
244 |
{ |
245 |
char *p = NULL , *old = NULL , *new_subject = NULL ; |
246 |
int c = 0 , search_size; |
247 |
|
248 |
search_size = strlen (search); |
249 |
|
250 |
//Count how many occurences |
251 |
for (p = strstr (subject , search) ; p != NULL ; p = strstr (p + search_size , search)) |
252 |
{ |
253 |
c++; |
254 |
} |
255 |
|
256 |
//Final size |
257 |
c = ( strlen (replace) - search_size )*c + strlen (subject); |
258 |
|
259 |
//New subject with new size |
260 |
new_subject = malloc ( c ); |
261 |
|
262 |
//Set it to blank |
263 |
strcpy (new_subject , "" ); |
264 |
|
265 |
//The start position |
266 |
old = subject; |
267 |
|
268 |
for (p = strstr (subject , search) ; p != NULL ; p = strstr (p + search_size , search)) |
269 |
{ |
270 |
//move ahead and copy some text from original subject , from a certain position |
271 |
strncpy (new_subject + strlen (new_subject) , old , p - old); |
272 |
|
273 |
//move ahead and copy the replacement text |
274 |
strcpy (new_subject + strlen (new_subject) , replace); |
275 |
|
276 |
//The new start position after this search match |
277 |
old = p + search_size; |
278 |
} |
279 |
|
280 |
//Copy the part after the last search match |
281 |
strcpy (new_subject + strlen (new_subject) , old); |
282 |
|
283 |
return new_subject; |
284 |
} |
hostname_to_ip – This is a simple function to get an IP of a domain.
str_replace – This is a generic string processing function that is used to search for a string in another big string and replace it with another string.
Output
1 |
Enter domain name to whois : www.wikipedia.org |
2 |
3 |
Resolving whois.iana.org...192.0.47.59 |
4 |
Querying for ... org ...Done |
5 |
TLD Whois server is : whois.pir.org |
6 |
Resolving whois.pir.org...149.17.192.7 |
7 |
Querying for ... wikipedia.org ...DoneAccess to .ORG WHOIS information is provided to assist persons in |
8 |
determining the contents of a domain name registration record in the |
9 |
Public Interest Registry registry database. The data in this record is provided by |
10 |
Public Interest Registry for informational purposes only, and Public Interest Registry does not |
11 |
guarantee its accuracy. This service is intended only for query-based |
12 |
access. You agree that you will use this data only for lawful purposes |
13 |
and that, under no circumstances will you use this data to: (a) allow, |
14 |
enable , or otherwise support the transmission by e-mail, telephone, or |
15 |
facsimile of mass unsolicited, commercial advertising or solicitations |
16 |
to entities other than the data recipient's own existing customers; or |
17 |
(b) enable high volume, automated, electronic processes that send |
18 |
queries or data to the systems of Registry Operator, a Registrar, or |
19 |
Afilias except as reasonably necessary to register domain names or |
20 |
modify existing registrations. All rights reserved. Public Interest Registry reserves |
21 |
the right to modify these terms at any time . By submitting this query, |
22 |
you agree to abide by this policy. |
23 |
24 |
Domain ID:D51687756-LROR |
25 |
Domain Name:WIKIPEDIA.ORG |
26 |
Created On:13-Jan-2001 00:12:14 UTC |
27 |
Last Updated On:02-Dec-2009 20:57:17 UTC |
28 |
Expiration Date:13-Jan-2015 00:12:14 UTC |
29 |
Sponsoring Registrar:GoDaddy.com, Inc. (R91-LROR) |
30 |
Status:CLIENT DELETE PROHIBITED |
31 |
Status:CLIENT RENEW PROHIBITED |
32 |
Status:CLIENT TRANSFER PROHIBITED |
33 |
Status:CLIENT UPDATE PROHIBITED |
34 |
Registrant ID:CR31094073 |
35 |
Registrant Name:DNS Admin |
36 |
Registrant Organization:Wikimedia Foundation, Inc. |
37 |
Registrant Street1:149 New Montgomery Street |
38 |
Registrant Street2:Third Floor |
39 |
Registrant Street3: |
40 |
Registrant City:San Francisco |
41 |
Registrant State/Province:California |
42 |
Registrant Postal Code:94105 |
43 |
Registrant Country:US |
44 |
Registrant Phone:+1.4158396885 |
45 |
Registrant Phone Ext.: |
46 |
Registrant FAX:+1.4158820495 |
47 |
Registrant FAX Ext.: |
48 |
Registrant Email:dns-admin@wikimedia.org |
49 |
Admin ID:CR31094075 |
50 |
Admin Name:DNS Admin |
51 |
Admin Organization:Wikimedia Foundation, Inc. |
52 |
Admin Street1:149 New Montgomery Street |
53 |
Admin Street2:Third Floor |
54 |
Admin Street3: |
55 |
Admin City:San Francisco |
56 |
Admin State/Province:California |
57 |
Admin Postal Code:94105 |
58 |
Admin Country:US |
59 |
Admin Phone:+1.4158396885 |
60 |
Admin Phone Ext.: |
61 |
Admin FAX:+1.4158820495 |
62 |
Admin FAX Ext.: |
63 |
Admin Email:dns-admin@wikimedia.org |
64 |
Tech ID:CR31094074 |
65 |
Tech Name:DNS Admin |
66 |
Tech Organization:Wikimedia Foundation, Inc. |
67 |
Tech Street1:149 New Montgomery Street |
68 |
Tech Street2:Third Floor |
69 |
Tech Street3: |
70 |
Tech City:San Francisco |
71 |
Tech State/Province:California |
72 |
Tech Postal Code:94105 |
73 |
Tech Country:US |
74 |
Tech Phone:+1.4158396885 |
75 |
Tech Phone Ext.: |
76 |
Tech FAX:+1.4158820495 |
77 |
Tech FAX Ext.: |
78 |
Tech Email:dns-admin@wikimedia.org |
79 |
Name Server:NS0.WIKIMEDIA.ORG |
80 |
Name Server:NS1.WIKIMEDIA.ORG |
81 |
Name Server:NS2.WIKIMEDIA.ORG |
82 |
Name Server: |
83 |
Name Server: |
84 |
Name Server: |
85 |
Name Server: |
86 |
Name Server: |
87 |
Name Server: |
88 |
Name Server: |
89 |
Name Server: |
90 |
Name Server: |
91 |
Name Server: |
92 |
DNSSEC:Unsigned |
A whois client is a program that will simply fetch the whois information for a domain/ip address from the whois servers. The code over here works according to the algorithm discussed here.
Code
1 |
/* |
2 |
* @brief |
3 |
* Whois client program |
4 |
* |
5 |
* @details |
6 |
* This program shall perform whois for a domain and get you the whois data of that domain |
7 |
* |
8 |
* @author Silver Moon ( m00n.silv3r@gmail.com ) |
9 |
* */ |
10 |
11 |
#include<stdio.h> //scanf , printf |
12 |
#include<string.h> //strtok |
13 |
#include<stdlib.h> //realloc |
14 |
#include<sys/socket.h> //socket |
15 |
#include<netinet/in.h> //sockaddr_in |
16 |
#include<arpa/inet.h> //getsockname |
17 |
#include<netdb.h> //hostent |
18 |
#include<unistd.h> //close |
19 |
20 |
int get_whois_data( char * , char **); |
21 |
int hostname_to_ip( char * , char *); |
22 |
int whois_query( char * , char * , char **); |
23 |
char *str_replace( char *search , char *replace , char *subject ); |
24 |
25 |
int main( int argc , char *argv[]) |
26 |
{ |
27 |
char domain[100] , *data = NULL; |
28 |
|
29 |
printf ( "Enter domain name to whois : " ); |
30 |
scanf ( "%s" , domain); |
31 |
|
32 |
get_whois_data(domain , &data); |
33 |
|
34 |
//puts(data); |
35 |
return 0; |
36 |
} |
37 |
38 |
/* |
39 |
* Get the whois data of a domain |
40 |
* */ |
41 |
int get_whois_data( char *domain , char **data) |
42 |
{ |
43 |
char ext[1024] , *pch , *response = NULL , *response_2 = NULL , *wch , *dt; |
44 |
45 |
//remove "http://" and "www." |
46 |
domain = str_replace( "http://" , "" , domain); |
47 |
domain = str_replace( "www." , "" , domain); |
48 |
49 |
//get the extension , com , org , edu |
50 |
dt = strdup(domain); |
51 |
if (dt == NULL) |
52 |
{ |
53 |
printf ( "strdup failed" ); |
54 |
} |
55 |
pch = ( char *) strtok (dt , "." ); |
56 |
while (pch != NULL) |
57 |
{ |
58 |
strcpy (ext , pch); |
59 |
pch = strtok (NULL , "." ); |
60 |
} |
61 |
|
62 |
//This will tell the whois server for the particular TLD like com , org |
63 |
if (whois_query( "whois.iana.org" , ext , &response)) |
64 |
{ |
65 |
printf ( "Whois query failed" ); |
66 |
} |
67 |
|
68 |
//Now analysze the response :) |
69 |
pch = strtok (response , "\n" ); |
70 |
while (pch != NULL) |
71 |
{ |
72 |
//Check if whois line |
73 |
wch = strstr
|