xref: /NextBSD/sys/contrib/cloudabi/syscalldefs_mi.h (revision c21ffb8d6aca32c9584cfa072f309a5890a21aea)
1 // Copyright (c) 2015 Nuxi, https://nuxi.nl/
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions
5 // are met:
6 // 1. Redistributions of source code must retain the above copyright
7 //    notice, this list of conditions and the following disclaimer.
8 // 2. Redistributions in binary form must reproduce the above copyright
9 //    notice, this list of conditions and the following disclaimer in the
10 //    documentation and/or other materials provided with the distribution.
11 //
12 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
13 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15 // ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18 // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
19 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
20 // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
21 // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
22 // SUCH DAMAGE.
23 
24 #ifndef COMMON_SYSCALLDEFS_MI_H
25 #define COMMON_SYSCALLDEFS_MI_H
26 
27 // Machine independent definitions.
28 
29 // Socket address families.
30 #define CLOUDABI_AF_UNSPEC 0
31 #define CLOUDABI_AF_INET 1
32 #define CLOUDABI_AF_INET6 2
33 #define CLOUDABI_AF_UNIX 3
34 
35 // File and memory I/O advice.
36 #define CLOUDABI_ADVICE_DONTNEED 1
37 #define CLOUDABI_ADVICE_NOREUSE 2
38 #define CLOUDABI_ADVICE_NORMAL 3
39 #define CLOUDABI_ADVICE_RANDOM 4
40 #define CLOUDABI_ADVICE_SEQUENTIAL 5
41 #define CLOUDABI_ADVICE_WILLNEED 6
42 
43 // Auxiliary vector entries. All entries that are also part of the
44 // x86-64 ABI use the same number. All extensions start at 256.
45 #define CLOUDABI_AT_ARGDATA 256
46 #define CLOUDABI_AT_ARGDATALEN 257
47 #define CLOUDABI_AT_CANARY 258
48 #define CLOUDABI_AT_CANARYLEN 259
49 #define CLOUDABI_AT_NCPUS 260
50 #define CLOUDABI_AT_NULL 0
51 #define CLOUDABI_AT_PAGESZ 6
52 #define CLOUDABI_AT_PHDR 3
53 #define CLOUDABI_AT_PHNUM 4
54 #define CLOUDABI_AT_TID 261
55 
56 // Clocks.
57 #define CLOUDABI_CLOCK_MONOTONIC 1
58 #define CLOUDABI_CLOCK_PROCESS_CPUTIME_ID 2
59 #define CLOUDABI_CLOCK_REALTIME 3
60 #define CLOUDABI_CLOCK_THREAD_CPUTIME_ID 4
61 
62 // Condition variables.
63 #define CLOUDABI_CONDVAR_HAS_NO_WAITERS 0
64 
65 // The start of a directory, to be passed to readdir().
66 #define CLOUDABI_DIRCOOKIE_START 0
67 
68 // POSIX standard error numbers.
69 #define CLOUDABI_E2BIG 1
70 #define CLOUDABI_EACCES 2
71 #define CLOUDABI_EADDRINUSE 3
72 #define CLOUDABI_EADDRNOTAVAIL 4
73 #define CLOUDABI_EAFNOSUPPORT 5
74 #define CLOUDABI_EAGAIN 6
75 #define CLOUDABI_EALREADY 7
76 #define CLOUDABI_EBADF 8
77 #define CLOUDABI_EBADMSG 9
78 #define CLOUDABI_EBUSY 10
79 #define CLOUDABI_ECANCELED 11
80 #define CLOUDABI_ECHILD 12
81 #define CLOUDABI_ECONNABORTED 13
82 #define CLOUDABI_ECONNREFUSED 14
83 #define CLOUDABI_ECONNRESET 15
84 #define CLOUDABI_EDEADLK 16
85 #define CLOUDABI_EDESTADDRREQ 17
86 #define CLOUDABI_EDOM 18
87 #define CLOUDABI_EDQUOT 19
88 #define CLOUDABI_EEXIST 20
89 #define CLOUDABI_EFAULT 21
90 #define CLOUDABI_EFBIG 22
91 #define CLOUDABI_EHOSTUNREACH 23
92 #define CLOUDABI_EIDRM 24
93 #define CLOUDABI_EILSEQ 25
94 #define CLOUDABI_EINPROGRESS 26
95 #define CLOUDABI_EINTR 27
96 #define CLOUDABI_EINVAL 28
97 #define CLOUDABI_EIO 29
98 #define CLOUDABI_EISCONN 30
99 #define CLOUDABI_EISDIR 31
100 #define CLOUDABI_ELOOP 32
101 #define CLOUDABI_EMFILE 33
102 #define CLOUDABI_EMLINK 34
103 #define CLOUDABI_EMSGSIZE 35
104 #define CLOUDABI_EMULTIHOP 36
105 #define CLOUDABI_ENAMETOOLONG 37
106 #define CLOUDABI_ENETDOWN 38
107 #define CLOUDABI_ENETRESET 39
108 #define CLOUDABI_ENETUNREACH 40
109 #define CLOUDABI_ENFILE 41
110 #define CLOUDABI_ENOBUFS 42
111 #define CLOUDABI_ENODEV 43
112 #define CLOUDABI_ENOENT 44
113 #define CLOUDABI_ENOEXEC 45
114 #define CLOUDABI_ENOLCK 46
115 #define CLOUDABI_ENOLINK 47
116 #define CLOUDABI_ENOMEM 48
117 #define CLOUDABI_ENOMSG 49
118 #define CLOUDABI_ENOPROTOOPT 50
119 #define CLOUDABI_ENOSPC 51
120 #define CLOUDABI_ENOSYS 52
121 #define CLOUDABI_ENOTCONN 53
122 #define CLOUDABI_ENOTDIR 54
123 #define CLOUDABI_ENOTEMPTY 55
124 #define CLOUDABI_ENOTRECOVERABLE 56
125 #define CLOUDABI_ENOTSOCK 57
126 #define CLOUDABI_ENOTSUP 58
127 #define CLOUDABI_ENOTTY 59
128 #define CLOUDABI_ENXIO 60
129 #define CLOUDABI_EOVERFLOW 61
130 #define CLOUDABI_EOWNERDEAD 62
131 #define CLOUDABI_EPERM 63
132 #define CLOUDABI_EPIPE 64
133 #define CLOUDABI_EPROTO 65
134 #define CLOUDABI_EPROTONOSUPPORT 66
135 #define CLOUDABI_EPROTOTYPE 67
136 #define CLOUDABI_ERANGE 68
137 #define CLOUDABI_EROFS 69
138 #define CLOUDABI_ESPIPE 70
139 #define CLOUDABI_ESRCH 71
140 #define CLOUDABI_ESTALE 72
141 #define CLOUDABI_ETIMEDOUT 73
142 #define CLOUDABI_ETXTBSY 74
143 #define CLOUDABI_EXDEV 75
144 
145 // Non-standard error numbers.
146 #define CLOUDABI_ENOTCAPABLE 76
147 
148 #define CLOUDABI_EVENT_FD_READWRITE_HANGUP 0x1
149 
150 // Filter types for cloudabi_eventtype_t.
151 #define CLOUDABI_EVENTTYPE_CLOCK 1
152 #define CLOUDABI_EVENTTYPE_CONDVAR 2
153 #define CLOUDABI_EVENTTYPE_FD_READ 3
154 #define CLOUDABI_EVENTTYPE_FD_WRITE 4
155 #define CLOUDABI_EVENTTYPE_LOCK_RDLOCK 5
156 #define CLOUDABI_EVENTTYPE_LOCK_WRLOCK 6
157 #define CLOUDABI_EVENTTYPE_PROC_TERMINATE 7
158 
159 // File descriptor behavior flags.
160 #define CLOUDABI_FDFLAG_APPEND 0x1
161 #define CLOUDABI_FDFLAG_DSYNC 0x2
162 #define CLOUDABI_FDFLAG_NONBLOCK 0x4
163 #define CLOUDABI_FDFLAG_RSYNC 0x8
164 #define CLOUDABI_FDFLAG_SYNC 0x10
165 
166 // fdstat_put() flags.
167 #define CLOUDABI_FDSTAT_FLAGS 0x1
168 #define CLOUDABI_FDSTAT_RIGHTS 0x2
169 
170 // filestat_put() flags.
171 #define CLOUDABI_FILESTAT_ATIM 0x1
172 #define CLOUDABI_FILESTAT_ATIM_NOW 0x2
173 #define CLOUDABI_FILESTAT_MTIM 0x4
174 #define CLOUDABI_FILESTAT_MTIM_NOW 0x8
175 #define CLOUDABI_FILESTAT_SIZE 0x10
176 
177 // File types returned through struct stat::st_mode.
178 #define CLOUDABI_FILETYPE_UNKNOWN 0
179 #define CLOUDABI_FILETYPE_BLOCK_DEVICE 0x10
180 #define CLOUDABI_FILETYPE_CHARACTER_DEVICE 0x11
181 #define CLOUDABI_FILETYPE_DIRECTORY 0x20
182 #define CLOUDABI_FILETYPE_FIFO 0x30
183 #define CLOUDABI_FILETYPE_POLL 0x40
184 #define CLOUDABI_FILETYPE_PROCESS 0x50
185 #define CLOUDABI_FILETYPE_REGULAR_FILE 0x60
186 #define CLOUDABI_FILETYPE_SHARED_MEMORY 0x70
187 #define CLOUDABI_FILETYPE_SOCKET_DGRAM 0x80
188 #define CLOUDABI_FILETYPE_SOCKET_SEQPACKET 0x81
189 #define CLOUDABI_FILETYPE_SOCKET_STREAM 0x82
190 #define CLOUDABI_FILETYPE_SYMBOLIC_LINK 0x90
191 
192 // Read-write lock related constants.
193 #define CLOUDABI_LOCK_UNLOCKED 0                 // Lock is unlocked.
194 #define CLOUDABI_LOCK_WRLOCKED 0x40000000        // Lock is write locked.
195 #define CLOUDABI_LOCK_KERNEL_MANAGED 0x80000000  // Lock has waiters.
196 #define CLOUDABI_LOCK_BOGUS 0x80000000           // Lock is broken.
197 
198 // Lookup properties for *at() functions.
199 #define CLOUDABI_LOOKUP_SYMLINK_FOLLOW (UINT64_C(0x1) << 32)
200 
201 // Open flags for openat(), etc.
202 #define CLOUDABI_O_CREAT 0x1
203 #define CLOUDABI_O_DIRECTORY 0x2
204 #define CLOUDABI_O_EXCL 0x4
205 #define CLOUDABI_O_TRUNC 0x8
206 
207 // File descriptor returned to pdfork()'s child process.
208 #define CLOUDABI_PROCESS_CHILD 0xffffffff
209 
210 // mmap() map flags.
211 #define CLOUDABI_MAP_ANON 0x1
212 #define CLOUDABI_MAP_FIXED 0x2
213 #define CLOUDABI_MAP_PRIVATE 0x4
214 #define CLOUDABI_MAP_SHARED 0x8
215 
216 // File descriptor that must be passed in when using CLOUDABI_MAP_ANON.
217 #define CLOUDABI_MAP_ANON_FD 0xffffffff
218 
219 // msync() flags.
220 #define CLOUDABI_MS_ASYNC 0x1
221 #define CLOUDABI_MS_INVALIDATE 0x2
222 #define CLOUDABI_MS_SYNC 0x4
223 
224 // send() and recv() flags.
225 #define CLOUDABI_MSG_CTRUNC 0x1    // Control data truncated.
226 #define CLOUDABI_MSG_EOR 0x2       // Terminates a record.
227 #define CLOUDABI_MSG_PEEK 0x4      // Leave received data in queue.
228 #define CLOUDABI_MSG_TRUNC 0x8     // Normal data truncated.
229 #define CLOUDABI_MSG_WAITALL 0x10  // Attempt to fill the read buffer.
230 
231 // mmap()/mprotect() protection flags.
232 #define CLOUDABI_PROT_EXEC 0x1
233 #define CLOUDABI_PROT_WRITE 0x2
234 #define CLOUDABI_PROT_READ 0x4
235 
236 // File descriptor capabilities/rights.
237 #define CLOUDABI_RIGHT_BIT(bit) (UINT64_C(1) << (bit))
238 #define CLOUDABI_RIGHT_FD_DATASYNC CLOUDABI_RIGHT_BIT(0)
239 #define CLOUDABI_RIGHT_FD_READ CLOUDABI_RIGHT_BIT(1)
240 #define CLOUDABI_RIGHT_FD_SEEK CLOUDABI_RIGHT_BIT(2)
241 #define CLOUDABI_RIGHT_FD_STAT_PUT_FLAGS CLOUDABI_RIGHT_BIT(3)
242 #define CLOUDABI_RIGHT_FD_SYNC CLOUDABI_RIGHT_BIT(4)
243 #define CLOUDABI_RIGHT_FD_TELL CLOUDABI_RIGHT_BIT(5)
244 #define CLOUDABI_RIGHT_FD_WRITE CLOUDABI_RIGHT_BIT(6)
245 #define CLOUDABI_RIGHT_FILE_ADVISE CLOUDABI_RIGHT_BIT(7)
246 #define CLOUDABI_RIGHT_FILE_ALLOCATE CLOUDABI_RIGHT_BIT(8)
247 #define CLOUDABI_RIGHT_FILE_CREATE_DIRECTORY CLOUDABI_RIGHT_BIT(9)
248 #define CLOUDABI_RIGHT_FILE_CREATE_FILE CLOUDABI_RIGHT_BIT(10)
249 #define CLOUDABI_RIGHT_FILE_CREATE_FIFO CLOUDABI_RIGHT_BIT(11)
250 #define CLOUDABI_RIGHT_FILE_LINK_SOURCE CLOUDABI_RIGHT_BIT(12)
251 #define CLOUDABI_RIGHT_FILE_LINK_TARGET CLOUDABI_RIGHT_BIT(13)
252 #define CLOUDABI_RIGHT_FILE_OPEN CLOUDABI_RIGHT_BIT(14)
253 #define CLOUDABI_RIGHT_FILE_READDIR CLOUDABI_RIGHT_BIT(15)
254 #define CLOUDABI_RIGHT_FILE_READLINK CLOUDABI_RIGHT_BIT(16)
255 #define CLOUDABI_RIGHT_FILE_RENAME_SOURCE CLOUDABI_RIGHT_BIT(17)
256 #define CLOUDABI_RIGHT_FILE_RENAME_TARGET CLOUDABI_RIGHT_BIT(18)
257 #define CLOUDABI_RIGHT_FILE_STAT_FGET CLOUDABI_RIGHT_BIT(19)
258 #define CLOUDABI_RIGHT_FILE_STAT_FPUT_SIZE CLOUDABI_RIGHT_BIT(20)
259 #define CLOUDABI_RIGHT_FILE_STAT_FPUT_TIMES CLOUDABI_RIGHT_BIT(21)
260 #define CLOUDABI_RIGHT_FILE_STAT_GET CLOUDABI_RIGHT_BIT(22)
261 #define CLOUDABI_RIGHT_FILE_STAT_PUT_TIMES CLOUDABI_RIGHT_BIT(23)
262 #define CLOUDABI_RIGHT_FILE_SYMLINK CLOUDABI_RIGHT_BIT(24)
263 #define CLOUDABI_RIGHT_FILE_UNLINK CLOUDABI_RIGHT_BIT(25)
264 #define CLOUDABI_RIGHT_MEM_MAP CLOUDABI_RIGHT_BIT(26)
265 #define CLOUDABI_RIGHT_MEM_MAP_EXEC CLOUDABI_RIGHT_BIT(27)
266 #define CLOUDABI_RIGHT_POLL_FD_READWRITE CLOUDABI_RIGHT_BIT(28)
267 #define CLOUDABI_RIGHT_POLL_MODIFY CLOUDABI_RIGHT_BIT(29)
268 #define CLOUDABI_RIGHT_POLL_PROC_TERMINATE CLOUDABI_RIGHT_BIT(30)
269 #define CLOUDABI_RIGHT_POLL_WAIT CLOUDABI_RIGHT_BIT(31)
270 #define CLOUDABI_RIGHT_PROC_EXEC CLOUDABI_RIGHT_BIT(32)
271 #define CLOUDABI_RIGHT_SOCK_ACCEPT CLOUDABI_RIGHT_BIT(33)
272 #define CLOUDABI_RIGHT_SOCK_BIND_DIRECTORY CLOUDABI_RIGHT_BIT(34)
273 #define CLOUDABI_RIGHT_SOCK_BIND_SOCKET CLOUDABI_RIGHT_BIT(35)
274 #define CLOUDABI_RIGHT_SOCK_CONNECT_DIRECTORY CLOUDABI_RIGHT_BIT(36)
275 #define CLOUDABI_RIGHT_SOCK_CONNECT_SOCKET CLOUDABI_RIGHT_BIT(37)
276 #define CLOUDABI_RIGHT_SOCK_LISTEN CLOUDABI_RIGHT_BIT(38)
277 #define CLOUDABI_RIGHT_SOCK_SHUTDOWN CLOUDABI_RIGHT_BIT(39)
278 #define CLOUDABI_RIGHT_SOCK_STAT_GET CLOUDABI_RIGHT_BIT(40)
279 
280 // Socket shutdown flags.
281 #define CLOUDABI_SHUT_RD 0x1
282 #define CLOUDABI_SHUT_WR 0x2
283 
284 // Signals.
285 #define CLOUDABI_SIGABRT 1
286 #define CLOUDABI_SIGALRM 2
287 #define CLOUDABI_SIGBUS 3
288 #define CLOUDABI_SIGCHLD 4
289 #define CLOUDABI_SIGCONT 5
290 #define CLOUDABI_SIGFPE 6
291 #define CLOUDABI_SIGHUP 7
292 #define CLOUDABI_SIGILL 8
293 #define CLOUDABI_SIGINT 9
294 #define CLOUDABI_SIGKILL 10
295 #define CLOUDABI_SIGPIPE 11
296 #define CLOUDABI_SIGQUIT 12
297 #define CLOUDABI_SIGSEGV 13
298 #define CLOUDABI_SIGSTOP 14
299 #define CLOUDABI_SIGSYS 15
300 #define CLOUDABI_SIGTERM 16
301 #define CLOUDABI_SIGTRAP 17
302 #define CLOUDABI_SIGTSTP 18
303 #define CLOUDABI_SIGTTIN 19
304 #define CLOUDABI_SIGTTOU 20
305 #define CLOUDABI_SIGURG 21
306 #define CLOUDABI_SIGUSR1 22
307 #define CLOUDABI_SIGUSR2 23
308 #define CLOUDABI_SIGVTALRM 24
309 #define CLOUDABI_SIGXCPU 25
310 #define CLOUDABI_SIGXFSZ 26
311 
312 // sockstat() flags.
313 #define CLOUDABI_SOCKSTAT_CLEAR_ERROR 0x1
314 
315 // sockstat() state.
316 #define CLOUDABI_SOCKSTAT_ACCEPTCONN 0x1
317 
318 // cloudabi_subscription_t flags.
319 #define CLOUDABI_SUBSCRIPTION_ADD 0x1
320 #define CLOUDABI_SUBSCRIPTION_CLEAR 0x2
321 #define CLOUDABI_SUBSCRIPTION_DELETE 0x4
322 #define CLOUDABI_SUBSCRIPTION_DISABLE 0x8
323 #define CLOUDABI_SUBSCRIPTION_ENABLE 0x10
324 #define CLOUDABI_SUBSCRIPTION_ONESHOT 0x20
325 
326 // cloudabi_subscription_t::clock.flags.
327 #define CLOUDABI_SUBSCRIPTION_CLOCK_ABSTIME 0x1
328 
329 // cloudabi_subscription_t::fd_readwrite.flags.
330 #define CLOUDABI_SUBSCRIPTION_FD_READWRITE_POLL 0x1
331 
332 // unlinkat().
333 #define CLOUDABI_UNLINK_REMOVEDIR 0x1
334 
335 // Seeking.
336 #define CLOUDABI_WHENCE_CUR 1
337 #define CLOUDABI_WHENCE_END 2
338 #define CLOUDABI_WHENCE_SET 3
339 
340 typedef uint8_t cloudabi_advice_t;      // posix_fadvise() and posix_madvise().
341 typedef uint32_t cloudabi_backlog_t;    // listen().
342 typedef uint32_t cloudabi_clockid_t;    // clock_*().
343 typedef uint32_t cloudabi_condvar_t;    // pthread_cond_*().
344 typedef uint64_t cloudabi_device_t;     // struct stat::st_dev.
345 typedef uint64_t cloudabi_dircookie_t;  // readdir().
346 typedef uint16_t cloudabi_errno_t;      // errno.
347 typedef uint8_t cloudabi_eventtype_t;   // poll().
348 typedef uint32_t cloudabi_exitcode_t;   // _exit() and _Exit().
349 typedef uint32_t cloudabi_fd_t;         // File descriptors.
350 typedef uint16_t cloudabi_fdflags_t;    // cloudabi_fdstat_t.
351 typedef uint16_t cloudabi_fdsflags_t;   // fd_stat_put().
352 typedef int64_t cloudabi_filedelta_t;   // lseek().
353 typedef uint64_t cloudabi_filesize_t;   // ftruncate(), struct stat::st_size.
354 typedef uint8_t cloudabi_filetype_t;    // struct stat::st_mode.
355 typedef uint16_t cloudabi_fsflags_t;    // file_stat_put().
356 typedef uint64_t cloudabi_inode_t;      // struct stat::st_ino.
357 typedef uint32_t cloudabi_linkcount_t;  // struct stat::st_nlink.
358 typedef uint32_t cloudabi_lock_t;       // pthread_{mutex,rwlock}_*().
359 typedef uint64_t cloudabi_lookup_t;     // openat(), linkat(), etc.
360 typedef uint8_t cloudabi_mflags_t;      // mmap().
361 typedef uint8_t cloudabi_mprot_t;       // mmap().
362 typedef uint8_t cloudabi_msflags_t;     // msync().
363 typedef uint16_t cloudabi_msgflags_t;   // send() and recv().
364 typedef uint32_t cloudabi_nthreads_t;   // pthread_cond_*().
365 typedef uint16_t cloudabi_oflags_t;     // openat(), etc.
366 typedef uint64_t cloudabi_rights_t;     // File descriptor rights.
367 typedef uint8_t cloudabi_sa_family_t;   // Socket address family.
368 typedef uint8_t cloudabi_sdflags_t;     // shutdown().
369 typedef uint8_t cloudabi_ssflags_t;     // sockstat().
370 typedef uint8_t cloudabi_signal_t;      // raise().
371 typedef uint32_t cloudabi_tid_t;        // Thread ID.
372 typedef uint64_t cloudabi_timestamp_t;  // clock_*(), struct stat::st_*tim.
373 typedef uint8_t cloudabi_ulflags_t;     // unlinkat().
374 typedef uint64_t cloudabi_userdata_t;   // User-supplied data for callbacks.
375 typedef uint8_t cloudabi_whence_t;      // lseek().
376 
377 // Macro to force sane alignment rules.
378 //
379 // On x86-32 it is the case that 64-bit integers are 4-byte aligned when
380 // embedded in structs, even though they are 8-byte aligned when not
381 // embedded. Force 8-byte alignment explicitly.
382 #define MEMBER(type) alignas(alignof(type)) type
383 #define ASSERT_OFFSET(type, field, offset)                    \
384   static_assert(offsetof(cloudabi_##type, field) == (offset), \
385                 "Offset incorrect")
386 #define ASSERT_SIZE(type, size) \
387   static_assert(sizeof(cloudabi_##type) == (size), "Size incorrect")
388 
389 // Directory entries.
390 typedef struct {
391   MEMBER(cloudabi_dircookie_t) d_next;  // Cookie of the next entry.
392   MEMBER(cloudabi_inode_t) d_ino;       // Inode number of the current entry.
393   MEMBER(uint32_t) d_namlen;  // Length of the name of the current entry.
394   MEMBER(cloudabi_filetype_t) d_type;  // File type of the current entry.
395 } cloudabi_dirent_t;
396 ASSERT_OFFSET(dirent_t, d_next, 0);
397 ASSERT_OFFSET(dirent_t, d_ino, 8);
398 ASSERT_OFFSET(dirent_t, d_namlen, 16);
399 ASSERT_OFFSET(dirent_t, d_type, 20);
400 ASSERT_SIZE(dirent_t, 24);
401 
402 // File descriptor status.
403 typedef struct {
404   MEMBER(cloudabi_filetype_t) fs_filetype;         // File descriptor type.
405   MEMBER(cloudabi_fdflags_t) fs_flags;             // Non-blocking mode, etc.
406   MEMBER(cloudabi_rights_t) fs_rights_base;        // Base rights.
407   MEMBER(cloudabi_rights_t) fs_rights_inheriting;  // Inheriting rights.
408 } cloudabi_fdstat_t;
409 ASSERT_OFFSET(fdstat_t, fs_filetype, 0);
410 ASSERT_OFFSET(fdstat_t, fs_flags, 2);
411 ASSERT_OFFSET(fdstat_t, fs_rights_base, 8);
412 ASSERT_OFFSET(fdstat_t, fs_rights_inheriting, 16);
413 ASSERT_SIZE(fdstat_t, 24);
414 
415 // File status.
416 typedef struct {
417   MEMBER(cloudabi_device_t) st_dev;         // Device storing the file.
418   MEMBER(cloudabi_inode_t) st_ino;          // Inode of the file.
419   MEMBER(cloudabi_filetype_t) st_filetype;  // File type.
420   MEMBER(cloudabi_linkcount_t) st_nlink;    // Number of hardlinks.
421   MEMBER(cloudabi_filesize_t) st_size;      // Size of the file.
422   MEMBER(cloudabi_timestamp_t) st_atim;     // Access time.
423   MEMBER(cloudabi_timestamp_t) st_mtim;     // Modification time.
424   MEMBER(cloudabi_timestamp_t) st_ctim;     // Change time.
425 } cloudabi_filestat_t;
426 ASSERT_OFFSET(filestat_t, st_dev, 0);
427 ASSERT_OFFSET(filestat_t, st_ino, 8);
428 ASSERT_OFFSET(filestat_t, st_filetype, 16);
429 ASSERT_OFFSET(filestat_t, st_nlink, 20);
430 ASSERT_OFFSET(filestat_t, st_size, 24);
431 ASSERT_OFFSET(filestat_t, st_atim, 32);
432 ASSERT_OFFSET(filestat_t, st_mtim, 40);
433 ASSERT_OFFSET(filestat_t, st_ctim, 48);
434 ASSERT_SIZE(filestat_t, 56);
435 
436 typedef struct {
437   MEMBER(cloudabi_sa_family_t) sa_family;
438   union {
439     struct {
440       // IPv4 address and port number.
441       MEMBER(uint8_t) addr[4];
442       MEMBER(uint16_t) port;
443     } sa_inet;
444     struct {
445       // IPv6 address and port number.
446       // TODO(ed): What about the flow info and scope ID?
447       MEMBER(uint8_t) addr[16];
448       MEMBER(uint16_t) port;
449     } sa_inet6;
450   };
451 } cloudabi_sockaddr_t;
452 ASSERT_OFFSET(sockaddr_t, sa_family, 0);
453 ASSERT_OFFSET(sockaddr_t, sa_inet.addr, 2);
454 ASSERT_OFFSET(sockaddr_t, sa_inet.port, 6);
455 ASSERT_OFFSET(sockaddr_t, sa_inet6.addr, 2);
456 ASSERT_OFFSET(sockaddr_t, sa_inet6.port, 18);
457 ASSERT_SIZE(sockaddr_t, 20);
458 
459 // Socket status.
460 typedef struct {
461   MEMBER(cloudabi_sockaddr_t) ss_sockname;  // Socket address.
462   MEMBER(cloudabi_sockaddr_t) ss_peername;  // Peer address.
463   MEMBER(cloudabi_errno_t) ss_error;        // Current error state.
464   MEMBER(uint32_t) ss_state;                // State flags.
465 } cloudabi_sockstat_t;
466 ASSERT_OFFSET(sockstat_t, ss_sockname, 0);
467 ASSERT_OFFSET(sockstat_t, ss_peername, 20);
468 ASSERT_OFFSET(sockstat_t, ss_error, 40);
469 ASSERT_OFFSET(sockstat_t, ss_state, 44);
470 ASSERT_SIZE(sockstat_t, 48);
471 
472 #undef MEMBER
473 #undef ASSERT_OFFSET
474 #undef ASSERT_SIZE
475 
476 #endif
477