Merge branch 'v3-2-test' of ssh://git.samba.org/data/git/samba into v3-2-test
[ira/wip.git] / source3 / libsmb / errormap.c
index 7c28c7e8aa1e0dc2d6df00a45dc90978f8d12095..4ec30f7e17f0d23d89a89390c882c3aa3be5b363 100644 (file)
@@ -7,7 +7,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,
@@ -16,8 +16,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"
@@ -45,7 +44,7 @@
 */
 
 /* NT status -> dos error map */
-const static struct {
+static const struct {
        uint8 dos_class;
        uint32 dos_code;
        NTSTATUS ntstatus;
@@ -62,7 +61,7 @@ const static struct {
        {ERRDOS,        193,    NT_STATUS_BAD_INITIAL_PC},
        {ERRDOS,        87,     NT_STATUS_INVALID_CID},
        {ERRHRD,        ERRgeneral,     NT_STATUS_TIMER_NOT_CANCELED},
-       {ERRDOS,        87,     NT_STATUS_INVALID_PARAMETER},
+       {ERRDOS,        ERRinvalidparam,        NT_STATUS_INVALID_PARAMETER},
        {ERRDOS,        ERRbadfile,     NT_STATUS_NO_SUCH_DEVICE},
        {ERRDOS,        ERRbadfile,     NT_STATUS_NO_SUCH_FILE},
        {ERRDOS,        ERRbadfunc,     NT_STATUS_INVALID_DEVICE_REQUEST},
@@ -98,6 +97,11 @@ const static struct {
 */
        {ERRDOS,        ERRnoaccess,    NT_STATUS_ACCESS_DENIED},
        {ERRDOS,        111,    NT_STATUS_BUFFER_TOO_SMALL},
+/*
+ * Not an official error, as only bit 0x80000000, not bits 0xC0000000 are set.
+ */
+       {ERRDOS,        ERRmoredata,    STATUS_BUFFER_OVERFLOW},
+       {ERRDOS,        ERRnofiles,     STATUS_NO_MORE_FILES},
        {ERRDOS,        ERRbadfid,      NT_STATUS_OBJECT_TYPE_MISMATCH},
        {ERRHRD,        ERRgeneral,     NT_STATUS_NONCONTINUABLE_EXCEPTION},
        {ERRHRD,        ERRgeneral,     NT_STATUS_INVALID_DISPOSITION},
@@ -119,9 +123,9 @@ const static struct {
        {ERRHRD,        ERRgeneral,     NT_STATUS_HANDLE_NOT_WAITABLE},
        {ERRDOS,        ERRbadfid,      NT_STATUS_PORT_DISCONNECTED},
        {ERRHRD,        ERRgeneral,     NT_STATUS_DEVICE_ALREADY_ATTACHED},
-       {ERRDOS,        161,    NT_STATUS_OBJECT_PATH_INVALID},
+       {ERRDOS,        ERRinvalidpath, NT_STATUS_OBJECT_PATH_INVALID},
        {ERRDOS,        ERRbadpath,     NT_STATUS_OBJECT_PATH_NOT_FOUND},
-       {ERRDOS,        161,    NT_STATUS_OBJECT_PATH_SYNTAX_BAD},
+       {ERRDOS,        ERRinvalidpath, NT_STATUS_OBJECT_PATH_SYNTAX_BAD},
        {ERRHRD,        ERRgeneral,     NT_STATUS_DATA_OVERRUN},
        {ERRHRD,        ERRgeneral,     NT_STATUS_DATA_LATE_ERROR},
        {ERRDOS,        23,     NT_STATUS_DATA_ERROR},
@@ -333,7 +337,7 @@ const static struct {
        {ERRDOS,        203,    NT_STATUS(0xc0000100)},
        {ERRDOS,        145,    NT_STATUS_DIRECTORY_NOT_EMPTY},
        {ERRHRD,        ERRgeneral,     NT_STATUS_FILE_CORRUPT_ERROR},
-       {ERRDOS,        267,    NT_STATUS_NOT_A_DIRECTORY},
+       {ERRDOS,        ERRbaddirectory,        NT_STATUS_NOT_A_DIRECTORY},
        {ERRHRD,        ERRgeneral,     NT_STATUS_BAD_LOGON_SESSION_STATE},
        {ERRHRD,        ERRgeneral,     NT_STATUS_LOGON_SESSION_COLLISION},
        {ERRDOS,        206,    NT_STATUS_NAME_TOO_LONG},
@@ -402,7 +406,7 @@ const static struct {
        {ERRHRD,        ERRgeneral,     NT_STATUS_APP_INIT_FAILURE},
        {ERRHRD,        ERRgeneral,     NT_STATUS_PAGEFILE_CREATE_FAILED},
        {ERRHRD,        ERRgeneral,     NT_STATUS_NO_PAGEFILE},
-       {ERRDOS,        124,    NT_STATUS_INVALID_LEVEL},
+       {ERRDOS,        ERRunknownlevel,        NT_STATUS_INVALID_LEVEL},
        {ERRDOS,        86,     NT_STATUS_WRONG_PASSWORD_CORE},
        {ERRHRD,        ERRgeneral,     NT_STATUS_ILLEGAL_FLOAT_CONTEXT},
        {ERRDOS,        109,    NT_STATUS_PIPE_BROKEN},
@@ -611,7 +615,7 @@ const static struct {
 
 
 /* dos -> nt status error map */
-const static struct {
+static const struct {
        uint8 dos_class;
        uint32 dos_code;
        NTSTATUS ntstatus;
@@ -623,12 +627,12 @@ const static struct {
        {ERRDOS,        ERRnoaccess,    NT_STATUS_ACCESS_DENIED},
        {ERRDOS,        ERRbadfid,      NT_STATUS_INVALID_HANDLE},
        {ERRDOS,        ERRnomem,       NT_STATUS_INSUFFICIENT_RESOURCES},
-       {ERRDOS,        ERRbadaccess,   NT_STATUS_INVALID_LOCK_SEQUENCE},
+       {ERRDOS,        ERRbadaccess,   NT_STATUS_ACCESS_DENIED},
        {ERRDOS,        ERRbaddata,     NT_STATUS_DATA_ERROR},
        {ERRDOS,        14,     NT_STATUS_SECTION_NOT_EXTENDED},
        {ERRDOS,        ERRremcd,       NT_STATUS_DIRECTORY_NOT_EMPTY},
        {ERRDOS,        ERRdiffdevice,  NT_STATUS_NOT_SAME_DEVICE},
-       {ERRDOS,        ERRnofiles,     NT_STATUS(0x80000006)},
+       {ERRDOS,        ERRnofiles,     STATUS_NO_MORE_FILES},
        {ERRDOS,        19,     NT_STATUS_MEDIA_WRITE_PROTECTED},
        {ERRDOS,        21,     NT_STATUS_NO_MEDIA_IN_DEVICE},
        {ERRDOS,        22,     NT_STATUS_INVALID_DEVICE_STATE},
@@ -675,7 +679,7 @@ const static struct {
        {ERRDOS,        121,    NT_STATUS_IO_TIMEOUT},
        {ERRDOS,        122,    NT_STATUS_BUFFER_TOO_SMALL},
        {ERRDOS,        ERRinvalidname, NT_STATUS_OBJECT_NAME_INVALID},
-       {ERRDOS,        124,    NT_STATUS_INVALID_LEVEL},
+       {ERRDOS,        ERRunknownlevel,        NT_STATUS_INVALID_LEVEL},
        {ERRDOS,        126,    NT_STATUS_DLL_NOT_FOUND},
        {ERRDOS,        127,    NT_STATUS_PROCEDURE_NOT_FOUND},
        {ERRDOS,        145,    NT_STATUS_DIRECTORY_NOT_EMPTY},
@@ -866,7 +870,7 @@ const static struct {
 };
 
 /* errmap NTSTATUS->Win32 */
-const static struct {
+static const struct {
        NTSTATUS ntstatus;
        WERROR werror;
 } ntstatus_to_werror_map[] = {
@@ -1406,11 +1410,18 @@ const static struct {
        {NT_STATUS(0x80000289), W_ERROR(0x48e)},
        {NT_STATUS_OK, WERR_OK}};
 
+static const struct {
+       WERROR werror;
+       NTSTATUS ntstatus;
+} werror_to_ntstatus_map[] = {
+       { W_ERROR(0x5), NT_STATUS_ACCESS_DENIED },
+       { WERR_OK, NT_STATUS_OK }
+};
 
 /*****************************************************************************
 convert a dos eclas/ecode to a NT status32 code
  *****************************************************************************/
-NTSTATUS dos_to_ntstatus(int eclass, int ecode)
+NTSTATUS dos_to_ntstatus(uint8 eclass, uint32 ecode)
 {
        int i;
        if (eclass == 0 && ecode == 0) return NT_STATUS_OK;
@@ -1455,6 +1466,14 @@ NTSTATUS werror_to_ntstatus(WERROR error)
 {
        int i;
        if (W_ERROR_IS_OK(error)) return NT_STATUS_OK;
+
+       for (i=0; !W_ERROR_IS_OK(werror_to_ntstatus_map[i].werror); i++) {
+               if (W_ERROR_V(error) == 
+                   W_ERROR_V(werror_to_ntstatus_map[i].werror)) {
+                       return werror_to_ntstatus_map[i].ntstatus;
+               }
+       }
+
        for (i=0; NT_STATUS_V(ntstatus_to_werror_map[i].ntstatus); i++) {
                if (W_ERROR_V(error) == 
                    W_ERROR_V(ntstatus_to_werror_map[i].werror)) {
@@ -1484,56 +1503,107 @@ WERROR ntstatus_to_werror(NTSTATUS error)
        return W_ERROR(NT_STATUS_V(error) & 0xffff);
 }
 
-/* Mapping between Unix, DOS and NT error numbers */
+#if defined(HAVE_GSSAPI)
+/*******************************************************************************
+ Map between gssapi errors and NT status. I made these up :-(. JRA.
+*******************************************************************************/
 
-const struct unix_error_map unix_dos_nt_errmap[] = {
-       { EPERM, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
-       { EACCES, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
-       { ENOENT, ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND },
-       { ENOTDIR, ERRDOS, ERRbadpath,  NT_STATUS_OBJECT_PATH_NOT_FOUND },
-       { EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
-       { EBADF, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
-       { EINVAL, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE },
-       { EEXIST, ERRDOS, ERRfilexists, NT_STATUS_OBJECT_NAME_COLLISION},
-       { ENFILE, ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES },
-       { EMFILE, ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES },
-       { ENOSPC, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
-#ifdef EDQUOT
-       { EDQUOT, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
+static const struct {
+               unsigned long gss_err;
+               NTSTATUS ntstatus;
+} gss_to_ntstatus_errormap[] = {
+#if defined(GSS_S_CALL_INACCESSIBLE_READ)
+               {GSS_S_CALL_INACCESSIBLE_READ, NT_STATUS_INVALID_PARAMETER},
+#endif
+#if defined(GSS_S_CALL_INACCESSIBLE_WRITE)
+               {GSS_S_CALL_INACCESSIBLE_WRITE, NT_STATUS_INVALID_PARAMETER},
+#endif
+#if defined(GSS_S_CALL_BAD_STRUCTURE)
+               {GSS_S_CALL_BAD_STRUCTURE, NT_STATUS_INVALID_PARAMETER},
+#endif
+#if defined(GSS_S_BAD_MECH)
+               {GSS_S_BAD_MECH, NT_STATUS_INVALID_PARAMETER},
+#endif
+#if defined(GSS_S_BAD_NAME)
+               {GSS_S_BAD_NAME, NT_STATUS_INVALID_ACCOUNT_NAME},
+#endif
+#if defined(GSS_S_BAD_NAMETYPE)
+               {GSS_S_BAD_NAMETYPE, NT_STATUS_INVALID_PARAMETER},
 #endif
-#ifdef ENOTEMPTY
-       { ENOTEMPTY, ERRDOS, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY },
+#if defined(GSS_S_BAD_BINDINGS)
+               {GSS_S_BAD_BINDINGS, NT_STATUS_INVALID_PARAMETER},
 #endif
-#ifdef EXDEV
-       { EXDEV, ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE },
+#if defined(GSS_S_BAD_STATUS)
+               {GSS_S_BAD_STATUS, NT_STATUS_UNSUCCESSFUL},
 #endif
-#ifdef EROFS
-       { EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED },
+#if defined(GSS_S_BAD_SIG)
+               {GSS_S_BAD_SIG, NT_STATUS_ACCESS_DENIED},
 #endif
-#ifdef ENAMETOOLONG
-       { ENAMETOOLONG, ERRDOS, 206, NT_STATUS_OBJECT_NAME_INVALID },
+#if defined(GSS_S_NO_CRED)
+               {GSS_S_NO_CRED, NT_STATUS_ACCESS_DENIED},
 #endif
-       { 0, 0, 0, NT_STATUS_OK }
+#if defined(GSS_S_NO_CONTEXT)
+               {GSS_S_NO_CONTEXT, NT_STATUS_ACCESS_DENIED},
+#endif
+#if defined(GSS_S_DEFECTIVE_TOKEN)
+               {GSS_S_DEFECTIVE_TOKEN, NT_STATUS_ACCESS_DENIED},
+#endif
+#if defined(GSS_S_DEFECTIVE_CREDENTIAL)
+               {GSS_S_DEFECTIVE_CREDENTIAL, NT_STATUS_ACCESS_DENIED},
+#endif
+#if defined(GSS_S_CREDENTIALS_EXPIRED)
+               {GSS_S_CREDENTIALS_EXPIRED, NT_STATUS_PASSWORD_EXPIRED},
+#endif
+#if defined(GSS_S_CONTEXT_EXPIRED)
+               {GSS_S_CONTEXT_EXPIRED, NT_STATUS_PASSWORD_EXPIRED},
+#endif
+#if defined(GSS_S_BAD_QOP)
+               {GSS_S_BAD_QOP, NT_STATUS_ACCESS_DENIED},
+#endif
+#if defined(GSS_S_UNAUTHORIZED)
+               {GSS_S_UNAUTHORIZED, NT_STATUS_ACCESS_DENIED},
+#endif
+#if defined(GSS_S_UNAVAILABLE)
+               {GSS_S_UNAVAILABLE, NT_STATUS_UNSUCCESSFUL},
+#endif
+#if defined(GSS_S_DUPLICATE_ELEMENT)
+               {GSS_S_DUPLICATE_ELEMENT, NT_STATUS_INVALID_PARAMETER},
+#endif
+#if defined(GSS_S_NAME_NOT_MN)
+               {GSS_S_NAME_NOT_MN, NT_STATUS_INVALID_PARAMETER},
+#endif
+               { 0, NT_STATUS_OK }
 };
 
 /*********************************************************************
- Map an NT error code from a Unix error code.
+ Map an NT error code from a gssapi error code.
 *********************************************************************/
 
-NTSTATUS map_nt_error_from_unix(int unix_error)
+NTSTATUS map_nt_error_from_gss(uint32 gss_maj, uint32 minor)
 {
        int i = 0;
 
-       if (unix_error == 0)
+       if (gss_maj == GSS_S_COMPLETE) {
                return NT_STATUS_OK;
+       }
+
+       if (gss_maj == GSS_S_CONTINUE_NEEDED) {
+               return NT_STATUS_MORE_PROCESSING_REQUIRED;
+       }
 
+       if (gss_maj == GSS_S_FAILURE) {
+               return map_nt_error_from_unix((int)minor);
+       }
+       
        /* Look through list */
-       while(unix_dos_nt_errmap[i].unix_error != 0) {
-               if (unix_dos_nt_errmap[i].unix_error == unix_error)
-                       return unix_dos_nt_errmap[i].nt_error;
+       while(gss_to_ntstatus_errormap[i].gss_err != 0) {
+               if (gss_to_ntstatus_errormap[i].gss_err == gss_maj) {
+                       return gss_to_ntstatus_errormap[i].ntstatus;
+               }
                i++;
        }
 
        /* Default return */
        return NT_STATUS_ACCESS_DENIED;
 }
+#endif