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 { "input/output", EIO },
25 { "timeout", ETIMEDOUT },
26 { "timed out", ETIMEDOUT },
27 { "i/o", EIO },
28 { "too long", E2BIG },
29 { "interrupt", EINTR },
30 { "no such", ENODEV },
31 { "bad file", EBADF },
32 { " fid ", EBADF },
33 { "temporar", EAGAIN },
34 { "memory", ENOMEM },
35 { "is a directory", EISDIR },
36 { "directory", ENOTDIR },
37 { "argument", EINVAL },
38 { "pipe", EPIPE },
39 { "in use", EBUSY },
40 { "busy", EBUSY },
41 { "illegal", EINVAL },
42 { "invalid", EINVAL },
43 { "read-only", EROFS },
44 { "read only", EROFS },
45 #ifdef EPROTO
46 { "proto", EPROTO },
47 #else
48 { "proto", EINVAL },
49 #endif
50 { "entry", ENOENT },
51 };
53 int
54 errstr2errno(void)
55 {
56 char e[ERRMAX];
57 int i, len;
59 if(errno != EPLAN9)
60 return errno;
62 if(errortab[0].len == 0)
63 for(i=0; i<nelem(errortab); i++)
64 errortab[i].len = strlen(errortab[i].text);
66 rerrstr(e, sizeof e);
67 len = strlen(e);
68 for(i=0; i<nelem(errortab); i++)
69 if(errortab[i].len <= len && cistrstr(e, errortab[i].text))
70 return errortab[i].err;
71 return ERANGE; /* who knows - be blatantly wrong */
72 }