Lines Matching defs:client
57 cleanup_gabn(ns_lwdclient_t *client) {
58 ns_lwdclient_log(50, "cleaning up client %p", client);
60 if (client->v6find != NULL) {
61 if (client->v6find == client->v4find)
62 client->v6find = NULL;
64 dns_adb_destroyfind(&client->v6find);
66 if (client->v4find != NULL)
67 dns_adb_destroyfind(&client->v4find);
71 setup_addresses(ns_lwdclient_t *client, dns_adbfind_t *find, unsigned int at) {
84 while (ai != NULL && client->gabn.naddrs < LWRES_MAX_ADDRS) {
89 addr = &client->addrs[client->gabn.naddrs];
98 client->gabn.naddrs++;
100 LWRES_LIST_APPEND(client->gabn.addrs, addr, link);
120 sort_addresses(ns_lwdclient_t *client) {
126 ns_lwresd_t *lwresd = client->clientmgr->listener->manager;
130 naddrs = client->gabn.naddrs;
139 isc_netaddr_fromsockaddr(&remote, &client->address);
149 &client->addrs[i]);
155 result = lwaddr_lwresaddr_fromnetaddr(&client->addrs[i],
164 generate_reply(ns_lwdclient_t *client) {
171 cm = client->clientmgr;
174 ns_lwdclient_log(50, "generating gabn reply for client %p", client);
177 * We must make certain the client->find is not still active.
181 if (client->find == client->v4find || client->find == client->v6find)
182 client->find = NULL;
184 if (client->find != NULL)
185 dns_adb_destroyfind(&client->find);
190 if (NEED_V6(client) && client->v4find != NULL)
191 client->v6find = client->v4find;
197 LWRES_LIST_INIT(client->gabn.addrs);
198 if (client->v4find != NULL)
199 setup_addresses(client, client->v4find, DNS_ADBFIND_INET);
200 if (client->v6find != NULL)
201 setup_addresses(client, client->v6find, DNS_ADBFIND_INET6);
208 if (client->gabn.naddrs == 0) {
210 result = ns_lwsearchctx_next(&client->searchctx);
212 cleanup_gabn(client);
213 result = start_find(client);
223 client->pkt.recvlength = LWRES_RECVLENGTH;
224 client->pkt.authtype = 0; /* XXXMLG */
225 client->pkt.authlength = 0;
230 if (client->gabn.naddrs != 0)
231 client->pkt.result = LWRES_R_SUCCESS;
233 client->pkt.result = LWRES_R_NOTFOUND;
235 sort_addresses(client);
237 lwres = lwres_gabnresponse_render(cm->lwctx, &client->gabn,
238 &client->pkt, &lwb);
244 client->sendbuf = r.base;
245 client->sendlength = r.length;
246 result = ns_lwdclient_sendreply(client, &r);
250 NS_LWDCLIENT_SETSEND(client);
255 cleanup_gabn(client);
260 cleanup_gabn(client);
263 lwres_context_freemem(client->clientmgr->lwctx,
266 ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);
277 add_alias(ns_lwdclient_t *client) {
282 b = client->recv_buffer;
287 result = dns_name_totext(dns_fixedname_name(&client->target_name),
288 ISC_TRUE, &client->recv_buffer);
295 naliases = client->gabn.naliases;
297 client->gabn.aliases[naliases] = client->gabn.realname;
298 client->gabn.aliaslen[naliases] = client->gabn.realnamelen;
299 client->gabn.naliases++;
305 client->gabn.realname = (char *)(b.base) + b.used;
306 client->gabn.realnamelen = client->recv_buffer.used - b.used;
312 store_realname(ns_lwdclient_t *client) {
317 b = client->recv_buffer;
319 tname = dns_fixedname_name(&client->target_name);
320 result = ns_lwsearchctx_current(&client->searchctx, tname);
327 result = dns_name_totext(tname, ISC_TRUE, &client->recv_buffer);
334 client->gabn.realname = (char *) b.base + b.used;
335 client->gabn.realnamelen = client->recv_buffer.used - b.used;
342 ns_lwdclient_t *client = ev->ev_arg;
346 ns_lwdclient_log(50, "find done for task %p, client %p", task, client);
357 if (NEED_V4(client)) {
358 client->v4find = client->find;
361 if (NEED_V6(client)) {
362 client->v6find = client->find;
365 if (client->find != NULL) {
367 client->find = NULL;
369 dns_adb_destroyfind(&client->find);
372 generate_reply(client);
381 if ((client->find != client->v4find)
382 && (client->find != client->v6find)) {
383 dns_adb_destroyfind(&client->find);
385 client->find = NULL;
393 restart_find(client);
400 cleanup_gabn(client);
401 ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);
405 restart_find(ns_lwdclient_t *client) {
410 ns_lwdclient_log(50, "starting find for client %p", client);
426 if (NEED_V4(client))
428 if (NEED_V6(client))
432 INSIST(client->find == NULL);
433 result = dns_adb_createfind(client->clientmgr->view->adb,
434 client->clientmgr->task,
435 process_gabn_finddone, client,
436 dns_fixedname_name(&client->target_name),
438 dns_fixedname_name(&client->target_name),
439 client->clientmgr->view->dstport,
440 &client->find);
447 dns_adb_destroyfind(&client->find);
448 cleanup_gabn(client);
449 result = add_alias(client);
453 ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);
466 if (client->find != NULL)
467 dns_adb_destroyfind(&client->find);
468 cleanup_gabn(client);
469 ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);
478 if (NEED_V4(client)
479 && ((client->find->query_pending & DNS_ADBFIND_INET) == 0)) {
480 ns_lwdclient_log(50, "client %p ipv4 satisfied by find %p",
481 client, client->find);
483 client->v4find = client->find;
489 if (NEED_V6(client)
490 && ((client->find->query_pending & DNS_ADBFIND_INET6) == 0)) {
491 ns_lwdclient_log(50, "client %p ipv6 satisfied by find %p",
492 client, client->find);
494 client->v6find = client->find;
506 if ((client->find->options & DNS_ADBFIND_WANTEVENT) != 0) {
508 INSIST(client->v4find == NULL || client->v6find == NULL);
513 client->find = NULL;
515 dns_adb_destroyfind(&client->find);
522 generate_reply(client);
526 start_find(ns_lwdclient_t *client) {
533 init_gabn(client);
535 result = store_realname(client);
538 restart_find(client);
544 init_gabn(ns_lwdclient_t *client) {
552 client->aliases[i] = NULL;
553 client->aliaslen[i] = 0;
556 client->addrs[i].family = 0;
557 client->addrs[i].length = 0;
558 memset(client->addrs[i].address, 0, LWRES_ADDR_MAXLEN);
559 LWRES_LINK_INIT(&client->addrs[i], link);
562 client->gabn.naliases = 0;
563 client->gabn.naddrs = 0;
564 client->gabn.realname = NULL;
565 client->gabn.aliases = client->aliases;
566 client->gabn.realnamelen = 0;
567 client->gabn.aliaslen = client->aliaslen;
568 LWRES_LIST_INIT(client->gabn.addrs);
569 client->gabn.base = NULL;
570 client->gabn.baselen = 0;
575 isc_buffer_init(&client->recv_buffer, client->buffer, LWRES_RECVLENGTH);
581 * client->sockaddr contains the address we need to reply to,
583 * client->pkt contains the packet header data,
598 ns_lwdclient_processgabn(ns_lwdclient_t *client, lwres_buffer_t *b) {
604 REQUIRE(NS_LWDCLIENT_ISRECVDONE(client));
606 cm = client->clientmgr;
609 result = lwres_gabnrequest_parse(client->clientmgr->lwctx,
610 b, &client->pkt, &req);
619 dns_fixedname_init(&client->target_name);
620 dns_fixedname_init(&client->query_name);
621 result = dns_name_fromtext(dns_fixedname_name(&client->query_name),
625 ns_lwsearchctx_init(&client->searchctx,
627 dns_fixedname_name(&client->query_name),
629 ns_lwsearchctx_first(&client->searchctx);
631 client->find_wanted = req->addrtypes;
632 ns_lwdclient_log(50, "client %p looking for addrtypes %08x",
633 client, client->find_wanted);
638 lwres_gabnrequest_free(client->clientmgr->lwctx, &req);
643 result = start_find(client);
654 lwres_gabnrequest_free(client->clientmgr->lwctx, &req);
656 ns_lwdclient_errorpktsend(client, LWRES_R_FAILURE);