Annotation of qemu/roms/ipxe/src/hci/strerror.c, revision 1.1.1.1

1.1       root        1: #include <errno.h>
                      2: #include <string.h>
                      3: #include <stdio.h>
                      4: #include <ipxe/errortab.h>
                      5: 
                      6: /** @file
                      7:  *
                      8:  * Error descriptions.
                      9:  *
                     10:  * The error numbers used by Etherboot are a superset of those defined
                     11:  * by the PXE specification version 2.1.  See errno.h for a listing of
                     12:  * the error values.
                     13:  *
                     14:  * To save space in ROM images, error string tables are optional.  Use
                     15:  * the ERRORMSG_XXX options in config.h to select which error string
                     16:  * tables you want to include.  If an error string table is omitted,
                     17:  * strerror() will simply return the text "Error 0x<errno>".
                     18:  *
                     19:  */
                     20: 
                     21: FILE_LICENCE ( GPL2_OR_LATER );
                     22: 
                     23: /**
                     24:  * Find error description
                     25:  *
                     26:  * @v errno            Error number
                     27:  * @ret errortab       Error description, or NULL
                     28:  */
                     29: static struct errortab * find_error ( int errno ) {
                     30:        struct errortab *errortab;
                     31: 
                     32:        for_each_table_entry ( errortab, ERRORTAB ) {
                     33:                if ( errortab->errno == errno )
                     34:                        return errortab;
                     35:        }
                     36: 
                     37:        return NULL;
                     38: }
                     39: 
                     40: /**
                     41:  * Find closest error description
                     42:  *
                     43:  * @v errno            Error number
                     44:  * @ret errortab       Error description, or NULL
                     45:  *
                     46:  * 
                     47:  */
                     48: static struct errortab * find_closest_error ( int errno ) {
                     49:        struct errortab *errortab;
                     50: 
                     51:        /* First, look for an exact match */
                     52:        if ( ( errortab = find_error ( errno ) ) != NULL )
                     53:                return errortab;
                     54: 
                     55:        /* Second, try masking off the iPXE-specific bit and seeing if
                     56:         * we have an entry for the generic POSIX error message.
                     57:         */
                     58:        if ( ( errortab = find_error ( errno & 0x7f0000ff ) ) != NULL )
                     59:                return errortab;
                     60: 
                     61:        return NULL;
                     62: }
                     63: 
                     64: /**
                     65:  * Retrieve string representation of error number.
                     66:  *
                     67:  * @v errno/rc         Error number or return status code
                     68:  * @ret strerror       Pointer to error text
                     69:  *
                     70:  * If the error is not found in the linked-in error tables, generates
                     71:  * a generic "Error 0x<errno>" message.
                     72:  *
                     73:  * The pointer returned by strerror() is valid only until the next
                     74:  * call to strerror().
                     75:  *
                     76:  */
                     77: const char * strerror ( int errno ) {
                     78:        static char errbuf[64];
                     79:        struct errortab *errortab;
                     80: 
                     81:        /* Allow for strerror(rc) as well as strerror(errno) */
                     82:        if ( errno < 0 )
                     83:                errno = -errno;
                     84: 
                     85:        /* Find the error description, if one exists */
                     86:        errortab = find_closest_error ( errno );
                     87: 
                     88:        /* Construct the error message */
                     89:        if ( errortab ) {
                     90:                snprintf ( errbuf, sizeof ( errbuf ),
                     91:                           "%s (http://ipxe.org/%08x)",
                     92:                           errortab->text, errno );
                     93:        } else {
                     94:                snprintf ( errbuf, sizeof ( errbuf ),
                     95:                           "Error %#08x (http://ipxe.org/%08x)",
                     96:                           errno, errno );
                     97:        }
                     98: 
                     99:        return errbuf;
                    100: }
                    101: 
                    102: /* Do not include ERRFILE portion in the numbers in the error table */
                    103: #undef ERRFILE
                    104: #define ERRFILE 0
                    105: 
                    106: /** The most common errors */
                    107: struct errortab common_errors[] __errortab = {
                    108:        __einfo_errortab ( EINFO_ENOERR ),
                    109:        __einfo_errortab ( EINFO_EACCES ),
                    110:        __einfo_errortab ( EINFO_ECANCELED ),
                    111:        __einfo_errortab ( EINFO_ECONNRESET ),
                    112:        __einfo_errortab ( EINFO_EINVAL ),
                    113:        __einfo_errortab ( EINFO_EIO ),
                    114:        __einfo_errortab ( EINFO_ENETUNREACH ),
                    115:        __einfo_errortab ( EINFO_ENODEV ),
                    116:        __einfo_errortab ( EINFO_ENOENT ),
                    117:        __einfo_errortab ( EINFO_ENOEXEC ),
                    118:        __einfo_errortab ( EINFO_ENOMEM ),
                    119:        __einfo_errortab ( EINFO_ENOSPC ),
                    120:        __einfo_errortab ( EINFO_ENOTCONN ),
                    121:        __einfo_errortab ( EINFO_ENOTSUP ),
                    122:        __einfo_errortab ( EINFO_EPERM ),
                    123:        __einfo_errortab ( EINFO_ERANGE ),
                    124:        __einfo_errortab ( EINFO_ETIMEDOUT ),
                    125: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.