diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index 9c824e294..43eaf91e1 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -12,6 +12,7 @@ #include #include +#include #include #include #include @@ -47,12 +48,10 @@ int sys_chdir(const char *path) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_fchdir(int fd) { @@ -127,20 +126,10 @@ int sys_mkdirat(int dirfd, const char *path, mode_t mode) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_symlink(const char *target_path, const char *link_path) { @@ -169,20 +158,10 @@ int sys_symlinkat(const char *target_path, int dirfd, const char *link_path) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_link(const char *old_path, const char *new_path) { @@ -213,16 +192,10 @@ int sys_linkat(int olddirfd, const char *old_path, int newdirfd, const char *new managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_rename(const char *path, const char *new_path) { @@ -252,12 +225,10 @@ int sys_renameat(int olddirfd, const char *old_path, int newdirfd, const char *n managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } } // namespace mlibc @@ -352,8 +323,10 @@ int sys_fcntl(int fd, int request, va_list args, int *result) { mlibc::infoLogger() << "\e[31mmlibc: fcntl(F_GETFL) unimplemented for this file\e[39m" << frg::endlog; return EINVAL; + } else if (resp.error() != managarm::fs::Errors::SUCCESS) { + return resp.error() | toErrno; } - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + *result = resp.flags(); return 0; } else if (request == F_SETFL) { @@ -384,8 +357,10 @@ int sys_fcntl(int fd, int request, va_list args, int *result) { mlibc::infoLogger() << "\e[31mmlibc: fcntl(F_SETFL) unimplemented for this file\e[39m" << frg::endlog; return EINVAL; + } else if (resp.error() != managarm::fs::Errors::SUCCESS) { + return resp.error() | toErrno; } - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + *result = 0; return 0; } else if (request == F_SETLK) { @@ -428,10 +403,9 @@ int sys_fcntl(int fd, int request, va_list args, int *result) { ) << "\e[31mmlibc: fcntl(F_ADD_SEALS) unimplemented for this file\e[39m" << frg::endlog; return EINVAL; - } else if (resp.error() == managarm::fs::Errors::INSUFFICIENT_PERMISSIONS) { - return EPERM; + } else if (resp.error() != managarm::fs::Errors::SUCCESS) { + return resp.error() | toErrno; } - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); *result = resp.seals(); return 0; @@ -462,8 +436,10 @@ int sys_fcntl(int fd, int request, va_list args, int *result) { ) << "\e[31mmlibc: fcntl(F_GET_SEALS) unimplemented for this file\e[39m" << frg::endlog; return EINVAL; + } else if (resp.error() != managarm::fs::Errors::SUCCESS) { + return resp.error() | toErrno; } - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + *result = resp.seals(); return 0; } else { @@ -499,16 +475,17 @@ int sys_read_entries(int fd, void *buffer, size_t max_size, size_t *bytes_read) if (resp.error() == managarm::fs::Errors::END_OF_FILE) { *bytes_read = 0; return 0; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - __ensure(max_size > sizeof(struct dirent)); - auto ent = new (buffer) struct dirent; - memset(ent, 0, sizeof(struct dirent)); - memcpy(ent->d_name, resp.path().data(), resp.path().size()); - ent->d_reclen = sizeof(struct dirent); - *bytes_read = sizeof(struct dirent); - return 0; + } else if (resp.error() != managarm::fs::Errors::SUCCESS) { + return resp.error() | toErrno; } + + __ensure(max_size > sizeof(struct dirent)); + auto ent = new (buffer) struct dirent; + memset(ent, 0, sizeof(struct dirent)); + memcpy(ent->d_name, resp.path().data(), resp.path().size()); + ent->d_reclen = sizeof(struct dirent); + *bytes_read = sizeof(struct dirent); + return 0; } int sys_ttyname(int fd, char *buf, size_t size) { @@ -531,17 +508,13 @@ int sys_ttyname(int fd, char *buf, size_t size) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::NO_SUCH_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::NOT_A_TTY) { - return ENOTTY; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - __ensure(size >= resp.path().size() + 1); - memcpy(buf, resp.path().data(), size); - buf[resp.path().size()] = '\0'; - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + __ensure(size >= resp.path().size() + 1); + memcpy(buf, resp.path().data(), size); + buf[resp.path().size()] = '\0'; + return 0; } int sys_fdatasync(int) { @@ -602,17 +575,10 @@ int sys_vm_map(void *hint, size_t size, int prot, int flags, int fd, off_t offse managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recvResp.data(), recvResp.length()); - if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::NO_MEMORY) { - return EFAULT; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *window = reinterpret_cast(resp.offset()); - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + *window = reinterpret_cast(resp.offset()); return 0; } @@ -831,11 +797,9 @@ int sys_socketpair(int domain, int type_and_flags, int proto, int *fds) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recvResp.data(), recvResp.length()); - if (resp.error() == managarm::posix::Errors::PROTOCOL_NOT_SUPPORTED) { - return EPROTONOSUPPORT; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + __ensure(resp.fds_size() == 2); fds[0] = resp.fds(0); fds[1] = resp.fds(1); @@ -918,35 +882,11 @@ int sys_msg_send(int sockfd, const struct msghdr *hdr, int flags, ssize_t *lengt managarm::fs::SendMsgReply resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::BROKEN_PIPE) { - return EPIPE; - } else if (resp.error() == managarm::fs::Errors::NOT_CONNECTED) { - return ENOTCONN; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::HOST_UNREACHABLE) { - return EHOSTUNREACH; - } else if (resp.error() == managarm::fs::Errors::ACCESS_DENIED) { - return EACCES; - } else if (resp.error() == managarm::fs::Errors::NETWORK_UNREACHABLE) { - return ENETUNREACH; - } else if (resp.error() == managarm::fs::Errors::DESTINATION_ADDRESS_REQUIRED) { - return EDESTADDRREQ; - } else if (resp.error() == managarm::fs::Errors::ADDRESS_NOT_AVAILABLE) { - return EADDRNOTAVAIL; - } else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else if (resp.error() == managarm::fs::Errors::AF_NOT_SUPPORTED) { - return EAFNOSUPPORT; - } else if (resp.error() == managarm::fs::Errors::MESSAGE_TOO_LARGE) { - return EMSGSIZE; - } else if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EOPNOTSUPP; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - *length = resp.size(); - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + *length = resp.size(); + return 0; } int sys_msg_recv(int sockfd, struct msghdr *hdr, int flags, ssize_t *length) { @@ -1199,16 +1139,9 @@ int sys_epoll_ctl(int epfd, int mode, int fd, struct epoll_event *ev) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + return 0; } @@ -1246,10 +1179,9 @@ int sys_epoll_pwait( managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + __ensure(!(recv_data.actualLength() % sizeof(struct epoll_event))); *raised = recv_data.actualLength() / sizeof(struct epoll_event); return 0; @@ -1431,15 +1363,11 @@ int sys_inotify_add_watch(int ifd, const char *path, uint32_t mask, int *wd) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *wd = resp.wd(); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + *wd = resp.wd(); + return 0; } int sys_eventfd_create(unsigned int initval, int flags, int *fd) { @@ -1536,29 +1464,11 @@ int sys_openat(int dirfd, const char *path, int flags, mode_t mode, int *fd) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recvResp.data(), recvResp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_OPERATION_TARGET) { - mlibc::infoLogger() << "\e[31mmlibc: openat unimplemented for this file " << path - << "\e[39m" << frg::endlog; - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::NO_BACKING_DEVICE) { - return ENXIO; - } else if (resp.error() == managarm::posix::Errors::IS_DIRECTORY) { - return EISDIR; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::SYMBOLIC_LINK_LOOP) { - return ELOOP; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *fd = resp.fd(); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + *fd = resp.fd(); + return 0; } int sys_mkfifoat(int dirfd, const char *path, mode_t mode) { @@ -1583,20 +1493,10 @@ int sys_mkfifoat(int dirfd, const char *path, mode_t mode) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::INTERNAL_ERROR) { - return EIEIO; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_mknodat(int dirfd, const char *path, int mode, int dev) { @@ -1622,18 +1522,10 @@ int sys_mknodat(int dirfd, const char *path, int mode, int dev) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ALREADY_EXISTS) { - return EEXIST; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_read(int fd, void *data, size_t max_size, ssize_t *bytes_read) { @@ -1668,26 +1560,12 @@ int sys_read(int fd, void *data, size_t max_size, ssize_t *bytes_read) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - /* if(resp.error() == managarm::fs::Errors::NO_SUCH_FD) { - return EBADF; - }else*/ - if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::IS_DIRECTORY) { - return EISDIR; - } else if (resp.error() == managarm::fs::Errors::NOT_CONNECTED) { - return ENOTCONN; - } else if (resp.error() == managarm::fs::Errors::END_OF_FILE) { - *bytes_read = 0; - return 0; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - HEL_CHECK(recv_data.error()); - *bytes_read = recv_data.actualLength(); - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + HEL_CHECK(recv_data.error()); + *bytes_read = recv_data.actualLength(); + return 0; } int sys_readv(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_read) { @@ -1735,25 +1613,13 @@ int sys_write(int fd, const void *data, size_t size, ssize_t *bytes_written) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - // TODO: implement NO_SUCH_FD - /* if(resp.error() == managarm::fs::Errors::NO_SUCH_FD) { - return EBADF; - }else*/ - if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EINVAL; // FD does not support writes. - } else if (resp.error() == managarm::fs::Errors::NO_SPACE_LEFT) { - return ENOSPC; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::NOT_CONNECTED) { - return ENOTCONN; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - if (bytes_written) { - *bytes_written = resp.size(); - } - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + if (bytes_written) + *bytes_written = resp.size(); + + return 0; } int sys_writev(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_written) { @@ -1798,21 +1664,13 @@ int sys_writev(int fd, const struct iovec *iovs, int iovc, ssize_t *bytes_writte managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EINVAL; // FD does not support writes. - } else if (resp.error() == managarm::fs::Errors::NO_SPACE_LEFT) { - return ENOSPC; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::NOT_CONNECTED) { - return ENOTCONN; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - if (bytes_written) - *bytes_written = resp.size(); + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; - return 0; - } + if (bytes_written) + *bytes_written = resp.size(); + + return 0; } int sys_pread(int fd, void *buf, size_t n, off_t off, ssize_t *bytes_read) { @@ -1844,22 +1702,16 @@ int sys_pread(int fd, void *buf, size_t n, off_t off, ssize_t *bytes_read) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - /* if(resp.error() == managarm::fs::Errors::NO_SUCH_FD) { - return EBADF; - }else*/ - if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::END_OF_FILE) { + if (resp.error() == managarm::fs::Errors::END_OF_FILE) { *bytes_read = 0; return 0; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + } else if (resp.error() == managarm::fs::Errors::SUCCESS) { HEL_CHECK(recv_data.error()); *bytes_read = recv_data.actualLength(); return 0; } + + return resp.error() | toErrno; } int sys_pwrite(int fd, const void *buf, size_t n, off_t off, ssize_t *bytes_written) { @@ -1896,21 +1748,11 @@ int sys_pwrite(int fd, const void *buf, size_t n, off_t off, ssize_t *bytes_writ managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else if (resp.error() == managarm::fs::Errors::WOULD_BLOCK) { - return EAGAIN; - } else if (resp.error() == managarm::fs::Errors::NO_SPACE_LEFT) { - return ENOSPC; - } else if (resp.error() == managarm::fs::Errors::SEEK_ON_PIPE) { - return ESPIPE; - } else if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - *bytes_written = n; - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + *bytes_written = n; + return 0; } int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { @@ -1948,15 +1790,11 @@ int sys_seek(int fd, off_t offset, int whence, off_t *new_offset) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::SEEK_ON_PIPE) { - return ESPIPE; - } else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - *new_offset = resp.offset(); - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + *new_offset = resp.offset(); + return 0; } int sys_close(int fd) { @@ -2016,13 +1854,8 @@ int sys_dup(int fd, int flags, int *newfd) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; *newfd = resp.fd(); return 0; @@ -2050,14 +1883,8 @@ int sys_dup2(int fd, int flags, int newfd) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - - if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; return 0; } @@ -2102,60 +1929,54 @@ int sys_stat(fsfd_target fsfdt, int fd, const char *path, int flags, struct stat managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - memset(result, 0, sizeof(struct stat)); - - switch (resp.file_type()) { - case managarm::posix::FileType::FT_REGULAR: - result->st_mode = S_IFREG; - break; - case managarm::posix::FileType::FT_DIRECTORY: - result->st_mode = S_IFDIR; - break; - case managarm::posix::FileType::FT_SYMLINK: - result->st_mode = S_IFLNK; - break; - case managarm::posix::FileType::FT_CHAR_DEVICE: - result->st_mode = S_IFCHR; - break; - case managarm::posix::FileType::FT_BLOCK_DEVICE: - result->st_mode = S_IFBLK; - break; - case managarm::posix::FileType::FT_SOCKET: - result->st_mode = S_IFSOCK; - break; - case managarm::posix::FileType::FT_FIFO: - result->st_mode = S_IFIFO; - break; - default: - __ensure(!resp.file_type()); - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; - result->st_dev = 1; - result->st_ino = resp.fs_inode(); - result->st_mode |= resp.mode(); - result->st_nlink = resp.num_links(); - result->st_uid = resp.uid(); - result->st_gid = resp.gid(); - result->st_rdev = resp.ref_devnum(); - result->st_size = resp.file_size(); - result->st_atim.tv_sec = resp.atime_secs(); - result->st_atim.tv_nsec = resp.atime_nanos(); - result->st_mtim.tv_sec = resp.mtime_secs(); - result->st_mtim.tv_nsec = resp.mtime_nanos(); - result->st_ctim.tv_sec = resp.ctime_secs(); - result->st_ctim.tv_nsec = resp.ctime_nanos(); - result->st_blksize = 4096; - result->st_blocks = resp.file_size() / 512 + 1; - return 0; - } + memset(result, 0, sizeof(struct stat)); + + switch (resp.file_type()) { + case managarm::posix::FileType::FT_REGULAR: + result->st_mode = S_IFREG; + break; + case managarm::posix::FileType::FT_DIRECTORY: + result->st_mode = S_IFDIR; + break; + case managarm::posix::FileType::FT_SYMLINK: + result->st_mode = S_IFLNK; + break; + case managarm::posix::FileType::FT_CHAR_DEVICE: + result->st_mode = S_IFCHR; + break; + case managarm::posix::FileType::FT_BLOCK_DEVICE: + result->st_mode = S_IFBLK; + break; + case managarm::posix::FileType::FT_SOCKET: + result->st_mode = S_IFSOCK; + break; + case managarm::posix::FileType::FT_FIFO: + result->st_mode = S_IFIFO; + break; + default: + __ensure(!resp.file_type()); + } + + result->st_dev = 1; + result->st_ino = resp.fs_inode(); + result->st_mode |= resp.mode(); + result->st_nlink = resp.num_links(); + result->st_uid = resp.uid(); + result->st_gid = resp.gid(); + result->st_rdev = resp.ref_devnum(); + result->st_size = resp.file_size(); + result->st_atim.tv_sec = resp.atime_secs(); + result->st_atim.tv_nsec = resp.atime_nanos(); + result->st_mtim.tv_sec = resp.mtime_secs(); + result->st_mtim.tv_nsec = resp.mtime_nanos(); + result->st_ctim.tv_sec = resp.ctime_secs(); + result->st_ctim.tv_nsec = resp.ctime_nanos(); + result->st_blksize = 4096; + result->st_blocks = resp.file_size() / 512 + 1; + return 0; } int sys_readlink(const char *path, void *data, size_t max_size, ssize_t *length) { @@ -2184,15 +2005,11 @@ int sys_readlinkat(int dirfd, const char *path, void *data, size_t max_size, ssi managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *length = recv_data.actualLength(); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + *length = recv_data.actualLength(); + return 0; } int sys_rmdir(const char *path) { @@ -2215,18 +2032,10 @@ int sys_rmdir(const char *path) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::DIRECTORY_NOT_EMPTY) { - return ENOTEMPTY; - } else if (resp.error() == managarm::posix::Errors::INTERNAL_ERROR) { - return EIEIO; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_ftruncate(int fd, size_t size) { @@ -2252,12 +2061,10 @@ int sys_ftruncate(int fd, size_t size) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_fallocate(int fd, off_t offset, size_t size) { @@ -2284,16 +2091,9 @@ int sys_fallocate(int fd, off_t offset, size_t size) { managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { - return EINVAL; - } else if (resp.error() == managarm::fs::Errors::INSUFFICIENT_PERMISSIONS) { - return EPERM; - } else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + return 0; } @@ -2319,24 +2119,10 @@ int sys_unlinkat(int fd, const char *path, int flags) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::RESOURCE_IN_USE) { - return EBUSY; - } else if (resp.error() == managarm::posix::Errors::IS_DIRECTORY) { - return EISDIR; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::BAD_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::NOT_A_DIRECTORY) { - return ENOTDIR; - } else if (resp.error() == managarm::posix::Errors::DIRECTORY_NOT_EMPTY) { - return ENOTEMPTY; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_access(const char *path, int mode) { return sys_faccessat(AT_FDCWD, path, mode, 0); } @@ -2363,16 +2149,10 @@ int sys_faccessat(int dirfd, const char *pathname, int, int flags) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::NO_SUCH_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_flock(int fd, int opts) { @@ -2399,14 +2179,10 @@ int sys_flock(int fd, int opts) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::WOULD_BLOCK) { - return EWOULDBLOCK; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_isatty(int fd) { @@ -2467,18 +2243,10 @@ int sys_fchmodat(int fd, const char *pathname, mode_t mode, int flags) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::NO_SUCH_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::NOT_SUPPORTED) { - return ENOTSUP; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags) { @@ -2532,18 +2300,10 @@ int sys_utimensat(int dirfd, const char *pathname, const struct timespec times[2 managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) { - return ENOENT; - } else if (resp.error() == managarm::posix::Errors::NO_SUCH_FD) { - return EBADF; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::NOT_SUPPORTED) { - return ENOTSUP; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_getentropy(void *buffer, size_t length) { diff --git a/sysdeps/managarm/generic/fork-exec.cpp b/sysdeps/managarm/generic/fork-exec.cpp index 3ef15e5a7..8d9f763fd 100644 --- a/sysdeps/managarm/generic/fork-exec.cpp +++ b/sysdeps/managarm/generic/fork-exec.cpp @@ -1,5 +1,6 @@ // for _Exit() +#include #include #include @@ -74,12 +75,9 @@ int sys_waitpid(pid_t pid, int *status, int flags, struct rusage *ru, pid_t *ret managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::NO_CHILD_PROCESSES) { - return ECHILD; - } - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + if (status) *status = resp.mode(); *ret_pid = resp.pid(); @@ -114,12 +112,9 @@ int sys_waitid(idtype_t idtype, id_t id, siginfo_t *info, int options) { managarm::posix::WaitIdResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else if (resp.error() == managarm::posix::Errors::NO_CHILD_PROCESSES) { - return ECHILD; - } - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + info->si_pid = resp.pid(); info->si_uid = resp.uid(); info->si_code = resp.sig_code(); @@ -267,14 +262,10 @@ int sys_setgid(gid_t gid) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ACCESS_DENIED) { - return EPERM; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } gid_t sys_getegid() { @@ -319,14 +310,10 @@ int sys_setegid(gid_t egid) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ACCESS_DENIED) { - return EPERM; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } uid_t sys_getuid() { @@ -371,14 +358,10 @@ int sys_setuid(uid_t uid) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ACCESS_DENIED) { - return EPERM; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } uid_t sys_geteuid() { @@ -423,14 +406,10 @@ int sys_seteuid(uid_t euid) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::ACCESS_DENIED) { - return EPERM; - } else if (resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { - return EINVAL; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } pid_t sys_gettid() { @@ -504,11 +483,12 @@ int sys_getsid(pid_t pid, pid_t *sid) { if (resp.error() == managarm::posix::Errors::NO_SUCH_RESOURCE) { *sid = 0; return ESRCH; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *sid = resp.pid(); - return 0; + } else if (resp.error() != managarm::posix::Errors::SUCCESS) { + return resp.error() | toErrno; } + + *sid = resp.pid(); + return 0; } int sys_getpgid(pid_t pid, pid_t *pgid) { @@ -533,11 +513,12 @@ int sys_getpgid(pid_t pid, pid_t *pgid) { if (resp.error() == managarm::posix::Errors::NO_SUCH_RESOURCE) { *pgid = 0; return ESRCH; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *pgid = resp.pid(); - return 0; + } else if (resp.error() != managarm::posix::Errors::SUCCESS) { + return resp.error() | toErrno; } + + *pgid = resp.pid(); + return 0; } int sys_setpgid(pid_t pid, pid_t pgid) { @@ -561,16 +542,10 @@ int sys_setpgid(pid_t pid, pid_t pgid) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::posix::Errors::INSUFFICIENT_PERMISSION) { - return EPERM; - } else if (resp.error() == managarm::posix::Errors::NO_SUCH_RESOURCE) { - return ESRCH; - } else if (resp.error() == managarm::posix::Errors::ACCESS_DENIED) { - return EACCES; - } else { - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - return 0; - } + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } int sys_getrusage(int scope, struct rusage *usage) { @@ -595,7 +570,8 @@ int sys_getrusage(int scope, struct rusage *usage) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; usage->ru_utime.tv_sec = resp.ru_user_time() / 1'000'000'000; usage->ru_utime.tv_usec = (resp.ru_user_time() % 1'000'000'000) / 1'000; diff --git a/sysdeps/managarm/generic/mount.cpp b/sysdeps/managarm/generic/mount.cpp index b50b4fa70..9a6ed3997 100644 --- a/sysdeps/managarm/generic/mount.cpp +++ b/sysdeps/managarm/generic/mount.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -34,9 +35,9 @@ sys_mount(const char *source, const char *target, const char *fstype, unsigned l auto resp = *bragi::parse_head_only(recv_resp, getSysdepsAllocator()); - if (resp.error() == managarm::posix::Errors::FILE_NOT_FOUND) - return ENOENT; - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + if (resp.error() != managarm::posix::Errors::SUCCESS) + return resp.error() | toErrno; + return 0; } diff --git a/sysdeps/managarm/generic/socket.cpp b/sysdeps/managarm/generic/socket.cpp index 30a6a8368..935db6dbb 100644 --- a/sysdeps/managarm/generic/socket.cpp +++ b/sysdeps/managarm/generic/socket.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -382,17 +383,10 @@ sys_getsockopt(int fd, int layer, int number, void *__restrict buffer, socklen_t managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::SUCCESS) - return 0; - else if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) - return EINVAL; - else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) - return EINVAL; - else if (resp.error() == managarm::fs::Errors::INVALID_PROTOCOL_OPTION) - return ENOPROTOOPT; - else - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); - __builtin_unreachable(); + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } else { mlibc::panicLogger() << "\e[31mmlibc: Unexpected getsockopt() call, layer: " << layer << " number: " << number << "\e[39m" << frg::endlog; @@ -486,16 +480,10 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, socklen_t managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::SUCCESS) - return 0; - else if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) - return EINVAL; - else if (resp.error() == managarm::fs::Errors::ILLEGAL_ARGUMENT) - return EINVAL; - else if (resp.error() == managarm::fs::Errors::INVALID_PROTOCOL_OPTION) - return ENOPROTOOPT; - else - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } else if (std::find( setsockopt_passthrough_noopt.begin(), setsockopt_passthrough_noopt.end(), @@ -523,12 +511,10 @@ int sys_setsockopt(int fd, int layer, int number, const void *buffer, socklen_t managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp.data(), recv_resp.length()); - if (resp.error() == managarm::fs::Errors::SUCCESS) - return 0; - else if (resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) - return EINVAL; - else - __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + if (resp.error() != managarm::fs::Errors::SUCCESS) + return resp.error() | toErrno; + + return 0; } else if (std::find( setsockopt_readonly.begin(), setsockopt_readonly.end(), diff --git a/sysdeps/managarm/include/bits/errors.hpp b/sysdeps/managarm/include/bits/errors.hpp new file mode 100644 index 000000000..cb841ac02 --- /dev/null +++ b/sysdeps/managarm/include/bits/errors.hpp @@ -0,0 +1,136 @@ +#pragma once + +#include + +#include "fs.frigg_bragi.hpp" +#include "posix.frigg_bragi.hpp" + +struct ToErrno { + template + auto operator()(E e) const { + return e | *this; + } +}; +constexpr ToErrno toErrno; + +inline int operator|(managarm::fs::Errors e, ToErrno) { + switch (e) { + case managarm::fs::Errors::SUCCESS: + return 0; + case managarm::fs::Errors::FILE_NOT_FOUND: + return ENOENT; + case managarm::fs::Errors::END_OF_FILE: + return 0; + case managarm::fs::Errors::ILLEGAL_ARGUMENT: + return EINVAL; + case managarm::fs::Errors::WOULD_BLOCK: + return EAGAIN; + case managarm::fs::Errors::SEEK_ON_PIPE: + return ESPIPE; + case managarm::fs::Errors::BROKEN_PIPE: + return EPIPE; + case managarm::fs::Errors::ACCESS_DENIED: + return EPERM; + case managarm::fs::Errors::NOT_DIRECTORY: + return ENOTDIR; + case managarm::fs::Errors::AF_NOT_SUPPORTED: + return EAFNOSUPPORT; + case managarm::fs::Errors::DESTINATION_ADDRESS_REQUIRED: + return EDESTADDRREQ; + case managarm::fs::Errors::NETWORK_UNREACHABLE: + return ENETUNREACH; + case managarm::fs::Errors::MESSAGE_TOO_LARGE: + return EMSGSIZE; + case managarm::fs::Errors::HOST_UNREACHABLE: + return EHOSTUNREACH; + case managarm::fs::Errors::INSUFFICIENT_PERMISSIONS: + return EPERM; + case managarm::fs::Errors::ADDRESS_IN_USE: + return EADDRINUSE; + case managarm::fs::Errors::ADDRESS_NOT_AVAILABLE: + return EADDRNOTAVAIL; + case managarm::fs::Errors::NOT_CONNECTED: + return ENOTCONN; + case managarm::fs::Errors::ALREADY_EXISTS: + return EEXIST; + case managarm::fs::Errors::ILLEGAL_OPERATION_TARGET: + return EINVAL; + case managarm::fs::Errors::NO_SPACE_LEFT: + return ENOSPC; + case managarm::fs::Errors::NOT_A_TERMINAL: + return ENOTTY; + case managarm::fs::Errors::NO_BACKING_DEVICE: + return ENXIO; + case managarm::fs::Errors::IS_DIRECTORY: + return EISDIR; + case managarm::fs::Errors::INVALID_PROTOCOL_OPTION: + return ENOPROTOOPT; + case managarm::fs::Errors::DIRECTORY_NOT_EMPTY: + return ENOTEMPTY; + case managarm::fs::Errors::CONNECTION_REFUSED: + return ECONNREFUSED; + case managarm::fs::Errors::INTERNAL_ERROR: + return EIO; + } +} + +inline int operator|(managarm::posix::Errors e, ToErrno) { + switch (e) { + case managarm::posix::Errors::SUCCESS: + return 0; + case managarm::posix::Errors::FILE_NOT_FOUND: + return ENOENT; + case managarm::posix::Errors::END_OF_FILE: + return 0; + case managarm::posix::Errors::WOULD_BLOCK: + return EAGAIN; + case managarm::posix::Errors::BROKEN_PIPE: + return EPIPE; + case managarm::posix::Errors::ACCESS_DENIED: + return EPERM; + case managarm::posix::Errors::NOT_A_DIRECTORY: + return ENOTDIR; + case managarm::posix::Errors::INSUFFICIENT_PERMISSION: + return EPERM; + case managarm::posix::Errors::ALREADY_EXISTS: + return EEXIST; + case managarm::posix::Errors::ILLEGAL_OPERATION_TARGET: + return EINVAL; + case managarm::posix::Errors::NO_BACKING_DEVICE: + return ENXIO; + case managarm::posix::Errors::IS_DIRECTORY: + return EISDIR; + case managarm::posix::Errors::DIRECTORY_NOT_EMPTY: + return ENOTEMPTY; + case managarm::posix::Errors::INTERNAL_ERROR: + return EIO; + case managarm::posix::Errors::DEAD_FORK: + return EAGAIN; + case managarm::posix::Errors::ILLEGAL_REQUEST: + return ENOSYS; + case managarm::posix::Errors::ILLEGAL_ARGUMENTS: + return EINVAL; + case managarm::posix::Errors::NO_SUCH_FD: + return EBADF; + case managarm::posix::Errors::BAD_FD: + return EBADFD; + case managarm::posix::Errors::NOT_SUPPORTED: + return ENOTSUP; + case managarm::posix::Errors::RESOURCE_IN_USE: + return EBUSY; + case managarm::posix::Errors::NO_SUCH_RESOURCE: + return ESRCH; + case managarm::posix::Errors::NOT_A_TTY: + return ENOTTY; + case managarm::posix::Errors::PROTOCOL_NOT_SUPPORTED: + return EPROTONOSUPPORT; + case managarm::posix::Errors::ADDRESS_FAMILY_NOT_SUPPORTED: + return EAFNOSUPPORT; + case managarm::posix::Errors::NO_MEMORY: + return ENOMEM; + case managarm::posix::Errors::NO_CHILD_PROCESSES: + return ECHILD; + case managarm::posix::Errors::SYMBOLIC_LINK_LOOP: + return ELOOP; + } +}