From 4618a6d22fda6ac6783d1989c83f697a38391b32 Mon Sep 17 00:00:00 2001 From: Andreas Hampicke Date: Sat, 25 Feb 2017 16:37:52 +0100 Subject: [PATCH] managarm: Fix close() --- libc/platform/x86_64-managarm/src/file.cpp | 54 +++++++++++++--------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/libc/platform/x86_64-managarm/src/file.cpp b/libc/platform/x86_64-managarm/src/file.cpp index 1bfaff23..68098053 100644 --- a/libc/platform/x86_64-managarm/src/file.cpp +++ b/libc/platform/x86_64-managarm/src/file.cpp @@ -395,36 +395,48 @@ HelHandle __raw_map(int fd) { } int close(int fd) { - assert(!"Fix this"); -/* managarm::posix::CntRequest request(getAllocator()); - request.set_request_type(managarm::posix::CntReqType::CLOSE); - request.set_fd(fd); + HelAction actions[3]; + globalQueue.trim(); - int64_t request_num = allocPosixRequest(); - frigg::String serialized(getAllocator()); - request.SerializeToString(&serialized); - HelError error; - posixPipe.sendStringReqSync(serialized.data(), serialized.size(), - eventHub, request_num, 0, error); - HEL_CHECK(error); + managarm::posix::CntRequest req(getAllocator()); + req.set_request_type(managarm::posix::CntReqType::CLOSE); + req.set_fd(fd); - uint8_t buffer[128]; - size_t length; - HelError response_error; - posixPipe.recvStringRespSync(buffer, 128, eventHub, request_num, 0, response_error, length); - HEL_CHECK(response_error); + frigg::String ser(getAllocator()); + req.SerializeToString(&ser); + + actions[0].type = kHelActionOffer; + actions[0].flags = kHelItemAncillary; + actions[1].type = kHelActionSendFromBuffer; + actions[1].flags = kHelItemChain; + actions[1].buffer = ser.data(); + actions[1].length = ser.size(); + actions[2].type = kHelActionRecvInline; + actions[2].flags = 0; + HEL_CHECK(helSubmitAsync(kHelThisThread, actions, 3, + globalQueue.getQueue(), 0, 0)); + + auto element = globalQueue.dequeueSingle(); + auto offer = parseSimple(element); + auto send_req = parseSimple(element); + auto recv_resp = parseInline(element); - managarm::posix::SvrResponse response(getAllocator()); - response.ParseFromArray(buffer, length); - if(response.error() == managarm::posix::Errors::NO_SUCH_FD) { + HEL_CHECK(offer->error); + HEL_CHECK(send_req->error); + HEL_CHECK(recv_resp->error); + + managarm::posix::SvrResponse resp(getAllocator()); + resp.ParseFromArray(recv_resp->data, recv_resp->length); + + if(resp.error() == managarm::posix::Errors::NO_SUCH_FD) { errno = EBADF; return -1; - }else if(response.error() == managarm::posix::Errors::SUCCESS) { + }else if(resp.error() == managarm::posix::Errors::SUCCESS) { return 0; }else{ __ensure(!"Unexpected error"); __builtin_unreachable(); - }*/ + } } int dup2(int src_fd, int dest_fd) {