svn commit: samba r17881 - in branches/SAMBA_3_0/source: libads libsmb nsswitch utils

vlendec at samba.org vlendec at samba.org
Mon Aug 28 09:19:30 GMT 2006


Author: vlendec
Date: 2006-08-28 09:19:30 +0000 (Mon, 28 Aug 2006)
New Revision: 17881

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17881

Log:
Another microstep towards better error reporting: Make get_sorted_dc_list
return NTSTATUS.

If we want to differentiate different name resolution problems we might want
to introduce yet another error class for Samba-internal errors. Things like no
route to host to the WINS server, a DNS server explicitly said host not found
etc might be worth passing up. 

Because we can not stash everything into the existing NT_STATUS codes, what
about a Samba-specific error class like NT_STATUS_DOS and NT_STATUS_LDAP?

Volker


Modified:
   branches/SAMBA_3_0/source/libads/ldap.c
   branches/SAMBA_3_0/source/libsmb/namequery.c
   branches/SAMBA_3_0/source/libsmb/namequery_dc.c
   branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c
   branches/SAMBA_3_0/source/utils/net_lookup.c


Changeset:
Modified: branches/SAMBA_3_0/source/libads/ldap.c
===================================================================
--- branches/SAMBA_3_0/source/libads/ldap.c	2006-08-28 07:56:15 UTC (rev 17880)
+++ branches/SAMBA_3_0/source/libads/ldap.c	2006-08-28 09:19:30 UTC (rev 17881)
@@ -182,7 +182,7 @@
  disabled
 **********************************************************************/
 
-static BOOL ads_find_dc(ADS_STRUCT *ads)
+static NTSTATUS ads_find_dc(ADS_STRUCT *ads)
 {
 	const char *c_realm;
 	int count, i=0;
@@ -190,6 +190,7 @@
 	pstring realm;
 	BOOL got_realm = False;
 	BOOL use_own_domain = False;
+	NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
 
 	/* if the realm and workgroup are both empty, assume they are ours */
 
@@ -220,7 +221,7 @@
 		
 		if ( !c_realm || !*c_realm ) {
 			DEBUG(0,("ads_find_dc: no realm or workgroup!  Don't know what to do\n"));
-			return False;
+			return NT_STATUS_INVALID_PARAMETER; /* rather need MISSING_PARAMETER ... */
 		}
 	}
 	
@@ -229,14 +230,15 @@
 	DEBUG(6,("ads_find_dc: looking for %s '%s'\n", 
 		(got_realm ? "realm" : "domain"), realm));
 
-	if ( !get_sorted_dc_list(realm, &ip_list, &count, got_realm) ) {
+	status = get_sorted_dc_list(realm, &ip_list, &count, got_realm);
+	if (!NT_STATUS_IS_OK(status)) {
 		/* fall back to netbios if we can */
 		if ( got_realm && !lp_disable_netbios() ) {
 			got_realm = False;
 			goto again;
 		}
 		
-		return False;
+		return status;
 	}
 			
 	/* if we fail this loop, then giveup since all the IP addresses returned were dead */
@@ -250,7 +252,7 @@
 			
 		if ( ads_try_connect(ads, server) ) {
 			SAFE_FREE(ip_list);
-			return True;
+			return NT_STATUS_OK;
 		}
 		
 		/* keep track of failures */
@@ -259,7 +261,7 @@
 
 	SAFE_FREE(ip_list);
 	
-	return False;
+	return NT_STATUS_NO_LOGON_SERVERS;
 }
 
 
@@ -272,6 +274,7 @@
 {
 	int version = LDAP_VERSION3;
 	ADS_STATUS status;
+	NTSTATUS ntstatus;
 
 	ads->last_attempt = time(NULL);
 	ads->ld = NULL;
@@ -283,11 +286,12 @@
 		goto got_connection;
 	}
 
