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 { "read-only", EROFS },
43 { "read only", EROFS },
44 #ifdef EPROTO
45 { "proto", EPROTO },
46 #else
47 { "proto", EINVAL },
48 #endif
49 { "entry", ENOENT },
50 };
52 int
53 errstr2errno(void)
54 {
55 char e[ERRMAX];
56 int i, len;
58 if(errno != EPLAN9)
59 return errno;
61 if(errortab[0].len == 0)
62 for(i=0; i<nelem(errortab); i++)
63 errortab[i].len = strlen(errortab[i].text);
65 rerrstr(e, sizeof e);
66 len = strlen(e);
67 for(i=0; i<nelem(errortab); i++)
68 if(errortab[i].len <= len && cistrstr(e, errortab[i].text))
69 return errortab[i].err;
70 return ERANGE; /* who knows - be blatantly wrong */
71 }