[GLUE] Rsync SAMBA_3_2_0 SVN r25598 in order to create the v3-2-test branch.
[samba.git] / source / libsmb / errormap.c
index 116d2cefe152669262afa93477d59d13e1d863d7..ce826ae999ec34bd84969ccd78ae50b97ac3e4ca 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"
@@ -62,7 +61,7 @@ static const 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},
@@ -102,6 +101,7 @@ static const struct {
  * 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},
@@ -123,9 +123,9 @@ static const 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},
@@ -337,7 +337,7 @@ static const 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},
@@ -406,7 +406,7 @@ static const 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},
@@ -627,12 +627,12 @@ static const 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},
@@ -679,7 +679,7 @@ static const 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},
@@ -1410,6 +1410,13 @@ static const 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
@@ -1459,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)) {
@@ -1487,61 +1502,3 @@ WERROR ntstatus_to_werror(NTSTATUS error)
        /* a lame guess */
        return W_ERROR(NT_STATUS_V(error) & 0xffff);
 }
-
-/* Mapping between Unix, DOS and NT error numbers */
-
-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_NOT_A_DIRECTORY },
-       { 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 },
-       { ENOMEM, ERRDOS, ERRnomem, NT_STATUS_NO_MEMORY },
-#ifdef EDQUOT
-       { EDQUOT, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
-#endif
-#ifdef ENOTEMPTY
-       { ENOTEMPTY, ERRDOS, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY },
-#endif
-#ifdef EXDEV
-       { EXDEV, ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE },
-#endif
-#ifdef EROFS
-       { EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED },
-#endif
-#ifdef ENAMETOOLONG
-       { ENAMETOOLONG, ERRDOS, 206, NT_STATUS_OBJECT_NAME_INVALID },
-#endif
-#ifdef EFBIG
-       { EFBIG, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
-#endif
-       { 0, 0, 0, NT_STATUS_OK }
-};
-
-/*********************************************************************
- Map an NT error code from a Unix error code.
-*********************************************************************/
-
-NTSTATUS map_nt_error_from_unix(int unix_error)
-{
-       int i = 0;
-
-       if (unix_error == 0)
-               return NT_STATUS_OK;
-
-       /* 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;
-               i++;
-       }
-
-       /* Default return */
-       return NT_STATUS_ACCESS_DENIED;
-}