1 | cdef extern from "hesiod.h": |
---|
2 | int hesiod_init(void **context) |
---|
3 | void hesiod_end(void *context) |
---|
4 | char *hesiod_to_bind(void *context, char *name, char *type) |
---|
5 | char **hesiod_resolve(void *context, char *name, char *type) |
---|
6 | void hesiod_free_list(void *context, char **list) |
---|
7 | # This function isn't defined in 3.0.2, which is what Debian/Ubuntu use |
---|
8 | #void hesiod_free_string(void *context, char *str) |
---|
9 | |
---|
10 | cdef extern from "errno.h": |
---|
11 | int errno |
---|
12 | |
---|
13 | cdef extern from "string.h": |
---|
14 | char * strerror(int errnum) |
---|
15 | |
---|
16 | cdef extern from "stdlib.h": |
---|
17 | void free(void *) |
---|
18 | |
---|
19 | cdef void * __context |
---|
20 | |
---|
21 | cdef class __ContextManager: |
---|
22 | def __init__(self): |
---|
23 | if hesiod_init(&__context) == -1: |
---|
24 | raise IOError(errno, strerror(errno)) |
---|
25 | |
---|
26 | def __del__(self): |
---|
27 | hesiod_end(__context) |
---|
28 | |
---|
29 | cdef object __cm |
---|
30 | __cm = __ContextManager() |
---|
31 | |
---|
32 | import threading |
---|
33 | __lookup_lock = threading.Lock() |
---|
34 | |
---|
35 | def bind(hes_name, hes_type): |
---|
36 | """ |
---|
37 | Convert the provided arguments into a DNS name. |
---|
38 | |
---|
39 | The DNS name derived from the name and type provided is used to |
---|
40 | actually execute the Hesiod lookup. |
---|
41 | """ |
---|
42 | cdef object py_result |
---|
43 | cdef char * c_result |
---|
44 | |
---|
45 | name_str, type_str = map(str, (hes_name, hes_type)) |
---|
46 | |
---|
47 | c_result = hesiod_to_bind(__context, name_str, type_str) |
---|
48 | if c_result is NULL: |
---|
49 | raise IOError(errno, strerror(errno)) |
---|
50 | py_result = c_result |
---|
51 | |
---|
52 | free(c_result) |
---|
53 | return py_result |
---|
54 | |
---|
55 | def resolve(hes_name, hes_type): |
---|
56 | """ |
---|
57 | Return a list of records matching the given name and type. |
---|
58 | """ |
---|
59 | cdef int i |
---|
60 | cdef object py_result |
---|
61 | py_result = list() |
---|
62 | cdef char ** c_result |
---|
63 | |
---|
64 | name_str, type_str = map(str, (hes_name, hes_type)) |
---|
65 | |
---|
66 | __lookup_lock.acquire() |
---|
67 | c_result = hesiod_resolve(__context, name_str, type_str) |
---|
68 | err = errno |
---|
69 | __lookup_lock.release() |
---|
70 | |
---|
71 | if c_result is NULL: |
---|
72 | raise IOError(err, strerror(err)) |
---|
73 | i = 0 |
---|
74 | while True: |
---|
75 | if c_result[i] is NULL: |
---|
76 | break |
---|
77 | py_result.append(c_result[i]) |
---|
78 | i = i + 1 |
---|
79 | |
---|
80 | hesiod_free_list(__context, c_result) |
---|
81 | return py_result |
---|