This is the mail archive of the libc-help@sourceware.org mailing list for the glibc project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
Hi,
On 14/03/15 00:56, Carlos O'Donell wrote:
> Other than that, it must accurately set RES_INIT flag to indicate
> the structure is initialized and does not need to be initialized
> again.
>
> The obvious dislcaimer is that this is very fragile and may break
> at any time if we change the layout of _res.
>
Would that be what res_init() is for?
If so, that doesn't seem to work either. If I use res_init(); before I
set _res, it still overwrites it on the first call to getaddrinfo.
This is the same for using res_query.
From gdb:
> Breakpoint 1, main () at k.c:9
> 9 int main() {
> (gdb) n
> 18 res_init();
> (gdb) n
> 19 inet_pton(AF_INET, "208.67.220.220", &server);
> (gdb) p _res
> $1 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 16842879}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 902, dnsrch = {
> 0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
> s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
> mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 0, _vcsock =
> -1, _flags = 0, _u = {
> pad = "\000\000\003\000\003\000\003", '\000' <repeats 41 times>,
> "\001\000\000", _ext = {nscount = 0, nsmap = {3, 3, 3}, nssocks = {0,
> 0, 0}, nscount6 = 0, nsinit = 0, nsaddrs = {0x0, 0x0, 0x0}, initstamp
> = 1}}}
> (gdb) n
> 21 serverSock.sin_family = AF_INET;
> (gdb) n
> 22 serverSock.sin_port = htons(53);
> (gdb) n
> 23 serverSock.sin_addr = server;
> (gdb) n
> 25 _res.nscount = 1;
> (gdb) n
> 26 _res.nsaddr_list[0] = serverSock;
> (gdb) n
> 27 printf("Blah\n");
> (gdb) p _res
> $2 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 3705422800}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 902, dnsrch = {
> 0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
> s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
> mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 0, _vcsock =
> -1, _flags = 0, _u = {
> pad = "\000\000\003\000\003\000\003", '\000' <repeats 41 times>,
> "\001\000\000", _ext = {nscount = 0, nsmap = {3, 3, 3}, nssocks = {0,
> 0, 0}, nscount6 = 0, nsinit = 0, nsaddrs = {0x0, 0x0, 0x0}, initstamp
> = 1}}}
> (gdb) n
> Blah
> 28 int l = res_query("myip.opendns.com", ns_c_any, ns_t_a, buf,
> sizeof(buf));
> (gdb) n
> 29 if(l < 0) {
> (gdb) p _res
> $3 = {retrans = 5, retry = 4, options = 524993, nscount = 1,
> nsaddr_list = {{sin_family = 2, sin_port = 13568, sin_addr = {s_addr =
> 16842879}, sin_zero = "\000\000\000\000\000\000\000"}, {sin_family =
> 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero =
> "\000\000\000\000\000\000\000"}, {sin_family = 0, sin_port = 0,
> sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}},
> id = 12360, dnsrch = {
> 0x7ffff7bbd460 <_res+128> "", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
> defdname = '\000' <repeats 255 times>, pfcode = 0, ndots = 1, nsort =
> 0, ipv6_unavail = 0, unused = 0, sort_list = {{addr = {s_addr = 0},
> mask = 0}, {addr = {
> s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr
> = {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0}, mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr =
> {s_addr = 0},
> mask = 0}, {addr = {s_addr = 0}, mask = 0}, {addr = {s_addr =
> 0}, mask = 0}}, qhook = 0x0, rhook = 0x0, res_h_errno = 2, _vcsock =
> -1, _flags = 0, _u = {
> pad = "\001\000\000\000\003\000\003\000\377\377\377\377", '\000'
> <repeats 12 times>, "\020 `", '\000' <repeats 21 times>,
> "\002\000\000", _ext = {nscount = 1, nsmap = {0, 3, 3}, nssocks = {-1,
> 0, 0}, nscount6 = 0,
> nsinit = 0, nsaddrs = {0x602010, 0x0, 0x0}, initstamp = 2}}}
Anyways, for my code, I assume I should be using the res_* family, as
getaddrinfo is not guaranteed to use _res, right?
Thanks,
--
-- Joshua Rogers <https://internot.info/>
Attachment:
signature.asc
Description: OpenPGP digital signature
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |