[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / libsmb / errormap.c
index a35108c3de01cc517aece919faba06d7dc2c1667..ce826ae999ec34bd84969ccd78ae50b97ac3e4ca 100644 (file)
@@ -3,10 +3,11 @@
  *  error mapping functions
  *  Copyright (C) Andrew Tridgell 2001
  *  Copyright (C) Andrew Bartlett 2001
+ *  Copyright (C) Tim Potter 2000
  *  
  *  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,
@@ -15,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"
@@ -44,7 +44,7 @@
 */
 
 /* NT status -> dos error map */
-const static struct {
+static const struct {
        uint8 dos_class;
        uint32 dos_code;
        NTSTATUS ntstatus;
@@ -61,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},
@@ -97,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},
@@ -118,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},
@@ -332,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},
@@ -401,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},
@@ -610,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;
@@ -622,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},
@@ -674,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},
@@ -865,7 +870,7 @@ const static struct {
 };
 
 /* errmap NTSTATUS->Win32 */
-const static struct {
+static const struct {
        NTSTATUS ntstatus;
        WERROR werror;
 } ntstatus_to_werror_map[] = {
@@ -1405,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;
@@ -1454,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)) {