From c52b3fb89f29110d2c2026a540e5dd39826bb799 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 28 Aug 2006 09:19:30 +0000 Subject: r17881: 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 (This used to be commit 60a166f0347170dff38554bed46193ce1226c8c1) --- source3/libads/ldap.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'source3/libads/ldap.c') diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index 4f1f0146a7..402e37b3c0 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -182,7 +182,7 @@ BOOL ads_try_connect(ADS_STRUCT *ads, const char *server ) 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 @@ static BOOL ads_find_dc(ADS_STRUCT *ads) 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 @@ again: 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 @@ again: 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 @@ again: if ( ads_try_connect(ads, server) ) { SAFE_FREE(ip_list); - return True; + return NT_STATUS_OK; } /* keep track of failures */ @@ -259,7 +261,7 @@ again: SAFE_FREE(ip_list); - return False; + return NT_STATUS_NO_LOGON_SERVERS; } @@ -272,6 +274,7 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads) { int version = LDAP_VERSION3; ADS_STATUS status; + NTSTATUS ntstatus; ads->last_attempt = time(NULL); ads->ld = NULL; @@ -283,11 +286,12 @@ ADS_STATUS ads_connect(ADS_STRUCT *ads) 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))); -- cgit