Merge pull request #129 from Dennisbonke/master
Various fixes required for Xwayland support in managarm
This commit is contained in:
commit
e99cf8d1b2
|
@ -7,22 +7,19 @@
|
|||
#include <mlibc/sysdeps.hpp>
|
||||
|
||||
__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) {
|
||||
|
|
|
@ -1,7 +1,14 @@
|
|||
|
||||
#include <sys/uio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <frg/vector.hpp>
|
||||
#include <mlibc/allocator.hpp>
|
||||
#include <mlibc/debug.hpp>
|
||||
#include <bits/ensure.h>
|
||||
|
||||
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<char, MemoryAllocator> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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<MemoryAllocator> 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<MemoryAllocator> 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) {
|
||||
|
|
Loading…
Reference in a new issue