summaryrefslogtreecommitdiff
path: root/deps/uvwasi/src/uv_mapping.c
blob: 846dcedbeb6b4f4b115b81beeac89fb9910caa93 (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#include <sys/stat.h>

#ifndef _WIN32
# include <sys/types.h>
#endif /* _WIN32 */

#include "uv.h"
#include "wasi_types.h"
#include "uv_mapping.h"

#if !defined(S_ISREG) && defined(S_IFMT) && defined(S_IFREG)
# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif

#if !defined(S_ISDIR) && defined(S_IFMT) && defined(S_IFDIR)
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif

#if !defined(S_ISCHR) && defined(S_IFMT) && defined(S_IFCHR)
# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
#endif

#if !defined(S_ISLNK) && defined(S_IFMT) && defined(S_IFLNK)
# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
#endif


uvwasi_errno_t uvwasi__translate_uv_error(int err) {
  switch (err) {
    case UV_E2BIG:           return UVWASI_E2BIG;
    case UV_EACCES:          return UVWASI_EACCES;
    case UV_EADDRINUSE:      return UVWASI_EADDRINUSE;
    case UV_EADDRNOTAVAIL:   return UVWASI_EADDRNOTAVAIL;
    case UV_EAFNOSUPPORT:    return UVWASI_EAFNOSUPPORT;
    case UV_EAGAIN:          return UVWASI_EAGAIN;
    case UV_EALREADY:        return UVWASI_EALREADY;
    case UV_EBADF:           return UVWASI_EBADF;
    case UV_EBUSY:           return UVWASI_EBUSY;
    case UV_ECANCELED:       return UVWASI_ECANCELED;
    case UV_ECONNABORTED:    return UVWASI_ECONNABORTED;
    case UV_ECONNREFUSED:    return UVWASI_ECONNREFUSED;
    case UV_ECONNRESET:      return UVWASI_ECONNRESET;
    case UV_EDESTADDRREQ:    return UVWASI_EDESTADDRREQ;
    case UV_EEXIST:          return UVWASI_EEXIST;
    case UV_EFAULT:          return UVWASI_EFAULT;
    case UV_EFBIG:           return UVWASI_EFBIG;
    case UV_EHOSTUNREACH:    return UVWASI_EHOSTUNREACH;
    case UV_EINTR:           return UVWASI_EINTR;
    case UV_EINVAL:          return UVWASI_EINVAL;
    case UV_EIO:             return UVWASI_EIO;
    case UV_EISCONN:         return UVWASI_EISCONN;
    case UV_EISDIR:          return UVWASI_EISDIR;
    case UV_ELOOP:           return UVWASI_ELOOP;
    case UV_EMFILE:          return UVWASI_EMFILE;
    case UV_EMLINK:          return UVWASI_EMLINK;
    case UV_EMSGSIZE:        return UVWASI_EMSGSIZE;
    case UV_ENAMETOOLONG:    return UVWASI_ENAMETOOLONG;
    case UV_ENETDOWN:        return UVWASI_ENETDOWN;
    case UV_ENETUNREACH:     return UVWASI_ENETUNREACH;
    case UV_ENFILE:          return UVWASI_ENFILE;
    case UV_ENOBUFS:         return UVWASI_ENOBUFS;
    case UV_ENODEV:          return UVWASI_ENODEV;
    case UV_ENOENT:          return UVWASI_ENOENT;
    case UV_ENOMEM:          return UVWASI_ENOMEM;
    case UV_ENOPROTOOPT:     return UVWASI_ENOPROTOOPT;
    case UV_ENOSPC:          return UVWASI_ENOSPC;
    case UV_ENOSYS:          return UVWASI_ENOSYS;
    case UV_ENOTCONN:        return UVWASI_ENOTCONN;
    case UV_ENOTDIR:         return UVWASI_ENOTDIR;
    /* On at least some AIX machines, ENOTEMPTY and EEXIST are equivalent. */
#if ENOTEMPTY != EEXIST
    case UV_ENOTEMPTY:       return UVWASI_ENOTEMPTY;
#endif /* ENOTEMPTY != EEXIST */
    case UV_ENOTSOCK:        return UVWASI_ENOTSOCK;
    case UV_ENOTSUP:         return UVWASI_ENOTSUP;
    case UV_ENXIO:           return UVWASI_ENXIO;
    case UV_EPERM:           return UVWASI_EPERM;
    case UV_EPIPE:           return UVWASI_EPIPE;
    case UV_EPROTO:          return UVWASI_EPROTO;
    case UV_EPROTONOSUPPORT: return UVWASI_EPROTONOSUPPORT;
    case UV_EPROTOTYPE:      return UVWASI_EPROTOTYPE;
    case UV_ERANGE:          return UVWASI_ERANGE;
    case UV_EROFS:           return UVWASI_EROFS;
    case UV_ESPIPE:          return UVWASI_ESPIPE;
    case UV_ESRCH:           return UVWASI_ESRCH;
    case UV_ETIMEDOUT:       return UVWASI_ETIMEDOUT;
    case UV_ETXTBSY:         return UVWASI_ETXTBSY;
    case UV_EXDEV:           return UVWASI_EXDEV;
    case 0:                  return UVWASI_ESUCCESS;
    /* The following libuv error codes have no corresponding WASI error code:
          UV_EAI_ADDRFAMILY, UV_EAI_AGAIN, UV_EAI_BADFLAGS, UV_EAI_BADHINTS,
          UV_EAI_CANCELED, UV_EAI_FAIL, UV_EAI_FAMILY, UV_EAI_MEMORY,
          UV_EAI_NODATA, UV_EAI_NONAME, UV_EAI_OVERFLOW, UV_EAI_PROTOCOL,
          UV_EAI_SERVICE, UV_EAI_SOCKTYPE, UV_ECHARSET, UV_ENONET, UV_EOF,
          UV_ESHUTDOWN, UV_UNKNOWN
    */
    default:
      /* libuv errors are < 0 */
      if (err > 0)
        return err;

      return UVWASI_ENOSYS;
  }
}


int uvwasi__translate_to_uv_signal(uvwasi_signal_t sig) {
  switch (sig) {
#ifdef SIGABRT
    case UVWASI_SIGABRT:   return SIGABRT;
#endif
#ifdef SIGALRM
    case UVWASI_SIGALRM:   return SIGALRM;
#endif
#ifdef SIGBUS
    case UVWASI_SIGBUS:    return SIGBUS;
#endif
#ifdef SIGCHLD
    case UVWASI_SIGCHLD:   return SIGCHLD;
#endif
#ifdef SIGCONT
    case UVWASI_SIGCONT:   return SIGCONT;
#endif
#ifdef SIGFPE
    case UVWASI_SIGFPE:    return SIGFPE;
#endif
#ifdef SIGHUP
    case UVWASI_SIGHUP:    return SIGHUP;
#endif
#ifdef SIGILL
    case UVWASI_SIGILL:    return SIGILL;
#endif
#ifdef SIGINT
    case UVWASI_SIGINT:    return SIGINT;
#endif
#ifdef SIGKILL
    case UVWASI_SIGKILL:   return SIGKILL;
#endif
#ifdef SIGPIPE
    case UVWASI_SIGPIPE:   return SIGPIPE;
#endif
#ifdef SIGQUIT
    case UVWASI_SIGQUIT:   return SIGQUIT;
#endif
#ifdef SIGSEGV
    case UVWASI_SIGSEGV:   return SIGSEGV;
#endif
#ifdef SIGSTOP
    case UVWASI_SIGSTOP:   return SIGSTOP;
#endif
#ifdef SIGSYS
    case UVWASI_SIGSYS:    return SIGSYS;
#endif
#ifdef SIGTERM
    case UVWASI_SIGTERM:   return SIGTERM;
#endif
#ifdef SIGTRAP
    case UVWASI_SIGTRAP:   return SIGTRAP;
#endif
#ifdef SIGTSTP
    case UVWASI_SIGTSTP:   return SIGTSTP;
#endif
#ifdef SIGTTIN
    case UVWASI_SIGTTIN:   return SIGTTIN;
#endif
#ifdef SIGTTOU
    case UVWASI_SIGTTOU:   return SIGTTOU;
#endif
#ifdef SIGURG
    case UVWASI_SIGURG:    return SIGURG;
#endif
#ifdef SIGUSR1
    case UVWASI_SIGUSR1:   return SIGUSR1;
#endif
#ifdef SIGUSR2
    case UVWASI_SIGUSR2:   return SIGUSR2;
#endif
#ifdef SIGVTALRM
    case UVWASI_SIGVTALRM: return SIGVTALRM;
#endif
#ifdef SIGXCPU
    case UVWASI_SIGXCPU:   return SIGXCPU;
#endif
#ifdef SIGXFSZ
    case UVWASI_SIGXFSZ:   return SIGXFSZ;
#endif
    default:               return -1;
  }
}


uvwasi_timestamp_t uvwasi__timespec_to_timestamp(const uv_timespec_t* ts) {
  /* TODO(cjihrig): Handle overflow. */
  return (uvwasi_timestamp_t) ts->tv_sec * NANOS_PER_SEC + ts->tv_nsec;
}


uvwasi_filetype_t uvwasi__stat_to_filetype(const uv_stat_t* stat) {
  uint64_t mode;

  mode = stat->st_mode;

  if (S_ISREG(mode))
    return UVWASI_FILETYPE_REGULAR_FILE;

  if (S_ISDIR(mode))
    return UVWASI_FILETYPE_DIRECTORY;

  if (S_ISCHR(mode))
    return UVWASI_FILETYPE_CHARACTER_DEVICE;

  if (S_ISLNK(mode))
    return UVWASI_FILETYPE_SYMBOLIC_LINK;

#ifdef S_ISSOCK
  if (S_ISSOCK(mode))
    return UVWASI_FILETYPE_SOCKET_STREAM;
#endif /* S_ISSOCK */

#ifdef S_ISFIFO
  if (S_ISFIFO(mode))
    return UVWASI_FILETYPE_SOCKET_STREAM;
#endif /* S_ISFIFO */

#ifdef S_ISBLK
  if (S_ISBLK(mode))
    return UVWASI_FILETYPE_BLOCK_DEVICE;
#endif /* S_ISBLK */

  return UVWASI_FILETYPE_UNKNOWN;
}


void uvwasi__stat_to_filestat(const uv_stat_t* stat, uvwasi_filestat_t* fs) {
  fs->st_dev = stat->st_dev;
  fs->st_ino = stat->st_ino;
  fs->st_nlink = stat->st_nlink;
  fs->st_size = stat->st_size;
  fs->st_filetype = uvwasi__stat_to_filetype(stat);
  fs->st_atim = uvwasi__timespec_to_timestamp(&stat->st_atim);
  fs->st_mtim = uvwasi__timespec_to_timestamp(&stat->st_mtim);
  fs->st_ctim = uvwasi__timespec_to_timestamp(&stat->st_ctim);
}