Home | History | Annotate | Download | only in include
      1 #ifndef ERRNO_H
      2 #define ERRNO_H
      3 
      4 FILE_LICENCE ( GPL2_OR_LATER );
      5 
      6 /** @file
      7  *
      8  * Error codes
      9  *
     10  * Return status codes as used within gPXE are designed to allow for
     11  * maximum visibility into the source of an error even in an end-user
     12  * build with no debugging.  They are constructed as follows:
     13  *
     14  * Bits 7-0 : PXE error code
     15  *
     16  * This is the closest equivalent PXE error code
     17  * (e.g. PXENV_STATUS_OUT_OF_RESOURCES), and is the only part of the
     18  * error that will be returned via the PXE API, since PXE has
     19  * predefined error codes.
     20  *
     21  * Bits 12-8 : Per-file disambiguator
     22  *
     23  * When the same error number can be generated from multiple points
     24  * within a file, this field can be used to identify the unique
     25  * instance.
     26  *
     27  * Bits 23-13 : File identifier
     28  *
     29  * This is a unique identifier for the file generating the error
     30  * (e.g. ERRFILE_tcp for tcp.c).
     31  *
     32  * Bits 30-24 : POSIX error code
     33  *
     34  * This is the closest equivalent POSIX error code (e.g. ENOMEM).
     35  *
     36  * Bit 31 : Reserved
     37  *
     38  * Errors are usually return as negative error numbers (e.g. -EINVAL);
     39  * bit 31 is therefore unusable.
     40  *
     41  *
     42  * The convention within the code is that errors are negative and
     43  * expressed using the POSIX error code and (optionally) a per-file
     44  * disambiguator, e.g.
     45  *
     46  *     return -EINVAL;
     47  *
     48  * or
     49  *
     50  *     #define ETCP_BAD_CHECKSUM EUNIQ_02
     51  *     return -( EINVAL | ETCP_BAD_CHECKSUM )
     52  *
     53  * By various bits of preprocessor magic, the PXE error code and file
     54  * identifier are already incorporated into the definition of the
     55  * POSIX error code, which keeps the code relatively clean.
     56  *
     57  *
     58  * Functions that wish to return failures should be declared as
     59  * returning an integer @c rc "Return status code".  A return value of
     60  * zero indicates success, a non-zero value indicates failure.  The
     61  * return value can be passed directly to strerror() in order to
     62  * generate a human-readable error message, e.g.
     63  *
     64  *     if ( ( rc = some_function ( ... ) ) != 0 ) {
     65  *         DBG ( "Whatever I was trying to do failed: %s\n", strerror ( rc ) );
     66  *         return rc;
     67  *     }
     68  *
     69  * As illustrated in the above example, error returns should generally
     70  * be directly propagated upward to the calling function.
     71  *
     72  */
     73 
     74 /* Get definitions for file identifiers */
     75 #include <gpxe/errfile.h>
     76 
     77 /* If we do not have a valid file identifier, generate a compiler
     78  * warning upon usage of any error codes.  (Don't just use a #warning,
     79  * because some files include errno.h but don't ever actually use any
     80  * error codes.)
     81  */
     82 #if ! ERRFILE
     83 extern char missing_errfile_declaration[] __attribute__ (( deprecated ));
     84 #undef ERRFILE
     85 #define ERRFILE ( 0 * ( ( int ) missing_errfile_declaration ) )
     86 #endif
     87 
     88 /** Derive PXENV_STATUS code from gPXE error number */
     89 #define PXENV_STATUS( rc ) ( (-(rc)) & 0x00ff )
     90 
     91 /**
     92  * @defgroup pxeerrors PXE error codes
     93  *
     94  * The names, meanings and values of these error codes are defined by
     95  * the PXE specification.
     96  *
     97  * @{
     98  */
     99 
    100 /* Generic errors */
    101 #define	PXENV_STATUS_SUCCESS					       0x0000
    102 #define	PXENV_STATUS_FAILURE					       0x0001
    103 #define	PXENV_STATUS_BAD_FUNC					       0x0002
    104 #define	PXENV_STATUS_UNSUPPORTED				       0x0003
    105 #define	PXENV_STATUS_KEEP_UNDI					       0x0004
    106 #define	PXENV_STATUS_KEEP_ALL					       0x0005
    107 #define	PXENV_STATUS_OUT_OF_RESOURCES				       0x0006
    108 
    109 /* ARP errors (0x0010 to 0x001f) */
    110 #define	PXENV_STATUS_ARP_TIMEOUT				       0x0011
    111 
    112 /* Base-Code state errors */
    113 #define	PXENV_STATUS_UDP_CLOSED					       0x0018
    114 #define	PXENV_STATUS_UDP_OPEN					       0x0019
    115 #define	PXENV_STATUS_TFTP_CLOSED				       0x001a
    116 #define	PXENV_STATUS_TFTP_OPEN					       0x001b
    117 
    118 /* BIOS/system errors (0x0020 to 0x002f) */
    119 #define	PXENV_STATUS_MCOPY_PROBLEM				       0x0020
    120 #define	PXENV_STATUS_BIS_INTEGRITY_FAILURE			       0x0021
    121 #define	PXENV_STATUS_BIS_VALIDATE_FAILURE			       0x0022
    122 #define	PXENV_STATUS_BIS_INIT_FAILURE				       0x0023
    123 #define	PXENV_STATUS_BIS_SHUTDOWN_FAILURE			       0x0024
    124 #define	PXENV_STATUS_BIS_GBOA_FAILURE				       0x0025
    125 #define	PXENV_STATUS_BIS_FREE_FAILURE				       0x0026
    126 #define	PXENV_STATUS_BIS_GSI_FAILURE				       0x0027
    127 #define	PXENV_STATUS_BIS_BAD_CKSUM				       0x0028
    128 
    129 /* TFTP/MTFTP errors (0x0030 to 0x003f) */
    130 #define	PXENV_STATUS_TFTP_CANNOT_ARP_ADDRESS			       0x0030
    131 #define	PXENV_STATUS_TFTP_OPEN_TIMEOUT				       0x0032
    132 #define	PXENV_STATUS_TFTP_UNKNOWN_OPCODE			       0x0033
    133 #define	PXENV_STATUS_TFTP_READ_TIMEOUT				       0x0035
    134 #define	PXENV_STATUS_TFTP_ERROR_OPCODE				       0x0036
    135 #define	PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION		       0x0038
    136 #define	PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION		       0x0039
    137 #define	PXENV_STATUS_TFTP_TOO_MANY_PACKAGES			       0x003a
    138 #define	PXENV_STATUS_TFTP_FILE_NOT_FOUND			       0x003b
    139 #define	PXENV_STATUS_TFTP_ACCESS_VIOLATION			       0x003c
    140 #define	PXENV_STATUS_TFTP_NO_MCAST_ADDRESS			       0x003d
    141 #define	PXENV_STATUS_TFTP_NO_FILESIZE				       0x003e
    142 #define	PXENV_STATUS_TFTP_INVALID_PACKET_SIZE			       0x003f
    143 
    144 /* Reserved errors 0x0040 to 0x004f) */
    145 
    146 /* DHCP/BOOTP errors (0x0050 to 0x005f) */
    147 #define	PXENV_STATUS_DHCP_TIMEOUT				       0x0051
    148 #define	PXENV_STATUS_DHCP_NO_IP_ADDRESS				       0x0052
    149 #define	PXENV_STATUS_DHCP_NO_BOOTFILE_NAME			       0x0053
    150 #define	PXENV_STATUS_DHCP_BAD_IP_ADDRESS			       0x0054
    151 
    152 /* Driver errors (0x0060 to 0x006f) */
    153 #define	PXENV_STATUS_UNDI_INVALID_FUNCTION			       0x0060
    154 #define	PXENV_STATUS_UNDI_MEDIATEST_FAILED			       0x0061
    155 #define	PXENV_STATUS_UNDI_CANNOT_INIT_NIC_FOR_MCAST		       0x0062
    156 #define	PXENV_STATUS_UNDI_CANNOT_INITIALIZE_NIC			       0x0063
    157 #define	PXENV_STATUS_UNDI_CANNOT_INITIALIZE_PHY			       0x0064
    158 #define	PXENV_STATUS_UNDI_CANNOT_READ_CONFIG_DATA		       0x0065
    159 #define	PXENV_STATUS_UNDI_CANNOT_READ_INIT_DATA			       0x0066
    160 #define	PXENV_STATUS_UNDI_BAD_MAC_ADDRESS			       0x0067
    161 #define	PXENV_STATUS_UNDI_BAD_EEPROM_CHECKSUM			       0x0068
    162 #define	PXENV_STATUS_UNDI_ERROR_SETTING_ISR			       0x0069
    163 #define	PXENV_STATUS_UNDI_INVALID_STATE				       0x006a
    164 #define	PXENV_STATUS_UNDI_TRANSMIT_ERROR			       0x006b
    165 #define	PXENV_STATUS_UNDI_INVALID_PARAMETER			       0x006c
    166 
    167 /* ROM and NBP bootstrap errors (0x0070 to 0x007f) */
    168 #define	PXENV_STATUS_BSTRAP_PROMPT_MENU				       0x0074
    169 #define	PXENV_STATUS_BSTRAP_MCAST_ADDR				       0x0076
    170 #define	PXENV_STATUS_BSTRAP_MISSING_LIST			       0x0077
    171 #define	PXENV_STATUS_BSTRAP_NO_RESPONSE				       0x0078
    172 #define	PXENV_STATUS_BSTRAP_FILE_TOO_BIG			       0x0079
    173 
    174 /* Environment NBP errors (0x0080 to 0x008f) */
    175 
    176 /* Reserved errors (0x0090 to 0x009f) */
    177 
    178 /* Miscellaneous errors (0x00a0 to 0x00af) */
    179 #define	PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE			       0x00a0
    180 #define	PXENV_STATUS_BINL_NO_PXE_SERVER				       0x00a1
    181 #define	PXENV_STATUS_NOT_AVAILABLE_IN_PMODE			       0x00a2
    182 #define	PXENV_STATUS_NOT_AVAILABLE_IN_RMODE			       0x00a3
    183 
    184 /* BUSD errors (0x00b0 to 0x00bf) */
    185 #define	PXENV_STATUS_BUSD_DEVICE_NOT_SUPPORTED			       0x00b0
    186 
    187 /* Loader errors (0x00c0 to 0x00cf) */
    188 #define	PXENV_STATUS_LOADER_NO_FREE_BASE_MEMORY			       0x00c0
    189 #define	PXENV_STATUS_LOADER_NO_BC_ROMID				       0x00c1
    190 #define	PXENV_STATUS_LOADER_BAD_BC_ROMID			       0x00c2
    191 #define	PXENV_STATUS_LOADER_BAD_BC_RUNTIME_IMAGE		       0x00c3
    192 #define	PXENV_STATUS_LOADER_NO_UNDI_ROMID			       0x00c4
    193 #define	PXENV_STATUS_LOADER_BAD_UNDI_ROMID			       0x00c5
    194 #define	PXENV_STATUS_LOADER_BAD_UNDI_DRIVER_IMAGE		       0x00c6
    195 #define	PXENV_STATUS_LOADER_NO_PXE_STRUCT			       0x00c8
    196 #define	PXENV_STATUS_LOADER_NO_PXENV_STRUCT			       0x00c9
    197 #define	PXENV_STATUS_LOADER_UNDI_START				       0x00ca
    198 #define	PXENV_STATUS_LOADER_BC_START				       0x00cb
    199 
    200 /** @} */
    201 
    202 /**
    203  * @defgroup posixerrors POSIX error codes
    204  *
    205  * The names and meanings (but not the values) of these error codes
    206  * are defined by POSIX.  We choose to assign unique values which
    207  * incorporate the closest equivalent PXE error code, so that code may
    208  * simply use ENOMEM, rather than having to use the cumbersome
    209  * (ENOMEM|PXENV_STATUS_OUT_OF_RESOURCES).
    210  *
    211  * @{
    212  */
    213 
    214 /** Operation completed successfully */
    215 #define ENOERR			( ERRFILE | PXENV_STATUS_SUCCESS | 0x00000000 )
    216 
    217 /** Arg list too long */
    218 #define E2BIG		       ( ERRFILE | PXENV_STATUS_BAD_FUNC | 0x01000000 )
    219 
    220 /** Permission denied */
    221 #define EACCES	  ( ERRFILE | PXENV_STATUS_TFTP_ACCESS_VIOLATION | 0x02000000 )
    222 
    223 /** Address in use */
    224 #define EADDRINUSE	       ( ERRFILE | PXENV_STATUS_UDP_OPEN | 0x03000000 )
    225 
    226 /** Address not available */
    227 #define EADDRNOTAVAIL	       ( ERRFILE | PXENV_STATUS_UDP_OPEN | 0x04000000 )
    228 
    229 /** Address family not supported */
    230 #define EAFNOSUPPORT	    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x05000000 )
    231 
    232 /** Resource temporarily unavailable */
    233 #define EAGAIN			( ERRFILE | PXENV_STATUS_FAILURE | 0x06000000 )
    234 
    235 /** Connection already in progress */
    236 #define EALREADY	       ( ERRFILE | PXENV_STATUS_UDP_OPEN | 0x07000000 )
    237 
    238 /** Bad file descriptor */
    239 #define EBADF		    ( ERRFILE | PXENV_STATUS_TFTP_CLOSED | 0x08000000 )
    240 
    241 /** Bad message */
    242 #define EBADMSG			( ERRFILE | PXENV_STATUS_FAILURE | 0x09000000 )
    243 
    244 /** Resource busy */
    245 #define EBUSY	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x0a000000 )
    246 
    247 /** Operation canceled */
    248 #define ECANCELED \
    249 	     ( ERRFILE | PXENV_STATUS_BINL_CANCELED_BY_KEYSTROKE | 0x0b000000 )
    250 
    251 /** No child processes */
    252 #define ECHILD	    ( ERRFILE | PXENV_STATUS_TFTP_FILE_NOT_FOUND | 0x0c000000 )
    253 
    254 /** Connection aborted */
    255 #define ECONNABORTED \
    256        ( ERRFILE | PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION | 0x0d000000 )
    257 
    258 /** Connection refused */
    259 #define ECONNREFUSED \
    260 	    ( ERRFILE | PXENV_STATUS_TFTP_CANNOT_OPEN_CONNECTION | 0x0e000000 )
    261 
    262 /** Connection reset */
    263 #define ECONNRESET \
    264        ( ERRFILE | PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION | 0x0f000000 )
    265 
    266 /** Resource deadlock avoided */
    267 #define EDEADLK			( ERRFILE | PXENV_STATUS_FAILURE | 0x10000000 )
    268 
    269 /** Destination address required */
    270 #define EDESTADDRREQ	       ( ERRFILE | PXENV_STATUS_BAD_FUNC | 0x11000000 )
    271 
    272 /** Domain error */
    273 #define EDOM			( ERRFILE | PXENV_STATUS_FAILURE | 0x12000000 )
    274 
    275 /** Reserved */
    276 #define EDQUOT			( ERRFILE | PXENV_STATUS_FAILURE | 0x13000000 )
    277 
    278 /** File exists */
    279 #define EEXIST			( ERRFILE | PXENV_STATUS_FAILURE | 0x14000000 )
    280 
    281 /** Bad address */
    282 #define EFAULT		  ( ERRFILE | PXENV_STATUS_MCOPY_PROBLEM | 0x15000000 )
    283 
    284 /** File too large */
    285 #define EFBIG		  ( ERRFILE | PXENV_STATUS_MCOPY_PROBLEM | 0x16000000 )
    286 
    287 /** Host is unreachable */
    288 #define EHOSTUNREACH	    ( ERRFILE | PXENV_STATUS_ARP_TIMEOUT | 0x17000000 )
    289 
    290 /** Identifier removed */
    291 #define EIDRM			( ERRFILE | PXENV_STATUS_FAILURE | 0x18000000 )
    292 
    293 /** Illegal byte sequence */
    294 #define EILSEQ			( ERRFILE | PXENV_STATUS_FAILURE | 0x19000000 )
    295 
    296 /** Operation in progress */
    297 #define EINPROGRESS		( ERRFILE | PXENV_STATUS_FAILURE | 0x1a000000 )
    298 
    299 /** Interrupted function call */
    300 #define EINTR			( ERRFILE | PXENV_STATUS_FAILURE | 0x1b000000 )
    301 
    302 /** Invalid argument */
    303 #define EINVAL		       ( ERRFILE | PXENV_STATUS_BAD_FUNC | 0x1c000000 )
    304 
    305 /** Input/output error */
    306 #define EIO \
    307        ( ERRFILE | PXENV_STATUS_TFTP_CANNOT_READ_FROM_CONNECTION | 0x1d000000 )
    308 
    309 /** Socket is connected */
    310 #define EISCONN		       ( ERRFILE | PXENV_STATUS_UDP_OPEN | 0x1e000000 )
    311 
    312 /** Is a directory */
    313 #define EISDIR			( ERRFILE | PXENV_STATUS_FAILURE | 0x1f000000 )
    314 
    315 /** Too many levels of symbolic links */
    316 #define ELOOP			( ERRFILE | PXENV_STATUS_FAILURE | 0x20000000 )
    317 
    318 /** Too many open files */
    319 #define EMFILE	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x21000000 )
    320 
    321 /** Too many links */
    322 #define EMLINK			( ERRFILE | PXENV_STATUS_FAILURE | 0x22000000 )
    323 
    324 /** Inappropriate message buffer length */
    325 #define EMSGSIZE	       ( ERRFILE | PXENV_STATUS_BAD_FUNC | 0x23000000 )
    326 
    327 /** Reserved */
    328 #define EMULTIHOP		( ERRFILE | PXENV_STATUS_FAILURE | 0x24000000 )
    329 
    330 /** Filename too long */
    331 #define ENAMETOOLONG		( ERRFILE | PXENV_STATUS_FAILURE | 0x25000000 )
    332 
    333 /** Network is down */
    334 #define ENETDOWN	    ( ERRFILE | PXENV_STATUS_ARP_TIMEOUT | 0x26000000 )
    335 
    336 /** Connection aborted by network */
    337 #define ENETRESET		( ERRFILE | PXENV_STATUS_FAILURE | 0x27000000 )
    338 
    339 /** Network unreachable */
    340 #define ENETUNREACH	    ( ERRFILE | PXENV_STATUS_ARP_TIMEOUT | 0x28000000 )
    341 
    342 /** Too many open files in system */
    343 #define ENFILE	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x29000000 )
    344 
    345 /** No buffer space available */
    346 #define ENOBUFS	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x2a000000 )
    347 
    348 /** No message is available on the STREAM head read queue */
    349 #define ENODATA			( ERRFILE | PXENV_STATUS_FAILURE | 0x2b000000 )
    350 
    351 /** No such device */
    352 #define ENODEV	    ( ERRFILE | PXENV_STATUS_TFTP_FILE_NOT_FOUND | 0x2c000000 )
    353 
    354 /** No such file or directory */
    355 #define ENOENT	    ( ERRFILE | PXENV_STATUS_TFTP_FILE_NOT_FOUND | 0x2d000000 )
    356 
    357 /** Exec format error */
    358 #define ENOEXEC			( ERRFILE | PXENV_STATUS_FAILURE | 0x2e000000 )
    359 
    360 /** No locks available */
    361 #define ENOLCK			( ERRFILE | PXENV_STATUS_FAILURE | 0x2f000000 )
    362 
    363 /** Reserved */
    364 #define ENOLINK			( ERRFILE | PXENV_STATUS_FAILURE | 0x30000000 )
    365 
    366 /** Not enough space */
    367 #define ENOMEM	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x31000000 )
    368 
    369 /** No message of the desired type */
    370 #define ENOMSG			( ERRFILE | PXENV_STATUS_FAILURE | 0x32000000 )
    371 
    372 /** Protocol not available */
    373 #define ENOPROTOOPT	    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x33000000 )
    374 
    375 /** No space left on device */
    376 #define ENOSPC	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x34000000 )
    377 
    378 /** No STREAM resources */
    379 #define ENOSR	       ( ERRFILE | PXENV_STATUS_OUT_OF_RESOURCES | 0x35000000 )
    380 
    381 /** Not a STREAM */
    382 #define ENOSTR			( ERRFILE | PXENV_STATUS_FAILURE | 0x36000000 )
    383 
    384 /** Function not implemented */
    385 #define ENOSYS		    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x37000000 )
    386 
    387 /** The socket is not connected */
    388 #define ENOTCONN		( ERRFILE | PXENV_STATUS_FAILURE | 0x38000000 )
    389 
    390 /** Not a directory */
    391 #define ENOTDIR			( ERRFILE | PXENV_STATUS_FAILURE | 0x39000000 )
    392 
    393 /** Directory not empty */
    394 #define ENOTEMPTY		( ERRFILE | PXENV_STATUS_FAILURE | 0x3a000000 )
    395 
    396 /** Not a socket */
    397 #define ENOTSOCK		( ERRFILE | PXENV_STATUS_FAILURE | 0x3b000000 )
    398 
    399 /** Not supported */
    400 #define ENOTSUP		    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x3c000000 )
    401 
    402 /** Inappropriate I/O control operation */
    403 #define ENOTTY			( ERRFILE | PXENV_STATUS_FAILURE | 0x3d000000 )
    404 
    405 /** No such device or address */
    406 #define ENXIO	    ( ERRFILE | PXENV_STATUS_TFTP_FILE_NOT_FOUND | 0x3e000000 )
    407 
    408 /** Operation not supported on socket */
    409 #define EOPNOTSUPP	    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x3f000000 )
    410 
    411 /** Value too large to be stored in data type */
    412 #define EOVERFLOW		( ERRFILE | PXENV_STATUS_FAILURE | 0x40000000 )
    413 
    414 /** Operation not permitted */
    415 #define EPERM	  ( ERRFILE | PXENV_STATUS_TFTP_ACCESS_VIOLATION | 0x41000000 )
    416 
    417 /** Broken pipe */
    418 #define EPIPE			( ERRFILE | PXENV_STATUS_FAILURE | 0x42000000 )
    419 
    420 /** Protocol error */
    421 #define EPROTO			( ERRFILE | PXENV_STATUS_FAILURE | 0x43000000 )
    422 
    423 /** Protocol not supported */
    424 #define EPROTONOSUPPORT	    ( ERRFILE | PXENV_STATUS_UNSUPPORTED | 0x44000000 )
    425 
    426 /** Protocol wrong type for socket */
    427 #define EPROTOTYPE		( ERRFILE | PXENV_STATUS_FAILURE | 0x45000000 )
    428 
    429 /** Result too large */
    430 #define ERANGE			( ERRFILE | PXENV_STATUS_FAILURE | 0x46000000 )
    431 
    432 /** Read-only file system */
    433 #define EROFS			( ERRFILE | PXENV_STATUS_FAILURE | 0x47000000 )
    434 
    435 /** Invalid seek */
    436 #define ESPIPE			( ERRFILE | PXENV_STATUS_FAILURE | 0x48000000 )
    437 
    438 /** No such process */
    439 #define ESRCH	    ( ERRFILE | PXENV_STATUS_TFTP_FILE_NOT_FOUND | 0x49000000 )
    440 
    441 /** Stale file handle */
    442 #define ESTALE			( ERRFILE | PXENV_STATUS_FAILURE | 0x4a000000 )
    443 
    444 /** STREAM ioctl() timeout */
    445 #define ETIME			( ERRFILE | PXENV_STATUS_FAILURE | 0x4b000000 )
    446 
    447 /** Operation timed out */
    448 #define ETIMEDOUT     ( ERRFILE | PXENV_STATUS_TFTP_READ_TIMEOUT | 0x4c000000 )
    449 
    450 /** Text file busy */
    451 #define ETXTBSY			( ERRFILE | PXENV_STATUS_FAILURE | 0x4d000000 )
    452 
    453 /** Operation would block (different from EAGAIN!) */
    454 #define EWOULDBLOCK	      ( ERRFILE | PXENV_STATUS_TFTP_OPEN | 0x4e000000 )
    455 
    456 /** Improper link */
    457 #define EXDEV			( ERRFILE | PXENV_STATUS_FAILURE | 0x4f000000 )
    458 
    459 /** @} */
    460 
    461 /**
    462  * @defgroup euniq Per-file error disambiguators
    463  *
    464  * Files which use the same error number multiple times should
    465  * probably define their own error subspace using these
    466  * disambiguators.  For example:
    467  *
    468  *     #define ETCP_HEADER_TOO_SHORT	EUNIQ_01
    469  *     #define ETCP_BAD_CHECKSUM	EUNIQ_02
    470  *
    471  * @{
    472  */
    473 
    474 #define EUNIQ_01	0x00000100
    475 #define EUNIQ_02	0x00000200
    476 #define EUNIQ_03	0x00000300
    477 #define EUNIQ_04	0x00000400
    478 #define EUNIQ_05	0x00000500
    479 #define EUNIQ_06	0x00000600
    480 #define EUNIQ_07	0x00000700
    481 #define EUNIQ_08	0x00000800
    482 #define EUNIQ_09	0x00000900
    483 #define EUNIQ_0A	0x00000a00
    484 #define EUNIQ_0B	0x00000b00
    485 #define EUNIQ_0C	0x00000c00
    486 #define EUNIQ_0D	0x00000d00
    487 #define EUNIQ_0E	0x00000e00
    488 #define EUNIQ_0F	0x00000f00
    489 #define EUNIQ_10	0x00001000
    490 #define EUNIQ_11	0x00001100
    491 #define EUNIQ_12	0x00001200
    492 #define EUNIQ_13	0x00001300
    493 #define EUNIQ_14	0x00001400
    494 #define EUNIQ_15	0x00001500
    495 #define EUNIQ_16	0x00001600
    496 #define EUNIQ_17	0x00001700
    497 #define EUNIQ_18	0x00001800
    498 #define EUNIQ_19	0x00001900
    499 #define EUNIQ_1A	0x00001a00
    500 #define EUNIQ_1B	0x00001b00
    501 #define EUNIQ_1C	0x00001c00
    502 #define EUNIQ_1D	0x00001d00
    503 #define EUNIQ_1E	0x00001e00
    504 #define EUNIQ_1F	0x00001f00
    505 
    506 /** @} */
    507 
    508 extern int errno;
    509 
    510 #endif /* ERRNO_H */
    511