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 "../lib/addns/dnsquery.h"
25 #include "../libcli/netlogon/netlogon.h"
26 #include "lib/async_req/async_sock.h"
27 #include "lib/tsocket/tsocket.h"
28 #include "libsmb/nmblib.h"
29 #include "libsmb/unexpected.h"
30 #include "../libcli/nbt/libnbt.h"
31 #include "libads/kerberos_proto.h"
33 /* nmbd.c sets this to True. */
34 bool global_in_nmbd
= False
;
36 /****************************
37 * SERVER AFFINITY ROUTINES *
38 ****************************/
40 /* Server affinity is the concept of preferring the last domain
41 controller with whom you had a successful conversation */
43 /****************************************************************************
44 ****************************************************************************/
45 #define SAFKEY_FMT "SAF/DOMAIN/%s"
47 #define SAFJOINKEY_FMT "SAFJOIN/DOMAIN/%s"
48 #define SAFJOIN_TTL 3600
50 static char *saf_key(TALLOC_CTX
*mem_ctx
, const char *domain
)
52 return talloc_asprintf_strupper_m(mem_ctx
, SAFKEY_FMT
, domain
);
55 static char *saf_join_key(TALLOC_CTX
*mem_ctx
, const char *domain
)
57 return talloc_asprintf_strupper_m(mem_ctx
, SAFJOINKEY_FMT
, domain
);
60 /****************************************************************************
61 ****************************************************************************/
63 bool saf_store( const char *domain
, const char *servername
)
69 if ( !domain
|| !servername
) {
70 DEBUG(2,("saf_store: "
71 "Refusing to store empty domain or servername!\n"));
75 if ( (strlen(domain
) == 0) || (strlen(servername
) == 0) ) {
76 DEBUG(0,("saf_store: "
77 "refusing to store 0 length domain or servername!\n"));
81 key
= saf_key(talloc_tos(), domain
);
83 DEBUG(1, ("saf_key() failed\n"));
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(talloc_tos(), domain
);
116 DEBUG(1, ("saf_join_key() failed\n"));
119 expire
= time( NULL
) + lp_parm_int(-1, "saf","join ttl", SAFJOIN_TTL
);
121 DEBUG(10,("saf_join_store: domain = [%s], server = [%s], expire = [%u]\n",
122 domain
, servername
, (unsigned int)expire
));
124 ret
= gencache_set( key
, servername
, expire
);
131 bool saf_delete( const char *domain
)
137 DEBUG(2,("saf_delete: Refusing to delete empty domain\n"));
141 key
= saf_join_key(talloc_tos(), domain
);
143 DEBUG(1, ("saf_join_key() failed\n"));
146 ret
= gencache_del(key
);
150 DEBUG(10,("saf_delete[join]: domain = [%s]\n", domain
));
153 key
= saf_key(talloc_tos(), domain
);
155 DEBUG(1, ("saf_key() failed\n"));
158 ret
= gencache_del(key
);
162 DEBUG(10,("saf_delete: domain = [%s]\n", domain
));
168 /****************************************************************************
169 ****************************************************************************/
171 char *saf_fetch(TALLOC_CTX
*mem_ctx
, const char *domain
)
178 if ( !domain
|| strlen(domain
) == 0) {
179 DEBUG(2,("saf_fetch: Empty domain name!\n"));
183 key
= saf_join_key(talloc_tos(), domain
);
185 DEBUG(1, ("saf_join_key() failed\n"));
189 ret
= gencache_get( key
, mem_ctx
, &server
, &timeout
);
194 DEBUG(5,("saf_fetch[join]: Returning \"%s\" for \"%s\" domain\n",
199 key
= saf_key(talloc_tos(), domain
);
201 DEBUG(1, ("saf_key() failed\n"));
205 ret
= gencache_get( key
, mem_ctx
, &server
, &timeout
);
210 DEBUG(5,("saf_fetch: failed to find server for \"%s\" domain\n",
213 DEBUG(5,("saf_fetch: Returning \"%s\" for \"%s\" domain\n",
220 static void set_socket_addr_v4(struct sockaddr_storage
*addr
)
222 if (!interpret_string_addr(addr
, lp_nbt_client_socket_address(),
223 AI_NUMERICHOST
|AI_PASSIVE
)) {
226 if (addr
->ss_family
!= AF_INET
) {
231 static struct in_addr
my_socket_addr_v4(void)
233 struct sockaddr_storage my_addr
;
234 struct sockaddr_in
*in_addr
= (struct sockaddr_in
*)((char *)&my_addr
);
236 set_socket_addr_v4(&my_addr
);
237 return in_addr
->sin_addr
;
240 /****************************************************************************
241 Generate a random trn_id.
242 ****************************************************************************/
244 static int generate_trn_id(void)
248 generate_random_buffer((uint8_t *)&id
, sizeof(id
));
250 return id
% (unsigned)0x7FFF;
253 /****************************************************************************
254 Parse a node status response into an array of structures.
255 ****************************************************************************/
257 static struct node_status
*parse_node_status(TALLOC_CTX
*mem_ctx
, char *p
,
259 struct node_status_extra
*extra
)
261 struct node_status
*ret
;
264 *num_names
= CVAL(p
,0);
269 ret
= talloc_array(mem_ctx
, struct node_status
,*num_names
);
274 for (i
=0;i
< *num_names
;i
++) {
275 StrnCpy(ret
[i
].name
,p
,15);
276 trim_char(ret
[i
].name
,'\0',' ');
277 ret
[i
].type
= CVAL(p
,15);
278 ret
[i
].flags
= p
[16];
280 DEBUG(10, ("%s#%02x: flags = 0x%02x\n", ret
[i
].name
,
281 ret
[i
].type
, ret
[i
].flags
));
284 * Also, pick up the MAC address ...
287 memcpy(&extra
->mac_addr
, p
, 6); /* Fill in the mac addr */
292 struct sock_packet_read_state
{
293 struct tevent_context
*ev
;
294 enum packet_type type
;
297 struct nb_packet_reader
*reader
;
298 struct tevent_req
*reader_req
;
300 struct tdgram_context
*sock
;
301 struct tevent_req
*socket_req
;
303 struct tsocket_address
*addr
;
305 bool (*validator
)(struct packet_struct
*p
,
309 struct packet_struct
*packet
;
312 static void sock_packet_read_got_packet(struct tevent_req
*subreq
);
313 static void sock_packet_read_got_socket(struct tevent_req
*subreq
);
315 static struct tevent_req
*sock_packet_read_send(
317 struct tevent_context
*ev
,
318 struct tdgram_context
*sock
,
319 struct nb_packet_reader
*reader
,
320 enum packet_type type
,
322 bool (*validator
)(struct packet_struct
*p
, void *private_data
),
325 struct tevent_req
*req
;
326 struct sock_packet_read_state
*state
;
328 req
= tevent_req_create(mem_ctx
, &state
,
329 struct sock_packet_read_state
);
334 state
->reader
= reader
;
337 state
->trn_id
= trn_id
;
338 state
->validator
= validator
;
339 state
->private_data
= private_data
;
341 if (reader
!= NULL
) {
342 state
->reader_req
= nb_packet_read_send(state
, ev
, reader
);
343 if (tevent_req_nomem(state
->reader_req
, req
)) {
344 return tevent_req_post(req
, ev
);
346 tevent_req_set_callback(
347 state
->reader_req
, sock_packet_read_got_packet
, req
);
350 state
->socket_req
= tdgram_recvfrom_send(state
, ev
, state
->sock
);
351 if (tevent_req_nomem(state
->socket_req
, req
)) {
352 return tevent_req_post(req
, ev
);
354 tevent_req_set_callback(state
->socket_req
, sock_packet_read_got_socket
,
360 static void sock_packet_read_got_packet(struct tevent_req
*subreq
)
362 struct tevent_req
*req
= tevent_req_callback_data(
363 subreq
, struct tevent_req
);
364 struct sock_packet_read_state
*state
= tevent_req_data(
365 req
, struct sock_packet_read_state
);
368 status
= nb_packet_read_recv(subreq
, state
, &state
->packet
);
370 TALLOC_FREE(state
->reader_req
);
372 if (!NT_STATUS_IS_OK(status
)) {
373 if (state
->socket_req
!= NULL
) {
375 * Still waiting for socket
380 * Both socket and packet reader failed
382 tevent_req_nterror(req
, status
);
386 if ((state
->validator
!= NULL
) &&
387 !state
->validator(state
->packet
, state
->private_data
)) {
388 DEBUG(10, ("validator failed\n"));
390 TALLOC_FREE(state
->packet
);
392 state
->reader_req
= nb_packet_read_send(state
, state
->ev
,
394 if (tevent_req_nomem(state
->reader_req
, req
)) {
397 tevent_req_set_callback(
398 state
->reader_req
, sock_packet_read_got_packet
, req
);
402 TALLOC_FREE(state
->socket_req
);
403 tevent_req_done(req
);
406 static void sock_packet_read_got_socket(struct tevent_req
*subreq
)
408 struct tevent_req
*req
= tevent_req_callback_data(
409 subreq
, struct tevent_req
);
410 struct sock_packet_read_state
*state
= tevent_req_data(
411 req
, struct sock_packet_read_state
);
414 struct sockaddr_in sin
;
421 received
= tdgram_recvfrom_recv(subreq
, &err
, state
,
422 &state
->buf
, &state
->addr
);
424 TALLOC_FREE(state
->socket_req
);
426 if (received
== -1) {
427 if (state
->reader_req
!= NULL
) {
429 * Still waiting for reader
434 * Both socket and reader failed
436 tevent_req_nterror(req
, map_nt_error_from_unix(err
));
439 ok
= tsocket_address_is_inet(state
->addr
, "ipv4");
443 ret
= tsocket_address_bsd_sockaddr(state
->addr
,
447 tevent_req_nterror(req
, map_nt_error_from_unix(errno
));
451 state
->packet
= parse_packet_talloc(
452 state
, (char *)state
->buf
, received
, state
->type
,
453 addr
.sin
.sin_addr
, addr
.sin
.sin_port
);
454 if (state
->packet
== NULL
) {
455 DEBUG(10, ("parse_packet failed\n"));
458 if ((state
->trn_id
!= -1) &&
459 (state
->trn_id
!= packet_trn_id(state
->packet
))) {
460 DEBUG(10, ("Expected transaction id %d, got %d\n",
461 state
->trn_id
, packet_trn_id(state
->packet
)));
465 if ((state
->validator
!= NULL
) &&
466 !state
->validator(state
->packet
, state
->private_data
)) {
467 DEBUG(10, ("validator failed\n"));
471 tevent_req_done(req
);
475 TALLOC_FREE(state
->packet
);
476 TALLOC_FREE(state
->buf
);
477 TALLOC_FREE(state
->addr
);
479 state
->socket_req
= tdgram_recvfrom_send(state
, state
->ev
, state
->sock
);
480 if (tevent_req_nomem(state
->socket_req
, req
)) {
483 tevent_req_set_callback(state
->socket_req
, sock_packet_read_got_socket
,
487 static NTSTATUS
sock_packet_read_recv(struct tevent_req
*req
,
489 struct packet_struct
**ppacket
)
491 struct sock_packet_read_state
*state
= tevent_req_data(
492 req
, struct sock_packet_read_state
);
495 if (tevent_req_is_nterror(req
, &status
)) {
498 *ppacket
= talloc_move(mem_ctx
, &state
->packet
);
502 struct nb_trans_state
{
503 struct tevent_context
*ev
;
504 struct tdgram_context
*sock
;
505 struct nb_packet_reader
*reader
;
507 struct tsocket_address
*src_addr
;
508 struct tsocket_address
*dst_addr
;
511 enum packet_type type
;
514 bool (*validator
)(struct packet_struct
*p
,
518 struct packet_struct
*packet
;
521 static void nb_trans_got_reader(struct tevent_req
*subreq
);
522 static void nb_trans_done(struct tevent_req
*subreq
);
523 static void nb_trans_sent(struct tevent_req
*subreq
);
524 static void nb_trans_send_next(struct tevent_req
*subreq
);
526 static struct tevent_req
*nb_trans_send(
528 struct tevent_context
*ev
,
529 const struct sockaddr_storage
*_my_addr
,
530 const struct sockaddr_storage
*_dst_addr
,
532 uint8_t *buf
, size_t buflen
,
533 enum packet_type type
, int trn_id
,
534 bool (*validator
)(struct packet_struct
*p
,
538 const struct sockaddr
*my_addr
=
539 discard_const_p(const struct sockaddr
, _my_addr
);
540 size_t my_addr_len
= sizeof(*_my_addr
);
541 const struct sockaddr
*dst_addr
=
542 discard_const_p(const struct sockaddr
, _dst_addr
);
543 size_t dst_addr_len
= sizeof(*_dst_addr
);
544 struct tevent_req
*req
, *subreq
;
545 struct nb_trans_state
*state
;
548 req
= tevent_req_create(mem_ctx
, &state
, struct nb_trans_state
);
554 state
->buflen
= buflen
;
556 state
->trn_id
= trn_id
;
557 state
->validator
= validator
;
558 state
->private_data
= private_data
;
560 ret
= tsocket_address_bsd_from_sockaddr(state
,
561 my_addr
, my_addr_len
,
564 tevent_req_nterror(req
, map_nt_error_from_unix(errno
));
565 return tevent_req_post(req
, ev
);
568 ret
= tsocket_address_bsd_from_sockaddr(state
,
569 dst_addr
, dst_addr_len
,
572 tevent_req_nterror(req
, map_nt_error_from_unix(errno
));
573 return tevent_req_post(req
, ev
);
576 ret
= tdgram_inet_udp_broadcast_socket(state
->src_addr
, state
,
579 tevent_req_nterror(req
, map_nt_error_from_unix(errno
));
580 return tevent_req_post(req
, ev
);
583 subreq
= nb_packet_reader_send(state
, ev
, type
, state
->trn_id
, NULL
);
584 if (tevent_req_nomem(subreq
, req
)) {
585 return tevent_req_post(req
, ev
);
587 tevent_req_set_callback(subreq
, nb_trans_got_reader
, req
);
591 static void nb_trans_got_reader(struct tevent_req
*subreq
)
593 struct tevent_req
*req
= tevent_req_callback_data(
594 subreq
, struct tevent_req
);
595 struct nb_trans_state
*state
= tevent_req_data(
596 req
, struct nb_trans_state
);
599 status
= nb_packet_reader_recv(subreq
, state
, &state
->reader
);
602 if (!NT_STATUS_IS_OK(status
)) {
603 DEBUG(10, ("nmbd not around\n"));
604 state
->reader
= NULL
;
607 subreq
= sock_packet_read_send(
608 state
, state
->ev
, state
->sock
,
609 state
->reader
, state
->type
, state
->trn_id
,
610 state
->validator
, state
->private_data
);
611 if (tevent_req_nomem(subreq
, req
)) {
614 tevent_req_set_callback(subreq
, nb_trans_done
, req
);
616 subreq
= tdgram_sendto_send(state
, state
->ev
,
618 state
->buf
, state
->buflen
,
620 if (tevent_req_nomem(subreq
, req
)) {
623 tevent_req_set_callback(subreq
, nb_trans_sent
, req
);
626 static void nb_trans_sent(struct tevent_req
*subreq
)
628 struct tevent_req
*req
= tevent_req_callback_data(
629 subreq
, struct tevent_req
);
630 struct nb_trans_state
*state
= tevent_req_data(
631 req
, struct nb_trans_state
);
635 sent
= tdgram_sendto_recv(subreq
, &err
);
638 DEBUG(10, ("sendto failed: %s\n", strerror(err
)));
639 tevent_req_nterror(req
, map_nt_error_from_unix(err
));
642 subreq
= tevent_wakeup_send(state
, state
->ev
,
643 timeval_current_ofs(1, 0));
644 if (tevent_req_nomem(subreq
, req
)) {
647 tevent_req_set_callback(subreq
, nb_trans_send_next
, req
);
650 static void nb_trans_send_next(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 ret
= tevent_wakeup_recv(subreq
);
661 tevent_req_nterror(req
, NT_STATUS_INTERNAL_ERROR
);
664 subreq
= tdgram_sendto_send(state
, state
->ev
,
666 state
->buf
, state
->buflen
,
668 if (tevent_req_nomem(subreq
, req
)) {
671 tevent_req_set_callback(subreq
, nb_trans_sent
, req
);
674 static void nb_trans_done(struct tevent_req
*subreq
)
676 struct tevent_req
*req
= tevent_req_callback_data(
677 subreq
, struct tevent_req
);
678 struct nb_trans_state
*state
= tevent_req_data(
679 req
, struct nb_trans_state
);
682 status
= sock_packet_read_recv(subreq
, state
, &state
->packet
);
684 if (tevent_req_nterror(req
, status
)) {
687 tevent_req_done(req
);
690 static NTSTATUS
nb_trans_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
691 struct packet_struct
**ppacket
)
693 struct nb_trans_state
*state
= tevent_req_data(
694 req
, struct nb_trans_state
);
697 if (tevent_req_is_nterror(req
, &status
)) {
700 *ppacket
= talloc_move(mem_ctx
, &state
->packet
);
704 /****************************************************************************
705 Do a NBT node status query on an open socket and return an array of
706 structures holding the returned names or NULL if the query failed.
707 **************************************************************************/
709 struct node_status_query_state
{
710 struct sockaddr_storage my_addr
;
711 struct sockaddr_storage addr
;
714 struct packet_struct
*packet
;
717 static bool node_status_query_validator(struct packet_struct
*p
,
719 static void node_status_query_done(struct tevent_req
*subreq
);
721 struct tevent_req
*node_status_query_send(TALLOC_CTX
*mem_ctx
,
722 struct tevent_context
*ev
,
723 struct nmb_name
*name
,
724 const struct sockaddr_storage
*addr
)
726 struct tevent_req
*req
, *subreq
;
727 struct node_status_query_state
*state
;
728 struct packet_struct p
;
729 struct nmb_packet
*nmb
= &p
.packet
.nmb
;
730 struct sockaddr_in
*in_addr
;
732 req
= tevent_req_create(mem_ctx
, &state
,
733 struct node_status_query_state
);
738 if (addr
->ss_family
!= AF_INET
) {
739 /* Can't do node status to IPv6 */
740 tevent_req_nterror(req
, NT_STATUS_INVALID_ADDRESS
);
741 return tevent_req_post(req
, ev
);
745 in_addr
= (struct sockaddr_in
*)(void *)&state
->addr
;
746 in_addr
->sin_port
= htons(NMB_PORT
);
748 set_socket_addr_v4(&state
->my_addr
);
751 nmb
->header
.name_trn_id
= generate_trn_id();
752 nmb
->header
.opcode
= 0;
753 nmb
->header
.response
= false;
754 nmb
->header
.nm_flags
.bcast
= false;
755 nmb
->header
.nm_flags
.recursion_available
= false;
756 nmb
->header
.nm_flags
.recursion_desired
= false;
757 nmb
->header
.nm_flags
.trunc
= false;
758 nmb
->header
.nm_flags
.authoritative
= false;
759 nmb
->header
.rcode
= 0;
760 nmb
->header
.qdcount
= 1;
761 nmb
->header
.ancount
= 0;
762 nmb
->header
.nscount
= 0;
763 nmb
->header
.arcount
= 0;
764 nmb
->question
.question_name
= *name
;
765 nmb
->question
.question_type
= 0x21;
766 nmb
->question
.question_class
= 0x1;
768 state
->buflen
= build_packet((char *)state
->buf
, sizeof(state
->buf
),
770 if (state
->buflen
== 0) {
771 tevent_req_nterror(req
, NT_STATUS_INTERNAL_ERROR
);
772 DEBUG(10, ("build_packet failed\n"));
773 return tevent_req_post(req
, ev
);
776 subreq
= nb_trans_send(state
, ev
, &state
->my_addr
, &state
->addr
, false,
777 state
->buf
, state
->buflen
,
778 NMB_PACKET
, nmb
->header
.name_trn_id
,
779 node_status_query_validator
, NULL
);
780 if (tevent_req_nomem(subreq
, req
)) {
781 DEBUG(10, ("nb_trans_send failed\n"));
782 return tevent_req_post(req
, ev
);
784 if (!tevent_req_set_endtime(req
, ev
, timeval_current_ofs(10, 0))) {
785 return tevent_req_post(req
, ev
);
787 tevent_req_set_callback(subreq
, node_status_query_done
, req
);
791 static bool node_status_query_validator(struct packet_struct
*p
,
794 struct nmb_packet
*nmb
= &p
->packet
.nmb
;
797 if (nmb
->header
.opcode
!= 0 ||
798 nmb
->header
.nm_flags
.bcast
||
800 !nmb
->header
.ancount
||
801 nmb
->answers
->rr_type
!= 0x21) {
803 * XXXX what do we do with this? could be a redirect,
804 * but we'll discard it for the moment
811 static void node_status_query_done(struct tevent_req
*subreq
)
813 struct tevent_req
*req
= tevent_req_callback_data(
814 subreq
, struct tevent_req
);
815 struct node_status_query_state
*state
= tevent_req_data(
816 req
, struct node_status_query_state
);
819 status
= nb_trans_recv(subreq
, state
, &state
->packet
);
821 if (tevent_req_nterror(req
, status
)) {
824 tevent_req_done(req
);
827 NTSTATUS
node_status_query_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
828 struct node_status
**pnode_status
,
830 struct node_status_extra
*extra
)
832 struct node_status_query_state
*state
= tevent_req_data(
833 req
, struct node_status_query_state
);
834 struct node_status
*node_status
;
838 if (tevent_req_is_nterror(req
, &status
)) {
841 node_status
= parse_node_status(
842 mem_ctx
, &state
->packet
->packet
.nmb
.answers
->rdata
[0],
844 if (node_status
== NULL
) {
845 return NT_STATUS_NO_MEMORY
;
847 *pnode_status
= node_status
;
848 *pnum_names
= num_names
;
852 NTSTATUS
node_status_query(TALLOC_CTX
*mem_ctx
, struct nmb_name
*name
,
853 const struct sockaddr_storage
*addr
,
854 struct node_status
**pnode_status
,
856 struct node_status_extra
*extra
)
858 TALLOC_CTX
*frame
= talloc_stackframe();
859 struct tevent_context
*ev
;
860 struct tevent_req
*req
;
861 NTSTATUS status
= NT_STATUS_NO_MEMORY
;
863 ev
= samba_tevent_context_init(frame
);
867 req
= node_status_query_send(ev
, ev
, name
, addr
);
871 if (!tevent_req_poll_ntstatus(req
, ev
, &status
)) {
874 status
= node_status_query_recv(req
, mem_ctx
, pnode_status
,
881 static bool name_status_lmhosts(const struct sockaddr_storage
*paddr
,
882 int qname_type
, fstring pname
)
887 struct sockaddr_storage addr
;
889 if (paddr
->ss_family
!= AF_INET
) {
893 f
= startlmhosts(get_dyn_LMHOSTSFILE());
898 while (getlmhostsent(talloc_tos(), f
, &name
, &name_type
, &addr
)) {
899 if (addr
.ss_family
!= AF_INET
) {
902 if (name_type
!= qname_type
) {
905 if (memcmp(&((const struct sockaddr_in
*)paddr
)->sin_addr
,
906 &((const struct sockaddr_in
*)&addr
)->sin_addr
,
907 sizeof(struct in_addr
)) == 0) {
908 fstrcpy(pname
, name
);
917 /****************************************************************************
918 Find the first type XX name in a node status reply - used for finding
919 a servers name given its IP. Return the matched name in *name.
920 **************************************************************************/
922 bool name_status_find(const char *q_name
,
925 const struct sockaddr_storage
*to_ss
,
928 char addr
[INET6_ADDRSTRLEN
];
929 struct sockaddr_storage ss
;
930 struct node_status
*addrs
= NULL
;
931 struct nmb_name nname
;
936 if (lp_disable_netbios()) {
937 DEBUG(5,("name_status_find(%s#%02x): netbios is disabled\n",
942 print_sockaddr(addr
, sizeof(addr
), to_ss
);
944 DEBUG(10, ("name_status_find: looking up %s#%02x at %s\n", q_name
,
947 /* Check the cache first. */
949 if (namecache_status_fetch(q_name
, q_type
, type
, to_ss
, name
)) {
953 if (to_ss
->ss_family
!= AF_INET
) {
954 /* Can't do node status to IPv6 */
958 result
= name_status_lmhosts(to_ss
, type
, name
);
960 DBG_DEBUG("Found name %s in lmhosts\n", name
);
961 namecache_status_store(q_name
, q_type
, type
, to_ss
, name
);
965 set_socket_addr_v4(&ss
);
967 /* W2K PDC's seem not to respond to '*'#0. JRA */
968 make_nmb_name(&nname
, q_name
, q_type
);
969 status
= node_status_query(talloc_tos(), &nname
, to_ss
,
970 &addrs
, &count
, NULL
);
971 if (!NT_STATUS_IS_OK(status
)) {
975 for (i
=0;i
<count
;i
++) {
976 /* Find first one of the requested type that's not a GROUP. */
977 if (addrs
[i
].type
== type
&& ! (addrs
[i
].flags
& 0x80))
983 pull_ascii_nstring(name
, sizeof(fstring
), addrs
[i
].name
);
985 /* Store the result in the cache. */
986 /* but don't store an entry for 0x1c names here. Here we have
987 a single host and DOMAIN<0x1c> names should be a list of hosts */
989 if ( q_type
!= 0x1c ) {
990 namecache_status_store(q_name
, q_type
, type
, to_ss
, name
);
998 DEBUG(10, ("name_status_find: name %sfound", result
? "" : "not "));
1001 DEBUGADD(10, (", name %s ip address is %s", name
, addr
));
1009 comparison function used by sort_addr_list
1012 static int addr_compare(const struct sockaddr_storage
*ss1
,
1013 const struct sockaddr_storage
*ss2
)
1015 int max_bits1
=0, max_bits2
=0;
1016 int num_interfaces
= iface_count();
1019 /* Sort IPv4 addresses first. */
1020 if (ss1
->ss_family
!= ss2
->ss_family
) {
1021 if (ss2
->ss_family
== AF_INET
) {
1028 /* Here we know both addresses are of the same
1031 for (i
=0;i
<num_interfaces
;i
++) {
1032 const struct sockaddr_storage
*pss
= iface_n_bcast(i
);
1033 const unsigned char *p_ss1
= NULL
;
1034 const unsigned char *p_ss2
= NULL
;
1035 const unsigned char *p_if
= NULL
;
1039 if (pss
->ss_family
!= ss1
->ss_family
) {
1040 /* Ignore interfaces of the wrong type. */
1043 if (pss
->ss_family
== AF_INET
) {
1044 p_if
= (const unsigned char *)
1045 &((const struct sockaddr_in
*)pss
)->sin_addr
;
1046 p_ss1
= (const unsigned char *)
1047 &((const struct sockaddr_in
*)ss1
)->sin_addr
;
1048 p_ss2
= (const unsigned char *)
1049 &((const struct sockaddr_in
*)ss2
)->sin_addr
;
1052 #if defined(HAVE_IPV6)
1053 if (pss
->ss_family
== AF_INET6
) {
1054 p_if
= (const unsigned char *)
1055 &((const struct sockaddr_in6
*)pss
)->sin6_addr
;
1056 p_ss1
= (const unsigned char *)
1057 &((const struct sockaddr_in6
*)ss1
)->sin6_addr
;
1058 p_ss2
= (const unsigned char *)
1059 &((const struct sockaddr_in6
*)ss2
)->sin6_addr
;
1063 if (!p_ss1
|| !p_ss2
|| !p_if
|| len
== 0) {
1066 bits1
= matching_len_bits(p_ss1
, p_if
, len
);
1067 bits2
= matching_len_bits(p_ss2
, p_if
, len
);
1068 max_bits1
= MAX(bits1
, max_bits1
);
1069 max_bits2
= MAX(bits2
, max_bits2
);
1072 /* Bias towards directly reachable IPs */
1073 if (iface_local((const struct sockaddr
*)ss1
)) {
1074 if (ss1
->ss_family
== AF_INET
) {
1080 if (iface_local((const struct sockaddr
*)ss2
)) {
1081 if (ss2
->ss_family
== AF_INET
) {
1087 return max_bits2
- max_bits1
;
1090 /*******************************************************************
1091 compare 2 ldap IPs by nearness to our interfaces - used in qsort
1092 *******************************************************************/
1094 static int ip_service_compare(struct ip_service
*ss1
, struct ip_service
*ss2
)
1098 if ((result
= addr_compare(&ss1
->ss
, &ss2
->ss
)) != 0) {
1102 if (ss1
->port
> ss2
->port
) {
1106 if (ss1
->port
< ss2
->port
) {
1114 sort an IP list so that names that are close to one of our interfaces
1115 are at the top. This prevents the problem where a WINS server returns an IP
1116 that is not reachable from our subnet as the first match
1119 static void sort_addr_list(struct sockaddr_storage
*sslist
, int count
)
1125 TYPESAFE_QSORT(sslist
, count
, addr_compare
);
1128 static void sort_service_list(struct ip_service
*servlist
, int count
)
1134 TYPESAFE_QSORT(servlist
, count
, ip_service_compare
);
1137 /**********************************************************************
1138 Remove any duplicate address/port pairs in the list
1139 *********************************************************************/
1141 int remove_duplicate_addrs2(struct ip_service
*iplist
, int count
)
1145 DEBUG(10,("remove_duplicate_addrs2: "
1146 "looking for duplicate address/port pairs\n"));
1148 /* One loop to set duplicates to a zero addr. */
1149 for ( i
=0; i
<count
; i
++ ) {
1150 if ( is_zero_addr(&iplist
[i
].ss
)) {
1154 for ( j
=i
+1; j
<count
; j
++ ) {
1155 if (sockaddr_equal((struct sockaddr
*)(void *)&iplist
[i
].ss
,
1156 (struct sockaddr
*)(void *)&iplist
[j
].ss
) &&
1157 iplist
[i
].port
== iplist
[j
].port
) {
1158 zero_sockaddr(&iplist
[j
].ss
);
1163 /* Now remove any addresses set to zero above. */
1164 for (i
= 0; i
< count
; i
++) {
1166 is_zero_addr(&iplist
[i
].ss
)) {
1170 (count
-i
-1)*sizeof(struct ip_service
));
1179 static bool prioritize_ipv4_list(struct ip_service
*iplist
, int count
)
1181 TALLOC_CTX
*frame
= talloc_stackframe();
1182 struct ip_service
*iplist_new
= talloc_array(frame
, struct ip_service
, count
);
1185 if (iplist_new
== NULL
) {
1192 /* Copy IPv4 first. */
1193 for (i
= 0; i
< count
; i
++) {
1194 if (iplist
[i
].ss
.ss_family
== AF_INET
) {
1195 iplist_new
[j
++] = iplist
[i
];
1200 for (i
= 0; i
< count
; i
++) {
1201 if (iplist
[i
].ss
.ss_family
!= AF_INET
) {
1202 iplist_new
[j
++] = iplist
[i
];
1206 memcpy(iplist
, iplist_new
, sizeof(struct ip_service
)*count
);
1211 /****************************************************************************
1212 Do a netbios name query to find someones IP.
1213 Returns an array of IP addresses or NULL if none.
1214 *count will be set to the number of addresses returned.
1215 *timed_out is set if we failed by timing out
1216 ****************************************************************************/
1218 struct name_query_state
{
1219 struct sockaddr_storage my_addr
;
1220 struct sockaddr_storage addr
;
1227 NTSTATUS validate_error
;
1230 struct sockaddr_storage
*addrs
;
1234 static bool name_query_validator(struct packet_struct
*p
, void *private_data
);
1235 static void name_query_done(struct tevent_req
*subreq
);
1237 struct tevent_req
*name_query_send(TALLOC_CTX
*mem_ctx
,
1238 struct tevent_context
*ev
,
1239 const char *name
, int name_type
,
1240 bool bcast
, bool recurse
,
1241 const struct sockaddr_storage
*addr
)
1243 struct tevent_req
*req
, *subreq
;
1244 struct name_query_state
*state
;
1245 struct packet_struct p
;
1246 struct nmb_packet
*nmb
= &p
.packet
.nmb
;
1247 struct sockaddr_in
*in_addr
;
1249 req
= tevent_req_create(mem_ctx
, &state
, struct name_query_state
);
1253 state
->bcast
= bcast
;
1255 if (addr
->ss_family
!= AF_INET
) {
1256 /* Can't do node status to IPv6 */
1257 tevent_req_nterror(req
, NT_STATUS_INVALID_ADDRESS
);
1258 return tevent_req_post(req
, ev
);
1261 if (lp_disable_netbios()) {
1262 DEBUG(5,("name_query(%s#%02x): netbios is disabled\n",
1264 tevent_req_nterror(req
, NT_STATUS_NOT_SUPPORTED
);
1265 return tevent_req_post(req
, ev
);
1268 state
->addr
= *addr
;
1269 in_addr
= (struct sockaddr_in
*)(void *)&state
->addr
;
1270 in_addr
->sin_port
= htons(NMB_PORT
);
1272 set_socket_addr_v4(&state
->my_addr
);
1275 nmb
->header
.name_trn_id
= generate_trn_id();
1276 nmb
->header
.opcode
= 0;
1277 nmb
->header
.response
= false;
1278 nmb
->header
.nm_flags
.bcast
= bcast
;
1279 nmb
->header
.nm_flags
.recursion_available
= false;
1280 nmb
->header
.nm_flags
.recursion_desired
= recurse
;
1281 nmb
->header
.nm_flags
.trunc
= false;
1282 nmb
->header
.nm_flags
.authoritative
= false;
1283 nmb
->header
.rcode
= 0;
1284 nmb
->header
.qdcount
= 1;
1285 nmb
->header
.ancount
= 0;
1286 nmb
->header
.nscount
= 0;
1287 nmb
->header
.arcount
= 0;
1289 make_nmb_name(&nmb
->question
.question_name
,name
,name_type
);
1291 nmb
->question
.question_type
= 0x20;
1292 nmb
->question
.question_class
= 0x1;
1294 state
->buflen
= build_packet((char *)state
->buf
, sizeof(state
->buf
),
1296 if (state
->buflen
== 0) {
1297 tevent_req_nterror(req
, NT_STATUS_INTERNAL_ERROR
);
1298 DEBUG(10, ("build_packet failed\n"));
1299 return tevent_req_post(req
, ev
);
1302 subreq
= nb_trans_send(state
, ev
, &state
->my_addr
, &state
->addr
, bcast
,
1303 state
->buf
, state
->buflen
,
1304 NMB_PACKET
, nmb
->header
.name_trn_id
,
1305 name_query_validator
, state
);
1306 if (tevent_req_nomem(subreq
, req
)) {
1307 DEBUG(10, ("nb_trans_send failed\n"));
1308 return tevent_req_post(req
, ev
);
1310 tevent_req_set_callback(subreq
, name_query_done
, req
);
1314 static bool name_query_validator(struct packet_struct
*p
, void *private_data
)
1316 struct name_query_state
*state
= talloc_get_type_abort(
1317 private_data
, struct name_query_state
);
1318 struct nmb_packet
*nmb
= &p
->packet
.nmb
;
1319 struct sockaddr_storage
*tmp_addrs
;
1320 bool got_unique_netbios_name
= false;
1323 debug_nmb_packet(p
);
1326 * If we get a Negative Name Query Response from a WINS
1327 * server, we should report it and give up.
1329 if( 0 == nmb
->header
.opcode
/* A query response */
1330 && !state
->bcast
/* from a WINS server */
1331 && nmb
->header
.rcode
/* Error returned */
1334 if( DEBUGLVL( 3 ) ) {
1335 /* Only executed if DEBUGLEVEL >= 3 */
1336 dbgtext( "Negative name query "
1337 "response, rcode 0x%02x: ",
1338 nmb
->header
.rcode
);
1339 switch( nmb
->header
.rcode
) {
1341 dbgtext("Request was invalidly formatted.\n");
1344 dbgtext("Problem with NBNS, cannot process "
1348 dbgtext("The name requested does not "
1352 dbgtext("Unsupported request error.\n");
1355 dbgtext("Query refused error.\n");
1358 dbgtext("Unrecognized error code.\n" );
1364 * We accept this packet as valid, but tell the upper
1365 * layers that it's a negative response.
1367 state
->validate_error
= NT_STATUS_NOT_FOUND
;
1371 if (nmb
->header
.opcode
!= 0 ||
1372 nmb
->header
.nm_flags
.bcast
||
1373 nmb
->header
.rcode
||
1374 !nmb
->header
.ancount
) {
1376 * XXXX what do we do with this? Could be a redirect,
1377 * but we'll discard it for the moment.
1382 tmp_addrs
= talloc_realloc(
1383 state
, state
->addrs
, struct sockaddr_storage
,
1384 state
->num_addrs
+ nmb
->answers
->rdlength
/6);
1385 if (tmp_addrs
== NULL
) {
1386 state
->validate_error
= NT_STATUS_NO_MEMORY
;
1389 state
->addrs
= tmp_addrs
;
1391 DEBUG(2,("Got a positive name query response "
1392 "from %s ( ", inet_ntoa(p
->ip
)));
1394 for (i
=0; i
<nmb
->answers
->rdlength
/6; i
++) {
1397 struct sockaddr_storage addr
;
1400 flags
= RSVAL(&nmb
->answers
->rdata
[i
*6], 0);
1401 got_unique_netbios_name
|= ((flags
& 0x8000) == 0);
1403 putip((char *)&ip
,&nmb
->answers
->rdata
[2+i
*6]);
1404 in_addr_to_sockaddr_storage(&addr
, ip
);
1406 if (is_zero_addr(&addr
)) {
1410 for (j
=0; j
<state
->num_addrs
; j
++) {
1412 (struct sockaddr
*)(void *)&addr
,
1413 (struct sockaddr
*)(void *)&state
->addrs
[j
])) {
1417 if (j
< state
->num_addrs
) {
1418 /* Already got it */
1422 DEBUGADD(2,("%s ",inet_ntoa(ip
)));
1424 state
->addrs
[state
->num_addrs
] = addr
;
1425 state
->num_addrs
+= 1;
1427 DEBUGADD(2,(")\n"));
1429 /* We add the flags back ... */
1430 if (nmb
->header
.response
)
1431 state
->flags
|= NM_FLAGS_RS
;
1432 if (nmb
->header
.nm_flags
.authoritative
)
1433 state
->flags
|= NM_FLAGS_AA
;
1434 if (nmb
->header
.nm_flags
.trunc
)
1435 state
->flags
|= NM_FLAGS_TC
;
1436 if (nmb
->header
.nm_flags
.recursion_desired
)
1437 state
->flags
|= NM_FLAGS_RD
;
1438 if (nmb
->header
.nm_flags
.recursion_available
)
1439 state
->flags
|= NM_FLAGS_RA
;
1440 if (nmb
->header
.nm_flags
.bcast
)
1441 state
->flags
|= NM_FLAGS_B
;
1445 * We have to collect all entries coming in from broadcast
1446 * queries. If we got a unique name, we're done.
1448 return got_unique_netbios_name
;
1451 * WINS responses are accepted when they are received
1456 static void name_query_done(struct tevent_req
*subreq
)
1458 struct tevent_req
*req
= tevent_req_callback_data(
1459 subreq
, struct tevent_req
);
1460 struct name_query_state
*state
= tevent_req_data(
1461 req
, struct name_query_state
);
1463 struct packet_struct
*p
= NULL
;
1465 status
= nb_trans_recv(subreq
, state
, &p
);
1466 TALLOC_FREE(subreq
);
1467 if (tevent_req_nterror(req
, status
)) {
1470 if (!NT_STATUS_IS_OK(state
->validate_error
)) {
1471 tevent_req_nterror(req
, state
->validate_error
);
1474 tevent_req_done(req
);
1477 NTSTATUS
name_query_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
1478 struct sockaddr_storage
**addrs
, int *num_addrs
,
1481 struct name_query_state
*state
= tevent_req_data(
1482 req
, struct name_query_state
);
1485 if (tevent_req_is_nterror(req
, &status
)) {
1487 NT_STATUS_EQUAL(status
, NT_STATUS_IO_TIMEOUT
)) {
1489 * In the broadcast case we collect replies until the
1492 status
= NT_STATUS_OK
;
1494 if (!NT_STATUS_IS_OK(status
)) {
1498 if (state
->num_addrs
== 0) {
1499 return NT_STATUS_NOT_FOUND
;
1501 *addrs
= talloc_move(mem_ctx
, &state
->addrs
);
1502 sort_addr_list(*addrs
, state
->num_addrs
);
1503 *num_addrs
= state
->num_addrs
;
1504 if (flags
!= NULL
) {
1505 *flags
= state
->flags
;
1507 return NT_STATUS_OK
;
1510 NTSTATUS
name_query(const char *name
, int name_type
,
1511 bool bcast
, bool recurse
,
1512 const struct sockaddr_storage
*to_ss
,
1513 TALLOC_CTX
*mem_ctx
,
1514 struct sockaddr_storage
**addrs
,
1515 int *num_addrs
, uint8_t *flags
)
1517 TALLOC_CTX
*frame
= talloc_stackframe();
1518 struct tevent_context
*ev
;
1519 struct tevent_req
*req
;
1520 struct timeval timeout
;
1521 NTSTATUS status
= NT_STATUS_NO_MEMORY
;
1523 ev
= samba_tevent_context_init(frame
);
1527 req
= name_query_send(ev
, ev
, name
, name_type
, bcast
, recurse
, to_ss
);
1532 timeout
= timeval_current_ofs(0, 250000);
1534 timeout
= timeval_current_ofs(2, 0);
1536 if (!tevent_req_set_endtime(req
, ev
, timeout
)) {
1539 if (!tevent_req_poll_ntstatus(req
, ev
, &status
)) {
1542 status
= name_query_recv(req
, mem_ctx
, addrs
, num_addrs
, flags
);
1548 /********************************************************
1549 Convert an array if struct sockaddr_storage to struct ip_service
1550 return false on failure. Port is set to PORT_NONE;
1551 pcount is [in/out] - it is the length of ss_list on input,
1552 and the length of return_iplist on output as we remove any
1553 zero addresses from ss_list.
1554 *********************************************************/
1556 static bool convert_ss2service(struct ip_service
**return_iplist
,
1557 const struct sockaddr_storage
*ss_list
,
1561 int orig_count
= *pcount
;
1564 if (orig_count
==0 || !ss_list
)
1567 /* Filter out zero addrs. */
1568 for ( i
=0; i
<orig_count
; i
++ ) {
1569 if (is_zero_addr(&ss_list
[i
])) {
1574 if (real_count
==0) {
1578 /* copy the ip address; port will be PORT_NONE */
1579 if ((*return_iplist
= SMB_MALLOC_ARRAY(struct ip_service
, real_count
)) ==
1581 DEBUG(0,("convert_ip2service: malloc failed "
1582 "for %d enetries!\n", real_count
));
1586 for ( i
=0, real_count
= 0; i
<orig_count
; i
++ ) {
1587 if (is_zero_addr(&ss_list
[i
])) {
1590 (*return_iplist
)[real_count
].ss
= ss_list
[i
];
1591 (*return_iplist
)[real_count
].port
= PORT_NONE
;
1595 *pcount
= real_count
;
1599 struct name_queries_state
{
1600 struct tevent_context
*ev
;
1605 const struct sockaddr_storage
*addrs
;
1610 struct tevent_req
**subreqs
;
1615 struct sockaddr_storage
*result_addrs
;
1616 int num_result_addrs
;
1620 static void name_queries_done(struct tevent_req
*subreq
);
1621 static void name_queries_next(struct tevent_req
*subreq
);
1624 * Send a name query to multiple destinations with a wait time in between
1627 static struct tevent_req
*name_queries_send(
1628 TALLOC_CTX
*mem_ctx
, struct tevent_context
*ev
,
1629 const char *name
, int name_type
,
1630 bool bcast
, bool recurse
,
1631 const struct sockaddr_storage
*addrs
,
1632 int num_addrs
, int wait_msec
, int timeout_msec
)
1634 struct tevent_req
*req
, *subreq
;
1635 struct name_queries_state
*state
;
1637 req
= tevent_req_create(mem_ctx
, &state
,
1638 struct name_queries_state
);
1644 state
->name_type
= name_type
;
1645 state
->bcast
= bcast
;
1646 state
->recurse
= recurse
;
1647 state
->addrs
= addrs
;
1648 state
->num_addrs
= num_addrs
;
1649 state
->wait_msec
= wait_msec
;
1650 state
->timeout_msec
= timeout_msec
;
1652 state
->subreqs
= talloc_zero_array(
1653 state
, struct tevent_req
*, num_addrs
);
1654 if (tevent_req_nomem(state
->subreqs
, req
)) {
1655 return tevent_req_post(req
, ev
);
1657 state
->num_sent
= 0;
1659 subreq
= name_query_send(
1660 state
->subreqs
, state
->ev
, name
, name_type
, bcast
, recurse
,
1661 &state
->addrs
[state
->num_sent
]);
1662 if (tevent_req_nomem(subreq
, req
)) {
1663 return tevent_req_post(req
, ev
);
1665 if (!tevent_req_set_endtime(
1667 timeval_current_ofs(0, state
->timeout_msec
* 1000))) {
1668 tevent_req_oom(req
);
1669 return tevent_req_post(req
, ev
);
1671 tevent_req_set_callback(subreq
, name_queries_done
, req
);
1673 state
->subreqs
[state
->num_sent
] = subreq
;
1674 state
->num_sent
+= 1;
1676 if (state
->num_sent
< state
->num_addrs
) {
1677 subreq
= tevent_wakeup_send(
1679 timeval_current_ofs(0, state
->wait_msec
* 1000));
1680 if (tevent_req_nomem(subreq
, req
)) {
1681 return tevent_req_post(req
, ev
);
1683 tevent_req_set_callback(subreq
, name_queries_next
, req
);
1688 static void name_queries_done(struct tevent_req
*subreq
)
1690 struct tevent_req
*req
= tevent_req_callback_data(
1691 subreq
, struct tevent_req
);
1692 struct name_queries_state
*state
= tevent_req_data(
1693 req
, struct name_queries_state
);
1697 status
= name_query_recv(subreq
, state
, &state
->result_addrs
,
1698 &state
->num_result_addrs
, &state
->flags
);
1700 for (i
=0; i
<state
->num_sent
; i
++) {
1701 if (state
->subreqs
[i
] == subreq
) {
1705 if (i
== state
->num_sent
) {
1706 tevent_req_nterror(req
, NT_STATUS_INTERNAL_ERROR
);
1709 TALLOC_FREE(state
->subreqs
[i
]);
1711 state
->num_received
+= 1;
1713 if (!NT_STATUS_IS_OK(status
)) {
1715 if (state
->num_received
>= state
->num_addrs
) {
1716 tevent_req_nterror(req
, status
);
1720 * Still outstanding requests, just wait
1724 state
->received_index
= i
;
1725 tevent_req_done(req
);
1728 static void name_queries_next(struct tevent_req
*subreq
)
1730 struct tevent_req
*req
= tevent_req_callback_data(
1731 subreq
, struct tevent_req
);
1732 struct name_queries_state
*state
= tevent_req_data(
1733 req
, struct name_queries_state
);
1735 if (!tevent_wakeup_recv(subreq
)) {
1736 tevent_req_nterror(req
, NT_STATUS_INTERNAL_ERROR
);
1740 subreq
= name_query_send(
1741 state
->subreqs
, state
->ev
,
1742 state
->name
, state
->name_type
, state
->bcast
, state
->recurse
,
1743 &state
->addrs
[state
->num_sent
]);
1744 if (tevent_req_nomem(subreq
, req
)) {
1747 tevent_req_set_callback(subreq
, name_queries_done
, req
);
1748 if (!tevent_req_set_endtime(
1750 timeval_current_ofs(0, state
->timeout_msec
* 1000))) {
1751 tevent_req_oom(req
);
1754 state
->subreqs
[state
->num_sent
] = subreq
;
1755 state
->num_sent
+= 1;
1757 if (state
->num_sent
< state
->num_addrs
) {
1758 subreq
= tevent_wakeup_send(
1760 timeval_current_ofs(0, state
->wait_msec
* 1000));
1761 if (tevent_req_nomem(subreq
, req
)) {
1764 tevent_req_set_callback(subreq
, name_queries_next
, req
);
1768 static NTSTATUS
name_queries_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
1769 struct sockaddr_storage
**result_addrs
,
1770 int *num_result_addrs
, uint8_t *flags
,
1771 int *received_index
)
1773 struct name_queries_state
*state
= tevent_req_data(
1774 req
, struct name_queries_state
);
1777 if (tevent_req_is_nterror(req
, &status
)) {
1781 if (result_addrs
!= NULL
) {
1782 *result_addrs
= talloc_move(mem_ctx
, &state
->result_addrs
);
1784 if (num_result_addrs
!= NULL
) {
1785 *num_result_addrs
= state
->num_result_addrs
;
1787 if (flags
!= NULL
) {
1788 *flags
= state
->flags
;
1790 if (received_index
!= NULL
) {
1791 *received_index
= state
->received_index
;
1793 return NT_STATUS_OK
;
1796 /********************************************************
1797 Resolve via "bcast" method.
1798 *********************************************************/
1800 struct name_resolve_bcast_state
{
1801 struct sockaddr_storage
*addrs
;
1805 static void name_resolve_bcast_done(struct tevent_req
*subreq
);
1807 struct tevent_req
*name_resolve_bcast_send(TALLOC_CTX
*mem_ctx
,
1808 struct tevent_context
*ev
,
1812 struct tevent_req
*req
, *subreq
;
1813 struct name_resolve_bcast_state
*state
;
1814 struct sockaddr_storage
*bcast_addrs
;
1815 int i
, num_addrs
, num_bcast_addrs
;
1817 req
= tevent_req_create(mem_ctx
, &state
,
1818 struct name_resolve_bcast_state
);
1823 if (lp_disable_netbios()) {
1824 DEBUG(5, ("name_resolve_bcast(%s#%02x): netbios is disabled\n",
1826 tevent_req_nterror(req
, NT_STATUS_INVALID_PARAMETER
);
1827 return tevent_req_post(req
, ev
);
1831 * "bcast" means do a broadcast lookup on all the local interfaces.
1834 DEBUG(3, ("name_resolve_bcast: Attempting broadcast lookup "
1835 "for name %s<0x%x>\n", name
, name_type
));
1837 num_addrs
= iface_count();
1838 bcast_addrs
= talloc_array(state
, struct sockaddr_storage
, num_addrs
);
1839 if (tevent_req_nomem(bcast_addrs
, req
)) {
1840 return tevent_req_post(req
, ev
);
1844 * Lookup the name on all the interfaces, return on
1845 * the first successful match.
1847 num_bcast_addrs
= 0;
1849 for (i
=0; i
<num_addrs
; i
++) {
1850 const struct sockaddr_storage
*pss
= iface_n_bcast(i
);
1852 if (pss
->ss_family
!= AF_INET
) {
1855 bcast_addrs
[num_bcast_addrs
] = *pss
;
1856 num_bcast_addrs
+= 1;
1859 subreq
= name_queries_send(state
, ev
, name
, name_type
, true, true,
1860 bcast_addrs
, num_bcast_addrs
, 0, 1000);
1861 if (tevent_req_nomem(subreq
, req
)) {
1862 return tevent_req_post(req
, ev
);
1864 tevent_req_set_callback(subreq
, name_resolve_bcast_done
, req
);
1868 static void name_resolve_bcast_done(struct tevent_req
*subreq
)
1870 struct tevent_req
*req
= tevent_req_callback_data(
1871 subreq
, struct tevent_req
);
1872 struct name_resolve_bcast_state
*state
= tevent_req_data(
1873 req
, struct name_resolve_bcast_state
);
1876 status
= name_queries_recv(subreq
, state
,
1877 &state
->addrs
, &state
->num_addrs
,
1879 TALLOC_FREE(subreq
);
1880 if (tevent_req_nterror(req
, status
)) {
1883 tevent_req_done(req
);
1886 NTSTATUS
name_resolve_bcast_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
1887 struct sockaddr_storage
**addrs
,
1890 struct name_resolve_bcast_state
*state
= tevent_req_data(
1891 req
, struct name_resolve_bcast_state
);
1894 if (tevent_req_is_nterror(req
, &status
)) {
1897 *addrs
= talloc_move(mem_ctx
, &state
->addrs
);
1898 *num_addrs
= state
->num_addrs
;
1899 return NT_STATUS_OK
;
1902 NTSTATUS
name_resolve_bcast(const char *name
,
1904 TALLOC_CTX
*mem_ctx
,
1905 struct sockaddr_storage
**return_iplist
,
1908 TALLOC_CTX
*frame
= talloc_stackframe();
1909 struct tevent_context
*ev
;
1910 struct tevent_req
*req
;
1911 NTSTATUS status
= NT_STATUS_NO_MEMORY
;
1913 ev
= samba_tevent_context_init(frame
);
1917 req
= name_resolve_bcast_send(frame
, ev
, name
, name_type
);
1921 if (!tevent_req_poll_ntstatus(req
, ev
, &status
)) {
1924 status
= name_resolve_bcast_recv(req
, mem_ctx
, return_iplist
,
1931 struct query_wins_list_state
{
1932 struct tevent_context
*ev
;
1935 struct in_addr
*servers
;
1936 uint32_t num_servers
;
1937 struct sockaddr_storage server
;
1940 struct sockaddr_storage
*addrs
;
1945 static void query_wins_list_done(struct tevent_req
*subreq
);
1948 * Query a list of (replicating) wins servers in sequence, call them
1949 * dead if they don't reply
1952 static struct tevent_req
*query_wins_list_send(
1953 TALLOC_CTX
*mem_ctx
, struct tevent_context
*ev
,
1954 struct in_addr src_ip
, const char *name
, uint8_t name_type
,
1955 struct in_addr
*servers
, int num_servers
)
1957 struct tevent_req
*req
, *subreq
;
1958 struct query_wins_list_state
*state
;
1960 req
= tevent_req_create(mem_ctx
, &state
,
1961 struct query_wins_list_state
);
1967 state
->name_type
= name_type
;
1968 state
->servers
= servers
;
1969 state
->num_servers
= num_servers
;
1971 if (state
->num_servers
== 0) {
1972 tevent_req_nterror(req
, NT_STATUS_NOT_FOUND
);
1973 return tevent_req_post(req
, ev
);
1976 in_addr_to_sockaddr_storage(
1977 &state
->server
, state
->servers
[state
->num_sent
]);
1979 subreq
= name_query_send(state
, state
->ev
,
1980 state
->name
, state
->name_type
,
1981 false, true, &state
->server
);
1982 state
->num_sent
+= 1;
1983 if (tevent_req_nomem(subreq
, req
)) {
1984 return tevent_req_post(req
, ev
);
1986 if (!tevent_req_set_endtime(subreq
, state
->ev
,
1987 timeval_current_ofs(2, 0))) {
1988 tevent_req_oom(req
);
1989 return tevent_req_post(req
, ev
);
1991 tevent_req_set_callback(subreq
, query_wins_list_done
, req
);
1995 static void query_wins_list_done(struct tevent_req
*subreq
)
1997 struct tevent_req
*req
= tevent_req_callback_data(
1998 subreq
, struct tevent_req
);
1999 struct query_wins_list_state
*state
= tevent_req_data(
2000 req
, struct query_wins_list_state
);
2003 status
= name_query_recv(subreq
, state
,
2004 &state
->addrs
, &state
->num_addrs
,
2006 TALLOC_FREE(subreq
);
2007 if (NT_STATUS_IS_OK(status
)) {
2008 tevent_req_done(req
);
2011 if (!NT_STATUS_EQUAL(status
, NT_STATUS_IO_TIMEOUT
)) {
2012 tevent_req_nterror(req
, status
);
2015 wins_srv_died(state
->servers
[state
->num_sent
-1],
2016 my_socket_addr_v4());
2018 if (state
->num_sent
== state
->num_servers
) {
2019 tevent_req_nterror(req
, NT_STATUS_NOT_FOUND
);
2023 in_addr_to_sockaddr_storage(
2024 &state
->server
, state
->servers
[state
->num_sent
]);
2026 subreq
= name_query_send(state
, state
->ev
,
2027 state
->name
, state
->name_type
,
2028 false, true, &state
->server
);
2029 state
->num_sent
+= 1;
2030 if (tevent_req_nomem(subreq
, req
)) {
2033 if (!tevent_req_set_endtime(subreq
, state
->ev
,
2034 timeval_current_ofs(2, 0))) {
2035 tevent_req_oom(req
);
2038 tevent_req_set_callback(subreq
, query_wins_list_done
, req
);
2041 static NTSTATUS
query_wins_list_recv(struct tevent_req
*req
,
2042 TALLOC_CTX
*mem_ctx
,
2043 struct sockaddr_storage
**addrs
,
2047 struct query_wins_list_state
*state
= tevent_req_data(
2048 req
, struct query_wins_list_state
);
2051 if (tevent_req_is_nterror(req
, &status
)) {
2054 if (addrs
!= NULL
) {
2055 *addrs
= talloc_move(mem_ctx
, &state
->addrs
);
2057 if (num_addrs
!= NULL
) {
2058 *num_addrs
= state
->num_addrs
;
2060 if (flags
!= NULL
) {
2061 *flags
= state
->flags
;
2063 return NT_STATUS_OK
;
2066 struct resolve_wins_state
{
2070 struct sockaddr_storage
*addrs
;
2075 static void resolve_wins_done(struct tevent_req
*subreq
);
2077 struct tevent_req
*resolve_wins_send(TALLOC_CTX
*mem_ctx
,
2078 struct tevent_context
*ev
,
2082 struct tevent_req
*req
, *subreq
;
2083 struct resolve_wins_state
*state
;
2084 char **wins_tags
= NULL
;
2085 struct sockaddr_storage src_ss
;
2086 struct in_addr src_ip
;
2087 int i
, num_wins_tags
;
2089 req
= tevent_req_create(mem_ctx
, &state
,
2090 struct resolve_wins_state
);
2095 if (wins_srv_count() < 1) {
2096 DEBUG(3,("resolve_wins: WINS server resolution selected "
2097 "and no WINS servers listed.\n"));
2098 tevent_req_nterror(req
, NT_STATUS_INVALID_PARAMETER
);
2102 /* the address we will be sending from */
2103 if (!interpret_string_addr(&src_ss
, lp_nbt_client_socket_address(),
2104 AI_NUMERICHOST
|AI_PASSIVE
)) {
2105 zero_sockaddr(&src_ss
);
2108 if (src_ss
.ss_family
!= AF_INET
) {
2109 char addr
[INET6_ADDRSTRLEN
];
2110 print_sockaddr(addr
, sizeof(addr
), &src_ss
);
2111 DEBUG(3,("resolve_wins: cannot receive WINS replies "
2112 "on IPv6 address %s\n",
2114 tevent_req_nterror(req
, NT_STATUS_INVALID_PARAMETER
);
2118 src_ip
= ((const struct sockaddr_in
*)(void *)&src_ss
)->sin_addr
;
2120 wins_tags
= wins_srv_tags();
2121 if (wins_tags
== NULL
) {
2122 tevent_req_nterror(req
, NT_STATUS_INVALID_PARAMETER
);
2127 while (wins_tags
[num_wins_tags
] != NULL
) {
2131 for (i
=0; i
<num_wins_tags
; i
++) {
2132 int num_servers
, num_alive
;
2133 struct in_addr
*servers
, *alive
;
2136 if (!wins_server_tag_ips(wins_tags
[i
], talloc_tos(),
2137 &servers
, &num_servers
)) {
2138 DEBUG(10, ("wins_server_tag_ips failed for tag %s\n",
2143 alive
= talloc_array(state
, struct in_addr
, num_servers
);
2144 if (tevent_req_nomem(alive
, req
)) {
2149 for (j
=0; j
<num_servers
; j
++) {
2150 struct in_addr wins_ip
= servers
[j
];
2152 if (global_in_nmbd
&& ismyip_v4(wins_ip
)) {
2153 /* yikes! we'll loop forever */
2156 /* skip any that have been unresponsive lately */
2157 if (wins_srv_is_dead(wins_ip
, src_ip
)) {
2160 DEBUG(3, ("resolve_wins: using WINS server %s "
2162 inet_ntoa(wins_ip
), wins_tags
[i
]));
2163 alive
[num_alive
] = wins_ip
;
2166 TALLOC_FREE(servers
);
2168 if (num_alive
== 0) {
2172 subreq
= query_wins_list_send(
2173 state
, ev
, src_ip
, name
, name_type
,
2175 if (tevent_req_nomem(subreq
, req
)) {
2178 tevent_req_set_callback(subreq
, resolve_wins_done
, req
);
2179 state
->num_sent
+= 1;
2182 if (state
->num_sent
== 0) {
2183 tevent_req_nterror(req
, NT_STATUS_NOT_FOUND
);
2187 wins_srv_tags_free(wins_tags
);
2190 wins_srv_tags_free(wins_tags
);
2191 return tevent_req_post(req
, ev
);
2194 static void resolve_wins_done(struct tevent_req
*subreq
)
2196 struct tevent_req
*req
= tevent_req_callback_data(
2197 subreq
, struct tevent_req
);
2198 struct resolve_wins_state
*state
= tevent_req_data(
2199 req
, struct resolve_wins_state
);
2202 status
= query_wins_list_recv(subreq
, state
, &state
->addrs
,
2203 &state
->num_addrs
, &state
->flags
);
2204 if (NT_STATUS_IS_OK(status
)) {
2205 tevent_req_done(req
);
2209 state
->num_received
+= 1;
2211 if (state
->num_received
< state
->num_sent
) {
2213 * Wait for the others
2217 tevent_req_nterror(req
, status
);
2220 NTSTATUS
resolve_wins_recv(struct tevent_req
*req
, TALLOC_CTX
*mem_ctx
,
2221 struct sockaddr_storage
**addrs
,
2222 int *num_addrs
, uint8_t *flags
)
2224 struct resolve_wins_state
*state
= tevent_req_data(
2225 req
, struct resolve_wins_state
);
2228 if (tevent_req_is_nterror(req
, &status
)) {
2231 if (addrs
!= NULL
) {
2232 *addrs
= talloc_move(mem_ctx
, &state
->addrs
);
2234 if (num_addrs
!= NULL
) {
2235 *num_addrs
= state
->num_addrs
;
2237 if (flags
!= NULL
) {
2238 *flags
= state
->flags
;
2240 return NT_STATUS_OK
;
2243 /********************************************************
2244 Resolve via "wins" method.
2245 *********************************************************/
2247 NTSTATUS
resolve_wins(const char *name
,
2249 TALLOC_CTX
*mem_ctx
,
2250 struct sockaddr_storage
**return_iplist
,
2253 struct tevent_context
*ev
;
2254 struct tevent_req
*req
;
2255 NTSTATUS status
= NT_STATUS_NO_MEMORY
;
2257 ev
= samba_tevent_context_init(talloc_tos());
2261 req
= resolve_wins_send(ev
, ev
, name
, name_type
);
2265 if (!tevent_req_poll_ntstatus(req
, ev
, &status
)) {
2268 status
= resolve_wins_recv(req
, mem_ctx
, return_iplist
, return_count
,
2275 /********************************************************
2276 Resolve via "hosts" method.
2277 *********************************************************/
2279 static NTSTATUS
resolve_hosts(const char *name
, int name_type
,
2280 TALLOC_CTX
*mem_ctx
,
2281 struct sockaddr_storage
**return_iplist
,
2285 * "host" means do a localhost, or dns lookup.
2287 struct addrinfo hints
;
2288 struct addrinfo
*ailist
= NULL
;
2289 struct addrinfo
*res
= NULL
;
2293 if ( name_type
!= 0x20 && name_type
!= 0x0) {
2294 DEBUG(5, ("resolve_hosts: not appropriate "
2295 "for name type <0x%x>\n",
2297 return NT_STATUS_INVALID_PARAMETER
;
2300 *return_iplist
= NULL
;
2303 DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x%x>\n",
2307 /* By default make sure it supports TCP. */
2308 hints
.ai_socktype
= SOCK_STREAM
;
2309 hints
.ai_flags
= AI_ADDRCONFIG
;
2311 #if !defined(HAVE_IPV6)
2312 /* Unless we have IPv6, we really only want IPv4 addresses back. */
2313 hints
.ai_family
= AF_INET
;
2316 ret
= getaddrinfo(name
,
2321 DEBUG(3,("resolve_hosts: getaddrinfo failed for name %s [%s]\n",
2323 gai_strerror(ret
) ));
2326 for (res
= ailist
; res
; res
= res
->ai_next
) {
2327 struct sockaddr_storage ss
;
2329 if (!res
->ai_addr
|| res
->ai_addrlen
== 0) {
2334 memcpy(&ss
, res
->ai_addr
, res
->ai_addrlen
);
2336 if (is_zero_addr(&ss
)) {
2342 *return_iplist
= talloc_realloc(
2343 mem_ctx
, *return_iplist
, struct sockaddr_storage
,
2345 if (!*return_iplist
) {
2346 DEBUG(3,("resolve_hosts: malloc fail !\n"));
2347 freeaddrinfo(ailist
);
2348 return NT_STATUS_NO_MEMORY
;
2350 (*return_iplist
)[i
] = ss
;
2354 freeaddrinfo(ailist
);
2356 if (*return_count
) {
2357 return NT_STATUS_OK
;
2359 return NT_STATUS_UNSUCCESSFUL
;
2362 /********************************************************
2363 Resolve via "ADS" method.
2364 *********************************************************/
2366 /* Special name type used to cause a _kerberos DNS lookup. */
2367 #define KDC_NAME_TYPE 0xDCDC
2369 static NTSTATUS
resolve_ads(const char *name
,
2371 const char *sitename
,
2372 struct ip_service
**return_iplist
,
2378 struct dns_rr_srv
*dcs
= NULL
;
2382 if ((name_type
!= 0x1c) && (name_type
!= KDC_NAME_TYPE
) &&
2383 (name_type
!= 0x1b)) {
2384 return NT_STATUS_INVALID_PARAMETER
;
2387 if ( (ctx
= talloc_init("resolve_ads")) == NULL
) {
2388 DEBUG(0,("resolve_ads: talloc_init() failed!\n"));
2389 return NT_STATUS_NO_MEMORY
;
2392 /* The DNS code needs fixing to find IPv6 addresses... JRA. */
2393 switch (name_type
) {
2395 DEBUG(5,("resolve_ads: Attempting to resolve "
2396 "PDC for %s using DNS\n", name
));
2397 status
= ads_dns_query_pdc(ctx
,
2404 DEBUG(5,("resolve_ads: Attempting to resolve "
2405 "DCs for %s using DNS\n", name
));
2406 status
= ads_dns_query_dcs(ctx
,
2413 DEBUG(5,("resolve_ads: Attempting to resolve "
2414 "KDCs for %s using DNS\n", name
));
2415 status
= ads_dns_query_kdcs(ctx
,
2422 status
= NT_STATUS_INVALID_PARAMETER
;
2426 if ( !NT_STATUS_IS_OK( status
) ) {
2427 talloc_destroy(ctx
);
2432 *return_iplist
= NULL
;
2434 talloc_destroy(ctx
);
2435 return NT_STATUS_OK
;
2438 for (i
=0;i
<numdcs
;i
++) {
2442 numaddrs
+= dcs
[i
].num_ips
;
2446 if ((*return_iplist
= SMB_MALLOC_ARRAY(struct ip_service
, numaddrs
)) ==
2448 DEBUG(0,("resolve_ads: malloc failed for %d entries\n",
2450 talloc_destroy(ctx
);
2451 return NT_STATUS_NO_MEMORY
;
2454 /* now unroll the list of IP addresses */
2458 for (i
= 0; i
< numdcs
&& (*return_count
<numaddrs
); i
++ ) {
2459 /* If we don't have an IP list for a name, lookup it up */
2461 /* We need to get all IP addresses here. */
2462 struct addrinfo
*res
= NULL
;
2464 int extra_addrs
= 0;
2466 if (!interpret_string_addr_internal(&res
,
2471 /* Add in every IP from the lookup. How
2473 for (p
= res
; p
; p
= p
->ai_next
) {
2474 struct sockaddr_storage ss
;
2475 memcpy(&ss
, p
->ai_addr
, p
->ai_addrlen
);
2476 if (is_zero_addr(&ss
)) {
2481 if (extra_addrs
> 1) {
2482 /* We need to expand the return_iplist array
2483 as we only budgeted for one address. */
2484 numaddrs
+= (extra_addrs
-1);
2485 *return_iplist
= SMB_REALLOC_ARRAY(*return_iplist
,
2488 if (*return_iplist
== NULL
) {
2492 talloc_destroy(ctx
);
2493 return NT_STATUS_NO_MEMORY
;
2496 for (p
= res
; p
; p
= p
->ai_next
) {
2497 (*return_iplist
)[*return_count
].port
= dcs
[i
].port
;
2498 memcpy(&(*return_iplist
)[*return_count
].ss
,
2501 if (is_zero_addr(&(*return_iplist
)[*return_count
].ss
)) {
2505 /* Should never happen, but still... */
2506 if (*return_count
>=numaddrs
) {
2514 /* use all the IP addresses from the SRV response */
2516 for (j
= 0; j
< dcs
[i
].num_ips
; j
++) {
2517 (*return_iplist
)[*return_count
].port
= dcs
[i
].port
;
2518 (*return_iplist
)[*return_count
].ss
= dcs
[i
].ss_s
[j
];
2519 if (is_zero_addr(&(*return_iplist
)[*return_count
].ss
)) {
2523 /* Should never happen, but still... */
2524 if (*return_count
>=numaddrs
) {
2531 talloc_destroy(ctx
);
2532 return NT_STATUS_OK
;
2535 static const char **filter_out_nbt_lookup(TALLOC_CTX
*mem_ctx
,
2536 const char **resolve_order
)
2538 size_t i
, len
, result_idx
;
2539 const char **result
;
2542 while (resolve_order
[len
] != NULL
) {
2546 result
= talloc_array(mem_ctx
, const char *, len
+1);
2547 if (result
== NULL
) {
2553 for (i
=0; i
<len
; i
++) {
2554 const char *tok
= resolve_order
[i
];
2556 if (strequal(tok
, "lmhosts") || strequal(tok
, "wins") ||
2557 strequal(tok
, "bcast")) {
2560 result
[result_idx
++] = tok
;
2562 result
[result_idx
] = NULL
;
2567 /*******************************************************************
2568 Internal interface to resolve a name into an IP address.
2569 Use this function if the string is either an IP address, DNS
2570 or host name or NetBIOS name. This uses the name switch in the
2571 smb.conf to determine the order of name resolution.
2573 Added support for ip addr/port to support ADS ldap servers.
2574 the only place we currently care about the port is in the
2575 resolve_hosts() when looking up DC's via SRV RR entries in DNS
2576 **********************************************************************/
2578 NTSTATUS
internal_resolve_name(const char *name
,
2580 const char *sitename
,
2581 struct ip_service
**return_iplist
,
2583 const char **resolve_order
)
2586 NTSTATUS status
= NT_STATUS_UNSUCCESSFUL
;
2588 TALLOC_CTX
*frame
= NULL
;
2590 *return_iplist
= NULL
;
2593 DEBUG(10, ("internal_resolve_name: looking up %s#%x (sitename %s)\n",
2594 name
, name_type
, sitename
? sitename
: "(null)"));
2596 if (is_ipaddress(name
)) {
2597 if ((*return_iplist
= SMB_MALLOC_P(struct ip_service
)) ==
2599 DEBUG(0,("internal_resolve_name: malloc fail !\n"));
2600 return NT_STATUS_NO_MEMORY
;
2603 /* ignore the port here */
2604 (*return_iplist
)->port
= PORT_NONE
;
2606 /* if it's in the form of an IP address then get the lib to interpret it */
2607 if (!interpret_string_addr(&(*return_iplist
)->ss
,
2608 name
, AI_NUMERICHOST
)) {
2609 DEBUG(1,("internal_resolve_name: interpret_string_addr "
2612 SAFE_FREE(*return_iplist
);
2613 return NT_STATUS_INVALID_PARAMETER
;
2615 if (is_zero_addr(&(*return_iplist
)->ss
)) {
2616 SAFE_FREE(*return_iplist
);
2617 return NT_STATUS_UNSUCCESSFUL
;
2620 return NT_STATUS_OK
;
2623 /* Check name cache */
2625 if (namecache_fetch(name
, name_type
, return_iplist
, return_count
)) {
2626 *return_count
= remove_duplicate_addrs2(*return_iplist
,
2628 /* This could be a negative response */
2629 if (*return_count
> 0) {
2630 return NT_STATUS_OK
;
2632 return NT_STATUS_UNSUCCESSFUL
;
2636 /* set the name resolution order */
2638 if (resolve_order
&& strcmp(resolve_order
[0], "NULL") == 0) {
2639 DEBUG(8,("internal_resolve_name: all lookups disabled\n"));
2640 return NT_STATUS_INVALID_PARAMETER
;
2643 if (!resolve_order
|| !resolve_order
[0]) {
2644 static const char *host_order
[] = { "host", NULL
};
2645 resolve_order
= host_order
;
2648 frame
= talloc_stackframe();
2650 if ((strlen(name
) > MAX_NETBIOSNAME_LEN
- 1) ||
2651 (strchr(name
, '.') != NULL
)) {
2653 * Don't do NBT lookup, the name would not fit anyway
2655 resolve_order
= filter_out_nbt_lookup(frame
, resolve_order
);
2656 if (resolve_order
== NULL
) {
2658 return NT_STATUS_NO_MEMORY
;
2662 /* iterate through the name resolution backends */
2664 for (i
=0; resolve_order
[i
]; i
++) {
2665 tok
= resolve_order
[i
];
2667 if((strequal(tok
, "host") || strequal(tok
, "hosts"))) {
2668 struct sockaddr_storage
*ss_list
;
2669 status
= resolve_hosts(name
, name_type
,
2670 talloc_tos(), &ss_list
,
2672 if (NT_STATUS_IS_OK(status
)) {
2673 if (!convert_ss2service(return_iplist
,
2676 status
= NT_STATUS_NO_MEMORY
;
2680 } else if(strequal( tok
, "kdc")) {
2681 /* deal with KDC_NAME_TYPE names here.
2682 * This will result in a SRV record lookup */
2683 status
= resolve_ads(name
, KDC_NAME_TYPE
, sitename
,
2684 return_iplist
, return_count
);
2685 if (NT_STATUS_IS_OK(status
)) {
2686 /* Ensure we don't namecache
2687 * this with the KDC port. */
2688 name_type
= KDC_NAME_TYPE
;
2691 } else if(strequal( tok
, "ads")) {
2692 /* deal with 0x1c and 0x1b names here.
2693 * This will result in a SRV record lookup */
2694 status
= resolve_ads(name
, name_type
, sitename
,
2695 return_iplist
, return_count
);
2696 if (NT_STATUS_IS_OK(status
)) {
2699 } else if (strequal(tok
, "lmhosts")) {
2700 struct sockaddr_storage
*ss_list
;
2701 status
= resolve_lmhosts_file_as_sockaddr(
2702 get_dyn_LMHOSTSFILE(), name
, name_type
,
2703 talloc_tos(), &ss_list
, return_count
);
2704 if (NT_STATUS_IS_OK(status
)) {
2705 if (!convert_ss2service(return_iplist
,
2708 status
= NT_STATUS_NO_MEMORY
;
2712 } else if (strequal(tok
, "wins")) {
2713 /* don't resolve 1D via WINS */
2714 struct sockaddr_storage
*ss_list
;
2715 if (name_type
!= 0x1D) {
2716 status
= resolve_wins(name
, name_type
,
2720 if (NT_STATUS_IS_OK(status
)) {
2721 if (!convert_ss2service(return_iplist
,
2724 status
= NT_STATUS_NO_MEMORY
;
2729 } else if (strequal(tok
, "bcast")) {
2730 struct sockaddr_storage
*ss_list
;
2731 status
= name_resolve_bcast(
2732 name
, name_type
, talloc_tos(),
2733 &ss_list
, return_count
);
2734 if (NT_STATUS_IS_OK(status
)) {
2735 if (!convert_ss2service(return_iplist
,
2738 status
= NT_STATUS_NO_MEMORY
;
2743 DEBUG(0,("resolve_name: unknown name switch type %s\n",
2748 /* All of the resolve_* functions above have returned false. */
2751 SAFE_FREE(*return_iplist
);
2754 return NT_STATUS_UNSUCCESSFUL
;
2758 /* Remove duplicate entries. Some queries, notably #1c (domain
2759 controllers) return the PDC in iplist[0] and then all domain
2760 controllers including the PDC in iplist[1..n]. Iterating over
2761 the iplist when the PDC is down will cause two sets of timeouts. */
2763 *return_count
= remove_duplicate_addrs2(*return_iplist
, *return_count
);
2765 /* Save in name cache */
2766 if ( DEBUGLEVEL
>= 100 ) {
2767 for (i
= 0; i
< *return_count
&& DEBUGLEVEL
== 100; i
++) {
2768 char addr
[INET6_ADDRSTRLEN
];
2769 print_sockaddr(addr
, sizeof(addr
),
2770 &(*return_iplist
)[i
].ss
);
2771 DEBUG(100, ("Storing name %s of type %d (%s:%d)\n",
2775 (*return_iplist
)[i
].port
));
2779 if (*return_count
) {
2780 namecache_store(name
, name_type
, *return_count
, *return_iplist
);
2783 /* Display some debugging info */
2785 if ( DEBUGLEVEL
>= 10 ) {
2786 DEBUG(10, ("internal_resolve_name: returning %d addresses: ",
2789 for (i
= 0; i
< *return_count
; i
++) {
2790 char addr
[INET6_ADDRSTRLEN
];
2791 print_sockaddr(addr
, sizeof(addr
),
2792 &(*return_iplist
)[i
].ss
);
2793 DEBUGADD(10, ("%s:%d ",
2795 (*return_iplist
)[i
].port
));
2804 /********************************************************
2805 Internal interface to resolve a name into one IP address.
2806 Use this function if the string is either an IP address, DNS
2807 or host name or NetBIOS name. This uses the name switch in the
2808 smb.conf to determine the order of name resolution.
2809 *********************************************************/
2811 bool resolve_name(const char *name
,
2812 struct sockaddr_storage
*return_ss
,
2816 struct ip_service
*ss_list
= NULL
;
2817 char *sitename
= NULL
;
2820 TALLOC_CTX
*frame
= NULL
;
2822 if (is_ipaddress(name
)) {
2823 return interpret_string_addr(return_ss
, name
, AI_NUMERICHOST
);
2826 frame
= talloc_stackframe();
2828 sitename
= sitename_fetch(frame
, lp_realm()); /* wild guess */
2830 status
= internal_resolve_name(name
, name_type
, sitename
,
2832 lp_name_resolve_order());
2833 if (NT_STATUS_IS_OK(status
)) {
2837 for (i
=0; i
<count
; i
++) {
2838 if (!is_zero_addr(&ss_list
[i
].ss
) &&
2839 !is_broadcast_addr((struct sockaddr
*)(void *)&ss_list
[i
].ss
) &&
2840 (ss_list
[i
].ss
.ss_family
== AF_INET
)) {
2841 *return_ss
= ss_list
[i
].ss
;
2849 /* only return valid addresses for TCP connections */
2850 for (i
=0; i
<count
; i
++) {
2851 if (!is_zero_addr(&ss_list
[i
].ss
) &&
2852 !is_broadcast_addr((struct sockaddr
*)(void *)&ss_list
[i
].ss
)) {
2853 *return_ss
= ss_list
[i
].ss
;
2866 /********************************************************
2867 Internal interface to resolve a name into a list of IP addresses.
2868 Use this function if the string is either an IP address, DNS
2869 or host name or NetBIOS name. This uses the name switch in the
2870 smb.conf to determine the order of name resolution.
2871 *********************************************************/
2873 NTSTATUS
resolve_name_list(TALLOC_CTX
*ctx
,
2876 struct sockaddr_storage
**return_ss_arr
,
2877 unsigned int *p_num_entries
)
2879 struct ip_service
*ss_list
= NULL
;
2880 char *sitename
= NULL
;
2883 unsigned int num_entries
;
2887 *return_ss_arr
= NULL
;
2889 if (is_ipaddress(name
)) {
2890 *return_ss_arr
= talloc(ctx
, struct sockaddr_storage
);
2891 if (!*return_ss_arr
) {
2892 return NT_STATUS_NO_MEMORY
;
2894 if (!interpret_string_addr(*return_ss_arr
, name
, AI_NUMERICHOST
)) {
2895 TALLOC_FREE(*return_ss_arr
);
2896 return NT_STATUS_BAD_NETWORK_NAME
;
2899 return NT_STATUS_OK
;
2902 sitename
= sitename_fetch(ctx
, lp_realm()); /* wild guess */
2904 status
= internal_resolve_name(name
, name_type
, sitename
,
2906 lp_name_resolve_order());
2907 TALLOC_FREE(sitename
);
2909 if (!NT_STATUS_IS_OK(status
)) {
2913 /* only return valid addresses for TCP connections */
2914 for (i
=0, num_entries
= 0; i
<count
; i
++) {
2915 if (!is_zero_addr(&ss_list
[i
].ss
) &&
2916 !is_broadcast_addr((struct sockaddr
*)(void *)&ss_list
[i
].ss
)) {
2920 if (num_entries
== 0) {
2922 return NT_STATUS_BAD_NETWORK_NAME
;
2925 *return_ss_arr
= talloc_array(ctx
,
2926 struct sockaddr_storage
,
2928 if (!(*return_ss_arr
)) {
2930 return NT_STATUS_NO_MEMORY
;
2933 for (i
=0, num_entries
= 0; i
<count
; i
++) {
2934 if (!is_zero_addr(&ss_list
[i
].ss
) &&
2935 !is_broadcast_addr((struct sockaddr
*)(void *)&ss_list
[i
].ss
)) {
2936 (*return_ss_arr
)[num_entries
++] = ss_list
[i
].ss
;
2940 status
= NT_STATUS_OK
;
2941 *p_num_entries
= num_entries
;
2944 return NT_STATUS_OK
;
2947 /********************************************************
2948 Find the IP address of the master browser or DMB for a workgroup.
2949 *********************************************************/
2951 bool find_master_ip(const char *group
, struct sockaddr_storage
*master_ss
)
2953 struct ip_service
*ip_list
= NULL
;
2957 if (lp_disable_netbios()) {
2958 DEBUG(5,("find_master_ip(%s): netbios is disabled\n", group
));
2962 status
= internal_resolve_name(group
, 0x1D, NULL
, &ip_list
, &count
,
2963 lp_name_resolve_order());
2964 if (NT_STATUS_IS_OK(status
)) {
2965 *master_ss
= ip_list
[0].ss
;
2970 status
= internal_resolve_name(group
, 0x1B, NULL
, &ip_list
, &count
,
2971 lp_name_resolve_order());
2972 if (NT_STATUS_IS_OK(status
)) {
2973 *master_ss
= ip_list
[0].ss
;
2982 /********************************************************
2983 Get the IP address list of the primary domain controller
2985 *********************************************************/
2987 bool get_pdc_ip(const char *domain
, struct sockaddr_storage
*pss
)
2989 struct ip_service
*ip_list
= NULL
;
2991 NTSTATUS status
= NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND
;
2992 static const char *ads_order
[] = { "ads", NULL
};
2993 /* Look up #1B name */
2995 if (lp_security() == SEC_ADS
) {
2996 status
= internal_resolve_name(domain
, 0x1b, NULL
, &ip_list
,
3000 if (!NT_STATUS_IS_OK(status
) || count
== 0) {
3001 status
= internal_resolve_name(domain
, 0x1b, NULL
, &ip_list
,
3003 lp_name_resolve_order());
3004 if (!NT_STATUS_IS_OK(status
)) {
3010 /* if we get more than 1 IP back we have to assume it is a
3011 multi-homed PDC and not a mess up */
3014 DEBUG(6,("get_pdc_ip: PDC has %d IP addresses!\n", count
));
3015 sort_service_list(ip_list
, count
);
3018 *pss
= ip_list
[0].ss
;
3023 /* Private enum type for lookups. */
3025 enum dc_lookup_type
{ DC_NORMAL_LOOKUP
, DC_ADS_ONLY
, DC_KDC_ONLY
};
3027 /********************************************************
3028 Get the IP address list of the domain controllers for
3030 *********************************************************/
3032 static NTSTATUS
get_dc_list(const char *domain
,
3033 const char *sitename
,
3034 struct ip_service
**ip_list
,
3036 enum dc_lookup_type lookup_type
,
3039 const char **resolve_order
= NULL
;
3040 char *saf_servername
= NULL
;
3041 char *pserver
= NULL
;
3043 char *port_str
= NULL
;
3046 int num_addresses
= 0;
3047 int local_count
, i
, j
;
3048 struct ip_service
*return_iplist
= NULL
;
3049 struct ip_service
*auto_ip_list
= NULL
;
3050 bool done_auto_lookup
= false;
3053 TALLOC_CTX
*ctx
= talloc_stackframe();
3054 int auto_name_type
= 0x1C;
3061 /* if we are restricted to solely using DNS for looking
3062 up a domain controller, make sure that host lookups
3063 are enabled for the 'name resolve order'. If host lookups
3064 are disabled and ads_only is True, then set the string to
3067 resolve_order
= lp_name_resolve_order();
3068 if (!resolve_order
) {
3069 status
= NT_STATUS_NO_MEMORY
;
3072 if (lookup_type
== DC_ADS_ONLY
) {
3073 if (str_list_check_ci(resolve_order
, "host")) {
3074 static const char *ads_order
[] = { "ads", NULL
};
3075 resolve_order
= ads_order
;
3077 /* DNS SRV lookups used by the ads resolver
3078 are already sorted by priority and weight */
3081 /* this is quite bizarre! */
3082 static const char *null_order
[] = { "NULL", NULL
};
3083 resolve_order
= null_order
;
3085 } else if (lookup_type
== DC_KDC_ONLY
) {
3086 static const char *kdc_order
[] = { "kdc", NULL
};
3087 /* DNS SRV lookups used by the ads/kdc resolver
3088 are already sorted by priority and weight */
3090 resolve_order
= kdc_order
;
3091 auto_name_type
= KDC_NAME_TYPE
;
3094 /* fetch the server we have affinity for. Add the
3095 'password server' list to a search for our domain controllers */
3097 saf_servername
= saf_fetch(ctx
, domain
);
3099 if (strequal(domain
, lp_workgroup()) || strequal(domain
, lp_realm())) {
3100 pserver
= talloc_asprintf(ctx
, "%s, %s",
3101 saf_servername
? saf_servername
: "",
3102 lp_password_server());
3104 pserver
= talloc_asprintf(ctx
, "%s, *",
3105 saf_servername
? saf_servername
: "");
3108 TALLOC_FREE(saf_servername
);
3110 status
= NT_STATUS_NO_MEMORY
;
3114 DEBUG(3,("get_dc_list: preferred server list: \"%s\"\n", pserver
));
3117 * if '*' appears in the "password server" list then add
3118 * an auto lookup to the list of manually configured
3119 * DC's. If any DC is listed by name, then the list should be
3120 * considered to be ordered
3124 while (next_token_talloc(ctx
, &p
, &name
, LIST_SEP
)) {
3125 if (!done_auto_lookup
&& strequal(name
, "*")) {
3126 status
= internal_resolve_name(domain
, auto_name_type
,
3131 if (NT_STATUS_IS_OK(status
)) {
3132 num_addresses
+= auto_count
;
3134 done_auto_lookup
= true;
3135 DEBUG(8,("Adding %d DC's from auto lookup\n",
3142 /* if we have no addresses and haven't done the auto lookup, then
3143 just return the list of DC's. Or maybe we just failed. */
3145 if (num_addresses
== 0) {
3146 if (done_auto_lookup
) {
3147 DEBUG(4,("get_dc_list: no servers found\n"));
3148 status
= NT_STATUS_NO_LOGON_SERVERS
;
3151 status
= internal_resolve_name(domain
, auto_name_type
,
3153 count
, resolve_order
);
3157 if ((return_iplist
= SMB_MALLOC_ARRAY(struct ip_service
,
3158 num_addresses
)) == NULL
) {
3159 DEBUG(3,("get_dc_list: malloc fail !\n"));
3160 status
= NT_STATUS_NO_MEMORY
;
3167 /* fill in the return list now with real IP's */
3169 while ((local_count
<num_addresses
) &&
3170 next_token_talloc(ctx
, &p
, &name
, LIST_SEP
)) {
3171 struct sockaddr_storage name_ss
;
3173 /* copy any addresses from the auto lookup */
3175 if (strequal(name
, "*")) {
3176 for (j
=0; j
<auto_count
; j
++) {
3177 char addr
[INET6_ADDRSTRLEN
];
3178 print_sockaddr(addr
,
3180 &auto_ip_list
[j
].ss
);
3181 /* Check for and don't copy any
3182 * known bad DC IP's. */
3183 if(!NT_STATUS_IS_OK(check_negative_conn_cache(
3186 DEBUG(5,("get_dc_list: "
3187 "negative entry %s removed "
3192 return_iplist
[local_count
].ss
=
3194 return_iplist
[local_count
].port
=
3195 auto_ip_list
[j
].port
;
3201 /* added support for address:port syntax for ads
3202 * (not that I think anyone will ever run the LDAP
3203 * server in an AD domain on something other than
3205 * However, the port should not be used for kerberos
3208 port
= (lookup_type
== DC_ADS_ONLY
) ? LDAP_PORT
:
3209 ((lookup_type
== DC_KDC_ONLY
) ? DEFAULT_KRB5_PORT
:
3211 if ((port_str
=strchr(name
, ':')) != NULL
) {
3213 if (lookup_type
!= DC_KDC_ONLY
) {
3215 port
= atoi(port_str
);
3219 /* explicit lookup; resolve_name() will
3220 * handle names & IP addresses */
3221 if (resolve_name( name
, &name_ss
, 0x20, true )) {
3222 char addr
[INET6_ADDRSTRLEN
];
3223 print_sockaddr(addr
,
3227 /* Check for and don't copy any known bad DC IP's. */
3228 if( !NT_STATUS_IS_OK(check_negative_conn_cache(domain
,
3230 DEBUG(5,("get_dc_list: negative entry %s "
3231 "removed from DC list\n",
3236 return_iplist
[local_count
].ss
= name_ss
;
3237 return_iplist
[local_count
].port
= port
;
3243 /* need to remove duplicates in the list if we have any
3244 explicit password servers */
3246 local_count
= remove_duplicate_addrs2(return_iplist
, local_count
);
3248 /* For DC's we always prioritize IPv4 due to W2K3 not
3249 * supporting LDAP, KRB5 or CLDAP over IPv6. */
3251 if (local_count
&& return_iplist
) {
3252 prioritize_ipv4_list(return_iplist
, local_count
);
3255 if ( DEBUGLEVEL
>= 4 ) {
3256 DEBUG(4,("get_dc_list: returning %d ip addresses "
3257 "in an %sordered list\n",
3259 *ordered
? "":"un"));
3260 DEBUG(4,("get_dc_list: "));
3261 for ( i
=0; i
<local_count
; i
++ ) {
3262 char addr
[INET6_ADDRSTRLEN
];
3263 print_sockaddr(addr
,
3265 &return_iplist
[i
].ss
);
3266 DEBUGADD(4,("%s:%d ", addr
, return_iplist
[i
].port
));
3271 *ip_list
= return_iplist
;
3272 *count
= local_count
;
3274 status
= ( *count
!= 0 ? NT_STATUS_OK
: NT_STATUS_NO_LOGON_SERVERS
);
3278 if (!NT_STATUS_IS_OK(status
)) {
3279 SAFE_FREE(return_iplist
);
3284 SAFE_FREE(auto_ip_list
);
3289 /*********************************************************************
3290 Small wrapper function to get the DC list and sort it if neccessary.
3291 *********************************************************************/
3293 NTSTATUS
get_sorted_dc_list( const char *domain
,
3294 const char *sitename
,
3295 struct ip_service
**ip_list
,
3299 bool ordered
= false;
3301 enum dc_lookup_type lookup_type
= DC_NORMAL_LOOKUP
;
3306 DEBUG(8,("get_sorted_dc_list: attempting lookup "
3307 "for name %s (sitename %s)\n",
3309 sitename
? sitename
: "NULL"));
3312 lookup_type
= DC_ADS_ONLY
;
3315 status
= get_dc_list(domain
, sitename
, ip_list
,
3316 count
, lookup_type
, &ordered
);
3317 if (NT_STATUS_EQUAL(status
, NT_STATUS_NO_LOGON_SERVERS
)
3319 DEBUG(3,("get_sorted_dc_list: no server for name %s available"
3320 " in site %s, fallback to all servers\n",
3322 status
= get_dc_list(domain
, NULL
, ip_list
,
3323 count
, lookup_type
, &ordered
);
3326 if (!NT_STATUS_IS_OK(status
)) {
3327 SAFE_FREE(*ip_list
);
3332 /* only sort if we don't already have an ordered list */
3334 sort_service_list(*ip_list
, *count
);
3337 return NT_STATUS_OK
;
3340 /*********************************************************************
3341 Get the KDC list - re-use all the logic in get_dc_list.
3342 *********************************************************************/
3344 NTSTATUS
get_kdc_list( const char *realm
,
3345 const char *sitename
,
3346 struct ip_service
**ip_list
,
3355 status
= get_dc_list(realm
, sitename
, ip_list
,
3356 count
, DC_KDC_ONLY
, &ordered
);
3358 if (!NT_STATUS_IS_OK(status
)) {
3359 SAFE_FREE(*ip_list
);
3364 /* only sort if we don't already have an ordered list */
3366 sort_service_list(*ip_list
, *count
);
3369 return NT_STATUS_OK
;