diff --git a/options/ansi/generic/signal-stubs.cpp b/options/ansi/generic/signal-stubs.cpp index 3a6b18db..9dc9a761 100644 --- a/options/ansi/generic/signal-stubs.cpp +++ b/options/ansi/generic/signal-stubs.cpp @@ -7,22 +7,19 @@ #include __sighandler signal(int sn, __sighandler handler) { - mlibc::infoLogger() << "\e[31mmlibc: signal() always returns SIG_DFL\e[39m" << frg::endlog; if(!mlibc::sys_sigaction) { MLIBC_MISSING_SYSDEP(); errno = ENOSYS; return SIG_ERR; } - if(handler == SIG_DFL || handler == SIG_IGN) { - }else{ - struct sigaction sa; - sa.sa_handler = handler; - sa.sa_flags = 0; - sa.sa_mask = 0; - if(mlibc::sys_sigaction(sn, &sa, nullptr)) - mlibc::panicLogger() << "\e[31mmlibc: sys_sigaction() failed\e[39m" << frg::endlog; - } - return SIG_DFL; + struct sigaction sa; + sa.sa_handler = handler; + sa.sa_flags = 0; + sa.sa_mask = 0; + struct sigaction old; + if(mlibc::sys_sigaction(sn, &sa, &old)) + mlibc::panicLogger() << "\e[31mmlibc: sys_sigaction() failed\e[39m" << frg::endlog; + return old.sa_handler; } int raise(int sig) { diff --git a/options/posix/generic/sys-uio.cpp b/options/posix/generic/sys-uio.cpp index 1200bfa8..a4ffbf53 100644 --- a/options/posix/generic/sys-uio.cpp +++ b/options/posix/generic/sys-uio.cpp @@ -1,7 +1,14 @@ #include #include +#include +#include +#include +#include +#include +#include +#include #include ssize_t readv(int, const struct iovec *, int) { @@ -13,14 +20,30 @@ ssize_t writev(int fd, const struct iovec *iovs, int iovc) { __ensure(iovc); ssize_t written = 0; + size_t bytes = 0; for(int i = 0; i < iovc; i++) { - __ensure(iovs[i].iov_len); - auto chunk = write(fd, iovs[i].iov_base, iovs[i].iov_len); - // TODO: writev() should be atomic. - // This emulation here is not correct if there is an error! - __ensure(chunk > 0); - written += chunk; + if(SSIZE_MAX - bytes < iovs[i].iov_len) { + errno = EINVAL; + return -1; + } + bytes += iovs[i].iov_len; } + frg::vector buffer{getAllocator()}; + buffer.resize(bytes); + + size_t to_copy = bytes; + char *bp = buffer.data(); + for(int i = 0; i < iovc; i++) { + size_t copy = frg::min(iovs[i].iov_len, to_copy); + + bp = (char *)memcpy((void *)bp, (void *)iovs[i].iov_base, copy); + + to_copy -= copy; + if(to_copy == 0) + break; + } + + written = write(fd, buffer.data(), bytes); return written; } diff --git a/sysdeps/managarm/generic/file.cpp b/sysdeps/managarm/generic/file.cpp index 2ca7141c..fae948cb 100644 --- a/sysdeps/managarm/generic/file.cpp +++ b/sysdeps/managarm/generic/file.cpp @@ -1086,6 +1086,8 @@ int sys_msg_send(int sockfd, const struct msghdr *hdr, int flags, ssize_t *lengt if(resp.error() == managarm::fs::Errors::BROKEN_PIPE) { return EPIPE; + }else if(resp.error() == managarm::fs::Errors::NOT_CONNECTED) { + return ENOTCONN; }else{ __ensure(resp.error() == managarm::fs::Errors::SUCCESS); *length = resp.size(); diff --git a/sysdeps/managarm/generic/fork-exec.cpp b/sysdeps/managarm/generic/fork-exec.cpp index 441fd3fd..27bac0a3 100644 --- a/sysdeps/managarm/generic/fork-exec.cpp +++ b/sysdeps/managarm/generic/fork-exec.cpp @@ -453,8 +453,27 @@ pid_t sys_getpid() { } pid_t sys_getppid() { - mlibc::infoLogger() << "mlibc: Broken getppid() called" << frg::endlog; - return 1; + SignalGuard sguard; + + managarm::posix::GetPpidRequest req(getSysdepsAllocator()); + + auto [offer, send_head, recv_resp] = + exchangeMsgsSync( + getPosixLane(), + helix_ng::offer( + helix_ng::sendBragiHeadOnly(req, getSysdepsAllocator()), + helix_ng::recvInline() + ) + ); + + HEL_CHECK(offer.error()); + HEL_CHECK(send_head.error()); + HEL_CHECK(recv_resp.error()); + + managarm::posix::SvrResponse resp(getSysdepsAllocator()); + resp.ParseFromArray(recv_resp.data(), recv_resp.length()); + __ensure(resp.error() == managarm::posix::Errors::SUCCESS); + return resp.pid(); } int sys_getrusage(int scope, struct rusage *usage) {