#include #include #include #include "dat.h" #include "fns.h" #include "linux.h" int Efmt(Fmt *f) { static char *t[] = { [EPERM] "EPERM", [ENOENT] "ENOENT", [ESRCH] "ESRCH", [EINTR] "EINTR", [EIO] "EIO", [ENXIO] "ENXIO", [E2BIG] "E2BIG", [ENOEXEC] "ENOEXEC", [EBADF] "EBADF", [ECHILD] "ECHILD", [EAGAIN] "EAGAIN", [ENOMEM] "ENOMEM", [EACCES] "EACCES", [EFAULT] "EFAULT", [ENOTBLK] "ENOTBLK", [EBUSY] "EBUSY", [EEXIST] "EEXIST", [EXDEV] "EXDEV", [ENODEV] "ENODEV", [ENOTDIR] "ENOTDIR", [EISDIR] "EISDIR", [EINVAL] "EINVAL", [ENFILE] "ENFILE", [EMFILE] "EMFILE", [ENOTTY] "ENOTTY", [ETXTBSY] "ETXTBSY", [EFBIG] "EFBIG", [ENOSPC] "ENOSPC", [ESPIPE] "ESPIPE", [EROFS] "EROFS", [EMLINK] "EMLINK", [EPIPE] "EPIPE", [EDOM] "EDOM", [ERANGE] "ERANGE", [EDEADLK] "EDEADLK", [ENAMETOOLONG] "ENAMETOOLONG", [ENOLCK] "ENOLCK", [ENOSYS] "ENOSYS", [ENOTEMPTY] "ENOTEMPTY", [ELOOP] "ELOOP", [ENOMSG] "ENOMSG", [EIDRM] "EIDRM", [ECHRNG] "ECHRNG", [EL2NSYNC] "EL2NSYNC", [EL3HLT] "EL3HLT", [EL3RST] "EL3RST", [ELNRNG] "ELNRNG", [EUNATCH] "EUNATCH", [ENOCSI] "ENOCSI", [EL2HLT] "EL2HLT", [EBADE] "EBADE", [EBADR] "EBADR", [EXFULL] "EXFULL", [ENOANO] "ENOANO", [EBADRQC] "EBADRQC", [EBADSLT] "EBADSLT", [EBFONT] "EBFONT", [ENOSTR] "ENOSTR", [ENODATA] "ENODATA", [ETIME] "ETIME", [ENOSR] "ENOSR", [ENONET] "ENONET", [ENOPKG] "ENOPKG", [EREMOTE] "EREMOTE", [ENOLINK] "ENOLINK", [EADV] "EADV", [ESRMNT] "ESRMNT", [ECOMM] "ECOMM", [EPROTO] "EPROTO", [EMULTIHOP] "EMULTIHOP", [EDOTDOT] "EDOTDOT", [EBADMSG] "EBADMSG", [EOVERFLOW] "EOVERFLOW", [ENOTUNIQ] "ENOTUNIQ", [EBADFD] "EBADFD", [EREMCHG] "EREMCHG", [ELIBACC] "ELIBACC", [ELIBBAD] "ELIBBAD", [ELIBSCN] "ELIBSCN", [ELIBMAX] "ELIBMAX", [ELIBEXEC] "ELIBEXEC", [EILSEQ] "EILSEQ", [ERESTART] "ERESTART", [ESTRPIPE] "ESTRPIPE", [EUSERS] "EUSERS", [ENOTSOCK] "ENOTSOCK", [EDESTADDRREQ] "EDESTADDRREQ", [EMSGSIZE] "EMSGSIZE", [EPROTOTYPE] "EPROTOTYPE", [ENOPROTOOPT] "ENOPROTOOPT", [EPROTONOSUPPORT] "EPROTONOSUPPORT", [ESOCKTNOSUPPORT] "ESOCKTNOSUPPORT", [EOPNOTSUPP] "EOPNOTSUPP", [EPFNOSUPPORT] "EPFNOSUPPORT", [EAFNOSUPPORT] "EAFNOSUPPORT", [EADDRINUSE] "EADDRINUSE", [EADDRNOTAVAIL] "EADDRNOTAVAIL", [ENETDOWN] "ENETDOWN", [ENETUNREACH] "ENETUNREACH", [ENETRESET] "ENETRESET", [ECONNABORTED] "ECONNABORTED", [ECONNRESET] "ECONNRESET", [ENOBUFS] "ENOBUFS", [EISCONN] "EISCONN", [ENOTCONN] "ENOTCONN", [ESHUTDOWN] "ESHUTDOWN", [ETOOMANYREFS] "ETOOMANYREFS", [ETIMEDOUT] "ETIMEDOUT", [ECONNREFUSED] "ECONNREFUSED", [EHOSTDOWN] "EHOSTDOWN", [EHOSTUNREACH] "EHOSTUNREACH", [EALREADY] "EALREADY", [EINPROGRESS] "EINPROGRESS", [ESTALE] "ESTALE", [EUCLEAN] "EUCLEAN", [ENOTNAM] "ENOTNAM", [ENAVAIL] "ENAVAIL", [EISNAM] "EISNAM", [EREMOTEIO] "EREMOTEIO", [EDQUOT] "EDQUOT", [ENOMEDIUM] "ENOMEDIUM", [EMEDIUMTYPE] "EMEDIUMTYPE", }; int e; e = va_arg(f->args, int); if(e >= 0 || -e >= nelem(t)) return fmtprint(f, "%d", e); return fmtprint(f, "%d [%s]", e, t[-e]); } int mkerror(void) { static struct { int num; char *msg; } t[] = { /* from /sys/src/9/port/errstr.h */ {EINVAL, "inconsistent mount"}, {EINVAL, "not mounted"}, {EINVAL, "not in union"}, {EIO, "mount rpc error"}, {EIO, "mounted device shut down"}, {EPERM, "mounted directory forbids creation"}, {ENOENT, "does not exist"}, {ENXIO, "unknown device in # filename"}, {ENOTDIR, "not a directory"}, {EISDIR, "file is a directory"}, {EINVAL, "bad character in file name"}, {EINVAL, "file name syntax"}, {EPERM, "permission denied"}, {EPERM, "inappropriate use of fd"}, {EINVAL, "bad arg in system call"}, {EBUSY, "device or object already in use"}, {EIO, "i/o error"}, {EIO, "read or write too large"}, {EIO, "read or write too small"}, {EADDRINUSE, "network port not available"}, {ESHUTDOWN, "write to hungup stream"}, {ESHUTDOWN, "i/o on hungup channel"}, {EINVAL, "bad process or channel control request"}, {EBUSY, "no free devices"}, {ESRCH, "process exited"}, {ECHILD, "no living children"}, {EIO, "i/o error in demand load"}, {ENOMEM, "virtual memory allocation failed"}, {EBADF, "fd out of range or not open"}, {EMFILE, "no free file descriptors"}, {ESPIPE, "seek on a stream"}, {ENOEXEC, "exec header invalid"}, {ETIMEDOUT, "connection timed out"}, {ECONNREFUSED, "connection refused"}, {ECONNREFUSED, "connection in use"}, {ERESTART, "interrupted"}, {ENOMEM, "kernel allocate failed"}, {EINVAL, "segments overlap"}, {EIO, "i/o count too small"}, {EINVAL, "bad attach specifier"}, /* from exhausted() calls in kernel */ {ENFILE, "no free file descriptors"}, {EBUSY, "no free mount devices"}, {EBUSY, "no free mount rpc buffer"}, {EBUSY, "no free segments"}, {ENOMEM, "no free memory"}, {ENOBUFS, "no free Blocks"}, {EBUSY, "no free routes"}, /* from ken */ {EINVAL, "attach -- bad specifier"}, {EBADF, "unknown fid"}, {EINVAL, "bad character in directory name"}, {EBADF, "read/write -- on non open fid"}, {EIO, "read/write -- count too big"}, {EIO, "phase error -- directory entry not allocated"}, {EIO, "phase error -- qid does not match"}, {EACCES, "access permission denied"}, {ENOENT, "directory entry not found"}, {EINVAL, "open/create -- unknown mode"}, {ENOTDIR, "walk -- in a non-directory"}, {ENOTDIR, "create -- in a non-directory"}, {EIO, "phase error -- cannot happen"}, {EEXIST, "create -- file exists"}, {EINVAL, "create -- . and .. illegal names"}, {ENOTEMPTY, "remove -- directory not empty"}, {EINVAL, "attach -- privileged user"}, {EPERM, "wstat -- not owner"}, {EPERM, "wstat -- not in group"}, {EINVAL, "create/wstat -- bad character in file name"}, {EBUSY, "walk -- too many (system wide)"}, {EROFS, "file system read only"}, {ENOSPC, "file system full"}, {EINVAL, "read/write -- offset negative"}, {EBUSY, "open/create -- file is locked"}, {EBUSY, "close/read/write -- lock is broken"}, /* from sockets */ {ENOTSOCK, "not a socket"}, {EPROTONOSUPPORT, "protocol not supported"}, {ECONNREFUSED, "connection refused"}, {EAFNOSUPPORT, "address family not supported"}, {ENOBUFS, "insufficient buffer space"}, {EOPNOTSUPP, "operation not supported"}, {EADDRINUSE, "address in use"}, /* other */ {EEXIST, "file already exists"}, {EEXIST, "is a directory"}, {ENOTEMPTY, "directory not empty"}, }; int r, i; char msg[ERRMAX]; rerrstr(msg, sizeof(msg)); r = -EIO; for(i=0; isyscall); return -ENOSYS; }