2005-09-27 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / io-layer / error.c
index 18df1ad30b858caf76d3b5ba4ca4146e6f652d91..8ede0dcb0394338904801f8824fa1ebc737130c5 100644 (file)
@@ -20,7 +20,10 @@ static mono_once_t error_key_once=MONO_ONCE_INIT;
 
 static void error_init(void)
 {
-       pthread_key_create(&error_key, NULL);
+       int ret;
+       
+       ret = pthread_key_create(&error_key, NULL);
+       g_assert (ret == 0);
 }
 
 /**
@@ -51,9 +54,12 @@ guint32 GetLastError(void)
  */
 void SetLastError(guint32 code)
 {
+       int ret;
+       
        /* Set the thread-local error code */
        mono_once(&error_key_once, error_init);
-       pthread_setspecific(error_key, GUINT_TO_POINTER(code));
+       ret = pthread_setspecific(error_key, GUINT_TO_POINTER(code));
+       g_assert (ret == 0);
 }
 
 guint32
@@ -109,11 +115,14 @@ errno_to_WSA (guint32 code, const gchar *function_name)
        case ESOCKTNOSUPPORT: result = WSAESOCKTNOSUPPORT; break;
        case ETIMEDOUT: result = WSAENETDOWN; break;
        case EWOULDBLOCK: result = WSAEWOULDBLOCK; break;
+       case EADDRNOTAVAIL: result = WSAEADDRNOTAVAIL; break;
+       /* This might happen with unix sockets */
+       case ENOENT: result = WSAECONNREFUSED; break;
        default:
                sys_error = strerror (code);
                msg = g_locale_to_utf8 (sys_error, strlen (sys_error), NULL, NULL, NULL);
                if (function_name == NULL)
-                       function_name = G_GNUC_PRETTY_FUNCTION;
+                       function_name = __func__;
 
                g_warning ("%s: Need to translate %d [%s] into winsock error",
                           function_name, code, msg);
@@ -125,3 +134,91 @@ errno_to_WSA (guint32 code, const gchar *function_name)
        return result;
 }
 
+gint
+_wapi_get_win32_file_error (gint err)
+{
+       gint ret;
+       /* mapping ideas borrowed from wine. they may need some work */
+
+       switch (err) {
+       case EACCES: case EPERM: case EROFS:
+               ret = ERROR_ACCESS_DENIED;
+               break;
+       
+       case EAGAIN:
+               ret = ERROR_SHARING_VIOLATION;
+               break;
+       
+       case EBUSY:
+               ret = ERROR_LOCK_VIOLATION;
+               break;
+       
+       case EEXIST:
+               ret = ERROR_FILE_EXISTS;
+               break;
+       
+       case EINVAL: case ESPIPE:
+               ret = ERROR_SEEK;
+               break;
+       
+       case EISDIR:
+               ret = ERROR_CANNOT_MAKE;
+               break;
+       
+       case ENFILE: case EMFILE:
+               ret = ERROR_TOO_MANY_OPEN_FILES;
+               break;
+
+       case ENOENT: case ENOTDIR:
+               ret = ERROR_FILE_NOT_FOUND;
+               break;
+       
+       case ENOSPC:
+               ret = ERROR_HANDLE_DISK_FULL;
+               break;
+       
+       case ENOTEMPTY:
+               ret = ERROR_DIR_NOT_EMPTY;
+               break;
+
+       case ENOEXEC:
+               ret = ERROR_BAD_FORMAT;
+               break;
+
+       case ENAMETOOLONG:
+               ret = ERROR_FILENAME_EXCED_RANGE;
+               break;
+       
+       case EINPROGRESS:
+               ret = ERROR_IO_PENDING;
+               break;
+       
+       case ENOSYS:
+               ret = ERROR_NOT_SUPPORTED;
+               break;
+       
+       case EBADF:
+               ret = ERROR_INVALID_HANDLE;
+               break;
+               
+       case EIO:
+               ret = ERROR_INVALID_HANDLE;
+               break;
+               
+       case EINTR:
+               ret = ERROR_IO_PENDING;         /* best match I could find */
+               break;
+               
+       case EPIPE:
+               ret = ERROR_WRITE_FAULT;
+               break;
+               
+       default:
+               g_message ("Unknown errno: %s\n", g_strerror (err));
+               ret = ERROR_GEN_FAILURE;
+               break;
+       }
+
+       return ret;
+}
+