diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/errno.c | 29 | ||||
| -rw-r--r-- | src/core/vsprintf.c | 22 |
2 files changed, 42 insertions, 9 deletions
diff --git a/src/core/errno.c b/src/core/errno.c new file mode 100644 index 000000000..f0cf5a628 --- /dev/null +++ b/src/core/errno.c @@ -0,0 +1,29 @@ +#include "errno.h" +#include "vsprintf.h" + +/* Global "last error" number */ +int errno; + +static struct errortab errortab_start[0] __table_start(errortab); +static struct errortab errortab_end[0] __table_end(errortab); + +/* + * Retrieve string representation of error number. + * + * If error not found in the error table, generate a generic "Error + * 0x0000" message. + * + */ +const char * strerror ( int errno ) { + static char *generic_message = "Error 0x0000"; + struct errortab *errortab; + + for ( errortab = errortab_start ; errortab < errortab_end ; + errortab++ ) { + if ( errortab->errno == errno ) + return errortab->text; + } + + sprintf ( generic_message + 8, "%hx", errno ); + return generic_message; +} diff --git a/src/core/vsprintf.c b/src/core/vsprintf.c index 414b4509a..77373ccf0 100644 --- a/src/core/vsprintf.c +++ b/src/core/vsprintf.c @@ -2,6 +2,7 @@ #include "if_ether.h" /* for ETH_ALEN */ #include "limits.h" /* for CHAR_BIT */ #include "console.h" +#include "errno.h" #include "vsprintf.h" #define LONG_SHIFT ((int)((sizeof(unsigned long)*CHAR_BIT) - 4)) @@ -31,7 +32,8 @@ PRINTF and friends **************************************************************************/ static int vsprintf(char *buf, const char *fmt, va_list args) { - char *p, *s; + const char *p; + char *s; s = buf; for ( ; *fmt != '\0'; ++fmt) { if (*fmt != '%') { @@ -49,8 +51,10 @@ static int vsprintf(char *buf, const char *fmt, va_list args) if (*fmt == 's') { for(p = va_arg(args, char *); *p != '\0'; p++) buf ? *s++ = *p : putchar(*p); - } - else { /* Length of item is bounded */ + } else if (*fmt == 'm') { + for(p = strerror(errno); *p != '\0'; p++) + buf ? *s++ = *p : putchar(*p); + } else { /* Length of item is bounded */ char tmp[40], *q = tmp; int alt = 0; int shift = INT_SHIFT; @@ -93,7 +97,7 @@ static int vsprintf(char *buf, const char *fmt, va_list args) *q++ = "0123456789ABCDEF"[(h >> shift) & 0xF] | ncase; } else if (*fmt == 'd') { - char *r; + char *r, *t; long i; if (shift > INT_SHIFT) { i = va_arg(args, long); @@ -104,17 +108,17 @@ static int vsprintf(char *buf, const char *fmt, va_list args) *q++ = '-'; i = -i; } - p = q; /* save beginning of digits */ + t = q; /* save beginning of digits */ do { *q++ = '0' + (i % 10); i /= 10; } while (i); /* reverse digits, stop in middle */ r = q; /* don't alter q */ - while (--r > p) { + while (--r > t) { i = *r; - *r = *p; - *p++ = i; + *r = *t; + *t++ = i; } } else if (*fmt == '@') { @@ -129,7 +133,7 @@ static int vsprintf(char *buf, const char *fmt, va_list args) --q; } else if (*fmt == '!') { - char *r; + const char *r; p = va_arg(args, char *); for (r = p + ETH_ALEN; p < r; ++p) q += sprintf(q, "%hhX:", *p); |
