Skip to content

Commit ca31917

Browse files
committed
added getdns.__version__, broke out query types
1 parent d5074f8 commit ca31917

File tree

2 files changed

+71
-73
lines changed

2 files changed

+71
-73
lines changed

getdns.c

Lines changed: 69 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -223,68 +223,6 @@ dispatch_query(PyObject *context_capsule,
223223
return NULL;
224224
}
225225
}
226-
if (request_type == GETDNS_RRTYPE_PTR) {
227-
PyObject *address = (PyObject *)name;
228-
getdns_dict *addr_dict;
229-
getdns_bindata addr_data;
230-
getdns_bindata addr_type;
231-
PyObject *str;
232-
int domain;
233-
unsigned char buf[sizeof(struct in6_addr)];
234-
235-
if (!PyDict_Check(address)) {
236-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
237-
return NULL;
238-
}
239-
if (PyDict_Size(address) != 2) {
240-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
241-
return NULL;
242-
}
243-
addr_dict = getdns_dict_create();
244-
if ((str = PyDict_GetItemString(address, "address_type")) == NULL) {
245-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
246-
return NULL;
247-
}
248-
if (!PyString_Check(str)) {
249-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
250-
return NULL;
251-
}
252-
addr_type.data = (uint8_t *)strdup(PyString_AsString(str));
253-
addr_type.size = strlen((char *)addr_type.data);
254-
if (strlen((char *)addr_type.data) != 4) {
255-
PyErr_SetString(getdns_error, GETDNS_RETURN_WRONG_TYPE_REQUESTED_TEXT);
256-
return NULL;
257-
}
258-
if (!strncasecmp((char *)addr_type.data, "IPv4", 4))
259-
domain = AF_INET;
260-
else if (!strncasecmp((char *)addr_type.data, "IPv6", 4))
261-
domain = AF_INET6;
262-
else {
263-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
264-
return NULL;
265-
}
266-
getdns_dict_set_bindata(addr_dict, "address_type", &addr_type);
267-
268-
if ((str = PyDict_GetItemString(address, "address_data")) == NULL) {
269-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
270-
return NULL;
271-
}
272-
if (!PyString_Check(str)) {
273-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
274-
return NULL;
275-
}
276-
if (inet_pton(domain, PyString_AsString(str), buf) <= 0) {
277-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
278-
return NULL;
279-
}
280-
addr_data.data = (uint8_t *)buf;
281-
addr_data.size = (domain == AF_INET ? 4 : 16);
282-
getdns_dict_set_bindata(addr_dict, "address_data", &addr_data);
283-
if ((query_name = reverse_address(&addr_data)) == NULL) {
284-
PyErr_SetString(getdns_error, GETDNS_RETURN_INVALID_PARAMETER_TEXT);
285-
return NULL;
286-
}
287-
} else
288226
query_name = (char *)name;
289227

