diff options
Diffstat (limited to 'contrib/syslinux-4.02/gpxe/src/hci/strerror.c')
-rw-r--r-- | contrib/syslinux-4.02/gpxe/src/hci/strerror.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/gpxe/src/hci/strerror.c b/contrib/syslinux-4.02/gpxe/src/hci/strerror.c new file mode 100644 index 0000000..94547dd --- /dev/null +++ b/contrib/syslinux-4.02/gpxe/src/hci/strerror.c @@ -0,0 +1,122 @@ +#include <errno.h> +#include <string.h> +#include <stdio.h> +#include <gpxe/errortab.h> + +/** @file + * + * Error descriptions. + * + * The error numbers used by Etherboot are a superset of those defined + * by the PXE specification version 2.1. See errno.h for a listing of + * the error values. + * + * To save space in ROM images, error string tables are optional. Use + * the ERRORMSG_XXX options in config.h to select which error string + * tables you want to include. If an error string table is omitted, + * strerror() will simply return the text "Error 0x<errno>". + * + */ + +FILE_LICENCE ( GPL2_OR_LATER ); + +/** + * Find error description + * + * @v errno Error number + * @ret errortab Error description, or NULL + */ +static struct errortab * find_error ( int errno ) { + struct errortab *errortab; + + for_each_table_entry ( errortab, ERRORTAB ) { + if ( errortab->errno == errno ) + return errortab; + } + + return NULL; +} + +/** + * Find closest error description + * + * @v errno Error number + * @ret errortab Error description, or NULL + * + * + */ +static struct errortab * find_closest_error ( int errno ) { + struct errortab *errortab; + + /* First, look for an exact match */ + if ( ( errortab = find_error ( errno ) ) != NULL ) + return errortab; + + /* Second, try masking off the gPXE-specific bit and seeing if + * we have an entry for the generic POSIX error message. + */ + if ( ( errortab = find_error ( errno & 0x7f0000ff ) ) != NULL ) + return errortab; + + return NULL; +} + +/** + * Retrieve string representation of error number. + * + * @v errno/rc Error number or return status code + * @ret strerror Pointer to error text + * + * If the error is not found in the linked-in error tables, generates + * a generic "Error 0x<errno>" message. + * + * The pointer returned by strerror() is valid only until the next + * call to strerror(). + * + */ +const char * strerror ( int errno ) { + static char errbuf[64]; + struct errortab *errortab; + + /* Allow for strerror(rc) as well as strerror(errno) */ + if ( errno < 0 ) + errno = -errno; + + /* Find the error description, if one exists */ + errortab = find_closest_error ( errno ); + + /* Construct the error message */ + if ( errortab ) { + snprintf ( errbuf, sizeof ( errbuf ), "%s (%#08x)", + errortab->text, errno ); + } else { + snprintf ( errbuf, sizeof ( errbuf ), "Error %#08x", errno ); + } + + return errbuf; +} + +/* Do not include ERRFILE portion in the numbers in the error table */ +#undef ERRFILE +#define ERRFILE 0 + +/** The most common errors */ +struct errortab common_errors[] __errortab = { + { 0, "No error" }, + { EACCES, "Permission denied" }, + { ECANCELED, "Operation cancelled" }, + { ECONNRESET, "Connection reset" }, + { EINVAL, "Invalid argument" }, + { EIO, "Input/output error" }, + { ENETUNREACH, "Network unreachable" }, + { ENODEV, "No such device" }, + { ENOENT, "File not found" }, + { ENOEXEC, "Not an executable image" }, + { ENOMEM, "Out of memory" }, + { ENOSPC, "No space left on device" }, + { ENOTCONN, "Not connected" }, + { ENOTSUP, "Not supported" }, + { EPERM, "Operation not permitted" }, + { ERANGE, "Out of range" }, + { ETIMEDOUT, "Connection timed out" }, +}; |