Synchronize error to status code mapping between dlls/ntdll/file.c and server/file.c

Dmitry Timoshkov dmitry at codeweavers.com
Tue Sep 11 00:59:04 CDT 2007


Hello,

please apply this patch after "server: Map ETXTBSY to STATUS_SHARING_VIOLATION".

I gave server/file.c mappings more priority in the case existing mapping
doesn't match.

Changelog:
    Synchronize error to status code mapping between dlls/ntdll/file.c
    and server/file.c.

---
 dlls/ntdll/file.c |   31 +++++++++++++++++++------------
 server/file.c     |    9 +++++++++
 server/trace.c    |    2 ++
 3 files changed, 30 insertions(+), 12 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index c7004d7..4a875b7 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -283,33 +283,40 @@ NTSTATUS FILE_GetNtStatus(void)
     TRACE( "errno = %d\n", errno );
     switch (err)
     {
+    case ETXTBSY:
     case EAGAIN:    return STATUS_SHARING_VIOLATION;
     case EBADF:     return STATUS_INVALID_HANDLE;
-    case EBUSY:     return STATUS_DEVICE_BUSY;
     case ENOSPC:    return STATUS_DISK_FULL;
-    case EPERM:
-    case EROFS:
-    case EACCES:    return STATUS_ACCESS_DENIED;
-    case ENOTDIR:   return STATUS_OBJECT_PATH_NOT_FOUND;
-    case ENOENT:    return STATUS_OBJECT_NAME_NOT_FOUND;
+    case EACCES:
+    case ESRCH:
+    case EPERM:     return STATUS_ACCESS_DENIED;
+    case EROFS:     return STATUS_MEDIA_WRITE_PROTECTED;
+    case EBUSY:     return STATUS_FILE_LOCK_CONFLICT;
+    case ENOENT:    return STATUS_NO_SUCH_FILE;
     case EISDIR:    return STATUS_FILE_IS_A_DIRECTORY;
-    case EMFILE:
-    case ENFILE:    return STATUS_TOO_MANY_OPENED_FILES;
+    case ENFILE:
+    case EMFILE:    return STATUS_TOO_MANY_OPENED_FILES;
+    case EEXIST:    return STATUS_OBJECT_NAME_COLLISION;
     case EINVAL:    return STATUS_INVALID_PARAMETER;
+    case ESPIPE:    return STATUS_ILLEGAL_FUNCTION;
     case ENOTEMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
+    case EIO:       return STATUS_ACCESS_VIOLATION;
+    case ENOTDIR:   return STATUS_NOT_A_DIRECTORY;
     case EPIPE:     return STATUS_PIPE_DISCONNECTED;
-    case EIO:       return STATUS_DEVICE_NOT_READY;
+    case EFBIG:     return STATUS_SECTION_TOO_BIG;
+    case ENODEV:    return STATUS_NO_SUCH_DEVICE;
+    case ENXIO:     return STATUS_NO_SUCH_DEVICE;
 #ifdef ENOMEDIUM
     case ENOMEDIUM: return STATUS_NO_MEDIA_IN_DEVICE;
 #endif
-    case ENXIO:     return STATUS_NO_SUCH_DEVICE;
+#ifdef EOVERFLOW
+    case EOVERFLOW: return STATUS_INVALID_PARAMETER;
+#endif
     case ENOTTY:
     case EOPNOTSUPP:return STATUS_NOT_SUPPORTED;
     case ECONNRESET:return STATUS_PIPE_DISCONNECTED;
     case EFAULT:    return STATUS_ACCESS_VIOLATION;
-    case ESPIPE:    return STATUS_ILLEGAL_FUNCTION;
     case ENOEXEC:   /* ?? */
-    case EEXIST:    /* ?? */
     default:
         FIXME( "Converting errno %d to STATUS_UNSUCCESSFUL\n", err );
         return STATUS_UNSUCCESSFUL;
diff --git a/server/file.c b/server/file.c
index a8152da..8816e4b 100644
--- a/server/file.c
+++ b/server/file.c
@@ -305,12 +305,21 @@ void file_set_error(void)
     case ENOTEMPTY: set_error( STATUS_DIRECTORY_NOT_EMPTY ); break;
     case EIO:       set_error( STATUS_ACCESS_VIOLATION ); break;
     case ENOTDIR:   set_error( STATUS_NOT_A_DIRECTORY ); break;
+    case EPIPE:     set_error( STATUS_PIPE_DISCONNECTED ); break;
     case EFBIG:     set_error( STATUS_SECTION_TOO_BIG ); break;
     case ENODEV:    set_error( STATUS_NO_SUCH_DEVICE ); break;
     case ENXIO:     set_error( STATUS_NO_SUCH_DEVICE ); break;
+#ifdef ENOMEDIUM
+    case ENOMEDIUM: set_error( STATUS_NO_MEDIA_IN_DEVICE); break;
+#endif
 #ifdef EOVERFLOW
     case EOVERFLOW: set_error( STATUS_INVALID_PARAMETER ); break;
 #endif
+    case ENOTTY:
+    case EOPNOTSUPP:set_error( STATUS_NOT_SUPPORTED ); break;
+    case ECONNRESET:set_error( STATUS_PIPE_DISCONNECTED ); break;
+    case EFAULT:    set_error( STATUS_ACCESS_VIOLATION ); break;
+    case ENOEXEC:   /* ?? */
     default:
         perror("wineserver: file_set_error() can't map error");
         set_error( STATUS_UNSUCCESSFUL );
diff --git a/server/trace.c b/server/trace.c
index 49f4479..5a1c995 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -4233,6 +4233,7 @@ static const struct
     { "CANCELLED",                   STATUS_CANCELLED },
     { "CANT_OPEN_ANONYMOUS",         STATUS_CANT_OPEN_ANONYMOUS },
     { "CHILD_MUST_BE_VOLATILE",      STATUS_CHILD_MUST_BE_VOLATILE },
+    { "DEBUGGER_INACTIVE",           STATUS_DEBUGGER_INACTIVE },
     { "DEVICE_BUSY",                 STATUS_DEVICE_BUSY },
     { "DIRECTORY_NOT_EMPTY",         STATUS_DIRECTORY_NOT_EMPTY },
     { "DISK_FULL",                   STATUS_DISK_FULL },
@@ -4271,6 +4272,7 @@ static const struct
     { "NOT_SUPPORTED",               STATUS_NOT_SUPPORTED },
     { "NO_DATA_DETECTED",            STATUS_NO_DATA_DETECTED },
     { "NO_IMPERSONATION_TOKEN",      STATUS_NO_IMPERSONATION_TOKEN },
+    { "NO_MEDIA_IN_DEVICE",          STATUS_NO_MEDIA_IN_DEVICE },
     { "NO_MEMORY",                   STATUS_NO_MEMORY },
     { "NO_MORE_ENTRIES",             STATUS_NO_MORE_ENTRIES },
     { "NO_MORE_FILES",               STATUS_NO_MORE_FILES },
-- 
1.5.3.1






More information about the wine-patches mailing list