Fixup error mapping so we have only one table containing errno -> dos error -> NT...
authorJeremy Allison <jra@samba.org>
Wed, 16 Jan 2002 21:27:57 +0000 (21:27 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 16 Jan 2002 21:27:57 +0000 (21:27 +0000)
maps. Fixes problem with disk full returning incorrect error.
Jeremy.
(This used to be commit 16fcbf3c1ccf1d704765653f68395dd596c0d841)

source3/include/smb.h
source3/lib/error.c
source3/libsmb/errormap.c
source3/smbd/error.c

index cfb5d5f5e158801207781429e105c37058d805d0..bbc2d597ac491a32b3157a8c5faf45f06a2d97fe 100644 (file)
@@ -1631,6 +1631,13 @@ typedef struct user_struct
 } user_struct;
 
 
+struct unix_error_map {
+       int unix_error;
+       int dos_class;
+       int dos_code;
+       NTSTATUS nt_error;
+};
+
 #include "ntdomain.h"
 
 #include "client.h"
index cb2fffb96295b5a93f8f7a43e4358978ea726648..df177bcea0a9bf134ce5d4131d3c6066c0d52b76 100644 (file)
 
 /* Mapping between Unix, DOS and NT error numbers */
 
-struct {
-       int unix_error;
-       int dos_error;
-       NTSTATUS nt_error;
-} unix_dos_nt_errmap[] = {
-       { EPERM, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
-       { EACCES, ERRnoaccess, NT_STATUS_ACCESS_DENIED },
-       { ENOENT, ERRbadfile, NT_STATUS_NO_SUCH_FILE },
-       { ENOTDIR, ERRbadpath, NT_STATUS_NOT_A_DIRECTORY },
-       { EIO, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR },
-       { EBADF, ERRsrverror, NT_STATUS_INVALID_HANDLE },
-       { EINVAL, ERRsrverror, NT_STATUS_INVALID_HANDLE },
-       { EEXIST, ERRfilexists, NT_STATUS_ACCESS_DENIED},
-       { ENFILE, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES },
-       { EMFILE, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES },
-       { ENOSPC, ERRdiskfull, NT_STATUS_DISK_FULL },
+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_NO_SUCH_FILE },
+       { 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_ACCESS_DENIED},
+       { 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, ERRdiskfull, NT_STATUS_DISK_FULL },
+       { EDQUOT, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL },
 #endif
 #ifdef ENOTEMPTY
-       { ENOTEMPTY, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY },
+       { ENOTEMPTY, ERRDOS, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY },
 #endif
 #ifdef EXDEV
-       { EXDEV, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE },
+       { EXDEV, ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE },
 #endif
-       { EROFS, ERRnowrite, NT_STATUS_ACCESS_DENIED },
-
-       { 0, 0, NT_STATUS_OK }
+#ifdef EROFS
+       { EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED },
+#endif
+       { 0, 0, 0, NT_STATUS_OK }
 };
 
-/* Map an NT error code from a Unix error code */
+/*********************************************************************
+ 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;
+       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) {
+               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;
 }
index 1c44675c83ae31bd8ef76ec6de9407fb08841e06..401a07b77ddd8d56272e6f81e2b46e1b8f76d651 100644 (file)
@@ -773,6 +773,7 @@ static struct {
        {ERRHRD,        ERRlock,        NT_STATUS_FILE_LOCK_CONFLICT},
        {ERRHRD,        ERRwrongdisk,   NT_STATUS_WRONG_VOLUME},
        {ERRHRD,        38,     NT_STATUS_END_OF_FILE},
+       {ERRHRD,        ERRdiskfull,    NT_STATUS_DISK_FULL},
        {ERRHRD,        50,     NT_STATUS_CTL_FILE_NOT_SUPPORTED},
        {ERRHRD,        51,     NT_STATUS_REMOTE_NOT_LISTENING},
        {ERRHRD,        52,     NT_STATUS_DUPLICATE_NAME},
index 3c829deb09d41182843ae405cec146b060d37a16..fc26aa4ded7235fed6d3f1392dfc03f9789e9fe6 100644 (file)
@@ -25,6 +25,9 @@
 int unix_ERR_class=SMB_SUCCESS;
 int unix_ERR_code=0;
 
+/* From lib/error.c */
+extern struct unix_error_map unix_dos_nt_errmap[];
+
 /****************************************************************************
  Create an error packet from a cached error.
 ****************************************************************************/
