Merge pull request #129 from Dennisbonke/master

Various fixes required for Xwayland support in managarm
This commit is contained in:
Alexander van der Grinten 2020-07-19 10:20:35 +02:00 committed by GitHub
commit e99cf8d1b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 19 deletions

View file

@ -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) {

View file

@ -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;
}

View file

@ -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();

View file

@ -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) {