From 72eaa1fb24b6e3468a5310ca53a85fd4627367eb Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Sun, 6 Jun 2021 02:41:15 +0200 Subject: [PATCH 1/4] sysdeps/managarm: Add more error handling to sys_socket and sys_sockname Signed-off-by: Dennis Bonke --- sysdeps/managarm/generic/file.cpp | 10 +++++++--- sysdeps/managarm/generic/socket.cpp | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index 8899c3c5..ce92e0dd 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -951,9 +951,13 @@ int sys_socket(int domain, int type_and_flags, int proto, int *fd) { managarm::posix::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recvResp.data(), recvResp.length()); - __ensure(resp.error() == managarm::posix::Errors::SUCCESS); - *fd = resp.fd(); - return 0; + if(resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) { + return EAFNOSUPPORT; + } else { + __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + *fd = resp.fd(); + return 0; + } } int sys_pipe(int *fds, int flags) { diff --git a/sysdeps/managarm/generic/socket.cpp b/sysdeps/managarm/generic/socket.cpp index dd36ec7f..8111645e 100644 --- a/sysdeps/managarm/generic/socket.cpp +++ b/sysdeps/managarm/generic/socket.cpp @@ -169,11 +169,14 @@ int sys_sockname(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length, HEL_CHECK(offer->error); HEL_CHECK(send_req->error); HEL_CHECK(recv_resp->error); - HEL_CHECK(recv_addr->error); managarm::fs::SvrResponse resp(getSysdepsAllocator()); resp.ParseFromArray(recv_resp->data, recv_resp->length); + if(resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) { + return ENOTSOCK; + } __ensure(resp.error() == managarm::fs::Errors::SUCCESS); + HEL_CHECK(recv_addr->error); *actual_length = resp.file_size(); return 0; } From e0a5cd1c1d46c9bfbd58a9f466da6479a58ba279 Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Sun, 6 Jun 2021 02:48:17 +0200 Subject: [PATCH 2/4] sysdeps/managarm: Add more error handling to sys_msg_send Signed-off-by: Dennis Bonke --- sysdeps/managarm/generic/file.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index ce92e0dd..b24024c6 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -1124,6 +1124,16 @@ int sys_msg_send(int sockfd, const struct msghdr *hdr, int flags, ssize_t *lengt 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{ __ensure(resp.error() == managarm::fs::Errors::SUCCESS); *length = resp.size(); From c0ff4a05cdd5dca5a2255e7b9d7ca3acb7c22ef5 Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Sun, 6 Jun 2021 02:50:57 +0200 Subject: [PATCH 3/4] options/ansi: Add ctime, asctime, asctime_r and ctime_r Signed-off-by: Dennis Bonke --- options/ansi/generic/time-stubs.cpp | 39 ++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/options/ansi/generic/time-stubs.cpp b/options/ansi/generic/time-stubs.cpp index aea0bf92..d27680fe 100644 --- a/options/ansi/generic/time-stubs.cpp +++ b/options/ansi/generic/time-stubs.cpp @@ -62,14 +62,17 @@ int timespec_get(struct timespec *ts, int base) { return ret < 0 ? 0 : base; } -char *asctime(const struct tm *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +char *asctime(const struct tm *ptr) { + static char buf[26]; + return asctime_r(ptr, buf); } -char *ctime(const time_t *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +char *ctime(const time_t *timer) { + struct tm *tm = localtime(timer); + if(!tm) { + return 0; + } + return asctime(tm); } struct tm *gmtime(const time_t *unix_gmt) { @@ -553,14 +556,26 @@ struct tm *localtime_r(const time_t *unix_gmt, struct tm *res) { return res; } -char *asctime_r(const struct tm *, char *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +// This implementation of asctime_r is taken from sortix +char *asctime_r(const struct tm *tm, char *buf) { + static char weekday_names[7][4] = + { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + static char month_names[12][4] = + { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", + "Nov", "Dec" }; + sprintf(buf, "%.3s %.3s%3d %.2d:%.2d%.2d %d\n", + weekday_names[tm->tm_wday], + month_names[tm->tm_mon], + tm->tm_mday, + tm->tm_hour, + tm->tm_min, + tm->tm_sec, + tm->tm_year + 1900); + return buf; } -char *ctime_r(const time_t *, char *) { - __ensure(!"Not implemented"); - __builtin_unreachable(); +char *ctime_r(const time_t *clock, char *buf) { + return asctime_r(localtime(clock), buf); } char *strptime(const char *__restrict, const char *__restrict, From 82e3547f9b47f017cc0110a04345bb07b7f9bcc7 Mon Sep 17 00:00:00 2001 From: Dennis Bonke Date: Sun, 6 Jun 2021 02:56:04 +0200 Subject: [PATCH 4/4] sysdeps/managarm: Stub setsockopt(SOL_SOCKET, SO_REUSEADDR) Signed-off-by: Dennis Bonke --- sysdeps/managarm/generic/socket.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sysdeps/managarm/generic/socket.cpp b/sysdeps/managarm/generic/socket.cpp index 8111645e..86340968 100644 --- a/sysdeps/managarm/generic/socket.cpp +++ b/sysdeps/managarm/generic/socket.cpp @@ -345,6 +345,9 @@ int sys_setsockopt(int fd, int layer, int number, }else if(layer == SOL_SOCKET && number == SO_KEEPALIVE) { mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_KEEPALIVE is unimplemented\e[39m" << frg::endlog; return 0; + }else if(layer == SOL_SOCKET && number == SO_REUSEADDR) { + mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_REUSEADDR is unimplemented\e[39m" << frg::endlog; + return 0; }else if(layer == AF_NETLINK && number == SO_ACCEPTCONN) { mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with AF_NETLINK and SO_ACCEPTCONN is unimplemented\e[39m" << frg::endlog; return 0;