@@ -42,45 +45,16 @@ int cached_error_packet(char *outbuf,files_struct *fsp,int line,const char *file
        return error_packet(outbuf,NT_STATUS_OK,eclass,err,line,file);
 }
 
-struct
-{
-  int unixerror;
-  int smbclass;
-  int smbcode;
-} unix_smb_errmap[] =
-{
-  {EPERM,ERRDOS,ERRnoaccess},
-  {EACCES,ERRDOS,ERRnoaccess},
-  {ENOENT,ERRDOS,ERRbadfile},
-  {ENOTDIR,ERRDOS,ERRbadpath},
-  {EIO,ERRHRD,ERRgeneral},
-  {EBADF,ERRSRV,ERRsrverror},
-  {EINVAL,ERRSRV,ERRsrverror},
-  {EEXIST,ERRDOS,ERRfilexists},
-  {ENFILE,ERRDOS,ERRnofids},
-  {EMFILE,ERRDOS,ERRnofids},
-  {ENOSPC,ERRHRD,ERRdiskfull},
-#ifdef EDQUOT
-  {EDQUOT,ERRHRD,ERRdiskfull},
-#endif
-#ifdef ENOTEMPTY
-  {ENOTEMPTY,ERRDOS,ERRnoaccess},
-#endif
-#ifdef EXDEV
-  {EXDEV,ERRDOS,ERRdiffdevice},
-#endif
-  {EROFS,ERRHRD,ERRnowrite},
-  {0,0,0}
-};
-
 /****************************************************************************
-  create an error packet from errno
+ Create an error packet from errno.
 ****************************************************************************/
+
 int unix_error_packet(char *outbuf,int def_class,uint32 def_code,
                      int line, const char *file)
 {
        int eclass=def_class;
        int ecode=def_code;
+       NTSTATUS ntstatus = NT_STATUS_OK;
        int i=0;
 
        if (unix_ERR_class != SMB_SUCCESS) {
@@ -89,23 +63,25 @@ int unix_error_packet(char *outbuf,int def_class,uint32 def_code,
                unix_ERR_class = SMB_SUCCESS;
                unix_ERR_code = 0;
        } else {
-               while (unix_smb_errmap[i].smbclass != 0) {
-                       if (unix_smb_errmap[i].unixerror == errno) {
-                               eclass = unix_smb_errmap[i].smbclass;
-                               ecode = unix_smb_errmap[i].smbcode;
+               while (unix_dos_nt_errmap[i].dos_class != 0) {
+                       if (unix_dos_nt_errmap[i].unix_error == errno) {
+                               eclass = unix_dos_nt_errmap[i].dos_class;
+                               ecode = unix_dos_nt_errmap[i].dos_code;
+                               ntstatus = unix_dos_nt_errmap[i].nt_error;
                                break;
                        }
                        i++;
                }
        }
 
-       return error_packet(outbuf,NT_STATUS_OK,eclass,ecode,line,file);
+       return error_packet(outbuf,ntstatus,eclass,ecode,line,file);
 }
 
 
 /****************************************************************************
-  create an error packet. Normally called using the ERROR() macro
+ Create an error packet. Normally called using the ERROR() macro.
 ****************************************************************************/
+
 int error_packet(char *outbuf,NTSTATUS ntstatus,
                 uint8 eclass,uint32 ecode,int line, const char *file)
 {