xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/_errno.c (revision 94aa1c4c0955b2b4e990c9f4679be8e9f67a469b)
13e12c5d1SDavid du Colombier #include "lib.h"
23e12c5d1SDavid du Colombier #include "sys9.h"
33e12c5d1SDavid du Colombier #include <string.h>
43e12c5d1SDavid du Colombier #include <errno.h>
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier /* make this global, so programs can look at it if errno is unilluminating */
73e12c5d1SDavid du Colombier 
87dd7cddfSDavid du Colombier /* see also: ../stdio/strerror.c, with errno-> string mapping */
97dd7cddfSDavid du Colombier 
109a747e4fSDavid du Colombier char _plan9err[ERRMAX];
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier static struct errmap {
133e12c5d1SDavid du Colombier 	int	errno;
143e12c5d1SDavid du Colombier 	char	*ename;
153e12c5d1SDavid du Colombier } map[] = {
169a747e4fSDavid du Colombier 	/* from /sys/src/9/port/errstr.h */
17219b2ee8SDavid du Colombier 	{EINVAL,	"inconsistent mount"},
18219b2ee8SDavid du Colombier 	{EINVAL,	"not mounted"},
19219b2ee8SDavid du Colombier 	{EINVAL,	"not in union"},
20219b2ee8SDavid du Colombier 	{EIO,		"mount rpc error"},
21219b2ee8SDavid du Colombier 	{EIO,		"mounted device shut down"},
22219b2ee8SDavid du Colombier 	{EPERM,	"mounted directory forbids creation"},
239a747e4fSDavid du Colombier 	{ENOENT,	"does not exist"},
24219b2ee8SDavid du Colombier 	{ENXIO,	"unknown device in # filename"},
25219b2ee8SDavid du Colombier 	{ENOTDIR,	"not a directory"},
26219b2ee8SDavid du Colombier 	{EISDIR,	"file is a directory"},
27219b2ee8SDavid du Colombier 	{EINVAL,	"bad character in file name"},
28219b2ee8SDavid du Colombier 	{EINVAL,	"file name syntax"},
29219b2ee8SDavid du Colombier 	{EPERM,	"permission denied"},
303e12c5d1SDavid du Colombier 	{EPERM,	"inappropriate use of fd"},
313e12c5d1SDavid du Colombier 	{EINVAL,	"bad arg in system call"},
323e12c5d1SDavid du Colombier 	{EBUSY,	"device or object already in use"},
333e12c5d1SDavid du Colombier 	{EIO,		"i/o error"},
343e12c5d1SDavid du Colombier 	{EIO,		"read or write too large"},
353e12c5d1SDavid du Colombier 	{EIO,		"read or write too small"},
36219b2ee8SDavid du Colombier 	{EADDRINUSE,	"network port not available"},
37219b2ee8SDavid du Colombier 	{ESHUTDOWN,	"write to hungup stream"},
389a747e4fSDavid du Colombier 	{ESHUTDOWN,	"i/o on hungup channel"},
399a747e4fSDavid du Colombier 	{EINVAL,	"bad process or channel control request"},
40219b2ee8SDavid du Colombier 	{EBUSY,	"no free devices"},
41219b2ee8SDavid du Colombier 	{ESRCH,		"process exited"},
42219b2ee8SDavid du Colombier 	{ECHILD,	"no living children"},
43219b2ee8SDavid du Colombier 	{EIO,		"i/o error in demand load"},
443e12c5d1SDavid du Colombier 	{ENOMEM,	"virtual memory allocation failed"},
45219b2ee8SDavid du Colombier 	{EBADF,	"fd out of range or not open"},
469a747e4fSDavid du Colombier 	{EMFILE,	"no free file descriptors"},
473e12c5d1SDavid du Colombier 	{ESPIPE,	"seek on a stream"},
48219b2ee8SDavid du Colombier 	{ENOEXEC,	"exec header invalid"},
49219b2ee8SDavid du Colombier 	{ETIMEDOUT,	"connection timed out"},
50219b2ee8SDavid du Colombier 	{ECONNREFUSED,	"connection refused"},
519a747e4fSDavid du Colombier 	{ECONNREFUSED,	"connection in use"},
52219b2ee8SDavid du Colombier 	{EINTR,		"interrupted"},
53219b2ee8SDavid du Colombier 	{ENOMEM,	"kernel allocate failed"},
54219b2ee8SDavid du Colombier 	{EINVAL,	"segments overlap"},
55219b2ee8SDavid du Colombier 	{EIO,		"i/o count too small"},
569a747e4fSDavid du Colombier 	{EGREG,	"ken has left the building"},
57219b2ee8SDavid du Colombier 	{EINVAL,	"bad attach specifier"},
58219b2ee8SDavid du Colombier 
59219b2ee8SDavid du Colombier 	/* from exhausted() calls in kernel */
60219b2ee8SDavid du Colombier 	{ENFILE,	"no free file descriptors"},
61219b2ee8SDavid du Colombier 	{EBUSY,	"no free mount devices"},
62219b2ee8SDavid du Colombier 	{EBUSY,	"no free mount rpc buffer"},
63219b2ee8SDavid du Colombier 	{EBUSY,		"no free segments"},
64219b2ee8SDavid du Colombier 	{ENOMEM,	"no free memory"},
65219b2ee8SDavid du Colombier 	{ENOBUFS,	"no free Blocks"},
66219b2ee8SDavid du Colombier 	{EBUSY,	"no free routes"},
673e12c5d1SDavid du Colombier 
683e12c5d1SDavid du Colombier 	/* from ken */
693e12c5d1SDavid du Colombier 	{EINVAL,	"attach -- bad specifier"},
703e12c5d1SDavid du Colombier 	{EBADF,		"unknown fid"},
713e12c5d1SDavid du Colombier 	{EINVAL,	"bad character in directory name"},
723e12c5d1SDavid du Colombier 	{EBADF,		"read/write -- on non open fid"},
733e12c5d1SDavid du Colombier 	{EIO,		"read/write -- count too big"},
743e12c5d1SDavid du Colombier 	{EIO,		"phase error -- directory entry not allocated"},
753e12c5d1SDavid du Colombier 	{EIO,		"phase error -- qid does not match"},
763e12c5d1SDavid du Colombier 	{EACCES,	"access permission denied"},
773e12c5d1SDavid du Colombier 	{ENOENT,	"directory entry not found"},
783e12c5d1SDavid du Colombier 	{EINVAL,	"open/create -- unknown mode"},
793e12c5d1SDavid du Colombier 	{ENOTDIR,	"walk -- in a non-directory"},
803e12c5d1SDavid du Colombier 	{ENOTDIR,	"create -- in a non-directory"},
813e12c5d1SDavid du Colombier 	{EIO,		"phase error -- cannot happen"},
823e12c5d1SDavid du Colombier 	{EEXIST,	"create -- file exists"},
833e12c5d1SDavid du Colombier 	{EINVAL,	"create -- . and .. illegal names"},
84*94aa1c4cSDavid du Colombier 	{ENOTEMPTY,	"directory not empty"},
853e12c5d1SDavid du Colombier 	{EINVAL,	"attach -- privileged user"},
863e12c5d1SDavid du Colombier 	{EPERM,		"wstat -- not owner"},
873e12c5d1SDavid du Colombier 	{EPERM,		"wstat -- not in group"},
883e12c5d1SDavid du Colombier 	{EINVAL,	"create/wstat -- bad character in file name"},
893e12c5d1SDavid du Colombier 	{EBUSY,		"walk -- too many (system wide)"},
903e12c5d1SDavid du Colombier 	{EROFS,		"file system read only"},
913e12c5d1SDavid du Colombier 	{ENOSPC,	"file system full"},
923e12c5d1SDavid du Colombier 	{EINVAL,	"read/write -- offset negative"},
933e12c5d1SDavid du Colombier 	{EBUSY,		"open/create -- file is locked"},
943e12c5d1SDavid du Colombier 	{EBUSY,		"close/read/write -- lock is broken"},
95219b2ee8SDavid du Colombier 
96219b2ee8SDavid du Colombier 	/* from sockets */
97219b2ee8SDavid du Colombier 	{ENOTSOCK,	"not a socket"},
98219b2ee8SDavid du Colombier 	{EPROTONOSUPPORT,	"protocol not supported"},
99219b2ee8SDavid du Colombier 	{ECONNREFUSED,	"connection refused"},
100219b2ee8SDavid du Colombier 	{EAFNOSUPPORT,	"address family not supported"},
101219b2ee8SDavid du Colombier 	{ENOBUFS,	"insufficient buffer space"},
102219b2ee8SDavid du Colombier 	{EOPNOTSUPP,	"operation not supported"},
103219b2ee8SDavid du Colombier 	{EADDRINUSE,	"address in use"},
104219b2ee8SDavid du Colombier 	{EGREG,		"unnamed error message"},
1053e12c5d1SDavid du Colombier };
1063e12c5d1SDavid du Colombier 
1073e12c5d1SDavid du Colombier #define NERRMAP	(sizeof(map)/sizeof(struct errmap))
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier /* convert last system call error to an errno */
1103e12c5d1SDavid du Colombier void
_syserrno(void)1113e12c5d1SDavid du Colombier _syserrno(void)
1123e12c5d1SDavid du Colombier {
1133e12c5d1SDavid du Colombier 	int i;
1143e12c5d1SDavid du Colombier 
1159a747e4fSDavid du Colombier 	if(_ERRSTR(_plan9err, sizeof _plan9err) < 0)
116219b2ee8SDavid du Colombier 		errno = EINVAL;
1179a747e4fSDavid du Colombier 	else{
1183e12c5d1SDavid du Colombier 		for(i = 0; i < NERRMAP; i++)
1199a747e4fSDavid du Colombier 			if(strstr(_plan9err, map[i].ename) != 0)
1203e12c5d1SDavid du Colombier 				break;
1219a747e4fSDavid du Colombier 		_ERRSTR(_plan9err, sizeof _plan9err);
122219b2ee8SDavid du Colombier 		errno = (i < NERRMAP)? map[i].errno : EINVAL;
1233e12c5d1SDavid du Colombier 	}
1249a747e4fSDavid du Colombier }
125