290228
if (callback) {
@@ -302,26 +240,83 @@ dispatch_query(PyObject *context_capsule,
302240
return NULL;
303241
}
304242

305-
if ((ret = getdns_general(context, query_name, request_type,
306-
extensions_dict, (void *)callback_data,
307-
(getdns_transaction_t *)&tid, callback_shim)) != GETDNS_RETURN_GOOD) {
308-
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
309-
event_base_free(gen_event_base);
310-
return NULL;
243+
if ((request_type == GETDNS_RRTYPE_A) || (request_type == GETDNS_RRTYPE_AAAA)) {
244+
if ((ret = getdns_address(context, query_name, extensions_dict, (void *)callback_data,
245+
(getdns_transaction_t *)&tid, callback_shim)) != GETDNS_RETURN_GOOD) {
246+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
247+
event_base_free(gen_event_base);
248+
return NULL;
249+
}
250+
} else if (request_type == GETDNS_RRTYPE_SRV) {
251+
if ((ret = getdns_service(context, query_name, extensions_dict, (void *)callback_data,
252+
(getdns_transaction_t *)&tid, callback_shim)) != GETDNS_RETURN_GOOD) {
253+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
254+
event_base_free(gen_event_base);
255+
return NULL;
256+
}
257+
} else if (request_type == GETDNS_RRTYPE_PTR) {
258+
getdns_dict *addr_dict;
259+
int resp;
260+
if ((addr_dict = getdnsify_addressdict((PyObject *)name)) == NULL) {
261+
PyObject *err_type, *err_value, *err_traceback;
262+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
263+
PyErr_Restore(err_type, err_value, err_traceback);
264+
return NULL;
265+
}
266+
if ((resp = getdns_hostname(context, addr_dict, extensions_dict,
267+
(void *)callback_data, (getdns_transaction_t *)&tid,
268+
callback_shim)) != GETDNS_RETURN_GOOD) {
269+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
270+
event_base_free(gen_event_base);
271+
return NULL;
272+
}
273+
} else {
274+
if ((ret = getdns_general(context, query_name, request_type,
275+
extensions_dict, (void *)callback_data,
276+
(getdns_transaction_t *)&tid, callback_shim)) != GETDNS_RETURN_GOOD) {
277+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
278+
event_base_free(gen_event_base);
279+
return NULL;
280+
}
311281
}
312282
dispatch_ret = event_base_dispatch(gen_event_base);
313283
UNUSED_PARAM(dispatch_ret);
314284

315285
event_base_free(gen_event_base);
316286
return Py_None;
317287
}
318-
if ((ret = getdns_general_sync(context, query_name, request_type,
319-
extensions_dict, &resp)) != GETDNS_RETURN_GOOD) {
320-
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
321-
return NULL;
288+
if ((request_type == GETDNS_RRTYPE_A) || (request_type == GETDNS_RRTYPE_AAAA)) {
289+
if ((ret = getdns_address_sync(context, query_name, extensions_dict, &resp)) != GETDNS_RETURN_GOOD) {
290+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
291+
return NULL;
292+
}
293+
} else if (request_type == GETDNS_RRTYPE_SRV) {
294+
if ((ret = getdns_service_sync(context, query_name, extensions_dict, &resp)) != GETDNS_RETURN_GOOD) {
295+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
296+
return NULL;
297+
}
298+
} else if (request_type == GETDNS_RRTYPE_PTR) {
299+
getdns_dict *addr_dict;
300+
int ret;
301+
if ((addr_dict = getdnsify_addressdict((PyObject *)name)) == NULL) {
302+
PyObject *err_type, *err_value, *err_traceback;
303+
PyErr_Fetch(&err_type, &err_value, &err_traceback);
304+
PyErr_Restore(err_type, err_value, err_traceback);
305+
return NULL;
306+
}
307+
if ((ret = getdns_hostname_sync(context, addr_dict,
308+
extensions_dict, &resp)) != GETDNS_RETURN_GOOD) {
309+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
310+
return NULL;
311+
}
312+
} else {
313+
if ((ret = getdns_general_sync(context, query_name, request_type,
314+
extensions_dict, &resp)) != GETDNS_RETURN_GOOD) {
315+
PyErr_SetString(getdns_error, GETDNS_RETURN_GENERIC_ERROR_TEXT);
316+
return NULL;
317+
}
322318
}
323319
return getFullResponse(resp);
324-
325320
}
326321

327322

@@ -416,6 +411,7 @@ initgetdns(void)
416411
return;
417412
Py_INCREF(&getdns_ContextType);
418413
PyModule_AddObject(g, "Context", (PyObject *)&getdns_ContextType);
414+
PyModule_AddStringConstant(g, "__version__", PYGETDNS_VERSION);
419415
/*
420416
* return value constants
421417
*/

pygetdns.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
#ifndef PYGETDNS_H
3333
#define PYGETDNS_H
3434

35+
#define PYGETDNS_VERSION "0.2.1"
36+
3537
#define GETDNS_STR_IPV4 "IPv4"
3638
#define GETDNS_STR_IPV6 "IPv6"
3739

0 commit comments

Comments
 (0)