0001-01-01 02:30:17 +02:30
/*
Unix SMB / CIFS implementation .
ads ( active directory ) utility library
Copyright ( C ) Andrew Tridgell 2001
Copyright ( C ) Remus Koos 2001
Copyright ( C ) Andrew Bartlett 2001
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
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
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 0213 9 , USA .
*/
# include "includes.h"
/*
build a ADS_STATUS structure
*/
ADS_STATUS ads_build_error ( enum ads_error_type etype ,
int rc , int minor_status )
{
ADS_STATUS ret ;
0001-01-01 02:30:17 +02:30
if ( etype = = ENUM_ADS_ERROR_NT ) {
DEBUG ( 0 , ( " don't use ads_build_error with ENUM_ADS_ERROR_NT! \n " ) ) ;
0001-01-01 02:30:17 +02:30
ret . err . rc = - 1 ;
0001-01-01 02:30:17 +02:30
ret . error_type = ENUM_ADS_ERROR_SYSTEM ;
0001-01-01 02:30:17 +02:30
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 ;
0001-01-01 02:30:17 +02:30
if ( etype ! = ENUM_ADS_ERROR_NT ) {
DEBUG ( 0 , ( " don't use ads_build_nt_error without ENUM_ADS_ERROR_NT! \n " ) ) ;
0001-01-01 02:30:17 +02:30
ret . err . rc = - 1 ;
0001-01-01 02:30:17 +02:30
ret . error_type = ENUM_ADS_ERROR_SYSTEM ;
0001-01-01 02:30:17 +02:30
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 status )
{
0001-01-01 02:30:17 +02:30
if ( status . error_type = = ENUM_ADS_ERROR_NT ) {
0001-01-01 02:30:17 +02:30
return status . err . nt_status ;
}
# ifdef HAVE_LDAP
0001-01-01 02:30:17 +02:30
if ( ( status . error_type = = ENUM_ADS_ERROR_LDAP )
0001-01-01 02:30:17 +02:30
& & ( status . err . rc = = LDAP_NO_MEMORY ) ) {
return NT_STATUS_NO_MEMORY ;
}
0001-01-01 02:30:17 +02:30
# endif
# ifdef HAVE_KRB5
if ( status . error_type = = ENUM_ADS_ERROR_KRB5 ) {
if ( status . err . rc = = KRB5KDC_ERR_PREAUTH_FAILED ) {
return NT_STATUS_LOGON_FAILURE ;
} else if ( status . err . rc = = KRB5_KDC_UNREACH ) {
return NT_STATUS_NO_LOGON_SERVERS ;
}
}
0001-01-01 02:30:17 +02:30
# endif
if ( ADS_ERR_OK ( status ) ) return NT_STATUS_OK ;
return NT_STATUS_UNSUCCESSFUL ;
}
/*
return a string for an error from a ads routine
*/
const char * ads_errstr ( ADS_STATUS status )
{
2004-05-25 20:24:13 +04:00
uint32_t msg_ctx ;
0001-01-01 02:30:17 +02:30
static char * ret ;
SAFE_FREE ( ret ) ;
msg_ctx = 0 ;
switch ( status . error_type ) {
0001-01-01 02:30:17 +02:30
case ENUM_ADS_ERROR_SYSTEM :
0001-01-01 02:30:17 +02:30
return strerror ( status . err . rc ) ;
# ifdef HAVE_LDAP
0001-01-01 02:30:17 +02:30
case ENUM_ADS_ERROR_LDAP :
0001-01-01 02:30:17 +02:30
return ldap_err2string ( status . err . rc ) ;
# endif
# ifdef HAVE_KRB5
0001-01-01 02:30:17 +02:30
case ENUM_ADS_ERROR_KRB5 :
0001-01-01 02:30:17 +02:30
return error_message ( status . err . rc ) ;
# endif
# ifdef HAVE_GSSAPI
0001-01-01 02:30:17 +02:30
case ENUM_ADS_ERROR_GSS :
0001-01-01 02:30:17 +02:30
{
2004-05-25 20:24:13 +04:00
uint32_t minor ;
0001-01-01 02:30:17 +02:30
gss_buffer_desc msg1 , msg2 ;
msg1 . value = NULL ;
msg2 . value = NULL ;
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 ) ;
asprintf ( & ret , " %s : %s " , ( char * ) msg1 . value , ( char * ) msg2 . value ) ;
gss_release_buffer ( & minor , & msg1 ) ;
gss_release_buffer ( & minor , & msg2 ) ;
return ret ;
}
# endif
0001-01-01 02:30:17 +02:30
case ENUM_ADS_ERROR_NT :
return get_friendly_nt_error_msg ( ads_ntstatus ( status ) ) ;
0001-01-01 02:30:17 +02:30
default :
return " Unknown ADS error type!? (not compiled in?) " ;
}
}