Blob


1 #include "a.h"
3 enum
4 {
5 EPLAN9 = 0x19283745 /* see /usr/local/plan9/src/lib9/errstr.c */
6 };
8 typedef struct Error Error;
9 struct Error
10 {
11 char *text;
12 int err;
13 int len;
14 };
16 static Error errortab[] = {
17 { "permitted", EPERM },
18 { "permission", EACCES },
19 { "access", EACCES },
20 { "exists", EEXIST },
21 { "exist", ENOENT },
22 { "no such", ENOENT },
23 { "not found", ENOENT },
24 { "not implemented", ENOSYS},
25 { "input/output", EIO },
26 { "timeout", ETIMEDOUT },
27 { "timed out", ETIMEDOUT },
28 { "i/o", EIO },
29 { "too long", E2BIG },
30 { "interrupt", EINTR },
31 { "no such", ENODEV },
32 { "bad file", EBADF },
33 { " fid ", EBADF },
34 { "temporar", EAGAIN },
35 { "memory", ENOMEM },
36 { "is a directory", EISDIR },
37 { "directory", ENOTDIR },
38 { "argument", EINVAL },
39 { "pipe", EPIPE },
40 { "in use", EBUSY },
41 { "busy", EBUSY },
42 { "illegal", EINVAL },
43 { "invalid", EINVAL },
44 { "read-only", EROFS },
45 { "read only", EROFS },
46 { "stale ", ESTALE},
47 #ifdef EPROTO
48 { "proto", EPROTO },
49 #else
50 { "proto", EINVAL },
51 #endif
52 { "entry", ENOENT },
53 };
55 int
56 errstr2errno(void)
57 {
58 char e[ERRMAX];
59 int i, len;
61 if(errno != EPLAN9)
62 return errno;
64 if(errortab[0].len == 0)
65 for(i=0; i<nelem(errortab); i++)
66 errortab[i].len = strlen(errortab[i].text);
68 rerrstr(e, sizeof e);
69 len = strlen(e);
70 for(i=0; i<nelem(errortab); i++)
71 if(errortab[i].len <= len && cistrstr(e, errortab[i].text))
72 return errortab[i].err;
73 return ERANGE; /* who knows - be blatantly wrong */
74 }