| #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 }, |
| { "invalid", 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 */ |
| } |
| |