static void error_init(void)
{
- pthread_key_create(&error_key, NULL);
+ int ret;
+
+ ret = pthread_key_create(&error_key, NULL);
+ g_assert (ret == 0);
}
/**
*/
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
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);
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;
+}
+