2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1994-1998
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 /* nmbd.c sets this to True. */
25 BOOL global_in_nmbd
= False
;
27 /****************************************************************************
28 Generate a random trn_id.
29 ****************************************************************************/
31 static int generate_trn_id(void)
36 sys_srandom(sys_getpid());
39 trn_id
= sys_random();
41 return trn_id
% (unsigned)0x7FFF;
44 /****************************************************************************
45 Parse a node status response into an array of structures.
46 ****************************************************************************/
48 static struct node_status
*parse_node_status(char *p
, int *num_names
)
50 struct node_status
*ret
;
53 *num_names
= CVAL(p
,0);
58 ret
= (struct node_status
*)malloc(sizeof(struct node_status
)* (*num_names
));
59 if (!ret
) return NULL
;
62 for (i
=0;i
< *num_names
;i
++) {
63 StrnCpy(ret
[i
].name
,p
,15);
64 trim_char(ret
[i
].name
,'\0',' ');
65 ret
[i
].type
= CVAL(p
,15);
68 DEBUG(10, ("%s#%02x: flags = 0x%02x\n", ret
[i
].name
,
69 ret
[i
].type
, ret
[i
].flags
));
75 /****************************************************************************
76 Do a NBT node status query on an open socket and return an array of
77 structures holding the returned names or NULL if the query failed.
78 **************************************************************************/
80 struct node_status
*node_status_query(int fd
,struct nmb_name
*name
,
81 struct in_addr to_ip
, int *num_names
)
85 int retry_time
= 2000;
87 struct packet_struct p
;
88 struct packet_struct
*p2
;
89 struct nmb_packet
*nmb
= &p
.packet
.nmb
;
90 struct node_status
*ret
;
94 nmb
->header
.name_trn_id
= generate_trn_id();
95 nmb
->header
.opcode
= 0;
96 nmb
->header
.response
= False
;
97 nmb
->header
.nm_flags
.bcast
= False
;
98 nmb
->header
.nm_flags
.recursion_available
= False
;
99 nmb
->header
.nm_flags
.recursion_desired
= False
;
100 nmb
->header
.nm_flags
.trunc
= False
;
101 nmb
->header
.nm_flags
.authoritative
= False
;
102 nmb
->header
.rcode
= 0;
103 nmb
->header
.qdcount
= 1;
104 nmb
->header
.ancount
= 0;
105 nmb
->header
.nscount
= 0;
106 nmb
->header
.arcount
= 0;
107 nmb
->question
.question_name
= *name
;
108 nmb
->question
.question_type
= 0x21;
109 nmb
->question
.question_class
= 0x1;
114 p
.timestamp
= time(NULL
);
115 p
.packet_type
= NMB_PACKET
;
119 if (!send_packet(&p
))
125 struct timeval tval2
;
126 GetTimeOfDay(&tval2
);
127 if (TvalDiff(&tval
,&tval2
) > retry_time
) {
130 if (!found
&& !send_packet(&p
))
136 if ((p2
=receive_nmb_packet(fd
,90,nmb
->header
.name_trn_id
))) {
137 struct nmb_packet
*nmb2
= &p2
->packet
.nmb
;
138 debug_nmb_packet(p2
);
140 if (nmb2
->header
.opcode
!= 0 ||
141 nmb2
->header
.nm_flags
.bcast
||
142 nmb2
->header
.rcode
||
143 !nmb2
->header
.ancount
||
144 nmb2
->answers
->rr_type
!= 0x21) {
145 /* XXXX what do we do with this? could be a
146 redirect, but we'll discard it for the
152 ret
= parse_node_status(&nmb2
->answers
->rdata
[0], num_names
);
161 /****************************************************************************
162 Find the first type XX name in a node status reply - used for finding
163 a servers name given its IP. Return the matched name in *name.
164 **************************************************************************/
166 BOOL
name_status_find(const char *q_name
, int q_type
, int type
, struct in_addr to_ip
, char *name
)
168 struct node_status
*status
= NULL
;
169 struct nmb_name nname
;
174 if (lp_disable_netbios()) {
175 DEBUG(5,("name_status_find(%s#%02x): netbios is disabled\n", q_name
, q_type
));
179 DEBUG(10, ("name_status_find: looking up %s#%02x at %s\n", q_name
,
180 q_type
, inet_ntoa(to_ip
)));
182 /* Check the cache first. */
184 if (namecache_status_fetch(q_name
, q_type
, type
, to_ip
, name
))
187 sock
= open_socket_in(SOCK_DGRAM
, 0, 3, interpret_addr(lp_socket_address()), True
);
191 /* W2K PDC's seem not to respond to '*'#0. JRA */
192 make_nmb_name(&nname
, q_name
, q_type
);
193 status
= node_status_query(sock
, &nname
, to_ip
, &count
);
198 for (i
=0;i
<count
;i
++) {
199 if (status
[i
].type
== type
)
205 pull_ascii(name
, status
[i
].name
, 16, 15, STR_TERMINATE
);
207 /* Store the result in the cache. */
208 /* but don't store an entry for 0x1c names here. Here we have
209 a single host and DOMAIN<0x1c> names should be a list of hosts */
211 if ( q_type
!= 0x1c )
212 namecache_status_store(q_name
, q_type
, type
, to_ip
, name
);
219 DEBUG(10, ("name_status_find: name %sfound", result
? "" : "not "));
222 DEBUGADD(10, (", name %s ip address is %s", name
, inet_ntoa(to_ip
)));
230 comparison function used by sort_ip_list
233 int ip_compare(struct in_addr
*ip1
, struct in_addr
*ip2
)
235 int max_bits1
=0, max_bits2
=0;
236 int num_interfaces
= iface_count();
239 for (i
=0;i
<num_interfaces
;i
++) {
242 ip
= *iface_n_bcast(i
);
243 bits1
= matching_quad_bits((uchar
*)&ip1
->s_addr
, (uchar
*)&ip
.s_addr
);
244 bits2
= matching_quad_bits((uchar
*)&ip2
->s_addr
, (uchar
*)&ip
.s_addr
);
245 max_bits1
= MAX(bits1
, max_bits1
);
246 max_bits2
= MAX(bits2
, max_bits2
);
249 /* bias towards directly reachable IPs */
250 if (iface_local(*ip1
)) {
253 if (iface_local(*ip2
)) {
257 return max_bits2
- max_bits1
;
260 /*******************************************************************
261 compare 2 ldap IPs by nearness to our interfaces - used in qsort
262 *******************************************************************/
264 static int ip_service_compare(struct ip_service
*ip1
, struct ip_service
*ip2
)
268 if ( (result
= ip_compare(&ip1
->ip
, &ip2
->ip
)) != 0 )
271 if ( ip1
->port
> ip2
->port
)
274 if ( ip1
->port
< ip2
->port
)
281 sort an IP list so that names that are close to one of our interfaces
282 are at the top. This prevents the problem where a WINS server returns an IP that
283 is not reachable from our subnet as the first match
286 static void sort_ip_list(struct in_addr
*iplist
, int count
)
292 qsort(iplist
, count
, sizeof(struct in_addr
), QSORT_CAST ip_compare
);
295 void sort_ip_list2(struct ip_service
*iplist
, int count
)
301 qsort(iplist
, count
, sizeof(struct ip_service
), QSORT_CAST ip_service_compare
);
304 /**********************************************************************
305 Remove any duplicate address/port pairs in the list
306 *********************************************************************/
308 static int remove_duplicate_addrs2( struct ip_service
*iplist
, int count
)
312 DEBUG(10,("remove_duplicate_addrs2: looking for duplicate address/port pairs\n"));
314 /* one loop to remove duplicates */
315 for ( i
=0; i
<count
; i
++ ) {
316 if ( is_zero_ip(iplist
[i
].ip
) )
319 for ( j
=i
+1; j
<count
; j
++ ) {
320 if ( ip_service_equal(iplist
[i
], iplist
[j
]) )
321 zero_ip(&iplist
[j
].ip
);
325 /* one loop to clean up any holes we left */
326 /* first ip should never be a zero_ip() */
327 for (i
= 0; i
<count
; ) {
328 if ( is_zero_ip(iplist
[i
].ip
) ) {
330 memmove(&iplist
[i
], &iplist
[i
+1], (count
- i
- 1)*sizeof(iplist
[i
]));
340 /****************************************************************************
341 Do a netbios name query to find someones IP.
342 Returns an array of IP addresses or NULL if none.
343 *count will be set to the number of addresses returned.
344 *timed_out is set if we failed by timing out
345 ****************************************************************************/
347 struct in_addr
*name_query(int fd
,const char *name
,int name_type
,
348 BOOL bcast
,BOOL recurse
,
349 struct in_addr to_ip
, int *count
, int *flags
,
354 int retry_time
= bcast
?250:2000;
356 struct packet_struct p
;
357 struct packet_struct
*p2
;
358 struct nmb_packet
*nmb
= &p
.packet
.nmb
;
359 struct in_addr
*ip_list
= NULL
;
361 if (lp_disable_netbios()) {
362 DEBUG(5,("name_query(%s#%02x): netbios is disabled\n", name
, name_type
));
370 memset((char *)&p
,'\0',sizeof(p
));
374 nmb
->header
.name_trn_id
= generate_trn_id();
375 nmb
->header
.opcode
= 0;
376 nmb
->header
.response
= False
;
377 nmb
->header
.nm_flags
.bcast
= bcast
;
378 nmb
->header
.nm_flags
.recursion_available
= False
;
379 nmb
->header
.nm_flags
.recursion_desired
= recurse
;
380 nmb
->header
.nm_flags
.trunc
= False
;
381 nmb
->header
.nm_flags
.authoritative
= False
;
382 nmb
->header
.rcode
= 0;
383 nmb
->header
.qdcount
= 1;
384 nmb
->header
.ancount
= 0;
385 nmb
->header
.nscount
= 0;
386 nmb
->header
.arcount
= 0;
388 make_nmb_name(&nmb
->question
.question_name
,name
,name_type
);
390 nmb
->question
.question_type
= 0x20;
391 nmb
->question
.question_class
= 0x1;
396 p
.timestamp
= time(NULL
);
397 p
.packet_type
= NMB_PACKET
;
401 if (!send_packet(&p
))
407 struct timeval tval2
;
408 struct in_addr
*tmp_ip_list
;
410 GetTimeOfDay(&tval2
);
411 if (TvalDiff(&tval
,&tval2
) > retry_time
) {
414 if (!found
&& !send_packet(&p
))
420 if ((p2
=receive_nmb_packet(fd
,90,nmb
->header
.name_trn_id
))) {
421 struct nmb_packet
*nmb2
= &p2
->packet
.nmb
;
422 debug_nmb_packet(p2
);
424 /* If we get a Negative Name Query Response from a WINS
425 * server, we should report it and give up.
427 if( 0 == nmb2
->header
.opcode
/* A query response */
428 && !(bcast
) /* from a WINS server */
429 && nmb2
->header
.rcode
/* Error returned */
432 if( DEBUGLVL( 3 ) ) {
433 /* Only executed if DEBUGLEVEL >= 3 */
434 dbgtext( "Negative name query response, rcode 0x%02x: ", nmb2
->header
.rcode
);
435 switch( nmb2
->header
.rcode
) {
437 dbgtext( "Request was invalidly formatted.\n" );
440 dbgtext( "Problem with NBNS, cannot process name.\n");
443 dbgtext( "The name requested does not exist.\n" );
446 dbgtext( "Unsupported request error.\n" );
449 dbgtext( "Query refused error.\n" );
452 dbgtext( "Unrecognized error code.\n" );
460 if (nmb2
->header
.opcode
!= 0 ||
461 nmb2
->header
.nm_flags
.bcast
||
462 nmb2
->header
.rcode
||
463 !nmb2
->header
.ancount
) {
465 * XXXX what do we do with this? Could be a
466 * redirect, but we'll discard it for the
473 tmp_ip_list
= (struct in_addr
*)Realloc( ip_list
, sizeof( ip_list
[0] )
474 * ( (*count
) + nmb2
->answers
->rdlength
/6 ) );
477 DEBUG(0,("name_query: Realloc failed.\n"));
481 ip_list
= tmp_ip_list
;
484 DEBUG(2,("Got a positive name query response from %s ( ", inet_ntoa(p2
->ip
)));
485 for (i
=0;i
<nmb2
->answers
->rdlength
/6;i
++) {
486 putip((char *)&ip_list
[(*count
)],&nmb2
->answers
->rdata
[2+i
*6]);
487 DEBUGADD(2,("%s ",inet_ntoa(ip_list
[(*count
)])));
495 /* We add the flags back ... */
496 if (nmb2
->header
.response
)
497 (*flags
) |= NM_FLAGS_RS
;
498 if (nmb2
->header
.nm_flags
.authoritative
)
499 (*flags
) |= NM_FLAGS_AA
;
500 if (nmb2
->header
.nm_flags
.trunc
)
501 (*flags
) |= NM_FLAGS_TC
;
502 if (nmb2
->header
.nm_flags
.recursion_desired
)
503 (*flags
) |= NM_FLAGS_RD
;
504 if (nmb2
->header
.nm_flags
.recursion_available
)
505 (*flags
) |= NM_FLAGS_RA
;
506 if (nmb2
->header
.nm_flags
.bcast
)
507 (*flags
) |= NM_FLAGS_B
;
510 * If we're doing a unicast lookup we only
511 * expect one reply. Don't wait the full 2
512 * seconds if we got one. JRA.
519 /* only set timed_out if we didn't fund what we where looking for*/
521 if ( !found
&& timed_out
) {
525 /* sort the ip list so we choose close servers first if possible */
526 sort_ip_list(ip_list
, *count
);
531 /********************************************************
532 Start parsing the lmhosts file.
533 *********************************************************/
535 XFILE
*startlmhosts(char *fname
)
537 XFILE
*fp
= x_fopen(fname
,O_RDONLY
, 0);
539 DEBUG(4,("startlmhosts: Can't open lmhosts file %s. Error was %s\n",
540 fname
, strerror(errno
)));
546 /********************************************************
547 Parse the next line in the lmhosts file.
548 *********************************************************/
550 BOOL
getlmhostsent( XFILE
*fp
, pstring name
, int *name_type
, struct in_addr
*ipaddr
)
554 while(!x_feof(fp
) && !x_ferror(fp
)) {
555 pstring ip
,flags
,extra
;
562 if (!fgets_slash(line
,sizeof(pstring
),fp
))
574 if (next_token(&ptr
,ip
,NULL
,sizeof(ip
)))
576 if (next_token(&ptr
,name
,NULL
, sizeof(pstring
)))
578 if (next_token(&ptr
,flags
,NULL
, sizeof(flags
)))
580 if (next_token(&ptr
,extra
,NULL
, sizeof(extra
)))
586 if (count
> 0 && count
< 2)
588 DEBUG(0,("getlmhostsent: Ill formed hosts line [%s]\n",line
));
594 DEBUG(0,("getlmhostsent: too many columns in lmhosts file (obsolete syntax)\n"));
598 DEBUG(4, ("getlmhostsent: lmhost entry: %s %s %s\n", ip
, name
, flags
));
600 if (strchr_m(flags
,'G') || strchr_m(flags
,'S'))
602 DEBUG(0,("getlmhostsent: group flag in lmhosts ignored (obsolete)\n"));
606 *ipaddr
= *interpret_addr2(ip
);
608 /* Extra feature. If the name ends in '#XX', where XX is a hex number,
609 then only add that name type. */
610 if((ptr1
= strchr_m(name
, '#')) != NULL
)
615 *name_type
= (int)strtol(ptr1
, &endptr
, 16);
617 if(!*ptr1
|| (endptr
== ptr1
))
619 DEBUG(0,("getlmhostsent: invalid name %s containing '#'.\n", name
));
623 *(--ptr1
) = '\0'; /* Truncate at the '#' */
632 /********************************************************
633 Finish parsing the lmhosts file.
634 *********************************************************/
636 void endlmhosts(XFILE
*fp
)
641 /********************************************************
642 convert an array if struct in_addrs to struct ip_service
643 return False on failure. Port is set to PORT_NONE;
644 *********************************************************/
646 static BOOL
convert_ip2service( struct ip_service
**return_iplist
, struct in_addr
*ip_list
, int count
)
650 if ( count
==0 || !ip_list
)
653 /* copy the ip address; port will be PORT_NONE */
654 if ( (*return_iplist
= (struct ip_service
*)malloc(count
*sizeof(struct ip_service
))) == NULL
) {
655 DEBUG(0,("convert_ip2service: malloc failed for %d enetries!\n", count
));
659 for ( i
=0; i
<count
; i
++ ) {
660 (*return_iplist
)[i
].ip
= ip_list
[i
];
661 (*return_iplist
)[i
].port
= PORT_NONE
;
666 /********************************************************
667 Resolve via "bcast" method.
668 *********************************************************/
670 BOOL
name_resolve_bcast(const char *name
, int name_type
,
671 struct ip_service
**return_iplist
, int *return_count
)
674 int num_interfaces
= iface_count();
675 struct in_addr
*ip_list
;
678 if (lp_disable_netbios()) {
679 DEBUG(5,("name_resolve_bcast(%s#%02x): netbios is disabled\n", name
, name_type
));
683 *return_iplist
= NULL
;
687 * "bcast" means do a broadcast lookup on all the local interfaces.
690 DEBUG(3,("name_resolve_bcast: Attempting broadcast lookup for name %s<0x%x>\n", name
, name_type
));
692 sock
= open_socket_in( SOCK_DGRAM
, 0, 3,
693 interpret_addr(lp_socket_address()), True
);
695 if (sock
== -1) return False
;
697 set_socket_options(sock
,"SO_BROADCAST");
699 * Lookup the name on all the interfaces, return on
700 * the first successful match.
702 for( i
= num_interfaces
-1; i
>= 0; i
--) {
703 struct in_addr sendto_ip
;
705 /* Done this way to fix compiler error on IRIX 5.x */
706 sendto_ip
= *iface_n_bcast(i
);
707 ip_list
= name_query(sock
, name
, name_type
, True
,
708 True
, sendto_ip
, return_count
, &flags
, NULL
);
713 /* failed - no response */
720 if ( !convert_ip2service(return_iplist
, ip_list
, *return_count
) )
723 SAFE_FREE( ip_list
);
728 /********************************************************
729 Resolve via "wins" method.
730 *********************************************************/
732 BOOL
resolve_wins(const char *name
, int name_type
,
733 struct ip_service
**return_iplist
, int *return_count
)
737 struct in_addr src_ip
, *ip_list
= NULL
;
740 if (lp_disable_netbios()) {
741 DEBUG(5,("resolve_wins(%s#%02x): netbios is disabled\n", name
, name_type
));
745 *return_iplist
= NULL
;
748 DEBUG(3,("resolve_wins: Attempting wins lookup for name %s<0x%x>\n", name
, name_type
));
750 if (wins_srv_count() < 1) {
751 DEBUG(3,("resolve_wins: WINS server resolution selected and no WINS servers listed.\n"));
755 /* we try a lookup on each of the WINS tags in turn */
756 wins_tags
= wins_srv_tags();
759 /* huh? no tags?? give up in disgust */
763 /* the address we will be sending from */
764 src_ip
= *interpret_addr2(lp_socket_address());
766 /* in the worst case we will try every wins server with every
768 for (t
=0; wins_tags
&& wins_tags
[t
]; t
++) {
769 int srv_count
= wins_srv_count_tag(wins_tags
[t
]);
770 for (i
=0; i
<srv_count
; i
++) {
771 struct in_addr wins_ip
;
775 wins_ip
= wins_srv_ip_tag(wins_tags
[t
], src_ip
);
777 if (global_in_nmbd
&& ismyip(wins_ip
)) {
778 /* yikes! we'll loop forever */
782 /* skip any that have been unresponsive lately */
783 if (wins_srv_is_dead(wins_ip
, src_ip
)) {
787 DEBUG(3,("resolve_wins: using WINS server %s and tag '%s'\n", inet_ntoa(wins_ip
), wins_tags
[t
]));
789 sock
= open_socket_in(SOCK_DGRAM
, 0, 3, src_ip
.s_addr
, True
);
794 ip_list
= name_query(sock
,name
,name_type
, False
,
795 True
, wins_ip
, return_count
, &flags
,
798 /* exit loop if we got a list of addresses */
806 /* Timed out wating for WINS server to respond. Mark it dead. */
807 wins_srv_died(wins_ip
, src_ip
);
809 /* The name definately isn't in this
810 group of WINS servers. goto the next group */
816 wins_srv_tags_free(wins_tags
);
821 if ( !convert_ip2service( return_iplist
, ip_list
, *return_count
) )
824 SAFE_FREE( ip_list
);
825 wins_srv_tags_free(wins_tags
);
831 /********************************************************
832 Resolve via "lmhosts" method.
833 *********************************************************/
835 static BOOL
resolve_lmhosts(const char *name
, int name_type
,
836 struct ip_service
**return_iplist
, int *return_count
)
839 * "lmhosts" means parse the local lmhosts file.
845 struct in_addr return_ip
;
847 *return_iplist
= NULL
;
850 DEBUG(3,("resolve_lmhosts: Attempting lmhosts lookup for name %s<0x%x>\n", name
, name_type
));
852 fp
= startlmhosts(dyn_LMHOSTSFILE
);
854 while (getlmhostsent(fp
, lmhost_name
, &name_type2
, &return_ip
)) {
855 if (strequal(name
, lmhost_name
) &&
856 ((name_type2
== -1) || (name_type
== name_type2
))
859 if ( (*return_iplist
= (struct ip_service
*)malloc(sizeof(struct ip_service
))) == NULL
) {
860 DEBUG(3,("resolve_lmhosts: malloc fail !\n"));
863 (*return_iplist
)[0].ip
= return_ip
;
864 (*return_iplist
)[0].port
= PORT_NONE
;
875 /********************************************************
876 Resolve via "hosts" method.
877 *********************************************************/
879 static BOOL
resolve_hosts(const char *name
, int name_type
,
880 struct ip_service
**return_iplist
, int *return_count
)
883 * "host" means do a localhost, or dns lookup.
888 if ( name_type
== 0x1c ) {
894 /* try to lookup the _ldap._tcp.<domain> if we are using ADS */
895 if ( lp_security() != SEC_ADS
)
898 DEBUG(5,("resolve_hosts: Attempting to resolve DC's for %s using DNS\n",
901 if (ldap_domain2hostlist(name
, &list
) != LDAP_SUCCESS
)
904 count
= count_chars(list
, ' ') + 1;
905 if ( (*return_iplist
= malloc(count
* sizeof(struct ip_service
))) == NULL
) {
906 DEBUG(0,("resolve_hosts: malloc failed for %d entries\n", count
));
911 while (next_token(&ptr
, tok
, " ", sizeof(tok
))) {
912 unsigned port
= LDAP_PORT
;
913 char *p
= strchr(tok
, ':');
918 (*return_iplist
)[i
].ip
= *interpret_addr2(tok
);
919 (*return_iplist
)[i
].port
= port
;
921 /* make sure it is a valid IP. I considered checking the negative
922 connection cache, but this is the wrong place for it. Maybe only
923 as a hac. After think about it, if all of the IP addresses retuend
924 from DNS are dead, what hope does a netbios name lookup have?
925 The standard reason for falling back to netbios lookups is that
926 our DNS server doesn't know anything about the DC's -- jerry */
928 if ( is_zero_ip((*return_iplist
)[i
].ip
) )
939 #endif /* HAVE_ADS */
941 *return_iplist
= NULL
;
944 DEBUG(3,("resolve_hosts: Attempting host lookup for name %s<0x20>\n", name
));
946 if (((hp
= sys_gethostbyname(name
)) != NULL
) && (hp
->h_addr
!= NULL
)) {
947 struct in_addr return_ip
;
948 putip((char *)&return_ip
,(char *)hp
->h_addr
);
949 *return_iplist
= (struct ip_service
*)malloc(sizeof(struct ip_service
));
950 if(*return_iplist
== NULL
) {
951 DEBUG(3,("resolve_hosts: malloc fail !\n"));
954 (*return_iplist
)->ip
= return_ip
;
955 (*return_iplist
)->port
= PORT_NONE
;
962 /*******************************************************************
963 Internal interface to resolve a name into an IP address.
964 Use this function if the string is either an IP address, DNS
965 or host name or NetBIOS name. This uses the name switch in the
966 smb.conf to determine the order of name resolution.
968 Added support for ip addr/port to support ADS ldap servers.
969 the only place we currently care about the port is in the
970 resolve_hosts() when looking up DC's via SRV RR entries in DNS
971 **********************************************************************/
973 static BOOL
internal_resolve_name(const char *name
, int name_type
,
974 struct ip_service
**return_iplist
,
975 int *return_count
, const char *resolve_order
)
977 pstring name_resolve_list
;
980 BOOL allones
= (strcmp(name
,"255.255.255.255") == 0);
981 BOOL allzeros
= (strcmp(name
,"0.0.0.0") == 0);
982 BOOL is_address
= is_ipaddress(name
);
986 *return_iplist
= NULL
;
989 DEBUG(10, ("internal_resolve_name: looking up %s#%x\n", name
, name_type
));
991 if (allzeros
|| allones
|| is_address
) {
993 if ( (*return_iplist
= (struct ip_service
*)malloc(sizeof(struct ip_service
))) == NULL
) {
994 DEBUG(0,("internal_resolve_name: malloc fail !\n"));
999 /* ignore the port here */
1000 (*return_iplist
)->port
= PORT_NONE
;
1002 /* if it's in the form of an IP address then get the lib to interpret it */
1003 if (((*return_iplist
)->ip
.s_addr
= inet_addr(name
)) == 0xFFFFFFFF ){
1004 DEBUG(1,("internal_resolve_name: inet_addr failed on %s\n", name
));
1008 (*return_iplist
)->ip
.s_addr
= allones
? 0xFFFFFFFF : 0;
1014 /* Check name cache */
1016 if (namecache_fetch(name
, name_type
, return_iplist
, return_count
)) {
1017 /* This could be a negative response */
1018 return (*return_count
> 0);
1021 /* set the name resolution order */
1023 if ( !resolve_order
)
1024 pstrcpy(name_resolve_list
, lp_name_resolve_order());
1026 pstrcpy(name_resolve_list
, resolve_order
);
1028 if ( !name_resolve_list
[0] )
1031 ptr
= name_resolve_list
;
1033 /* iterate through the name resolution backends */
1035 while (next_token(&ptr
, tok
, LIST_SEP
, sizeof(tok
))) {
1036 if((strequal(tok
, "host") || strequal(tok
, "hosts"))) {
1037 /* deal with 0x20 & 0x1c names here. The latter will result
1038 in a SRV record lookup for _ldap._tcp.<domain> if we are using
1040 if ( name_type
==0x20 || name_type
== 0x1c ) {
1041 if (resolve_hosts(name
, name_type
, return_iplist
, return_count
)) {
1046 } else if(strequal( tok
, "lmhosts")) {
1047 if (resolve_lmhosts(name
, name_type
, return_iplist
, return_count
)) {
1051 } else if(strequal( tok
, "wins")) {
1052 /* don't resolve 1D via WINS */
1053 if (name_type
!= 0x1D &&
1054 resolve_wins(name
, name_type
, return_iplist
, return_count
)) {
1058 } else if(strequal( tok
, "bcast")) {
1059 if (name_resolve_bcast(name
, name_type
, return_iplist
, return_count
)) {
1064 DEBUG(0,("resolve_name: unknown name switch type %s\n", tok
));
1068 /* All of the resolve_* functions above have returned false. */
1070 SAFE_FREE(*return_iplist
);
1077 /* Remove duplicate entries. Some queries, notably #1c (domain
1078 controllers) return the PDC in iplist[0] and then all domain
1079 controllers including the PDC in iplist[1..n]. Iterating over
1080 the iplist when the PDC is down will cause two sets of timeouts. */
1082 if ( *return_count
) {
1083 *return_count
= remove_duplicate_addrs2( *return_iplist
, *return_count
);
1086 /* Save in name cache */
1087 if ( DEBUGLEVEL
>= 100 ) {
1088 for (i
= 0; i
< *return_count
&& DEBUGLEVEL
== 100; i
++)
1089 DEBUG(100, ("Storing name %s of type %d (%s:%d)\n", name
,
1090 name_type
, inet_ntoa((*return_iplist
)[i
].ip
), (*return_iplist
)[i
].port
));
1093 namecache_store(name
, name_type
, *return_count
, *return_iplist
);
1095 /* Display some debugging info */
1097 if ( DEBUGLEVEL
>= 10 ) {
1098 DEBUG(10, ("internal_resolve_name: returning %d addresses: ",
1101 for (i
= 0; i
< *return_count
; i
++)
1102 DEBUGADD(10, ("%s:%d ", inet_ntoa((*return_iplist
)[i
].ip
), (*return_iplist
)[i
].port
));
1110 /********************************************************
1111 Internal interface to resolve a name into one IP address.
1112 Use this function if the string is either an IP address, DNS
1113 or host name or NetBIOS name. This uses the name switch in the
1114 smb.conf to determine the order of name resolution.
1115 *********************************************************/
1117 BOOL
resolve_name(const char *name
, struct in_addr
*return_ip
, int name_type
)
1119 struct ip_service
*ip_list
= NULL
;
1122 if (is_ipaddress(name
)) {
1123 *return_ip
= *interpret_addr2(name
);
1127 if (internal_resolve_name(name
, name_type
, &ip_list
, &count
, lp_name_resolve_order())) {
1130 /* only return valid addresses for TCP connections */
1131 for (i
=0; i
<count
; i
++) {
1132 char *ip_str
= inet_ntoa(ip_list
[i
].ip
);
1134 strcmp(ip_str
, "255.255.255.255") != 0 &&
1135 strcmp(ip_str
, "0.0.0.0") != 0)
1137 *return_ip
= ip_list
[i
].ip
;
1148 /********************************************************
1149 Find the IP address of the master browser or DMB for a workgroup.
1150 *********************************************************/
1152 BOOL
find_master_ip(const char *group
, struct in_addr
*master_ip
)
1154 struct ip_service
*ip_list
= NULL
;
1157 if (lp_disable_netbios()) {
1158 DEBUG(5,("find_master_ip(%s): netbios is disabled\n", group
));
1162 if (internal_resolve_name(group
, 0x1D, &ip_list
, &count
, lp_name_resolve_order())) {
1163 *master_ip
= ip_list
[0].ip
;
1167 if(internal_resolve_name(group
, 0x1B, &ip_list
, &count
, lp_name_resolve_order())) {
1168 *master_ip
= ip_list
[0].ip
;
1177 /********************************************************
1178 Get the IP address list of the primary domain controller
1180 *********************************************************/
1182 BOOL
get_pdc_ip(const char *domain
, struct in_addr
*ip
)
1184 struct ip_service
*ip_list
;
1187 /* Look up #1B name */
1189 if (!internal_resolve_name(domain
, 0x1b, &ip_list
, &count
, lp_name_resolve_order()))
1192 /* if we get more than 1 IP back we have to assume it is a
1193 multi-homed PDC and not a mess up */
1196 DEBUG(6,("get_pdc_ip: PDC has %d IP addresses!\n", count
));
1197 sort_ip_list2( ip_list
, count
);
1200 *ip
= ip_list
[0].ip
;
1207 /*********************************************************************
1208 small wrapper function to get the DC list and sort it if neccessary
1209 *********************************************************************/
1210 BOOL
get_sorted_dc_list( const char *domain
, struct ip_service
**ip_list
, int *count
, BOOL dns_only
)
1214 DEBUG(8,("get_sorted_dc_list: attempting lookup using [%s]\n",
1215 (dns_only
? "hosts" : lp_name_resolve_order())));
1217 if ( !get_dc_list(domain
, ip_list
, count
, dns_only
, &ordered
) )
1220 /* only sort if we don't already have an ordered list */
1222 sort_ip_list2( *ip_list
, *count
);
1227 /********************************************************
1228 Get the IP address list of the domain controllers for
1230 *********************************************************/
1232 BOOL
get_dc_list(const char *domain
, struct ip_service
**ip_list
,
1233 int *count
, BOOL dns_only
, int *ordered
)
1235 /* defined the name resolve order to internal_name_resolve()
1236 only used for looking up 0x1c names */
1237 const char *resolve_oder
= (dns_only
? "hosts" : lp_name_resolve_order());
1241 /* If it's our domain then use the 'password server' parameter. */
1243 if ( strequal(domain
, lp_workgroup()) || strequal(domain
, lp_realm()) ) {
1245 char *pserver
= lp_passwordserver(); /* UNIX charset. */
1249 int num_addresses
= 0;
1250 int local_count
, i
, j
;
1251 struct ip_service
*return_iplist
= NULL
;
1252 struct ip_service
*auto_ip_list
= NULL
;
1253 BOOL done_auto_lookup
= False
;
1258 return internal_resolve_name(domain
, 0x1C, ip_list
, count
, resolve_oder
);
1263 * if '*' appears in the "password server" list then add
1264 * an auto lookup to the list of manually configured
1265 * DC's. If any DC is listed by name, then the list should be
1266 * considered to be ordered
1269 while (next_token(&p
,name
,LIST_SEP
,sizeof(name
))) {
1270 if (strequal(name
, "*")) {
1271 if ( internal_resolve_name(domain
, 0x1C, &auto_ip_list
, &auto_count
, resolve_oder
) )
1272 num_addresses
+= auto_count
;
1273 done_auto_lookup
= True
;
1274 DEBUG(8,("Adding %d DC's from auto lookup\n", auto_count
));
1280 /* if we have no addresses and haven't done the auto lookup, then
1281 just return the list of DC's */
1283 if ( (num_addresses
== 0) && !done_auto_lookup
)
1284 return internal_resolve_name(domain
, 0x1C, ip_list
, count
, resolve_oder
);
1286 /* maybe we just failed? */
1288 if ( num_addresses
== 0 ) {
1289 DEBUG(4,("get_dc_list: no servers found\n"));
1293 if ( (return_iplist
= (struct ip_service
*)
1294 malloc(num_addresses
* sizeof(struct ip_service
))) == NULL
)
1296 DEBUG(3,("get_dc_list: malloc fail !\n"));
1303 /* fill in the return list now with real IP's */
1305 while ( (local_count
<num_addresses
) && next_token(&p
,name
,LIST_SEP
,sizeof(name
)) ) {
1306 struct in_addr name_ip
;
1308 /* copy any addersses from the auto lookup */
1310 if ( strequal(name
, "*") ) {
1311 for ( j
=0; j
<auto_count
; j
++ ) {
1312 return_iplist
[local_count
].ip
= auto_ip_list
[j
].ip
;
1313 return_iplist
[local_count
].port
= auto_ip_list
[j
].port
;
1320 /* added support for address:port syntax for ads (not that I think
1321 anyone will ever run the LDAP server in an AD domain on something
1322 other than port 389 */
1324 port
= (lp_security() == SEC_ADS
) ? LDAP_PORT
: PORT_NONE
;
1325 if ( (port_str
=strchr(name
, ':')) != NULL
) {
1328 port
= atoi( port_str
);
1331 /* explicit lookup; resolve_name() will handle names & IP addresses */
1332 if ( resolve_name( name
, &name_ip
, 0x20 ) ) {
1333 return_iplist
[local_count
].ip
= name_ip
;
1334 return_iplist
[local_count
].port
= port
;
1340 SAFE_FREE(auto_ip_list
);
1342 /* need to remove duplicates in the list if we have any
1343 explicit password servers */
1346 local_count
= remove_duplicate_addrs2( return_iplist
, local_count
);
1348 if ( DEBUGLEVEL
>= 4 ) {
1349 DEBUG(4,("get_dc_list: returning %d ip addresses in an %sordered list\n", local_count
,
1350 *ordered
? "":"un"));
1351 DEBUG(4,("get_dc_list: "));
1352 for ( i
=0; i
<local_count
; i
++ )
1353 DEBUGADD(4,("%s:%d ", inet_ntoa(return_iplist
[i
].ip
), return_iplist
[i
].port
));
1357 *ip_list
= return_iplist
;
1358 *count
= local_count
;
1360 return (*count
!= 0);
1363 DEBUG(10,("get_dc_list: defaulting to internal auto lookup for domain %s\n", domain
));
1365 return internal_resolve_name(domain
, 0x1C, ip_list
, count
, resolve_oder
);