comparison libpurple/dnsquery.c @ 31746:8dbe2f531a89

dnsquery: Behold, automagic conversion of a string IP address into a sockaddr struct, IPv#-independent.
author Paul Aurich <paul@darkrain42.org>
date Sun, 17 Jul 2011 20:38:09 +0000
parents 92f3d821653f
children d3d41ba0c3b8 3828a61c44da
comparison
equal deleted inserted replaced
31745:451242c455ca 31746:8dbe2f531a89
152 } 152 }
153 153
154 static gboolean 154 static gboolean
155 resolve_ip(PurpleDnsQueryData *query_data) 155 resolve_ip(PurpleDnsQueryData *query_data)
156 { 156 {
157 #if defined(HAVE_GETADDRINFO) && defined(AI_NUMERICHOST)
158 struct addrinfo hints, *res;
159 char servname[20];
160
161 g_snprintf(servname, sizeof(servname), "%d", query_data->port);
162 memset(&hints, 0, sizeof(hints));
163 hints.ai_family = AF_UNSPEC;
164 hints.ai_flags |= AI_NUMERICHOST;
165
166 if (0 == getaddrinfo(query_data->hostname, servname, &hints, &res))
167 {
168 GSList *hosts = NULL;
169 hosts = g_slist_append(hosts, GINT_TO_POINTER(res->ai_addrlen));
170 hosts = g_slist_append(hosts, g_memdup(res->ai_addr, res->ai_addrlen));
171 purple_dnsquery_resolved(query_data, hosts);
172
173 freeaddrinfo(res);
174 return TRUE;
175 }
176 #else /* defined(HAVE_GETADDRINFO) && defined(AI_NUMERICHOST) */
157 struct sockaddr_in sin; 177 struct sockaddr_in sin;
158 /* TODO: Use inet_pton for IPv6 support */
159 if (inet_aton(query_data->hostname, &sin.sin_addr)) 178 if (inet_aton(query_data->hostname, &sin.sin_addr))
160 { 179 {
161 /* 180 /*
162 * The given "hostname" is actually an IP address, so we 181 * The given "hostname" is actually an IP address, so we
163 * don't need to do anything. 182 * don't need to do anything.
169 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin))); 188 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin)));
170 purple_dnsquery_resolved(query_data, hosts); 189 purple_dnsquery_resolved(query_data, hosts);
171 190
172 return TRUE; 191 return TRUE;
173 } 192 }
193 #endif
174 194
175 return FALSE; 195 return FALSE;
176 } 196 }
177 197
178 #ifdef USE_IDN 198 #ifdef USE_IDN