Annotation of qemu/roms/ipxe/src/hci/strerror.c, revision 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.