Home | History | Annotate | Download | only in syscall
      1 // Copyright 2013 The Go Authors.  All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package syscall
      6 
      7 // TODO: generate with runtime/mknacl.sh, allow override with IRT.
      8 const (
      9 	sys_null                 = 1
     10 	sys_nameservice          = 2
     11 	sys_dup                  = 8
     12 	sys_dup2                 = 9
     13 	sys_open                 = 10
     14 	sys_close                = 11
     15 	sys_read                 = 12
     16 	sys_write                = 13
     17 	sys_lseek                = 14
     18 	sys_stat                 = 16
     19 	sys_fstat                = 17
     20 	sys_chmod                = 18
     21 	sys_isatty               = 19
     22 	sys_brk                  = 20
     23 	sys_mmap                 = 21
     24 	sys_munmap               = 22
     25 	sys_getdents             = 23
     26 	sys_mprotect             = 24
     27 	sys_list_mappings        = 25
     28 	sys_exit                 = 30
     29 	sys_getpid               = 31
     30 	sys_sched_yield          = 32
     31 	sys_sysconf              = 33
     32 	sys_gettimeofday         = 40
     33 	sys_clock                = 41
     34 	sys_nanosleep            = 42
     35 	sys_clock_getres         = 43
     36 	sys_clock_gettime        = 44
     37 	sys_mkdir                = 45
     38 	sys_rmdir                = 46
     39 	sys_chdir                = 47
     40 	sys_getcwd               = 48
     41 	sys_unlink               = 49
     42 	sys_imc_makeboundsock    = 60
     43 	sys_imc_accept           = 61
     44 	sys_imc_connect          = 62
     45 	sys_imc_sendmsg          = 63
     46 	sys_imc_recvmsg          = 64
     47 	sys_imc_mem_obj_create   = 65
     48 	sys_imc_socketpair       = 66
     49 	sys_mutex_create         = 70
     50 	sys_mutex_lock           = 71
     51 	sys_mutex_trylock        = 72
     52 	sys_mutex_unlock         = 73
     53 	sys_cond_create          = 74
     54 	sys_cond_wait            = 75
     55 	sys_cond_signal          = 76
     56 	sys_cond_broadcast       = 77
     57 	sys_cond_timed_wait_abs  = 79
     58 	sys_thread_create        = 80
     59 	sys_thread_exit          = 81
     60 	sys_tls_init             = 82
     61 	sys_thread_nice          = 83
     62 	sys_tls_get              = 84
     63 	sys_second_tls_set       = 85
     64 	sys_second_tls_get       = 86
     65 	sys_exception_handler    = 87
     66 	sys_exception_stack      = 88
     67 	sys_exception_clear_flag = 89
     68 	sys_sem_create           = 100
     69 	sys_sem_wait             = 101
     70 	sys_sem_post             = 102
     71 	sys_sem_get_value        = 103
     72 	sys_dyncode_create       = 104
     73 	sys_dyncode_modify       = 105
     74 	sys_dyncode_delete       = 106
     75 	sys_test_infoleak        = 109
     76 	sys_test_crash           = 110
     77 	sys_test_syscall_1       = 111
     78 	sys_test_syscall_2       = 112
     79 	sys_futex_wait_abs       = 120
     80 	sys_futex_wake           = 121
     81 	sys_pread                = 130
     82 	sys_pwrite               = 131
     83 	sys_truncate             = 140
     84 	sys_lstat                = 141
     85 	sys_link                 = 142
     86 	sys_rename               = 143
     87 	sys_symlink              = 144
     88 	sys_access               = 145
     89 	sys_readlink             = 146
     90 	sys_utimes               = 147
     91 	sys_get_random_bytes     = 150
     92 )
     93 
     94 // TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
     95 const (
     96 	// native_client/src/trusted/service_runtime/include/sys/errno.h
     97 	// The errors are mainly copied from Linux.
     98 	EPERM           Errno = 1       /* Operation not permitted */
     99 	ENOENT          Errno = 2       /* No such file or directory */
    100 	ESRCH           Errno = 3       /* No such process */
    101 	EINTR           Errno = 4       /* Interrupted system call */
    102 	EIO             Errno = 5       /* I/O error */
    103 	ENXIO           Errno = 6       /* No such device or address */
    104 	E2BIG           Errno = 7       /* Argument list too long */
    105 	ENOEXEC         Errno = 8       /* Exec format error */
    106 	EBADF           Errno = 9       /* Bad file number */
    107 	ECHILD          Errno = 10      /* No child processes */
    108 	EAGAIN          Errno = 11      /* Try again */
    109 	ENOMEM          Errno = 12      /* Out of memory */
    110 	EACCES          Errno = 13      /* Permission denied */
    111 	EFAULT          Errno = 14      /* Bad address */
    112 	EBUSY           Errno = 16      /* Device or resource busy */
    113 	EEXIST          Errno = 17      /* File exists */
    114 	EXDEV           Errno = 18      /* Cross-device link */
    115 	ENODEV          Errno = 19      /* No such device */
    116 	ENOTDIR         Errno = 20      /* Not a directory */
    117 	EISDIR          Errno = 21      /* Is a directory */
    118 	EINVAL          Errno = 22      /* Invalid argument */
    119 	ENFILE          Errno = 23      /* File table overflow */
    120 	EMFILE          Errno = 24      /* Too many open files */
    121 	ENOTTY          Errno = 25      /* Not a typewriter */
    122 	EFBIG           Errno = 27      /* File too large */
    123 	ENOSPC          Errno = 28      /* No space left on device */
    124 	ESPIPE          Errno = 29      /* Illegal seek */
    125 	EROFS           Errno = 30      /* Read-only file system */
    126 	EMLINK          Errno = 31      /* Too many links */
    127 	EPIPE           Errno = 32      /* Broken pipe */
    128 	ENAMETOOLONG    Errno = 36      /* File name too long */
    129 	ENOSYS          Errno = 38      /* Function not implemented */
    130 	EDQUOT          Errno = 122     /* Quota exceeded */
    131 	EDOM            Errno = 33      /* Math arg out of domain of func */
    132 	ERANGE          Errno = 34      /* Math result not representable */
    133 	EDEADLK         Errno = 35      /* Deadlock condition */
    134 	ENOLCK          Errno = 37      /* No record locks available */
    135 	ENOTEMPTY       Errno = 39      /* Directory not empty */
    136 	ELOOP           Errno = 40      /* Too many symbolic links */
    137 	ENOMSG          Errno = 42      /* No message of desired type */
    138 	EIDRM           Errno = 43      /* Identifier removed */
    139 	ECHRNG          Errno = 44      /* Channel number out of range */
    140 	EL2NSYNC        Errno = 45      /* Level 2 not synchronized */
    141 	EL3HLT          Errno = 46      /* Level 3 halted */
    142 	EL3RST          Errno = 47      /* Level 3 reset */
    143 	ELNRNG          Errno = 48      /* Link number out of range */
    144 	EUNATCH         Errno = 49      /* Protocol driver not attached */
    145 	ENOCSI          Errno = 50      /* No CSI structure available */
    146 	EL2HLT          Errno = 51      /* Level 2 halted */
    147 	EBADE           Errno = 52      /* Invalid exchange */
    148 	EBADR           Errno = 53      /* Invalid request descriptor */
    149 	EXFULL          Errno = 54      /* Exchange full */
    150 	ENOANO          Errno = 55      /* No anode */
    151 	EBADRQC         Errno = 56      /* Invalid request code */
    152 	EBADSLT         Errno = 57      /* Invalid slot */
    153 	EDEADLOCK       Errno = EDEADLK /* File locking deadlock error */
    154 	EBFONT          Errno = 59      /* Bad font file fmt */
    155 	ENOSTR          Errno = 60      /* Device not a stream */
    156 	ENODATA         Errno = 61      /* No data (for no delay io) */
    157 	ETIME           Errno = 62      /* Timer expired */
    158 	ENOSR           Errno = 63      /* Out of streams resources */
    159 	ENONET          Errno = 64      /* Machine is not on the network */
    160 	ENOPKG          Errno = 65      /* Package not installed */
    161 	EREMOTE         Errno = 66      /* The object is remote */
    162 	ENOLINK         Errno = 67      /* The link has been severed */
    163 	EADV            Errno = 68      /* Advertise error */
    164 	ESRMNT          Errno = 69      /* Srmount error */
    165 	ECOMM           Errno = 70      /* Communication error on send */
    166 	EPROTO          Errno = 71      /* Protocol error */
    167 	EMULTIHOP       Errno = 72      /* Multihop attempted */
    168 	EDOTDOT         Errno = 73      /* Cross mount point (not really error) */
    169 	EBADMSG         Errno = 74      /* Trying to read unreadable message */
    170 	EOVERFLOW       Errno = 75      /* Value too large for defined data type */
    171 	ENOTUNIQ        Errno = 76      /* Given log. name not unique */
    172 	EBADFD          Errno = 77      /* f.d. invalid for this operation */
    173 	EREMCHG         Errno = 78      /* Remote address changed */
    174 	ELIBACC         Errno = 79      /* Can't access a needed shared lib */
    175 	ELIBBAD         Errno = 80      /* Accessing a corrupted shared lib */
    176 	ELIBSCN         Errno = 81      /* .lib section in a.out corrupted */
    177 	ELIBMAX         Errno = 82      /* Attempting to link in too many libs */
    178 	ELIBEXEC        Errno = 83      /* Attempting to exec a shared library */
    179 	EILSEQ          Errno = 84
    180 	EUSERS          Errno = 87
    181 	ENOTSOCK        Errno = 88  /* Socket operation on non-socket */
    182 	EDESTADDRREQ    Errno = 89  /* Destination address required */
    183 	EMSGSIZE        Errno = 90  /* Message too long */
    184 	EPROTOTYPE      Errno = 91  /* Protocol wrong type for socket */
    185 	ENOPROTOOPT     Errno = 92  /* Protocol not available */
    186 	EPROTONOSUPPORT Errno = 93  /* Unknown protocol */
    187 	ESOCKTNOSUPPORT Errno = 94  /* Socket type not supported */
    188 	EOPNOTSUPP      Errno = 95  /* Operation not supported on transport endpoint */
    189 	EPFNOSUPPORT    Errno = 96  /* Protocol family not supported */
    190 	EAFNOSUPPORT    Errno = 97  /* Address family not supported by protocol family */
    191 	EADDRINUSE      Errno = 98  /* Address already in use */
    192 	EADDRNOTAVAIL   Errno = 99  /* Address not available */
    193 	ENETDOWN        Errno = 100 /* Network interface is not configured */
    194 	ENETUNREACH     Errno = 101 /* Network is unreachable */
    195 	ENETRESET       Errno = 102
    196 	ECONNABORTED    Errno = 103 /* Connection aborted */
    197 	ECONNRESET      Errno = 104 /* Connection reset by peer */
    198 	ENOBUFS         Errno = 105 /* No buffer space available */
    199 	EISCONN         Errno = 106 /* Socket is already connected */
    200 	ENOTCONN        Errno = 107 /* Socket is not connected */
    201 	ESHUTDOWN       Errno = 108 /* Can't send after socket shutdown */
    202 	ETOOMANYREFS    Errno = 109
    203 	ETIMEDOUT       Errno = 110 /* Connection timed out */
    204 	ECONNREFUSED    Errno = 111 /* Connection refused */
    205 	EHOSTDOWN       Errno = 112 /* Host is down */
    206 	EHOSTUNREACH    Errno = 113 /* Host is unreachable */
    207 	EALREADY        Errno = 114 /* Socket already connected */
    208 	EINPROGRESS     Errno = 115 /* Connection already in progress */
    209 	ESTALE          Errno = 116
    210 	ENOTSUP         Errno = EOPNOTSUPP /* Not supported */
    211 	ENOMEDIUM       Errno = 123        /* No medium (in tape drive) */
    212 	ECANCELED       Errno = 125        /* Operation canceled. */
    213 	ELBIN           Errno = 2048       /* Inode is remote (not really error) */
    214 	EFTYPE          Errno = 2049       /* Inappropriate file type or format */
    215 	ENMFILE         Errno = 2050       /* No more files */
    216 	EPROCLIM        Errno = 2051
    217 	ENOSHARE        Errno = 2052   /* No such host or network path */
    218 	ECASECLASH      Errno = 2053   /* Filename exists with different case */
    219 	EWOULDBLOCK     Errno = EAGAIN /* Operation would block */
    220 )
    221 
    222 // TODO: Auto-generate some day. (Hard-coded in binaries so not likely to change.)
    223 var errorstr = [...]string{
    224 	EPERM:           "Operation not permitted",
    225 	ENOENT:          "No such file or directory",
    226 	ESRCH:           "No such process",
    227 	EINTR:           "Interrupted system call",
    228 	EIO:             "I/O error",
    229 	ENXIO:           "No such device or address",
    230 	E2BIG:           "Argument list too long",
    231 	ENOEXEC:         "Exec format error",
    232 	EBADF:           "Bad file number",
    233 	ECHILD:          "No child processes",
    234 	EAGAIN:          "Try again",
    235 	ENOMEM:          "Out of memory",
    236 	EACCES:          "Permission denied",
    237 	EFAULT:          "Bad address",
    238 	EBUSY:           "Device or resource busy",
    239 	EEXIST:          "File exists",
    240 	EXDEV:           "Cross-device link",
    241 	ENODEV:          "No such device",
    242 	ENOTDIR:         "Not a directory",
    243 	EISDIR:          "Is a directory",
    244 	EINVAL:          "Invalid argument",
    245 	ENFILE:          "File table overflow",
    246 	EMFILE:          "Too many open files",
    247 	ENOTTY:          "Not a typewriter",
    248 	EFBIG:           "File too large",
    249 	ENOSPC:          "No space left on device",
    250 	ESPIPE:          "Illegal seek",
    251 	EROFS:           "Read-only file system",
    252 	EMLINK:          "Too many links",
    253 	EPIPE:           "Broken pipe",
    254 	ENAMETOOLONG:    "File name too long",
    255 	ENOSYS:          "not implemented on Native Client",
    256 	EDQUOT:          "Quota exceeded",
    257 	EDOM:            "Math arg out of domain of func",
    258 	ERANGE:          "Math result not representable",
    259 	EDEADLK:         "Deadlock condition",
    260 	ENOLCK:          "No record locks available",
    261 	ENOTEMPTY:       "Directory not empty",
    262 	ELOOP:           "Too many symbolic links",
    263 	ENOMSG:          "No message of desired type",
    264 	EIDRM:           "Identifier removed",
    265 	ECHRNG:          "Channel number out of range",
    266 	EL2NSYNC:        "Level 2 not synchronized",
    267 	EL3HLT:          "Level 3 halted",
    268 	EL3RST:          "Level 3 reset",
    269 	ELNRNG:          "Link number out of range",
    270 	EUNATCH:         "Protocol driver not attached",
    271 	ENOCSI:          "No CSI structure available",
    272 	EL2HLT:          "Level 2 halted",
    273 	EBADE:           "Invalid exchange",
    274 	EBADR:           "Invalid request descriptor",
    275 	EXFULL:          "Exchange full",
    276 	ENOANO:          "No anode",
    277 	EBADRQC:         "Invalid request code",
    278 	EBADSLT:         "Invalid slot",
    279 	EBFONT:          "Bad font file fmt",
    280 	ENOSTR:          "Device not a stream",
    281 	ENODATA:         "No data (for no delay io)",
    282 	ETIME:           "Timer expired",
    283 	ENOSR:           "Out of streams resources",
    284 	ENONET:          "Machine is not on the network",
    285 	ENOPKG:          "Package not installed",
    286 	EREMOTE:         "The object is remote",
    287 	ENOLINK:         "The link has been severed",
    288 	EADV:            "Advertise error",
    289 	ESRMNT:          "Srmount error",
    290 	ECOMM:           "Communication error on send",
    291 	EPROTO:          "Protocol error",
    292 	EMULTIHOP:       "Multihop attempted",
    293 	EDOTDOT:         "Cross mount point (not really error)",
    294 	EBADMSG:         "Trying to read unreadable message",
    295 	EOVERFLOW:       "Value too large for defined data type",
    296 	ENOTUNIQ:        "Given log. name not unique",
    297 	EBADFD:          "f.d. invalid for this operation",
    298 	EREMCHG:         "Remote address changed",
    299 	ELIBACC:         "Can't access a needed shared lib",
    300 	ELIBBAD:         "Accessing a corrupted shared lib",
    301 	ELIBSCN:         ".lib section in a.out corrupted",
    302 	ELIBMAX:         "Attempting to link in too many libs",
    303 	ELIBEXEC:        "Attempting to exec a shared library",
    304 	ENOTSOCK:        "Socket operation on non-socket",
    305 	EDESTADDRREQ:    "Destination address required",
    306 	EMSGSIZE:        "Message too long",
    307 	EPROTOTYPE:      "Protocol wrong type for socket",
    308 	ENOPROTOOPT:     "Protocol not available",
    309 	EPROTONOSUPPORT: "Unknown protocol",
    310 	ESOCKTNOSUPPORT: "Socket type not supported",
    311 	EOPNOTSUPP:      "Operation not supported on transport endpoint",
    312 	EPFNOSUPPORT:    "Protocol family not supported",
    313 	EAFNOSUPPORT:    "Address family not supported by protocol family",
    314 	EADDRINUSE:      "Address already in use",
    315 	EADDRNOTAVAIL:   "Address not available",
    316 	ENETDOWN:        "Network interface is not configured",
    317 	ENETUNREACH:     "Network is unreachable",
    318 	ECONNABORTED:    "Connection aborted",
    319 	ECONNRESET:      "Connection reset by peer",
    320 	ENOBUFS:         "No buffer space available",
    321 	EISCONN:         "Socket is already connected",
    322 	ENOTCONN:        "Socket is not connected",
    323 	ESHUTDOWN:       "Can't send after socket shutdown",
    324 	ETIMEDOUT:       "Connection timed out",
    325 	ECONNREFUSED:    "Connection refused",
    326 	EHOSTDOWN:       "Host is down",
    327 	EHOSTUNREACH:    "Host is unreachable",
    328 	EALREADY:        "Socket already connected",
    329 	EINPROGRESS:     "Connection already in progress",
    330 	ENOMEDIUM:       "No medium (in tape drive)",
    331 	ECANCELED:       "Operation canceled.",
    332 	ELBIN:           "Inode is remote (not really error)",
    333 	EFTYPE:          "Inappropriate file type or format",
    334 	ENMFILE:         "No more files",
    335 	ENOSHARE:        "No such host or network path",
    336 	ECASECLASH:      "Filename exists with different case",
    337 }
    338 
    339 // Do the interface allocations only once for common
    340 // Errno values.
    341 var (
    342 	errEAGAIN error = EAGAIN
    343 	errEINVAL error = EINVAL
    344 	errENOENT error = ENOENT
    345 )
    346 
    347 // errnoErr returns common boxed Errno values, to prevent
    348 // allocations at runtime.
    349 func errnoErr(e Errno) error {
    350 	switch e {
    351 	case 0:
    352 		return nil
    353 	case EAGAIN:
    354 		return errEAGAIN
    355 	case EINVAL:
    356 		return errEINVAL
    357 	case ENOENT:
    358 		return errENOENT
    359 	}
    360 	return e
    361 }
    362