-	if (ads_find_dc(ads)) {
+	ntstatus = ads_find_dc(ads);
+	if (NT_STATUS_IS_OK(ntstatus)) {
 		goto got_connection;
 	}
 
-	return ADS_ERROR_NT(NT_STATUS_NO_LOGON_SERVERS);
+	return ADS_ERROR_NT(ntstatus);
 
 got_connection:
 	DEBUG(3,("Connected to LDAP server %s\n", inet_ntoa(ads->ldap_ip)));

Modified: branches/SAMBA_3_0/source/libsmb/namequery.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/namequery.c	2006-08-28 07:56:15 UTC (rev 17880)
+++ branches/SAMBA_3_0/source/libsmb/namequery.c	2006-08-28 09:19:30 UTC (rev 17881)
@@ -1360,8 +1360,8 @@
  a domain.
 *********************************************************/
 
-static BOOL get_dc_list(const char *domain, struct ip_service **ip_list, 
-                 int *count, BOOL ads_only, int *ordered)
+static NTSTATUS get_dc_list(const char *domain, struct ip_service **ip_list, 
+                            int *count, BOOL ads_only, int *ordered)
 {
 	fstring resolve_order;
 	char *saf_servername;
@@ -1419,7 +1419,14 @@
 
 	if ( !*pserver ) {
 		DEBUG(10,("get_dc_list: no preferred domain controllers.\n"));
-		return internal_resolve_name(domain, 0x1C, ip_list, count, resolve_order);
+		/* TODO: change return type of internal_resolve_name to
+		 * NTSTATUS */
+		if (internal_resolve_name(domain, 0x1C, ip_list, count,
+					  resolve_order)) {
+			return NT_STATUS_OK;
+		} else {
+			return NT_STATUS_NO_LOGON_SERVERS;
+		}
 	}
 
 	DEBUG(3,("get_dc_list: preferred server list: \"%s\"\n", pserver ));
@@ -1434,7 +1441,8 @@
 	p = pserver;
 	while (next_token(&p,name,LIST_SEP,sizeof(name))) {
 		if (strequal(name, "*")) {
-			if ( internal_resolve_name(domain, 0x1C, &auto_ip_list, &auto_count, resolve_order) )
+			if (internal_resolve_name(domain, 0x1C, &auto_ip_list,
+						  &auto_count, resolve_order))
 				num_addresses += auto_count;
 			done_auto_lookup = True;
 			DEBUG(8,("Adding %d DC's from auto lookup\n", auto_count));
@@ -1448,16 +1456,20 @@
 		   
 	if ( (num_addresses == 0) ) {
 		if ( !done_auto_lookup ) {
-			return internal_resolve_name(domain, 0x1C, ip_list, count, resolve_order);
+			if (internal_resolve_name(domain, 0x1C, ip_list, count, resolve_order)) {
+				return NT_STATUS_OK;
+			} else {
+				return NT_STATUS_NO_LOGON_SERVERS;
+			}
 		} else {
 			DEBUG(4,("get_dc_list: no servers found\n")); 
-			return False;
+			return NT_STATUS_NO_LOGON_SERVERS;
 		}
 	}
 
 	if ( (return_iplist = SMB_MALLOC_ARRAY(struct ip_service, num_addresses)) == NULL ) {
 		DEBUG(3,("get_dc_list: malloc fail !\n"));
-		return False;
+		return NT_STATUS_NO_MEMORY;
 	}
 
 	p = pserver;
@@ -1535,22 +1547,24 @@
 	*ip_list = return_iplist;
 	*count = local_count;
 
-	return (*count != 0);
+	return ( *count != 0 ? NT_STATUS_OK : NT_STATUS_NO_LOGON_SERVERS );
 }
 
 /*********************************************************************
  Small wrapper function to get the DC list and sort it if neccessary.
 *********************************************************************/
 
-BOOL get_sorted_dc_list( const char *domain, struct ip_service **ip_list, int *count, BOOL ads_only )
+NTSTATUS get_sorted_dc_list( const char *domain, struct ip_service **ip_list, int *count, BOOL ads_only )
 {
 	BOOL ordered;
+	NTSTATUS status;
 	
 	DEBUG(8,("get_sorted_dc_list: attempting lookup using [%s]\n",
 		(ads_only ? "ads" : lp_name_resolve_order())));
 	
-	if ( !get_dc_list(domain, ip_list, count, ads_only, &ordered) ) {
-		return False; 
+	status = get_dc_list(domain, ip_list, count, ads_only, &ordered);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status; 
 	}
 		
 	/* only sort if we don't already have an ordered list */
@@ -1558,5 +1572,5 @@
 		sort_ip_list2( *ip_list, *count );
 	}
 		
-	return True;
+	return NT_STATUS_OK;
 }

Modified: branches/SAMBA_3_0/source/libsmb/namequery_dc.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/namequery_dc.c	2006-08-28 07:56:15 UTC (rev 17880)
+++ branches/SAMBA_3_0/source/libsmb/namequery_dc.c	2006-08-28 09:19:30 UTC (rev 17881)
@@ -81,7 +81,8 @@
 
 	/* get a list of all domain controllers */
 	
-	if ( !get_sorted_dc_list(domain, &ip_list, &count, False) ) {
+	if (!NT_STATUS_IS_OK(get_sorted_dc_list(domain, &ip_list, &count,
+						False))) {
 		DEBUG(3, ("Could not look up dc's for domain %s\n", domain));
 		return False;
 	}

Modified: branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c
===================================================================
--- branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c	2006-08-28 07:56:15 UTC (rev 17880)
+++ branches/SAMBA_3_0/source/nsswitch/winbindd_rpc.c	2006-08-28 09:19:30 UTC (rev 17881)
@@ -774,7 +774,8 @@
 	struct ip_service *ip_list = NULL;
 	int count;
 	
-	if ( !get_sorted_dc_list(domain, &ip_list, &count, False) ) {
+	if ( !NT_STATUS_IS_OK(get_sorted_dc_list(domain, &ip_list, &count,
+						 False)) ) {
 		DEBUG(3, ("Could not look up dc's for domain %s\n", domain));
 		return False;
 	}

Modified: branches/SAMBA_3_0/source/utils/net_lookup.c
===================================================================
--- branches/SAMBA_3_0/source/utils/net_lookup.c	2006-08-28 07:56:15 UTC (rev 17880)
+++ branches/SAMBA_3_0/source/utils/net_lookup.c	2006-08-28 09:19:30 UTC (rev 17881)
@@ -165,7 +165,7 @@
 	asprintf(&pdc_str, "%s", inet_ntoa(addr));
 	d_printf("%s\n", pdc_str);
 
-	if (!get_sorted_dc_list(domain, &ip_list, &count, False)) {
+	if (!NT_STATUS_IS_OK(get_sorted_dc_list(domain, &ip_list, &count, False))) {
 		SAFE_FREE(pdc_str);
 		return 0;
 	}



More information about the samba-cvs mailing list