[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 2d1830435fef4202b5993ab002c656f39d155844..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"
@@ -30,19 +29,68 @@ ADS_STATUS ads_build_error(enum ads_error_type etype,
                           int rc, int minor_status)
 {
        ADS_STATUS ret;
-       ret.error_type = etype;
-       ret.rc = rc;
+
+       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 = ENUM_ADS_ERROR_SYSTEM;
+               ret.minor_status = 0;
+               return ret;     
+       }       
+               
+       ret.err.rc = rc;
+       ret.error_type = etype;         
        ret.minor_status = minor_status;
        return ret;
 }
 
+ADS_STATUS ads_build_nt_error(enum ads_error_type etype, 
+                          NTSTATUS nt_status)
+{
+       ADS_STATUS ret;
+
+       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 = ENUM_ADS_ERROR_SYSTEM;
+               ret.minor_status = 0;
+               return ret;     
+       }
+       ret.err.nt_status = nt_status;
+       ret.error_type = etype;         
+       ret.minor_status = 0;
+       return ret;
+}
+
 /*
   do a rough conversion between ads error codes and NT status codes
   we'll need to fill this in more
 */
-NTSTATUS ads_ntstatus(ADS_STATUS rc)
+NTSTATUS ads_ntstatus(ADS_STATUS status)
 {
-       if (ADS_ERR_OK(rc)) return NT_STATUS_OK;
+       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
+       case ENUM_ADS_ERROR_LDAP:
+               if (status.err.rc == LDAP_SUCCESS) {
+                       return NT_STATUS_OK;
+               }
+               return NT_STATUS_LDAP(status.err.rc);
+#endif
+#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;
 }
 
@@ -51,32 +99,33 @@ NTSTATUS ads_ntstatus(ADS_STATUS rc)
 */
 const char *ads_errstr(ADS_STATUS status)
 {
-       int msg_ctx;
        static char *ret;
 
        SAFE_FREE(ret);
-       msg_ctx = 0;
 
        switch (status.error_type) {
-       case ADS_ERROR_SYSTEM:
-               return strerror(status.rc);
+       case ENUM_ADS_ERROR_SYSTEM:
+               return strerror(status.err.rc);
 #ifdef HAVE_LDAP
-       case ADS_ERROR_LDAP:
-               return ldap_err2string(status.rc);
+       case ENUM_ADS_ERROR_LDAP:
+               return ldap_err2string(status.err.rc);
 #endif
 #ifdef HAVE_KRB5
-       case ADS_ERROR_KRB5: 
-               return error_message(status.rc);
+       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.rc, GSS_C_GSS_CODE,
+               gss_display_status(&minor, status.err.rc, GSS_C_GSS_CODE,
                                   GSS_C_NULL_OID, &msg_ctx, &msg1);
                gss_display_status(&minor, status.minor_status, GSS_C_MECH_CODE,
                                   GSS_C_NULL_OID, &msg_ctx, &msg2);
@@ -86,10 +135,10 @@ const char *ads_errstr(ADS_STATUS status)
                return ret;
        }
 #endif
+       case ENUM_ADS_ERROR_NT: 
+               return get_friendly_nt_error_msg(ads_ntstatus(status));
        default:
                return "Unknown ADS error type!? (not compiled in?)";
        }
-
 }
 
-