[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / libads / ads_status.c
index 11f9d66b92df386d618d4b1ccc59ed46475b4313..3f0ab576386e98b4617ca7fb064672a71e5b34bb 100644 (file)
@@ -8,7 +8,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -17,8 +17,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -31,10 +30,10 @@ ADS_STATUS ads_build_error(enum ads_error_type etype,
 {
        ADS_STATUS ret;
 
-       if (etype == ADS_ERROR_NT) {
-               DEBUG(0,("don't use ads_build_error with ADS_ERROR_NT!\n"));
+       if (etype == ENUM_ADS_ERROR_NT) {
+               DEBUG(0,("don't use ads_build_error with ENUM_ADS_ERROR_NT!\n"));
                ret.err.rc = -1;
-               ret.error_type = ADS_ERROR_SYSTEM;
+               ret.error_type = ENUM_ADS_ERROR_SYSTEM;
                ret.minor_status = 0;
                return ret;     
        }       
@@ -50,10 +49,10 @@ ADS_STATUS ads_build_nt_error(enum ads_error_type etype,
 {
        ADS_STATUS ret;
 
-       if (etype != ADS_ERROR_NT) {
-               DEBUG(0,("don't use ads_build_nt_error without ADS_ERROR_NT!\n"));
+       if (etype != ENUM_ADS_ERROR_NT) {
+               DEBUG(0,("don't use ads_build_nt_error without ENUM_ADS_ERROR_NT!\n"));
                ret.err.rc = -1;
-               ret.error_type = ADS_ERROR_SYSTEM;
+               ret.error_type = ENUM_ADS_ERROR_SYSTEM;
                ret.minor_status = 0;
                return ret;     
        }
@@ -69,16 +68,29 @@ ADS_STATUS ads_build_nt_error(enum ads_error_type etype,
 */
 NTSTATUS ads_ntstatus(ADS_STATUS status)
 {
-       if (status.error_type == ADS_ERROR_NT){
+       switch (status.error_type) {
+       case ENUM_ADS_ERROR_NT:
                return status.err.nt_status;    
-       }
+       case ENUM_ADS_ERROR_SYSTEM:
+               return map_nt_error_from_unix(status.err.rc);
 #ifdef HAVE_LDAP
-       if ((status.error_type == ADS_ERROR_LDAP) 
-           && (status.err.rc == LDAP_NO_MEMORY)) {
-               return NT_STATUS_NO_MEMORY;
-       }
+       case ENUM_ADS_ERROR_LDAP:
+               if (status.err.rc == LDAP_SUCCESS) {
+                       return NT_STATUS_OK;
+               }
+               return NT_STATUS_LDAP(status.err.rc);
 #endif
-       if (ADS_ERR_OK(status)) return NT_STATUS_OK;
+#ifdef HAVE_KRB5
+       case ENUM_ADS_ERROR_KRB5:
+               return krb5_to_nt_status(status.err.rc);
+#endif
+       default:
+               break;
+       }
+
+       if (ADS_ERR_OK(status)) {
+               return NT_STATUS_OK;
+       }
        return NT_STATUS_UNSUCCESSFUL;
 }
 
@@ -87,29 +99,30 @@ NTSTATUS ads_ntstatus(ADS_STATUS status)
 */
 const char *ads_errstr(ADS_STATUS status)
 {
-       uint32 msg_ctx;
        static char *ret;
 
        SAFE_FREE(ret);
-       msg_ctx = 0;
 
        switch (status.error_type) {
-       case ADS_ERROR_SYSTEM:
+       case ENUM_ADS_ERROR_SYSTEM:
                return strerror(status.err.rc);
 #ifdef HAVE_LDAP
-       case ADS_ERROR_LDAP:
+       case ENUM_ADS_ERROR_LDAP:
                return ldap_err2string(status.err.rc);
 #endif
 #ifdef HAVE_KRB5
-       case ADS_ERROR_KRB5: 
+       case ENUM_ADS_ERROR_KRB5: 
                return error_message(status.err.rc);
 #endif
 #ifdef HAVE_GSSAPI
-       case ADS_ERROR_GSS:
+       case ENUM_ADS_ERROR_GSS:
        {
+               uint32 msg_ctx;
                uint32 minor;
-               
                gss_buffer_desc msg1, msg2;
+
+               msg_ctx = 0;
+               
                msg1.value = NULL;
                msg2.value = NULL;
                gss_display_status(&minor, status.err.rc, GSS_C_GSS_CODE,
@@ -122,12 +135,10 @@ const char *ads_errstr(ADS_STATUS status)
                return ret;
        }
 #endif
-       case ADS_ERROR_NT: 
-               return nt_errstr(ads_ntstatus(status));
+       case ENUM_ADS_ERROR_NT: 
+               return get_friendly_nt_error_msg(ads_ntstatus(status));
        default:
                return "Unknown ADS error type!? (not compiled in?)";
        }
-
 }
 
-