#include "a.h" | |
enum | |
{ | |
EPLAN9 = 0x19283745 /* see /usr/local/plan9/src/lib9/errstr.c */ | |
}; | |
typedef struct Error Error; | |
struct Error | |
{ | |
char *text; | |
int err; | |
int len; | |
}; | |
static Error errortab[] = { | |
{ "permitted", EPERM }, | |
{ "permission", EACCES }, | |
{ "access", EACCES }, | |
{ "exists", EEXIST }, | |
{ "exist", ENOENT }, | |
{ "no such", ENOENT }, | |
{ "not found", ENOENT }, | |
{ "input/output", EIO }, | |
{ "timeout", ETIMEDOUT }, | |
{ "timed out", ETIMEDOUT }, | |
{ "i/o", EIO }, | |
{ "too long", E2BIG }, | |
{ "interrupt", EINTR }, | |
{ "no such", ENODEV }, | |
{ "bad file", EBADF }, | |
{ " fid ", EBADF }, | |
{ "temporar", EAGAIN }, | |
{ "memory", ENOMEM }, | |
{ "is a directory", EISDIR }, | |
{ "directory", ENOTDIR }, | |
{ "argument", EINVAL }, | |
{ "pipe", EPIPE }, | |
{ "in use", EBUSY }, | |
{ "busy", EBUSY }, | |
{ "illegal", EINVAL }, | |
{ "read-only", EROFS }, | |
{ "read only", EROFS }, | |
#ifdef EPROTO | |
{ "proto", EPROTO }, | |
#else | |
{ "proto", EINVAL }, | |
#endif | |
{ "entry", ENOENT }, | |
}; | |
int | |
errstr2errno(void) | |
{ | |
char e[ERRMAX]; | |
int i, len; | |
if(errno != EPLAN9) | |
return errno; | |
if(errortab[0].len == 0) | |
for(i=0; i<nelem(errortab); i++) | |
errortab[i].len = strlen(errortab[i].text); | |
rerrstr(e, sizeof e); | |
len = strlen(e); | |
for(i=0; i<nelem(errortab); i++) | |
if(errortab[i].len <= len && cistrstr(e, errortab[i].text)) | |
return errortab[i].err; | |
return ERANGE; /* who knows - be blatantly wrong */ | |
} | |