6 /* make this global, so programs can look at it if errno is unilluminating */
8 /* see also: ../stdio/strerror.c, with errno-> string mapping */
10 char _plan9err[ERRMAX];
12 static struct errmap {
16 /* from /sys/src/9/port/errstr.h */
17 {EINVAL, "inconsistent mount"},
18 {EINVAL, "not mounted"},
19 {EINVAL, "not in union"},
20 {EIO, "mount rpc error"},
21 {EIO, "mounted device shut down"},
22 {EPERM, "mounted directory forbids creation"},
23 {ENOENT, "does not exist"},
24 {ENXIO, "unknown device in # filename"},
25 {ENOTDIR, "not a directory"},
26 {EISDIR, "file is a directory"},
27 {EINVAL, "bad character in file name"},
28 {EINVAL, "file name syntax"},
29 {EPERM, "permission denied"},
30 {EPERM, "inappropriate use of fd"},
31 {EINVAL, "bad arg in system call"},
32 {EBUSY, "device or object already in use"},
34 {EIO, "read or write too large"},
35 {EIO, "read or write too small"},
36 {EADDRINUSE, "network port not available"},
37 {ESHUTDOWN, "write to hungup stream"},
38 {ESHUTDOWN, "i/o on hungup channel"},
39 {EINVAL, "bad process or channel control request"},
40 {EBUSY, "no free devices"},
41 {ESRCH, "process exited"},
42 {ECHILD, "no living children"},
43 {EIO, "i/o error in demand load"},
44 {ENOMEM, "virtual memory allocation failed"},
45 {EBADF, "fd out of range or not open"},
46 {EMFILE, "no free file descriptors"},
47 {ESPIPE, "seek on a stream"},
48 {ENOEXEC, "exec header invalid"},
49 {ETIMEDOUT, "connection timed out"},
50 {ECONNREFUSED, "connection refused"},
51 {ECONNREFUSED, "connection in use"},
52 {EINTR, "interrupted"},
53 {ENOMEM, "kernel allocate failed"},
54 {EINVAL, "segments overlap"},
55 {EIO, "i/o count too small"},
56 {EGREG, "ken has left the building"},
57 {EINVAL, "bad attach specifier"},
59 /* from exhausted() calls in kernel */
60 {ENFILE, "no free file descriptors"},
61 {EBUSY, "no free mount devices"},
62 {EBUSY, "no free mount rpc buffer"},
63 {EBUSY, "no free segments"},
64 {ENOMEM, "no free memory"},
65 {ENOBUFS, "no free Blocks"},
66 {EBUSY, "no free routes"},
69 {EINVAL, "attach -- bad specifier"},
70 {EBADF, "unknown fid"},
71 {EINVAL, "bad character in directory name"},
72 {EBADF, "read/write -- on non open fid"},
73 {EIO, "read/write -- count too big"},
74 {EIO, "phase error -- directory entry not allocated"},
75 {EIO, "phase error -- qid does not match"},
76 {EACCES, "access permission denied"},
77 {ENOENT, "directory entry not found"},
78 {EINVAL, "open/create -- unknown mode"},
79 {ENOTDIR, "walk -- in a non-directory"},
80 {ENOTDIR, "create -- in a non-directory"},
81 {EIO, "phase error -- cannot happen"},
82 {EEXIST, "create -- file exists"},
83 {EINVAL, "create -- . and .. illegal names"},
84 {ENOTEMPTY, "directory not empty"},
85 {EINVAL, "attach -- privileged user"},
86 {EPERM, "wstat -- not owner"},
87 {EPERM, "wstat -- not in group"},
88 {EINVAL, "create/wstat -- bad character in file name"},
89 {EBUSY, "walk -- too many (system wide)"},
90 {EROFS, "file system read only"},
91 {ENOSPC, "file system full"},
92 {EINVAL, "read/write -- offset negative"},
93 {EBUSY, "open/create -- file is locked"},
94 {EBUSY, "close/read/write -- lock is broken"},
97 {ENOTSOCK, "not a socket"},
98 {EPROTONOSUPPORT, "protocol not supported"},
99 {ECONNREFUSED, "connection refused"},
100 {EAFNOSUPPORT, "address family not supported"},
101 {ENOBUFS, "insufficient buffer space"},
102 {EOPNOTSUPP, "operation not supported"},
103 {EADDRINUSE, "address in use"},
104 {EGREG, "unnamed error message"},
107 #define NERRMAP (sizeof(map)/sizeof(struct errmap))
109 /* convert last system call error to an errno */
115 if(_ERRSTR(_plan9err, sizeof _plan9err) < 0)
118 for(i = 0; i < NERRMAP; i++)
119 if(strstr(_plan9err, map[i].ename) != 0)
121 _ERRSTR(_plan9err, sizeof _plan9err);
122 errno = (i < NERRMAP)? map[i].errno : EINVAL;