2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1994-1998
5 Copyright (C) Jeremy Allison 2007.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "../lib/util/tevent_ntstatus.h"
23 #include "libads/sitename_cache.h"
24 #include "libads/dns.h"
25 #include "../libcli/netlogon/netlogon.h"
26 #include "lib/async_req/async_sock.h"
27 #include "libsmb/nmblib.h"
29 /* nmbd.c sets this to True. */
30 bool global_in_nmbd = False;
32 /****************************
33 * SERVER AFFINITY ROUTINES *
34 ****************************/
36 /* Server affinity is the concept of preferring the last domain
37 controller with whom you had a successful conversation */
39 /****************************************************************************
40 ****************************************************************************/
41 #define SAFKEY_FMT "SAF/DOMAIN/%s"
43 #define SAFJOINKEY_FMT "SAFJOIN/DOMAIN/%s"
44 #define SAFJOIN_TTL 3600
46 static char *saf_key(const char *domain)
50 asprintf_strupper_m(&keystr, SAFKEY_FMT, domain);
55 static char *saf_join_key(const char *domain)
59 asprintf_strupper_m(&keystr, SAFJOINKEY_FMT, domain);
64 /****************************************************************************
65 ****************************************************************************/
67 bool saf_store( const char *domain, const char *servername )
73 if ( !domain || !servername ) {
74 DEBUG(2,("saf_store: "
75 "Refusing to store empty domain or servername!\n"));
79 if ( (strlen(domain) == 0) || (strlen(servername) == 0) ) {
80 DEBUG(0,("saf_store: "
81 "refusing to store 0 length domain or servername!\n"));
85 key = saf_key( domain );
86 expire = time( NULL ) + lp_parm_int(-1, "saf","ttl", SAF_TTL);
88 DEBUG(10,("saf_store: domain = [%s], server = [%s], expire = [%u]\n",
89 domain, servername, (unsigned int)expire ));
91 ret = gencache_set( key, servername, expire );
98 bool saf_join_store( const char *domain, const char *servername )
104 if ( !domain || !servername ) {
105 DEBUG(2,("saf_join_store: Refusing to store empty domain or servername!\n"));
109 if ( (strlen(domain) == 0) || (strlen(servername) == 0) ) {
110 DEBUG(0,("saf_join_store: refusing to store 0 length domain or servername!\n"));
114 key = saf_join_key( domain );
115 expire = time( NULL ) + lp_parm_int(-1, "saf","join ttl", SAFJOIN_TTL);
117 DEBUG(10,("saf_join_store: domain = [%s], server = [%s], expire = [%u]\n",
118 domain, servername, (unsigned int)expire ));
120 ret = gencache_set( key, servername, expire );
127 bool saf_delete( const char *domain )
133 DEBUG(2,("saf_delete: Refusing to delete empty domain\n"));
137 key = saf_join_key(domain);
138 ret = gencache_del(key);
142 DEBUG(10,("saf_delete[join]: domain = [%s]\n", domain ));
145 key = saf_key(domain);
146 ret = gencache_del(key);
150 DEBUG(10,("saf_delete: domain = [%s]\n", domain ));
156 /****************************************************************************
157 ****************************************************************************/
159 char *saf_fetch( const char *domain )
166 if ( !domain || strlen(domain) == 0) {
167 DEBUG(2,("saf_fetch: Empty domain name!\n"));
171 key = saf_join_key( domain );
173 ret = gencache_get( key, &server, &timeout );
178 DEBUG(5,("saf_fetch[join]: Returning \"%s\" for \"%s\" domain\n",
183 key = saf_key( domain );
185 ret = gencache_get( key, &server, &timeout );
190 DEBUG(5,("saf_fetch: failed to find server for \"%s\" domain\n",
193 DEBUG(5,("saf_fetch: Returning \"%s\" for \"%s\" domain\n",
200 static void set_socket_addr_v4(struct sockaddr_storage *addr)
202 if (!interpret_string_addr(addr, lp_socket_address(),
203 AI_NUMERICHOST|AI_PASSIVE)) {
206 if (addr->ss_family != AF_INET) {
211 static struct in_addr my_socket_addr_v4(void)
213 struct sockaddr_storage my_addr;
214 struct sockaddr_in *in_addr = (struct sockaddr_in *)((char *)&my_addr);
216 set_socket_addr_v4(&my_addr);
217 return in_addr->sin_addr;
220 /****************************************************************************
221 Generate a random trn_id.
222 ****************************************************************************/
224 static int generate_trn_id(void)
228 generate_random_buffer((uint8 *)&id, sizeof(id));
230 return id % (unsigned)0x7FFF;
233 /****************************************************************************
234 Parse a node status response into an array of structures.
235 ****************************************************************************/
237 static struct node_status *parse_node_status(TALLOC_CTX *mem_ctx, char *p,
239 struct node_status_extra *extra)
241 struct node_status *ret;
244 *num_names = CVAL(p,0);
249 ret = talloc_array(mem_ctx, struct node_status,*num_names);
254 for (i=0;i< *num_names;i++) {
255 StrnCpy(ret[i].name,p,15);
256 trim_char(ret[i].name,'\0',' ');
257 ret[i].type = CVAL(p,15);
258 ret[i].flags = p[16];
260 DEBUG(10, ("%s#%02x: flags = 0x%02x\n", ret[i].name,
261 ret[i].type, ret[i].flags));
264 * Also, pick up the MAC address ...
267 memcpy(&extra->mac_addr, p, 6); /* Fill in the mac addr */
272 struct sock_packet_read_state {
273 struct tevent_context *ev;
274 enum packet_type type;
277 struct nb_packet_reader *reader;
278 struct tevent_req *reader_req;
281 struct tevent_req *socket_req;
283 struct sockaddr_storage addr;
286 bool (*validator)(struct packet_struct *p,
290 struct packet_struct *packet;
293 static int sock_packet_read_state_destructor(struct sock_packet_read_state *s);
294 static void sock_packet_read_got_packet(struct tevent_req *subreq);
295 static void sock_packet_read_got_socket(struct tevent_req *subreq);
297 static struct tevent_req *sock_packet_read_send(
299 struct tevent_context *ev,
300 int sock, /* dgram socket */
301 struct nb_packet_reader *reader,
302 enum packet_type type,
304 bool (*validator)(struct packet_struct *p, void *private_data),
307 struct tevent_req *req;
308 struct sock_packet_read_state *state;
310 req = tevent_req_create(mem_ctx, &state,
311 struct sock_packet_read_state);
315 talloc_set_destructor(state, sock_packet_read_state_destructor);
317 state->reader = reader;
320 state->trn_id = trn_id;
321 state->validator = validator;
322 state->private_data = private_data;
324 if (reader != NULL) {
325 state->reader_req = nb_packet_read_send(state, ev, reader);
326 if (tevent_req_nomem(state->reader_req, req)) {
327 return tevent_req_post(req, ev);
329 tevent_req_set_callback(
330 state->reader_req, sock_packet_read_got_packet, req);
333 state->addr_len = sizeof(state->addr);
334 state->socket_req = recvfrom_send(state, ev, sock,
335 state->buf, sizeof(state->buf), 0,
336 &state->addr, &state->addr_len);
337 if (tevent_req_nomem(state->socket_req, req)) {
338 return tevent_req_post(req, ev);
340 tevent_req_set_callback(state->socket_req, sock_packet_read_got_socket,
346 static int sock_packet_read_state_destructor(struct sock_packet_read_state *s)
348 if (s->packet != NULL) {
349 free_packet(s->packet);
355 static void sock_packet_read_got_packet(struct tevent_req *subreq)
357 struct tevent_req *req = tevent_req_callback_data(
358 subreq, struct tevent_req);
359 struct sock_packet_read_state *state = tevent_req_data(
360 req, struct sock_packet_read_state);
363 status = nb_packet_read_recv(subreq, &state->packet);
365 TALLOC_FREE(state->reader_req);
367 if (!NT_STATUS_IS_OK(status)) {
368 if (state->socket_req != NULL) {
370 * Still waiting for socket
375 * Both socket and packet reader failed
377 tevent_req_nterror(req, status);
381 if ((state->validator != NULL) &&
382 !state->validator(state->packet, state->private_data)) {
383 DEBUG(10, ("validator failed\n"));
385 free_packet(state->packet);
386 state->packet = NULL;
388 state->reader_req = nb_packet_read_send(state, state->ev,
390 if (tevent_req_nomem(state->reader_req, req)) {
393 tevent_req_set_callback(
394 state->reader_req, sock_packet_read_got_packet, req);
398 TALLOC_FREE(state->socket_req);
399 tevent_req_done(req);
402 static void sock_packet_read_got_socket(struct tevent_req *subreq)
404 struct tevent_req *req = tevent_req_callback_data(
405 subreq, struct tevent_req);
406 struct sock_packet_read_state *state = tevent_req_data(
407 req, struct sock_packet_read_state);
408 struct sockaddr_in *in_addr;
412 received = recvfrom_recv(subreq, &err);
414 TALLOC_FREE(state->socket_req);
416 if (received == -1) {
417 if (state->reader_req != NULL) {
419 * Still waiting for reader
424 * Both socket and reader failed
426 tevent_req_nterror(req, map_nt_error_from_unix(err));
429 if (state->addr.ss_family != AF_INET) {
432 in_addr = (struct sockaddr_in *)(void *)&state->addr;
434 state->packet = parse_packet((char *)state->buf, received, state->type,
435 in_addr->sin_addr, in_addr->sin_port);
436 if (state->packet == NULL) {
437 DEBUG(10, ("parse_packet failed\n"));
440 if ((state->trn_id != -1) &&
441 (state->trn_id != packet_trn_id(state->packet))) {
442 DEBUG(10, ("Expected transaction id %d, got %d\n",
443 state->trn_id, packet_trn_id(state->packet)));
447 if ((state->validator != NULL) &&
448 !state->validator(state->packet, state->private_data)) {
449 DEBUG(10, ("validator failed\n"));
453 tevent_req_done(req);
457 if (state->packet != NULL) {
458 free_packet(state->packet);
459 state->packet = NULL;
461 state->socket_req = recvfrom_send(state, state->ev, state->sock,
462 state->buf, sizeof(state->buf), 0,
463 &state->addr, &state->addr_len);
464 if (tevent_req_nomem(state->socket_req, req)) {
467 tevent_req_set_callback(state->socket_req, sock_packet_read_got_socket,
471 static NTSTATUS sock_packet_read_recv(struct tevent_req *req,
472 struct packet_struct **ppacket)
474 struct sock_packet_read_state *state = tevent_req_data(
475 req, struct sock_packet_read_state);
478 if (tevent_req_is_nterror(req, &status)) {
481 *ppacket = state->packet;
482 state->packet = NULL;
486 struct nb_trans_state {
487 struct tevent_context *ev;
489 struct nb_packet_reader *reader;
491 const struct sockaddr_storage *dst_addr;
494 enum packet_type type;
497 bool (*validator)(struct packet_struct *p,
501 struct packet_struct *packet;
504 static int nb_trans_state_destructor(struct nb_trans_state *s);
505 static void nb_trans_got_reader(struct tevent_req *subreq);
506 static void nb_trans_done(struct tevent_req *subreq);
507 static void nb_trans_sent(struct tevent_req *subreq);
508 static void nb_trans_send_next(struct tevent_req *subreq);
510 static struct tevent_req *nb_trans_send(
512 struct tevent_context *ev,
513 const struct sockaddr_storage *my_addr,
514 const struct sockaddr_storage *dst_addr,
516 uint8_t *buf, size_t buflen,
517 enum packet_type type, int trn_id,
518 bool (*validator)(struct packet_struct *p,
522 struct tevent_req *req, *subreq;
523 struct nb_trans_state *state;
525 req = tevent_req_create(mem_ctx, &state, struct nb_trans_state);
529 talloc_set_destructor(state, nb_trans_state_destructor);
531 state->dst_addr = dst_addr;
533 state->buflen = buflen;
535 state->trn_id = trn_id;
536 state->validator = validator;
537 state->private_data = private_data;
539 state->sock = open_socket_in(SOCK_DGRAM, 0, 3, my_addr, True);
540 if (state->sock == -1) {
541 tevent_req_nterror(req, map_nt_error_from_unix(errno));
542 DEBUG(10, ("open_socket_in failed: %s\n", strerror(errno)));
543 return tevent_req_post(req, ev);
547 set_socket_options(state->sock,"SO_BROADCAST");
550 subreq = nb_packet_reader_send(state, ev, type, state->trn_id, NULL);
551 if (tevent_req_nomem(subreq, req)) {
552 return tevent_req_post(req, ev);
554 tevent_req_set_callback(subreq, nb_trans_got_reader, req);
558 static int nb_trans_state_destructor(struct nb_trans_state *s)
564 if (s->packet != NULL) {
565 free_packet(s->packet);
571 static void nb_trans_got_reader(struct tevent_req *subreq)
573 struct tevent_req *req = tevent_req_callback_data(
574 subreq, struct tevent_req);
575 struct nb_trans_state *state = tevent_req_data(
576 req, struct nb_trans_state);
579 status = nb_packet_reader_recv(subreq, state, &state->reader);
582 if (!NT_STATUS_IS_OK(status)) {
583 DEBUG(10, ("nmbd not around\n"));
584 state->reader = NULL;
587 subreq = sock_packet_read_send(
588 state, state->ev, state->sock,
589 state->reader, state->type, state->trn_id,
590 state->validator, state->private_data);
591 if (tevent_req_nomem(subreq, req)) {
594 tevent_req_set_callback(subreq, nb_trans_done, req);
596 subreq = sendto_send(state, state->ev, state->sock,
597 state->buf, state->buflen, 0, state->dst_addr);
598 if (tevent_req_nomem(subreq, req)) {
601 tevent_req_set_callback(subreq, nb_trans_sent, req);
604 static void nb_trans_sent(struct tevent_req *subreq)
606 struct tevent_req *req = tevent_req_callback_data(
607 subreq, struct tevent_req);
608 struct nb_trans_state *state = tevent_req_data(
609 req, struct nb_trans_state);
613 sent = sendto_recv(subreq, &err);
616 DEBUG(10, ("sendto failed: %s\n", strerror(err)));
617 tevent_req_nterror(req, map_nt_error_from_unix(err));
620 subreq = tevent_wakeup_send(state, state->ev,
621 timeval_current_ofs(1, 0));
622 if (tevent_req_nomem(subreq, req)) {
625 tevent_req_set_callback(subreq, nb_trans_send_next, req);
628 static void nb_trans_send_next(struct tevent_req *subreq)
630 struct tevent_req *req = tevent_req_callback_data(
631 subreq, struct tevent_req);
632 struct nb_trans_state *state = tevent_req_data(
633 req, struct nb_trans_state);
636 ret = tevent_wakeup_recv(subreq);
639 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
642 subreq = sendto_send(state, state->ev, state->sock,
643 state->buf, state->buflen, 0, state->dst_addr);
644 if (tevent_req_nomem(subreq, req)) {
647 tevent_req_set_callback(subreq, nb_trans_sent, req);
650 static void nb_trans_done(struct tevent_req *subreq)
652 struct tevent_req *req = tevent_req_callback_data(
653 subreq, struct tevent_req);
654 struct nb_trans_state *state = tevent_req_data(
655 req, struct nb_trans_state);
658 status = sock_packet_read_recv(subreq, &state->packet);
660 if (tevent_req_nterror(req, status)) {
663 tevent_req_done(req);
666 static NTSTATUS nb_trans_recv(struct tevent_req *req,
667 struct packet_struct **ppacket)
669 struct nb_trans_state *state = tevent_req_data(
670 req, struct nb_trans_state);
673 if (tevent_req_is_nterror(req, &status)) {
676 *ppacket = state->packet;
677 state->packet = NULL;
681 /****************************************************************************
682 Do a NBT node status query on an open socket and return an array of
683 structures holding the returned names or NULL if the query failed.
684 **************************************************************************/
686 struct node_status_query_state {
687 struct sockaddr_storage my_addr;
688 struct sockaddr_storage addr;
691 struct packet_struct *packet;
694 static int node_status_query_state_destructor(
695 struct node_status_query_state *s);
696 static bool node_status_query_validator(struct packet_struct *p,
698 static void node_status_query_done(struct tevent_req *subreq);
700 struct tevent_req *node_status_query_send(TALLOC_CTX *mem_ctx,
701 struct tevent_context *ev,
702 struct nmb_name *name,
703 const struct sockaddr_storage *addr)
705 struct tevent_req *req, *subreq;
706 struct node_status_query_state *state;
707 struct packet_struct p;
708 struct nmb_packet *nmb = &p.packet.nmb;
709 struct sockaddr_in *in_addr;
711 req = tevent_req_create(mem_ctx, &state,
712 struct node_status_query_state);
716 talloc_set_destructor(state, node_status_query_state_destructor);
718 if (addr->ss_family != AF_INET) {
719 /* Can't do node status to IPv6 */
720 tevent_req_nterror(req, NT_STATUS_INVALID_ADDRESS);
721 return tevent_req_post(req, ev);
725 in_addr = (struct sockaddr_in *)(void *)&state->addr;
726 in_addr->sin_port = htons(NMB_PORT);
728 set_socket_addr_v4(&state->my_addr);
731 nmb->header.name_trn_id = generate_trn_id();
732 nmb->header.opcode = 0;
733 nmb->header.response = false;
734 nmb->header.nm_flags.bcast = false;
735 nmb->header.nm_flags.recursion_available = false;
736 nmb->header.nm_flags.recursion_desired = false;
737 nmb->header.nm_flags.trunc = false;
738 nmb->header.nm_flags.authoritative = false;
739 nmb->header.rcode = 0;
740 nmb->header.qdcount = 1;
741 nmb->header.ancount = 0;
742 nmb->header.nscount = 0;
743 nmb->header.arcount = 0;
744 nmb->question.question_name = *name;
745 nmb->question.question_type = 0x21;
746 nmb->question.question_class = 0x1;
748 state->buflen = build_packet((char *)state->buf, sizeof(state->buf),
750 if (state->buflen == 0) {
751 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
752 DEBUG(10, ("build_packet failed\n"));
753 return tevent_req_post(req, ev);
756 subreq = nb_trans_send(state, ev, &state->my_addr, &state->addr, false,
757 state->buf, state->buflen,
758 NMB_PACKET, nmb->header.name_trn_id,
759 node_status_query_validator, NULL);
760 if (tevent_req_nomem(subreq, req)) {
761 DEBUG(10, ("nb_trans_send failed\n"));
762 return tevent_req_post(req, ev);
764 if (!tevent_req_set_endtime(req, ev, timeval_current_ofs(10, 0))) {
765 return tevent_req_post(req, ev);
767 tevent_req_set_callback(subreq, node_status_query_done, req);
771 static bool node_status_query_validator(struct packet_struct *p,
774 struct nmb_packet *nmb = &p->packet.nmb;
777 if (nmb->header.opcode != 0 ||
778 nmb->header.nm_flags.bcast ||
780 !nmb->header.ancount ||
781 nmb->answers->rr_type != 0x21) {
783 * XXXX what do we do with this? could be a redirect,
784 * but we'll discard it for the moment
791 static int node_status_query_state_destructor(
792 struct node_status_query_state *s)
794 if (s->packet != NULL) {
795 free_packet(s->packet);
801 static void node_status_query_done(struct tevent_req *subreq)
803 struct tevent_req *req = tevent_req_callback_data(
804 subreq, struct tevent_req);
805 struct node_status_query_state *state = tevent_req_data(
806 req, struct node_status_query_state);
809 status = nb_trans_recv(subreq, &state->packet);
811 if (tevent_req_nterror(req, status)) {
814 tevent_req_done(req);
817 NTSTATUS node_status_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
818 struct node_status **pnode_status,
820 struct node_status_extra *extra)
822 struct node_status_query_state *state = tevent_req_data(
823 req, struct node_status_query_state);
824 struct node_status *node_status;
828 if (tevent_req_is_nterror(req, &status)) {
831 node_status = parse_node_status(
832 mem_ctx, &state->packet->packet.nmb.answers->rdata[0],
834 if (node_status == NULL) {
835 return NT_STATUS_NO_MEMORY;
837 *pnode_status = node_status;
838 *pnum_names = num_names;
842 NTSTATUS node_status_query(TALLOC_CTX *mem_ctx, struct nmb_name *name,
843 const struct sockaddr_storage *addr,
844 struct node_status **pnode_status,
846 struct node_status_extra *extra)
848 TALLOC_CTX *frame = talloc_stackframe();
849 struct tevent_context *ev;
850 struct tevent_req *req;
851 NTSTATUS status = NT_STATUS_NO_MEMORY;
853 ev = tevent_context_init(frame);
857 req = node_status_query_send(ev, ev, name, addr);
861 if (!tevent_req_poll_ntstatus(req, ev, &status)) {
864 status = node_status_query_recv(req, mem_ctx, pnode_status,
871 /****************************************************************************
872 Find the first type XX name in a node status reply - used for finding
873 a servers name given its IP. Return the matched name in *name.
874 **************************************************************************/
876 bool name_status_find(const char *q_name,
879 const struct sockaddr_storage *to_ss,
882 char addr[INET6_ADDRSTRLEN];
883 struct sockaddr_storage ss;
884 struct node_status *addrs = NULL;
885 struct nmb_name nname;
890 if (lp_disable_netbios()) {
891 DEBUG(5,("name_status_find(%s#%02x): netbios is disabled\n",
896 print_sockaddr(addr, sizeof(addr), to_ss);
898 DEBUG(10, ("name_status_find: looking up %s#%02x at %s\n", q_name,
901 /* Check the cache first. */
903 if (namecache_status_fetch(q_name, q_type, type, to_ss, name)) {
907 if (to_ss->ss_family != AF_INET) {
908 /* Can't do node status to IPv6 */
912 set_socket_addr_v4(&ss);
914 /* W2K PDC's seem not to respond to '*'#0. JRA */
915 make_nmb_name(&nname, q_name, q_type);
916 status = node_status_query(talloc_tos(), &nname, to_ss,
917 &addrs, &count, NULL);
918 if (!NT_STATUS_IS_OK(status)) {
922 for (i=0;i<count;i++) {
923 /* Find first one of the requested type that's not a GROUP. */
924 if (addrs[i].type == type && ! (addrs[i].flags & 0x80))
930 pull_ascii_nstring(name, sizeof(fstring), addrs[i].name);
932 /* Store the result in the cache. */
933 /* but don't store an entry for 0x1c names here. Here we have
934 a single host and DOMAIN<0x1c> names should be a list of hosts */
936 if ( q_type != 0x1c ) {
937 namecache_status_store(q_name, q_type, type, to_ss, name);
945 DEBUG(10, ("name_status_find: name %sfound", result ? "" : "not "));
948 DEBUGADD(10, (", name %s ip address is %s", name, addr));
956 comparison function used by sort_addr_list
959 static int addr_compare(const struct sockaddr_storage *ss1,
960 const struct sockaddr_storage *ss2)
962 int max_bits1=0, max_bits2=0;
963 int num_interfaces = iface_count();
966 /* Sort IPv4 addresses first. */
967 if (ss1->ss_family != ss2->ss_family) {
968 if (ss2->ss_family == AF_INET) {
975 /* Here we know both addresses are of the same
978 for (i=0;i<num_interfaces;i++) {
979 const struct sockaddr_storage *pss = iface_n_bcast(i);
980 const unsigned char *p_ss1 = NULL;
981 const unsigned char *p_ss2 = NULL;
982 const unsigned char *p_if = NULL;
986 if (pss->ss_family != ss1->ss_family) {
987 /* Ignore interfaces of the wrong type. */
990 if (pss->ss_family == AF_INET) {
991 p_if = (const unsigned char *)
992 &((const struct sockaddr_in *)pss)->sin_addr;
993 p_ss1 = (const unsigned char *)
994 &((const struct sockaddr_in *)ss1)->sin_addr;
995 p_ss2 = (const unsigned char *)
996 &((const struct sockaddr_in *)ss2)->sin_addr;
999 #if defined(HAVE_IPV6)
1000 if (pss->ss_family == AF_INET6) {
1001 p_if = (const unsigned char *)
1002 &((const struct sockaddr_in6 *)pss)->sin6_addr;
1003 p_ss1 = (const unsigned char *)
1004 &((const struct sockaddr_in6 *)ss1)->sin6_addr;
1005 p_ss2 = (const unsigned char *)
1006 &((const struct sockaddr_in6 *)ss2)->sin6_addr;
1010 if (!p_ss1 || !p_ss2 || !p_if || len == 0) {
1013 bits1 = matching_len_bits(p_ss1, p_if, len);
1014 bits2 = matching_len_bits(p_ss2, p_if, len);
1015 max_bits1 = MAX(bits1, max_bits1);
1016 max_bits2 = MAX(bits2, max_bits2);
1019 /* Bias towards directly reachable IPs */
1020 if (iface_local((const struct sockaddr *)ss1)) {
1021 if (ss1->ss_family == AF_INET) {
1027 if (iface_local((const struct sockaddr *)ss2)) {
1028 if (ss2->ss_family == AF_INET) {
1034 return max_bits2 - max_bits1;
1037 /*******************************************************************
1038 compare 2 ldap IPs by nearness to our interfaces - used in qsort
1039 *******************************************************************/
1041 int ip_service_compare(struct ip_service *ss1, struct ip_service *ss2)
1045 if ((result = addr_compare(&ss1->ss, &ss2->ss)) != 0) {
1049 if (ss1->port > ss2->port) {
1053 if (ss1->port < ss2->port) {
1061 sort an IP list so that names that are close to one of our interfaces
1062 are at the top. This prevents the problem where a WINS server returns an IP
1063 that is not reachable from our subnet as the first match
1066 static void sort_addr_list(struct sockaddr_storage *sslist, int count)
1072 TYPESAFE_QSORT(sslist, count, addr_compare);
1075 static void sort_service_list(struct ip_service *servlist, int count)
1081 TYPESAFE_QSORT(servlist, count, ip_service_compare);
1084 /**********************************************************************
1085 Remove any duplicate address/port pairs in the list
1086 *********************************************************************/
1088 static int remove_duplicate_addrs2(struct ip_service *iplist, int count )
1092 DEBUG(10,("remove_duplicate_addrs2: "
1093 "looking for duplicate address/port pairs\n"));
1095 /* one loop to remove duplicates */
1096 for ( i=0; i<count; i++ ) {
1097 if ( is_zero_addr(&iplist[i].ss)) {
1101 for ( j=i+1; j<count; j++ ) {
1102 if (sockaddr_equal((struct sockaddr *)(void *)&iplist[i].ss,
1103 (struct sockaddr *)(void *)&iplist[j].ss) &&
1104 iplist[i].port == iplist[j].port) {
1105 zero_sockaddr(&iplist[j].ss);
1110 /* one loop to clean up any holes we left */
1111 /* first ip should never be a zero_ip() */
1112 for (i = 0; i<count; ) {
1113 if (is_zero_addr(&iplist[i].ss) ) {
1115 memmove(&iplist[i], &iplist[i+1],
1116 (count - i - 1)*sizeof(iplist[i]));
1127 static bool prioritize_ipv4_list(struct ip_service *iplist, int count)
1129 TALLOC_CTX *frame = talloc_stackframe();
1130 struct ip_service *iplist_new = talloc_array(frame, struct ip_service, count);
1133 if (iplist_new == NULL) {
1140 /* Copy IPv4 first. */
1141 for (i = 0; i < count; i++) {
1142 if (iplist[i].ss.ss_family == AF_INET) {
1143 iplist_new[j++] = iplist[i];
1148 for (i = 0; i < count; i++) {
1149 if (iplist[i].ss.ss_family != AF_INET) {
1150 iplist_new[j++] = iplist[i];
1154 memcpy(iplist, iplist_new, sizeof(struct ip_service)*count);
1159 /****************************************************************************
1160 Do a netbios name query to find someones IP.
1161 Returns an array of IP addresses or NULL if none.
1162 *count will be set to the number of addresses returned.
1163 *timed_out is set if we failed by timing out
1164 ****************************************************************************/
1166 struct name_query_state {
1167 struct sockaddr_storage my_addr;
1168 struct sockaddr_storage addr;
1175 NTSTATUS validate_error;
1178 struct sockaddr_storage *addrs;
1182 static bool name_query_validator(struct packet_struct *p, void *private_data);
1183 static void name_query_done(struct tevent_req *subreq);
1185 struct tevent_req *name_query_send(TALLOC_CTX *mem_ctx,
1186 struct tevent_context *ev,
1187 const char *name, int name_type,
1188 bool bcast, bool recurse,
1189 const struct sockaddr_storage *addr)
1191 struct tevent_req *req, *subreq;
1192 struct name_query_state *state;
1193 struct packet_struct p;
1194 struct nmb_packet *nmb = &p.packet.nmb;
1195 struct sockaddr_in *in_addr;
1197 req = tevent_req_create(mem_ctx, &state, struct name_query_state);
1201 state->bcast = bcast;
1203 if (addr->ss_family != AF_INET) {
1204 /* Can't do node status to IPv6 */
1205 tevent_req_nterror(req, NT_STATUS_INVALID_ADDRESS);
1206 return tevent_req_post(req, ev);
1209 if (lp_disable_netbios()) {
1210 DEBUG(5,("name_query(%s#%02x): netbios is disabled\n",
1212 tevent_req_nterror(req, NT_STATUS_NOT_SUPPORTED);
1213 return tevent_req_post(req, ev);
1216 state->addr = *addr;
1217 in_addr = (struct sockaddr_in *)(void *)&state->addr;
1218 in_addr->sin_port = htons(NMB_PORT);
1220 set_socket_addr_v4(&state->my_addr);
1223 nmb->header.name_trn_id = generate_trn_id();
1224 nmb->header.opcode = 0;
1225 nmb->header.response = false;
1226 nmb->header.nm_flags.bcast = bcast;
1227 nmb->header.nm_flags.recursion_available = false;
1228 nmb->header.nm_flags.recursion_desired = recurse;
1229 nmb->header.nm_flags.trunc = false;
1230 nmb->header.nm_flags.authoritative = false;
1231 nmb->header.rcode = 0;
1232 nmb->header.qdcount = 1;
1233 nmb->header.ancount = 0;
1234 nmb->header.nscount = 0;
1235 nmb->header.arcount = 0;
1237 make_nmb_name(&nmb->question.question_name,name,name_type);
1239 nmb->question.question_type = 0x20;
1240 nmb->question.question_class = 0x1;
1242 state->buflen = build_packet((char *)state->buf, sizeof(state->buf),
1244 if (state->buflen == 0) {
1245 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
1246 DEBUG(10, ("build_packet failed\n"));
1247 return tevent_req_post(req, ev);
1250 subreq = nb_trans_send(state, ev, &state->my_addr, &state->addr, bcast,
1251 state->buf, state->buflen,
1252 NMB_PACKET, nmb->header.name_trn_id,
1253 name_query_validator, state);
1254 if (tevent_req_nomem(subreq, req)) {
1255 DEBUG(10, ("nb_trans_send failed\n"));
1256 return tevent_req_post(req, ev);
1258 tevent_req_set_callback(subreq, name_query_done, req);
1262 static bool name_query_validator(struct packet_struct *p, void *private_data)
1264 struct name_query_state *state = talloc_get_type_abort(
1265 private_data, struct name_query_state);
1266 struct nmb_packet *nmb = &p->packet.nmb;
1267 struct sockaddr_storage *tmp_addrs;
1268 bool got_unique_netbios_name = false;
1271 debug_nmb_packet(p);
1274 * If we get a Negative Name Query Response from a WINS
1275 * server, we should report it and give up.
1277 if( 0 == nmb->header.opcode /* A query response */
1278 && !state->bcast /* from a WINS server */
1279 && nmb->header.rcode /* Error returned */
1282 if( DEBUGLVL( 3 ) ) {
1283 /* Only executed if DEBUGLEVEL >= 3 */
1284 dbgtext( "Negative name query "
1285 "response, rcode 0x%02x: ",
1286 nmb->header.rcode );
1287 switch( nmb->header.rcode ) {
1289 dbgtext("Request was invalidly formatted.\n");
1292 dbgtext("Problem with NBNS, cannot process "
1296 dbgtext("The name requested does not "
1300 dbgtext("Unsupported request error.\n");
1303 dbgtext("Query refused error.\n");
1306 dbgtext("Unrecognized error code.\n" );
1312 * We accept this packet as valid, but tell the upper
1313 * layers that it's a negative response.
1315 state->validate_error = NT_STATUS_NOT_FOUND;
1319 if (nmb->header.opcode != 0 ||
1320 nmb->header.nm_flags.bcast ||
1321 nmb->header.rcode ||
1322 !nmb->header.ancount) {
1324 * XXXX what do we do with this? Could be a redirect,
1325 * but we'll discard it for the moment.
1330 tmp_addrs = talloc_realloc(
1331 state, state->addrs, struct sockaddr_storage,
1332 state->num_addrs + nmb->answers->rdlength/6);
1333 if (tmp_addrs == NULL) {
1334 state->validate_error = NT_STATUS_NO_MEMORY;
1337 state->addrs = tmp_addrs;
1339 DEBUG(2,("Got a positive name query response "
1340 "from %s ( ", inet_ntoa(p->ip)));
1342 for (i=0; i<nmb->answers->rdlength/6; i++) {
1345 struct sockaddr_storage addr;
1348 flags = RSVAL(&nmb->answers->rdata[i*6], 0);
1349 got_unique_netbios_name |= ((flags & 0x8000) == 0);
1351 putip((char *)&ip,&nmb->answers->rdata[2+i*6]);
1352 in_addr_to_sockaddr_storage(&addr, ip);
1354 for (j=0; j<state->num_addrs; j++) {
1356 (struct sockaddr *)(void *)&addr,
1357 (struct sockaddr *)(void *)&state->addrs[j])) {
1361 if (j < state->num_addrs) {
1362 /* Already got it */
1366 DEBUGADD(2,("%s ",inet_ntoa(ip)));
1368 state->addrs[state->num_addrs] = addr;
1369 state->num_addrs += 1;
1371 DEBUGADD(2,(")\n"));
1373 /* We add the flags back ... */
1374 if (nmb->header.response)
1375 state->flags |= NM_FLAGS_RS;
1376 if (nmb->header.nm_flags.authoritative)
1377 state->flags |= NM_FLAGS_AA;
1378 if (nmb->header.nm_flags.trunc)
1379 state->flags |= NM_FLAGS_TC;
1380 if (nmb->header.nm_flags.recursion_desired)
1381 state->flags |= NM_FLAGS_RD;
1382 if (nmb->header.nm_flags.recursion_available)
1383 state->flags |= NM_FLAGS_RA;
1384 if (nmb->header.nm_flags.bcast)
1385 state->flags |= NM_FLAGS_B;
1389 * We have to collect all entries coming in from broadcast
1390 * queries. If we got a unique name, we're done.
1392 return got_unique_netbios_name;
1395 * WINS responses are accepted when they are received
1400 static void name_query_done(struct tevent_req *subreq)
1402 struct tevent_req *req = tevent_req_callback_data(
1403 subreq, struct tevent_req);
1404 struct name_query_state *state = tevent_req_data(
1405 req, struct name_query_state);
1407 struct packet_struct *p = NULL;
1409 status = nb_trans_recv(subreq, &p);
1410 TALLOC_FREE(subreq);
1411 if (tevent_req_nterror(req, status)) {
1414 if (!NT_STATUS_IS_OK(state->validate_error)) {
1415 tevent_req_nterror(req, state->validate_error);
1420 * Free the packet here, we've collected the response in the
1425 tevent_req_done(req);
1428 NTSTATUS name_query_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
1429 struct sockaddr_storage **addrs, int *num_addrs,
1432 struct name_query_state *state = tevent_req_data(
1433 req, struct name_query_state);
1436 if (tevent_req_is_nterror(req, &status)) {
1438 NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
1440 * In the broadcast case we collect replies until the
1443 status = NT_STATUS_OK;
1445 if (!NT_STATUS_IS_OK(status)) {
1449 if (state->num_addrs == 0) {
1450 return NT_STATUS_NOT_FOUND;
1452 *addrs = talloc_move(mem_ctx, &state->addrs);
1453 sort_addr_list(*addrs, state->num_addrs);
1454 *num_addrs = state->num_addrs;
1455 if (flags != NULL) {
1456 *flags = state->flags;
1458 return NT_STATUS_OK;
1461 NTSTATUS name_query(const char *name, int name_type,
1462 bool bcast, bool recurse,
1463 const struct sockaddr_storage *to_ss,
1464 TALLOC_CTX *mem_ctx,
1465 struct sockaddr_storage **addrs,
1466 int *num_addrs, uint8_t *flags)
1468 TALLOC_CTX *frame = talloc_stackframe();
1469 struct tevent_context *ev;
1470 struct tevent_req *req;
1471 struct timeval timeout;
1472 NTSTATUS status = NT_STATUS_NO_MEMORY;
1474 ev = tevent_context_init(frame);
1478 req = name_query_send(ev, ev, name, name_type, bcast, recurse, to_ss);
1483 timeout = timeval_current_ofs(0, 250000);
1485 timeout = timeval_current_ofs(2, 0);
1487 if (!tevent_req_set_endtime(req, ev, timeout)) {
1490 if (!tevent_req_poll_ntstatus(req, ev, &status)) {
1493 status = name_query_recv(req, mem_ctx, addrs, num_addrs, flags);
1499 /********************************************************
1500 convert an array if struct sockaddr_storage to struct ip_service
1501 return false on failure. Port is set to PORT_NONE;
1502 *********************************************************/
1504 static bool convert_ss2service(struct ip_service **return_iplist,
1505 const struct sockaddr_storage *ss_list,
1510 if ( count==0 || !ss_list )
1513 /* copy the ip address; port will be PORT_NONE */
1514 if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, count)) ==
1516 DEBUG(0,("convert_ip2service: malloc failed "
1517 "for %d enetries!\n", count ));
1521 for ( i=0; i<count; i++ ) {
1522 (*return_iplist)[i].ss = ss_list[i];
1523 (*return_iplist)[i].port = PORT_NONE;
1529 struct name_queries_state {
1530 struct tevent_context *ev;
1535 const struct sockaddr_storage *addrs;
1540 struct tevent_req **subreqs;
1545 struct sockaddr_storage *result_addrs;
1546 int num_result_addrs;
1550 static void name_queries_done(struct tevent_req *subreq);
1551 static void name_queries_next(struct tevent_req *subreq);
1554 * Send a name query to multiple destinations with a wait time in between
1557 static struct tevent_req *name_queries_send(
1558 TALLOC_CTX *mem_ctx, struct tevent_context *ev,
1559 const char *name, int name_type,
1560 bool bcast, bool recurse,
1561 const struct sockaddr_storage *addrs,
1562 int num_addrs, int wait_msec, int timeout_msec)
1564 struct tevent_req *req, *subreq;
1565 struct name_queries_state *state;
1567 req = tevent_req_create(mem_ctx, &state,
1568 struct name_queries_state);
1574 state->name_type = name_type;
1575 state->bcast = bcast;
1576 state->recurse = recurse;
1577 state->addrs = addrs;
1578 state->num_addrs = num_addrs;
1579 state->wait_msec = wait_msec;
1580 state->timeout_msec = timeout_msec;
1582 state->subreqs = talloc_zero_array(
1583 state, struct tevent_req *, num_addrs);
1584 if (tevent_req_nomem(state->subreqs, req)) {
1585 return tevent_req_post(req, ev);
1587 state->num_sent = 0;
1589 subreq = name_query_send(
1590 state->subreqs, state->ev, name, name_type, bcast, recurse,
1591 &state->addrs[state->num_sent]);
1592 if (tevent_req_nomem(subreq, req)) {
1593 return tevent_req_post(req, ev);
1595 if (!tevent_req_set_endtime(
1597 timeval_current_ofs(0, state->timeout_msec * 1000))) {
1598 tevent_req_nomem(NULL, req);
1599 return tevent_req_post(req, ev);
1601 tevent_req_set_callback(subreq, name_queries_done, req);
1603 state->subreqs[state->num_sent] = subreq;
1604 state->num_sent += 1;
1606 if (state->num_sent < state->num_addrs) {
1607 subreq = tevent_wakeup_send(
1609 timeval_current_ofs(0, state->wait_msec * 1000));
1610 if (tevent_req_nomem(subreq, req)) {
1611 return tevent_req_post(req, ev);
1613 tevent_req_set_callback(subreq, name_queries_next, req);
1618 static void name_queries_done(struct tevent_req *subreq)
1620 struct tevent_req *req = tevent_req_callback_data(
1621 subreq, struct tevent_req);
1622 struct name_queries_state *state = tevent_req_data(
1623 req, struct name_queries_state);
1627 status = name_query_recv(subreq, state, &state->result_addrs,
1628 &state->num_result_addrs, &state->flags);
1630 for (i=0; i<state->num_sent; i++) {
1631 if (state->subreqs[i] == subreq) {
1635 if (i == state->num_sent) {
1636 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
1639 TALLOC_FREE(state->subreqs[i]);
1641 state->num_received += 1;
1643 if (!NT_STATUS_IS_OK(status)) {
1645 if (state->num_received >= state->num_addrs) {
1646 tevent_req_nterror(req, status);
1650 * Still outstanding requests, just wait
1654 state->received_index = i;
1655 tevent_req_done(req);
1658 static void name_queries_next(struct tevent_req *subreq)
1660 struct tevent_req *req = tevent_req_callback_data(
1661 subreq, struct tevent_req);
1662 struct name_queries_state *state = tevent_req_data(
1663 req, struct name_queries_state);
1665 if (!tevent_wakeup_recv(subreq)) {
1666 tevent_req_nterror(req, NT_STATUS_INTERNAL_ERROR);
1670 subreq = name_query_send(
1671 state->subreqs, state->ev,
1672 state->name, state->name_type, state->bcast, state->recurse,
1673 &state->addrs[state->num_sent]);
1674 if (tevent_req_nomem(subreq, req)) {
1677 tevent_req_set_callback(subreq, name_queries_done, req);
1678 if (!tevent_req_set_endtime(
1680 timeval_current_ofs(0, state->timeout_msec * 1000))) {
1681 tevent_req_nomem(NULL, req);
1684 state->subreqs[state->num_sent] = subreq;
1685 state->num_sent += 1;
1687 if (state->num_sent < state->num_addrs) {
1688 subreq = tevent_wakeup_send(
1690 timeval_current_ofs(0, state->wait_msec * 1000));
1691 if (tevent_req_nomem(subreq, req)) {
1694 tevent_req_set_callback(subreq, name_queries_next, req);
1698 static NTSTATUS name_queries_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
1699 struct sockaddr_storage **result_addrs,
1700 int *num_result_addrs, uint8_t *flags,
1701 int *received_index)
1703 struct name_queries_state *state = tevent_req_data(
1704 req, struct name_queries_state);
1707 if (tevent_req_is_nterror(req, &status)) {
1711 if (result_addrs != NULL) {
1712 *result_addrs = talloc_move(mem_ctx, &state->result_addrs);
1714 if (num_result_addrs != NULL) {
1715 *num_result_addrs = state->num_result_addrs;
1717 if (flags != NULL) {
1718 *flags = state->flags;
1720 if (received_index != NULL) {
1721 *received_index = state->received_index;
1723 return NT_STATUS_OK;
1726 static NTSTATUS name_queries(const char *name, int name_type,
1727 bool bcast, bool recurse,
1728 const struct sockaddr_storage *addrs,
1729 int num_addrs, int wait_msec, int timeout_msec,
1730 TALLOC_CTX *mem_ctx,
1731 struct sockaddr_storage **result_addrs,
1732 int *num_result_addrs, uint8_t *flags,
1733 int *received_index)
1735 TALLOC_CTX *frame = talloc_stackframe();
1736 struct event_context *ev;
1737 struct tevent_req *req;
1738 NTSTATUS status = NT_STATUS_NO_MEMORY;
1740 ev = event_context_init(frame);
1744 req = name_queries_send(frame, ev, name, name_type, bcast,
1745 recurse, addrs, num_addrs, wait_msec,
1750 if (!tevent_req_poll_ntstatus(req, ev, &status)) {
1753 status = name_queries_recv(req, mem_ctx, result_addrs,
1754 num_result_addrs, flags, received_index);
1760 /********************************************************
1761 Resolve via "bcast" method.
1762 *********************************************************/
1764 struct name_resolve_bcast_state {
1765 struct sockaddr_storage *addrs;
1769 static void name_resolve_bcast_done(struct tevent_req *subreq);
1771 struct tevent_req *name_resolve_bcast_send(TALLOC_CTX *mem_ctx,
1772 struct tevent_context *ev,
1776 struct tevent_req *req, *subreq;
1777 struct name_resolve_bcast_state *state;
1778 struct sockaddr_storage *bcast_addrs;
1779 int i, num_addrs, num_bcast_addrs;
1781 req = tevent_req_create(mem_ctx, &state,
1782 struct name_resolve_bcast_state);
1787 if (lp_disable_netbios()) {
1788 DEBUG(5, ("name_resolve_bcast(%s#%02x): netbios is disabled\n",
1790 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
1791 return tevent_req_post(req, ev);
1795 * "bcast" means do a broadcast lookup on all the local interfaces.
1798 DEBUG(3, ("name_resolve_bcast: Attempting broadcast lookup "
1799 "for name %s<0x%x>\n", name, name_type));
1801 num_addrs = iface_count();
1802 bcast_addrs = talloc_array(state, struct sockaddr_storage, num_addrs);
1803 if (tevent_req_nomem(bcast_addrs, req)) {
1804 return tevent_req_post(req, ev);
1808 * Lookup the name on all the interfaces, return on
1809 * the first successful match.
1811 num_bcast_addrs = 0;
1813 for (i=0; i<num_addrs; i++) {
1814 const struct sockaddr_storage *pss = iface_n_bcast(i);
1816 if (pss->ss_family != AF_INET) {
1819 bcast_addrs[num_bcast_addrs] = *pss;
1820 num_bcast_addrs += 1;
1823 subreq = name_queries_send(state, ev, name, name_type, true, true,
1824 bcast_addrs, num_bcast_addrs, 0, 1000);
1825 if (tevent_req_nomem(subreq, req)) {
1826 return tevent_req_post(req, ev);
1828 tevent_req_set_callback(subreq, name_resolve_bcast_done, req);
1832 static void name_resolve_bcast_done(struct tevent_req *subreq)
1834 struct tevent_req *req = tevent_req_callback_data(
1835 subreq, struct tevent_req);
1836 struct name_resolve_bcast_state *state = tevent_req_data(
1837 req, struct name_resolve_bcast_state);
1840 status = name_queries_recv(subreq, state,
1841 &state->addrs, &state->num_addrs,
1843 TALLOC_FREE(subreq);
1844 if (tevent_req_nterror(req, status)) {
1847 tevent_req_done(req);
1850 NTSTATUS name_resolve_bcast_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
1851 struct sockaddr_storage **addrs,
1854 struct name_resolve_bcast_state *state = tevent_req_data(
1855 req, struct name_resolve_bcast_state);
1858 if (tevent_req_is_nterror(req, &status)) {
1861 *addrs = talloc_move(mem_ctx, &state->addrs);
1862 *num_addrs = state->num_addrs;
1863 return NT_STATUS_OK;
1866 NTSTATUS name_resolve_bcast(const char *name,
1868 TALLOC_CTX *mem_ctx,
1869 struct sockaddr_storage **return_iplist,
1872 TALLOC_CTX *frame = talloc_stackframe();
1873 struct event_context *ev;
1874 struct tevent_req *req;
1875 NTSTATUS status = NT_STATUS_NO_MEMORY;
1877 ev = event_context_init(frame);
1881 req = name_resolve_bcast_send(frame, ev, name, name_type);
1885 if (!tevent_req_poll_ntstatus(req, ev, &status)) {
1888 status = name_resolve_bcast_recv(req, mem_ctx, return_iplist,
1895 struct query_wins_list_state {
1896 struct tevent_context *ev;
1899 struct in_addr *servers;
1900 uint32_t num_servers;
1901 struct sockaddr_storage server;
1904 struct sockaddr_storage *addrs;
1909 static void query_wins_list_done(struct tevent_req *subreq);
1912 * Query a list of (replicating) wins servers in sequence, call them
1913 * dead if they don't reply
1916 static struct tevent_req *query_wins_list_send(
1917 TALLOC_CTX *mem_ctx, struct tevent_context *ev,
1918 struct in_addr src_ip, const char *name, uint8_t name_type,
1919 struct in_addr *servers, int num_servers)
1921 struct tevent_req *req, *subreq;
1922 struct query_wins_list_state *state;
1924 req = tevent_req_create(mem_ctx, &state,
1925 struct query_wins_list_state);
1931 state->name_type = name_type;
1932 state->servers = servers;
1933 state->num_servers = num_servers;
1935 if (state->num_servers == 0) {
1936 tevent_req_nterror(req, NT_STATUS_NOT_FOUND);
1937 return tevent_req_post(req, ev);
1940 in_addr_to_sockaddr_storage(
1941 &state->server, state->servers[state->num_sent]);
1943 subreq = name_query_send(state, state->ev,
1944 state->name, state->name_type,
1945 false, true, &state->server);
1946 state->num_sent += 1;
1947 if (tevent_req_nomem(subreq, req)) {
1948 return tevent_req_post(req, ev);
1950 if (!tevent_req_set_endtime(subreq, state->ev,
1951 timeval_current_ofs(2, 0))) {
1952 tevent_req_nomem(NULL, req);
1953 return tevent_req_post(req, ev);
1955 tevent_req_set_callback(subreq, query_wins_list_done, req);
1959 static void query_wins_list_done(struct tevent_req *subreq)
1961 struct tevent_req *req = tevent_req_callback_data(
1962 subreq, struct tevent_req);
1963 struct query_wins_list_state *state = tevent_req_data(
1964 req, struct query_wins_list_state);
1967 status = name_query_recv(subreq, state,
1968 &state->addrs, &state->num_addrs,
1970 TALLOC_FREE(subreq);
1971 if (NT_STATUS_IS_OK(status)) {
1972 tevent_req_done(req);
1975 if (!NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
1976 tevent_req_nterror(req, status);
1979 wins_srv_died(state->servers[state->num_sent-1],
1980 my_socket_addr_v4());
1982 if (state->num_sent == state->num_servers) {
1983 tevent_req_nterror(req, NT_STATUS_NOT_FOUND);
1987 in_addr_to_sockaddr_storage(
1988 &state->server, state->servers[state->num_sent]);
1990 subreq = name_query_send(state, state->ev,
1991 state->name, state->name_type,
1992 false, true, &state->server);
1993 state->num_sent += 1;
1994 if (tevent_req_nomem(subreq, req)) {
1997 if (!tevent_req_set_endtime(subreq, state->ev,
1998 timeval_current_ofs(2, 0))) {
1999 tevent_req_nomem(NULL, req);
2002 tevent_req_set_callback(subreq, query_wins_list_done, req);
2005 static NTSTATUS query_wins_list_recv(struct tevent_req *req,
2006 TALLOC_CTX *mem_ctx,
2007 struct sockaddr_storage **addrs,
2011 struct query_wins_list_state *state = tevent_req_data(
2012 req, struct query_wins_list_state);
2015 if (tevent_req_is_nterror(req, &status)) {
2018 if (addrs != NULL) {
2019 *addrs = talloc_move(mem_ctx, &state->addrs);
2021 if (num_addrs != NULL) {
2022 *num_addrs = state->num_addrs;
2024 if (flags != NULL) {
2025 *flags = state->flags;
2027 return NT_STATUS_OK;
2030 struct resolve_wins_state {
2034 struct sockaddr_storage *addrs;
2039 static void resolve_wins_done(struct tevent_req *subreq);
2041 struct tevent_req *resolve_wins_send(TALLOC_CTX *mem_ctx,
2042 struct tevent_context *ev,
2046 struct tevent_req *req, *subreq;
2047 struct resolve_wins_state *state;
2048 char **wins_tags = NULL;
2049 struct sockaddr_storage src_ss;
2050 struct in_addr src_ip;
2051 int i, num_wins_tags;
2053 req = tevent_req_create(mem_ctx, &state,
2054 struct resolve_wins_state);
2059 if (wins_srv_count() < 1) {
2060 DEBUG(3,("resolve_wins: WINS server resolution selected "
2061 "and no WINS servers listed.\n"));
2062 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
2066 /* the address we will be sending from */
2067 if (!interpret_string_addr(&src_ss, lp_socket_address(),
2068 AI_NUMERICHOST|AI_PASSIVE)) {
2069 zero_sockaddr(&src_ss);
2072 if (src_ss.ss_family != AF_INET) {
2073 char addr[INET6_ADDRSTRLEN];
2074 print_sockaddr(addr, sizeof(addr), &src_ss);
2075 DEBUG(3,("resolve_wins: cannot receive WINS replies "
2076 "on IPv6 address %s\n",
2078 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
2082 src_ip = ((const struct sockaddr_in *)(void *)&src_ss)->sin_addr;
2084 wins_tags = wins_srv_tags();
2085 if (wins_tags == NULL) {
2086 tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
2091 while (wins_tags[num_wins_tags] != NULL) {
2095 for (i=0; i<num_wins_tags; i++) {
2096 int num_servers, num_alive;
2097 struct in_addr *servers, *alive;
2100 if (!wins_server_tag_ips(wins_tags[i], talloc_tos(),
2101 &servers, &num_servers)) {
2102 DEBUG(10, ("wins_server_tag_ips failed for tag %s\n",
2107 alive = talloc_array(state, struct in_addr, num_servers);
2108 if (tevent_req_nomem(alive, req)) {
2113 for (j=0; j<num_servers; j++) {
2114 struct in_addr wins_ip = servers[j];
2116 if (global_in_nmbd && ismyip_v4(wins_ip)) {
2117 /* yikes! we'll loop forever */
2120 /* skip any that have been unresponsive lately */
2121 if (wins_srv_is_dead(wins_ip, src_ip)) {
2124 DEBUG(3, ("resolve_wins: using WINS server %s "
2126 inet_ntoa(wins_ip), wins_tags[i]));
2127 alive[num_alive] = wins_ip;
2130 TALLOC_FREE(servers);
2132 if (num_alive == 0) {
2136 subreq = query_wins_list_send(
2137 state, ev, src_ip, name, name_type,
2139 if (tevent_req_nomem(subreq, req)) {
2142 tevent_req_set_callback(subreq, resolve_wins_done, req);
2143 state->num_sent += 1;
2146 if (state->num_sent == 0) {
2147 tevent_req_nterror(req, NT_STATUS_NOT_FOUND);
2151 wins_srv_tags_free(wins_tags);
2154 wins_srv_tags_free(wins_tags);
2155 return tevent_req_post(req, ev);
2158 static void resolve_wins_done(struct tevent_req *subreq)
2160 struct tevent_req *req = tevent_req_callback_data(
2161 subreq, struct tevent_req);
2162 struct resolve_wins_state *state = tevent_req_data(
2163 req, struct resolve_wins_state);
2166 status = query_wins_list_recv(subreq, state, &state->addrs,
2167 &state->num_addrs, &state->flags);
2168 if (NT_STATUS_IS_OK(status)) {
2169 tevent_req_done(req);
2173 state->num_received += 1;
2175 if (state->num_received < state->num_sent) {
2177 * Wait for the others
2181 tevent_req_nterror(req, status);
2184 NTSTATUS resolve_wins_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
2185 struct sockaddr_storage **addrs,
2186 int *num_addrs, uint8_t *flags)
2188 struct resolve_wins_state *state = tevent_req_data(
2189 req, struct resolve_wins_state);
2192 if (tevent_req_is_nterror(req, &status)) {
2195 if (addrs != NULL) {
2196 *addrs = talloc_move(mem_ctx, &state->addrs);
2198 if (num_addrs != NULL) {
2199 *num_addrs = state->num_addrs;
2201 if (flags != NULL) {
2202 *flags = state->flags;
2204 return NT_STATUS_OK;
2207 /********************************************************
2208 Resolve via "wins" method.
2209 *********************************************************/
2211 NTSTATUS resolve_wins(const char *name,
2213 TALLOC_CTX *mem_ctx,
2214 struct sockaddr_storage **return_iplist,
2217 struct tevent_context *ev;
2218 struct tevent_req *req;
2219 NTSTATUS status = NT_STATUS_NO_MEMORY;
2221 ev = tevent_context_init(talloc_tos());
2225 req = resolve_wins_send(ev, ev, name, name_type);
2229 if (!tevent_req_poll_ntstatus(req, ev, &status)) {
2232 status = resolve_wins_recv(req, mem_ctx, return_iplist, return_count,
2239 /********************************************************
2240 Resolve via "lmhosts" method.
2241 *********************************************************/
2243 static NTSTATUS resolve_lmhosts(const char *name, int name_type,
2244 struct ip_service **return_iplist,
2248 * "lmhosts" means parse the local lmhosts file.
2250 struct sockaddr_storage *ss_list;
2251 NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
2252 TALLOC_CTX *ctx = NULL;
2254 *return_iplist = NULL;
2257 DEBUG(3,("resolve_lmhosts: "
2258 "Attempting lmhosts lookup for name %s<0x%x>\n",
2261 ctx = talloc_init("resolve_lmhosts");
2263 return NT_STATUS_NO_MEMORY;
2266 status = resolve_lmhosts_file_as_sockaddr(get_dyn_LMHOSTSFILE(),
2271 if (NT_STATUS_IS_OK(status)) {
2272 if (convert_ss2service(return_iplist,
2276 return NT_STATUS_OK;
2279 return NT_STATUS_NO_MEMORY;
2287 /********************************************************
2288 Resolve via "hosts" method.
2289 *********************************************************/
2291 static NTSTATUS resolve_hosts(const char *name, int name_type,
2292 struct ip_service **return_iplist,
2296 * "host" means do a localhost, or dns lookup.
2298 struct addrinfo hints;
2299 struct addrinfo *ailist = NULL;
2300 struct addrinfo *res = NULL;
2303 const char *dns_hosts_file;
2305 if ( name_type != 0x20 && name_type != 0x0) {
2306 DEBUG(5, ("resolve_hosts: not appropriate "
2307 "for name type <0x%x>\n",
2309 return NT_STATUS_INVALID_PARAMETER;
2312 *return_iplist = NULL;
2315 DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x%x>\n",
2319 /* By default make sure it supports TCP. */
2320 hints.ai_socktype = SOCK_STREAM;
2321 hints.ai_flags = AI_ADDRCONFIG;
2323 #if !defined(HAVE_IPV6)
2324 /* Unless we have IPv6, we really only want IPv4 addresses back. */
2325 hints.ai_family = AF_INET;
2328 dns_hosts_file = lp_parm_const_string(-1, "resolv", "host file", NULL);
2329 if (dns_hosts_file) {
2330 struct sockaddr_storage *ss_list;
2332 TALLOC_CTX *ctx = talloc_stackframe();
2334 return NT_STATUS_NO_MEMORY;
2337 status = resolve_dns_hosts_file_as_sockaddr(dns_hosts_file, name, false,
2338 ctx, &ss_list, return_count);
2339 if (NT_STATUS_IS_OK(status)) {
2340 if (convert_ss2service(return_iplist,
2344 return NT_STATUS_OK;
2347 return NT_STATUS_NO_MEMORY;
2351 return NT_STATUS_UNSUCCESSFUL;
2354 ret = getaddrinfo(name,
2359 DEBUG(3,("resolve_hosts: getaddrinfo failed for name %s [%s]\n",
2361 gai_strerror(ret) ));
2364 for (res = ailist; res; res = res->ai_next) {
2365 struct sockaddr_storage ss;
2367 if (!res->ai_addr || res->ai_addrlen == 0) {
2372 memcpy(&ss, res->ai_addr, res->ai_addrlen);
2376 *return_iplist = SMB_REALLOC_ARRAY(*return_iplist,
2379 if (!*return_iplist) {
2380 DEBUG(3,("resolve_hosts: malloc fail !\n"));
2381 freeaddrinfo(ailist);
2382 return NT_STATUS_NO_MEMORY;
2384 (*return_iplist)[i].ss = ss;
2385 (*return_iplist)[i].port = PORT_NONE;
2389 freeaddrinfo(ailist);
2391 if (*return_count) {
2392 return NT_STATUS_OK;
2394 return NT_STATUS_UNSUCCESSFUL;
2397 /********************************************************
2398 Resolve via "ADS" method.
2399 *********************************************************/
2401 /* Special name type used to cause a _kerberos DNS lookup. */
2402 #define KDC_NAME_TYPE 0xDCDC
2404 static NTSTATUS resolve_ads(const char *name,
2406 const char *sitename,
2407 struct ip_service **return_iplist,
2413 struct dns_rr_srv *dcs = NULL;
2417 if ((name_type != 0x1c) && (name_type != KDC_NAME_TYPE) &&
2418 (name_type != 0x1b)) {
2419 return NT_STATUS_INVALID_PARAMETER;
2422 if ( (ctx = talloc_init("resolve_ads")) == NULL ) {
2423 DEBUG(0,("resolve_ads: talloc_init() failed!\n"));
2424 return NT_STATUS_NO_MEMORY;
2427 /* The DNS code needs fixing to find IPv6 addresses... JRA. */
2429 switch (name_type) {
2431 DEBUG(5,("resolve_ads: Attempting to resolve "
2432 "PDC for %s using DNS\n", name));
2433 status = ads_dns_query_pdc(ctx, name, &dcs, &numdcs);
2437 DEBUG(5,("resolve_ads: Attempting to resolve "
2438 "DCs for %s using DNS\n", name));
2439 status = ads_dns_query_dcs(ctx, name, sitename, &dcs,
2443 DEBUG(5,("resolve_ads: Attempting to resolve "
2444 "KDCs for %s using DNS\n", name));
2445 status = ads_dns_query_kdcs(ctx, name, sitename, &dcs,
2449 status = NT_STATUS_INVALID_PARAMETER;
2453 if ( !NT_STATUS_IS_OK( status ) ) {
2454 talloc_destroy(ctx);
2458 for (i=0;i<numdcs;i++) {
2459 numaddrs += MAX(dcs[i].num_ips,1);
2462 if ((*return_iplist = SMB_MALLOC_ARRAY(struct ip_service, numaddrs)) ==
2464 DEBUG(0,("resolve_ads: malloc failed for %d entries\n",
2466 talloc_destroy(ctx);
2467 return NT_STATUS_NO_MEMORY;
2470 /* now unroll the list of IP addresses */
2475 while ( i < numdcs && (*return_count<numaddrs) ) {
2476 struct ip_service *r = &(*return_iplist)[*return_count];
2478 r->port = dcs[i].port;
2480 /* If we don't have an IP list for a name, lookup it up */
2483 interpret_string_addr(&r->ss, dcs[i].hostname, 0);
2487 /* use the IP addresses from the SRV sresponse */
2489 if ( j >= dcs[i].num_ips ) {
2495 r->ss = dcs[i].ss_s[j];
2499 /* make sure it is a valid IP. I considered checking the
2500 * negative connection cache, but this is the wrong place
2501 * for it. Maybe only as a hack. After think about it, if
2502 * all of the IP addresses returned from DNS are dead, what
2503 * hope does a netbios name lookup have ? The standard reason
2504 * for falling back to netbios lookups is that our DNS server
2505 * doesn't know anything about the DC's -- jerry */
2507 if (!is_zero_addr(&r->ss)) {
2512 talloc_destroy(ctx);
2513 return NT_STATUS_OK;
2516 /*******************************************************************
2517 Internal interface to resolve a name into an IP address.
2518 Use this function if the string is either an IP address, DNS
2519 or host name or NetBIOS name. This uses the name switch in the
2520 smb.conf to determine the order of name resolution.
2522 Added support for ip addr/port to support ADS ldap servers.
2523 the only place we currently care about the port is in the
2524 resolve_hosts() when looking up DC's via SRV RR entries in DNS
2525 **********************************************************************/
2527 NTSTATUS internal_resolve_name(const char *name,
2529 const char *sitename,
2530 struct ip_service **return_iplist,
2532 const char *resolve_order)
2536 NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
2538 TALLOC_CTX *frame = NULL;
2540 *return_iplist = NULL;
2543 DEBUG(10, ("internal_resolve_name: looking up %s#%x (sitename %s)\n",
2544 name, name_type, sitename ? sitename : "(null)"));
2546 if (is_ipaddress(name)) {
2547 if ((*return_iplist = SMB_MALLOC_P(struct ip_service)) ==
2549 DEBUG(0,("internal_resolve_name: malloc fail !\n"));
2550 return NT_STATUS_NO_MEMORY;
2553 /* ignore the port here */
2554 (*return_iplist)->port = PORT_NONE;
2556 /* if it's in the form of an IP address then get the lib to interpret it */
2557 if (!interpret_string_addr(&(*return_iplist)->ss,
2558 name, AI_NUMERICHOST)) {
2559 DEBUG(1,("internal_resolve_name: interpret_string_addr "
2562 SAFE_FREE(*return_iplist);
2563 return NT_STATUS_INVALID_PARAMETER;
2566 return NT_STATUS_OK;
2569 /* Check name cache */
2571 if (namecache_fetch(name, name_type, return_iplist, return_count)) {
2572 /* This could be a negative response */
2573 if (*return_count > 0) {
2574 return NT_STATUS_OK;
2576 return NT_STATUS_UNSUCCESSFUL;
2580 /* set the name resolution order */
2582 if (strcmp( resolve_order, "NULL") == 0) {
2583 DEBUG(8,("internal_resolve_name: all lookups disabled\n"));
2584 return NT_STATUS_INVALID_PARAMETER;
2587 if (!resolve_order[0]) {
2590 ptr = resolve_order;
2593 /* iterate through the name resolution backends */
2595 frame = talloc_stackframe();
2596 while (next_token_talloc(frame, &ptr, &tok, LIST_SEP)) {
2597 if((strequal(tok, "host") || strequal(tok, "hosts"))) {
2598 status = resolve_hosts(name, name_type, return_iplist,
2600 if (NT_STATUS_IS_OK(status)) {
2603 } else if(strequal( tok, "kdc")) {
2604 /* deal with KDC_NAME_TYPE names here.
2605 * This will result in a SRV record lookup */
2606 status = resolve_ads(name, KDC_NAME_TYPE, sitename,
2607 return_iplist, return_count);
2608 if (NT_STATUS_IS_OK(status)) {
2609 /* Ensure we don't namecache
2610 * this with the KDC port. */
2611 name_type = KDC_NAME_TYPE;
2614 } else if(strequal( tok, "ads")) {
2615 /* deal with 0x1c and 0x1b names here.
2616 * This will result in a SRV record lookup */
2617 status = resolve_ads(name, name_type, sitename,
2618 return_iplist, return_count);
2619 if (NT_STATUS_IS_OK(status)) {
2622 } else if(strequal( tok, "lmhosts")) {
2623 status = resolve_lmhosts(name, name_type,
2624 return_iplist, return_count);
2625 if (NT_STATUS_IS_OK(status)) {
2628 } else if(strequal( tok, "wins")) {
2629 /* don't resolve 1D via WINS */
2630 struct sockaddr_storage *ss_list;
2631 if (name_type != 0x1D) {
2632 status = resolve_wins(name, name_type,
2636 if (NT_STATUS_IS_OK(status)) {
2637 if (!convert_ss2service(return_iplist,
2640 status = NT_STATUS_NO_MEMORY;
2645 } else if(strequal( tok, "bcast")) {
2646 struct sockaddr_storage *ss_list;
2647 status = name_resolve_bcast(
2648 name, name_type, talloc_tos(),
2649 &ss_list, return_count);
2650 if (NT_STATUS_IS_OK(status)) {
2651 if (!convert_ss2service(return_iplist,
2654 status = NT_STATUS_NO_MEMORY;
2659 DEBUG(0,("resolve_name: unknown name switch type %s\n",
2664 /* All of the resolve_* functions above have returned false. */
2667 SAFE_FREE(*return_iplist);
2670 return NT_STATUS_UNSUCCESSFUL;
2674 /* Remove duplicate entries. Some queries, notably #1c (domain
2675 controllers) return the PDC in iplist[0] and then all domain
2676 controllers including the PDC in iplist[1..n]. Iterating over
2677 the iplist when the PDC is down will cause two sets of timeouts. */
2679 if ( *return_count ) {
2680 *return_count = remove_duplicate_addrs2(*return_iplist,
2684 /* Save in name cache */
2685 if ( DEBUGLEVEL >= 100 ) {
2686 for (i = 0; i < *return_count && DEBUGLEVEL == 100; i++) {
2687 char addr[INET6_ADDRSTRLEN];
2688 print_sockaddr(addr, sizeof(addr),
2689 &(*return_iplist)[i].ss);
2690 DEBUG(100, ("Storing name %s of type %d (%s:%d)\n",
2694 (*return_iplist)[i].port));
2698 namecache_store(name, name_type, *return_count, *return_iplist);
2700 /* Display some debugging info */
2702 if ( DEBUGLEVEL >= 10 ) {
2703 DEBUG(10, ("internal_resolve_name: returning %d addresses: ",
2706 for (i = 0; i < *return_count; i++) {
2707 char addr[INET6_ADDRSTRLEN];
2708 print_sockaddr(addr, sizeof(addr),
2709 &(*return_iplist)[i].ss);
2710 DEBUGADD(10, ("%s:%d ",
2712 (*return_iplist)[i].port));
2721 /********************************************************
2722 Internal interface to resolve a name into one IP address.
2723 Use this function if the string is either an IP address, DNS
2724 or host name or NetBIOS name. This uses the name switch in the
2725 smb.conf to determine the order of name resolution.
2726 *********************************************************/
2728 bool resolve_name(const char *name,
2729 struct sockaddr_storage *return_ss,
2733 struct ip_service *ss_list = NULL;
2734 char *sitename = NULL;
2737 if (is_ipaddress(name)) {
2738 return interpret_string_addr(return_ss, name, AI_NUMERICHOST);
2741 sitename = sitename_fetch(lp_realm()); /* wild guess */
2743 if (NT_STATUS_IS_OK(internal_resolve_name(name, name_type, sitename,
2745 lp_name_resolve_order()))) {
2749 for (i=0; i<count; i++) {
2750 if (!is_zero_addr(&ss_list[i].ss) &&
2751 !is_broadcast_addr((struct sockaddr *)(void *)&ss_list[i].ss) &&
2752 (ss_list[i].ss.ss_family == AF_INET)) {
2753 *return_ss = ss_list[i].ss;
2755 SAFE_FREE(sitename);
2761 /* only return valid addresses for TCP connections */
2762 for (i=0; i<count; i++) {
2763 if (!is_zero_addr(&ss_list[i].ss) &&
2764 !is_broadcast_addr((struct sockaddr *)(void *)&ss_list[i].ss)) {
2765 *return_ss = ss_list[i].ss;
2767 SAFE_FREE(sitename);
2774 SAFE_FREE(sitename);
2778 /********************************************************
2779 Internal interface to resolve a name into a list of IP addresses.
2780 Use this function if the string is either an IP address, DNS
2781 or host name or NetBIOS name. This uses the name switch in the
2782 smb.conf to determine the order of name resolution.
2783 *********************************************************/
2785 NTSTATUS resolve_name_list(TALLOC_CTX *ctx,
2788 struct sockaddr_storage **return_ss_arr,
2789 unsigned int *p_num_entries)
2791 struct ip_service *ss_list = NULL;
2792 char *sitename = NULL;
2795 unsigned int num_entries;
2799 *return_ss_arr = NULL;
2801 if (is_ipaddress(name)) {
2802 *return_ss_arr = talloc(ctx, struct sockaddr_storage);
2803 if (!*return_ss_arr) {
2804 return NT_STATUS_NO_MEMORY;
2806 if (!interpret_string_addr(*return_ss_arr, name, AI_NUMERICHOST)) {
2807 TALLOC_FREE(*return_ss_arr);
2808 return NT_STATUS_BAD_NETWORK_NAME;
2811 return NT_STATUS_OK;
2814 sitename = sitename_fetch(lp_realm()); /* wild guess */
2816 status = internal_resolve_name(name, name_type, sitename,
2818 lp_name_resolve_order());
2819 SAFE_FREE(sitename);
2821 if (!NT_STATUS_IS_OK(status)) {
2825 /* only return valid addresses for TCP connections */
2826 for (i=0, num_entries = 0; i<count; i++) {
2827 if (!is_zero_addr(&ss_list[i].ss) &&
2828 !is_broadcast_addr((struct sockaddr *)(void *)&ss_list[i].ss)) {
2832 if (num_entries == 0) {
2834 return NT_STATUS_BAD_NETWORK_NAME;
2837 *return_ss_arr = talloc_array(ctx,
2838 struct sockaddr_storage,
2840 if (!(*return_ss_arr)) {
2842 return NT_STATUS_NO_MEMORY;
2845 for (i=0, num_entries = 0; i<count; i++) {
2846 if (!is_zero_addr(&ss_list[i].ss) &&
2847 !is_broadcast_addr((struct sockaddr *)(void *)&ss_list[i].ss)) {
2848 (*return_ss_arr)[num_entries++] = ss_list[i].ss;
2852 status = NT_STATUS_OK;
2853 *p_num_entries = num_entries;
2856 return NT_STATUS_OK;
2859 /********************************************************
2860 Find the IP address of the master browser or DMB for a workgroup.
2861 *********************************************************/
2863 bool find_master_ip(const char *group, struct sockaddr_storage *master_ss)
2865 struct ip_service *ip_list = NULL;
2869 if (lp_disable_netbios()) {
2870 DEBUG(5,("find_master_ip(%s): netbios is disabled\n", group));
2874 status = internal_resolve_name(group, 0x1D, NULL, &ip_list, &count,
2875 lp_name_resolve_order());
2876 if (NT_STATUS_IS_OK(status)) {
2877 *master_ss = ip_list[0].ss;
2882 status = internal_resolve_name(group, 0x1B, NULL, &ip_list, &count,
2883 lp_name_resolve_order());
2884 if (NT_STATUS_IS_OK(status)) {
2885 *master_ss = ip_list[0].ss;
2894 /********************************************************
2895 Get the IP address list of the primary domain controller
2897 *********************************************************/
2899 bool get_pdc_ip(const char *domain, struct sockaddr_storage *pss)
2901 struct ip_service *ip_list = NULL;
2903 NTSTATUS status = NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND;
2905 /* Look up #1B name */
2907 if (lp_security() == SEC_ADS) {
2908 status = internal_resolve_name(domain, 0x1b, NULL, &ip_list,
2912 if (!NT_STATUS_IS_OK(status) || count == 0) {
2913 status = internal_resolve_name(domain, 0x1b, NULL, &ip_list,
2915 lp_name_resolve_order());
2916 if (!NT_STATUS_IS_OK(status)) {
2921 /* if we get more than 1 IP back we have to assume it is a
2922 multi-homed PDC and not a mess up */
2925 DEBUG(6,("get_pdc_ip: PDC has %d IP addresses!\n", count));
2926 sort_service_list(ip_list, count);
2929 *pss = ip_list[0].ss;
2934 /* Private enum type for lookups. */
2936 enum dc_lookup_type { DC_NORMAL_LOOKUP, DC_ADS_ONLY, DC_KDC_ONLY };
2938 /********************************************************
2939 Get the IP address list of the domain controllers for
2941 *********************************************************/
2943 static NTSTATUS get_dc_list(const char *domain,
2944 const char *sitename,
2945 struct ip_service **ip_list,
2947 enum dc_lookup_type lookup_type,
2950 char *resolve_order = NULL;
2951 char *saf_servername = NULL;
2952 char *pserver = NULL;
2954 char *port_str = NULL;
2957 int num_addresses = 0;
2958 int local_count, i, j;
2959 struct ip_service *return_iplist = NULL;
2960 struct ip_service *auto_ip_list = NULL;
2961 bool done_auto_lookup = false;
2964 TALLOC_CTX *ctx = talloc_init("get_dc_list");
2970 return NT_STATUS_NO_MEMORY;
2975 /* if we are restricted to solely using DNS for looking
2976 up a domain controller, make sure that host lookups
2977 are enabled for the 'name resolve order'. If host lookups
2978 are disabled and ads_only is True, then set the string to
2981 resolve_order = talloc_strdup(ctx, lp_name_resolve_order());
2982 if (!resolve_order) {
2983 status = NT_STATUS_NO_MEMORY;
2986 strlower_m(resolve_order);
2987 if (lookup_type == DC_ADS_ONLY) {
2988 if (strstr( resolve_order, "host")) {
2989 resolve_order = talloc_strdup(ctx, "ads");
2991 /* DNS SRV lookups used by the ads resolver
2992 are already sorted by priority and weight */
2995 resolve_order = talloc_strdup(ctx, "NULL");
2997 } else if (lookup_type == DC_KDC_ONLY) {
2998 /* DNS SRV lookups used by the ads/kdc resolver
2999 are already sorted by priority and weight */
3001 resolve_order = talloc_strdup(ctx, "kdc");
3003 if (!resolve_order) {
3004 status = NT_STATUS_NO_MEMORY;
3008 /* fetch the server we have affinity for. Add the
3009 'password server' list to a search for our domain controllers */
3011 saf_servername = saf_fetch( domain);
3013 if (strequal(domain, lp_workgroup()) || strequal(domain, lp_realm())) {
3014 pserver = talloc_asprintf(ctx, "%s, %s",
3015 saf_servername ? saf_servername : "",
3016 lp_passwordserver());
3018 pserver = talloc_asprintf(ctx, "%s, *",
3019 saf_servername ? saf_servername : "");
3022 SAFE_FREE(saf_servername);
3024 status = NT_STATUS_NO_MEMORY;
3028 /* if we are starting from scratch, just lookup DOMAIN<0x1c> */
3031 DEBUG(10,("get_dc_list: no preferred domain controllers.\n"));
3032 status = internal_resolve_name(domain, 0x1C, sitename, ip_list,
3033 count, resolve_order);
3037 DEBUG(3,("get_dc_list: preferred server list: \"%s\"\n", pserver ));
3040 * if '*' appears in the "password server" list then add
3041 * an auto lookup to the list of manually configured
3042 * DC's. If any DC is listed by name, then the list should be
3043 * considered to be ordered
3047 while (next_token_talloc(ctx, &p, &name, LIST_SEP)) {
3048 if (!done_auto_lookup && strequal(name, "*")) {
3049 status = internal_resolve_name(domain, 0x1C, sitename,
3053 if (NT_STATUS_IS_OK(status)) {
3054 num_addresses += auto_count;
3056 done_auto_lookup = true;
3057 DEBUG(8,("Adding %d DC's from auto lookup\n",
3064 /* if we have no addresses and haven't done the auto lookup, then
3065 just return the list of DC's. Or maybe we just failed. */
3067 if ((num_addresses == 0)) {
3068 if (done_auto_lookup) {
3069 DEBUG(4,("get_dc_list: no servers found\n"));
3070 status = NT_STATUS_NO_LOGON_SERVERS;
3073 status = internal_resolve_name(domain, 0x1C, sitename, ip_list,
3074 count, resolve_order);
3078 if ((return_iplist = SMB_MALLOC_ARRAY(struct ip_service,
3079 num_addresses)) == NULL) {
3080 DEBUG(3,("get_dc_list: malloc fail !\n"));
3081 status = NT_STATUS_NO_MEMORY;
3088 /* fill in the return list now with real IP's */
3090 while ((local_count<num_addresses) &&
3091 next_token_talloc(ctx, &p, &name, LIST_SEP)) {
3092 struct sockaddr_storage name_ss;
3094 /* copy any addersses from the auto lookup */
3096 if (strequal(name, "*")) {
3097 for (j=0; j<auto_count; j++) {
3098 char addr[INET6_ADDRSTRLEN];
3099 print_sockaddr(addr,
3101 &auto_ip_list[j].ss);
3102 /* Check for and don't copy any
3103 * known bad DC IP's. */
3104 if(!NT_STATUS_IS_OK(check_negative_conn_cache(
3107 DEBUG(5,("get_dc_list: "
3108 "negative entry %s removed "
3113 return_iplist[local_count].ss =
3115 return_iplist[local_count].port =
3116 auto_ip_list[j].port;
3122 /* added support for address:port syntax for ads
3123 * (not that I think anyone will ever run the LDAP
3124 * server in an AD domain on something other than
3127 port = (lp_security() == SEC_ADS) ? LDAP_PORT : PORT_NONE;
3128 if ((port_str=strchr(name, ':')) != NULL) {
3131 port = atoi(port_str);
3134 /* explicit lookup; resolve_name() will
3135 * handle names & IP addresses */
3136 if (resolve_name( name, &name_ss, 0x20, true )) {
3137 char addr[INET6_ADDRSTRLEN];
3138 print_sockaddr(addr,
3142 /* Check for and don't copy any known bad DC IP's. */
3143 if( !NT_STATUS_IS_OK(check_negative_conn_cache(domain,
3145 DEBUG(5,("get_dc_list: negative entry %s "
3146 "removed from DC list\n",
3151 return_iplist[local_count].ss = name_ss;
3152 return_iplist[local_count].port = port;
3158 /* need to remove duplicates in the list if we have any
3159 explicit password servers */
3162 local_count = remove_duplicate_addrs2(return_iplist,
3166 /* For DC's we always prioritize IPv4 due to W2K3 not
3167 * supporting LDAP, KRB5 or CLDAP over IPv6. */
3169 if (local_count && return_iplist) {
3170 prioritize_ipv4_list(return_iplist, local_count);
3173 if ( DEBUGLEVEL >= 4 ) {
3174 DEBUG(4,("get_dc_list: returning %d ip addresses "
3175 "in an %sordered list\n",
3177 *ordered ? "":"un"));
3178 DEBUG(4,("get_dc_list: "));
3179 for ( i=0; i<local_count; i++ ) {
3180 char addr[INET6_ADDRSTRLEN];
3181 print_sockaddr(addr,
3183 &return_iplist[i].ss);
3184 DEBUGADD(4,("%s:%d ", addr, return_iplist[i].port ));
3189 *ip_list = return_iplist;
3190 *count = local_count;
3192 status = ( *count != 0 ? NT_STATUS_OK : NT_STATUS_NO_LOGON_SERVERS );
3196 if (!NT_STATUS_IS_OK(status)) {
3197 SAFE_FREE(return_iplist);
3202 SAFE_FREE(auto_ip_list);
3207 /*********************************************************************
3208 Small wrapper function to get the DC list and sort it if neccessary.
3209 *********************************************************************/
3211 NTSTATUS get_sorted_dc_list( const char *domain,
3212 const char *sitename,
3213 struct ip_service **ip_list,
3217 bool ordered = false;
3219 enum dc_lookup_type lookup_type = DC_NORMAL_LOOKUP;
3224 DEBUG(8,("get_sorted_dc_list: attempting lookup "
3225 "for name %s (sitename %s) using [%s]\n",
3227 sitename ? sitename : "NULL",
3228 (ads_only ? "ads" : lp_name_resolve_order())));
3231 lookup_type = DC_ADS_ONLY;
3234 status = get_dc_list(domain, sitename, ip_list,
3235 count, lookup_type, &ordered);
3236 if (NT_STATUS_EQUAL(status, NT_STATUS_NO_LOGON_SERVERS)
3238 DEBUG(3,("get_sorted_dc_list: no server for name %s available"
3239 " in site %s, fallback to all servers\n",
3241 status = get_dc_list(domain, NULL, ip_list,
3242 count, lookup_type, &ordered);
3245 if (!NT_STATUS_IS_OK(status)) {
3246 SAFE_FREE(*ip_list);
3251 /* only sort if we don't already have an ordered list */
3253 sort_service_list(*ip_list, *count);
3256 return NT_STATUS_OK;
3259 /*********************************************************************
3260 Get the KDC list - re-use all the logic in get_dc_list.
3261 *********************************************************************/
3263 NTSTATUS get_kdc_list( const char *realm,
3264 const char *sitename,
3265 struct ip_service **ip_list,
3274 status = get_dc_list(realm, sitename, ip_list,
3275 count, DC_KDC_ONLY, &ordered);
3277 if (!NT_STATUS_IS_OK(status)) {
3278 SAFE_FREE(*ip_list);
3283 /* only sort if we don't already have an ordered list */
3285 sort_service_list(*ip_list, *count);
3288 return NT_STATUS_OK;