少年修仙传客户端基础资源
hch
2024-04-01 d01413b00ef631ac20347716b23818b0b811f65f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
 * \file
 */
 
#include "w32error.h"
 
#include "utils/mono-lazy-init.h"
 
static mono_lazy_init_t error_key_once = MONO_LAZY_INIT_STATUS_NOT_INITIALIZED;
 
static pthread_key_t error_key;
 
static void
error_key_init (void)
{
    gint ret;
    ret = pthread_key_create (&error_key, NULL);
    g_assert (ret == 0);
}
 
guint32
mono_w32error_get_last (void)
{
    mono_lazy_initialize (&error_key_once, error_key_init);
    return GPOINTER_TO_UINT (pthread_getspecific (error_key));
}
 
void
mono_w32error_set_last (guint32 error)
{
    gint ret;
    mono_lazy_initialize (&error_key_once, error_key_init);
    ret = pthread_setspecific (error_key, GUINT_TO_POINTER (error));
    g_assert (ret == 0);
}
 
guint32
mono_w32error_unix_to_win32 (guint32 error)
{
    /* mapping ideas borrowed from wine. they may need some work */
 
    switch (error) {
    case EACCES:
    case EPERM:
    case EROFS: return ERROR_ACCESS_DENIED;
    case EAGAIN: return ERROR_SHARING_VIOLATION;
    case EBUSY: return ERROR_LOCK_VIOLATION;
    case EEXIST: return ERROR_FILE_EXISTS;
    case EINVAL:
    case ESPIPE: return ERROR_SEEK;
    case EISDIR: return ERROR_CANNOT_MAKE;
    case ENFILE:
    case EMFILE: return ERROR_TOO_MANY_OPEN_FILES;
    case ENOENT:
    case ENOTDIR: return ERROR_FILE_NOT_FOUND;
    case ENOSPC: return ERROR_HANDLE_DISK_FULL;
    case ENOTEMPTY: return ERROR_DIR_NOT_EMPTY;
    case ENOEXEC: return ERROR_BAD_FORMAT;
    case ENAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
#ifdef EINPROGRESS
    case EINPROGRESS: return ERROR_IO_PENDING;
#endif
    case ENOSYS: return ERROR_NOT_SUPPORTED;
    case EBADF: return ERROR_INVALID_HANDLE;
    case EIO: return ERROR_INVALID_HANDLE;
    case EINTR: return ERROR_IO_PENDING; /* best match I could find */
    case EPIPE: return ERROR_WRITE_FAULT;
    case ELOOP: return ERROR_CANT_RESOLVE_FILENAME;
#ifdef ENODEV
    case ENODEV: return ERROR_DEV_NOT_EXIST;
#endif
#ifdef ENXIO
    case ENXIO: return ERROR_DEV_NOT_EXIST;
#endif
#ifdef ENOTCONN
    case ENOTCONN: return ERROR_DEV_NOT_EXIST;
#endif
#ifdef EHOSTDOWN
    case EHOSTDOWN: return ERROR_DEV_NOT_EXIST;
#endif
 
    default:
        g_warning ("%s: unknown error (%d) \"%s\"", __FILE__, error, g_strerror (error));
        return ERROR_NOT_SUPPORTED;
    }
}