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