Implement read()
This commit is contained in:
parent
74faa94805
commit
67309eccad
|
@ -102,7 +102,7 @@ int pause(void);
|
|||
int pipe(int [2]);
|
||||
ssize_t pread(int, void *, size_t, off_t);
|
||||
ssize_t pwrite(int, const void *, size_t, off_t);
|
||||
ssize_t read(int, void *, size_t);
|
||||
ssize_t read(int fd, void *buffer, size_t size);
|
||||
ssize_t readlink(const char *__restrict, char *__restrict, size_t);
|
||||
ssize_t readlinkat(int, const char *__restrict, char *__restrict, size_t);
|
||||
int rmdir(const char *);
|
||||
|
|
|
@ -185,10 +185,7 @@ ssize_t pwrite(int, const void *, size_t, off_t) {
|
|||
__ensure(!"Not implemented");
|
||||
__builtin_unreachable();
|
||||
}
|
||||
ssize_t read(int, void *, size_t) {
|
||||
__ensure(!"Not implemented");
|
||||
__builtin_unreachable();
|
||||
}
|
||||
// read is provided by the platform
|
||||
ssize_t readlink(const char *__restrict, char *__restrict, size_t) {
|
||||
__ensure(!"Not implemented");
|
||||
__builtin_unreachable();
|
||||
|
|
|
@ -62,6 +62,39 @@ int open(const char *path, int flags, ...) {
|
|||
}
|
||||
}
|
||||
|
||||
ssize_t read(int fd, void *buffer, size_t size){
|
||||
managarm::posix::ClientRequest<MemoryAllocator> request(*memoryAllocator);
|
||||
request.set_request_type(managarm::posix::ClientRequestType::READ);
|
||||
request.set_fd(fd);
|
||||
request.set_size(size);
|
||||
|
||||
int64_t request_num = allocPosixRequest();
|
||||
frigg::String<MemoryAllocator> serialized(*memoryAllocator);
|
||||
request.SerializeToString(&serialized);
|
||||
posixPipe->sendStringReq(serialized.data(), serialized.size(),
|
||||
request_num, 0);
|
||||
|
||||
uint8_t msg_buffer[128];
|
||||
size_t length;
|
||||
HelError response_error;
|
||||
posixPipe->recvStringRespSync(msg_buffer, 128, *eventHub,
|
||||
request_num, 0, response_error, length);
|
||||
HEL_CHECK(response_error);
|
||||
|
||||
managarm::posix::ServerResponse<MemoryAllocator> response(*memoryAllocator);
|
||||
response.ParseFromArray(msg_buffer, length);
|
||||
if(response.error() == managarm::posix::Errors::NO_SUCH_FD) {
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}else if(response.error() == managarm::posix::Errors::SUCCESS) {
|
||||
memcpy(buffer, response.buffer().data(), response.buffer().size());
|
||||
return response.buffer().size();
|
||||
}else{
|
||||
__ensure(!"Unexpected error in write()!");
|
||||
__builtin_unreachable();
|
||||
}
|
||||
};
|
||||
|
||||
ssize_t write(int fd, const void *buffer, size_t size) {
|
||||
managarm::posix::ClientRequest<MemoryAllocator> request(*memoryAllocator);
|
||||
request.set_request_type(managarm::posix::ClientRequestType::WRITE);
|
||||
|
@ -78,7 +111,8 @@ ssize_t write(int fd, const void *buffer, size_t size) {
|
|||
uint8_t msg_buffer[128];
|
||||
size_t length;
|
||||
HelError response_error;
|
||||
posixPipe->recvStringRespSync(msg_buffer, 128, *eventHub, request_num, 0, response_error, length);
|
||||
posixPipe->recvStringRespSync(msg_buffer, 128, *eventHub,
|
||||
request_num, 0, response_error, length);
|
||||
HEL_CHECK(response_error);
|
||||
|
||||
managarm::posix::ServerResponse<MemoryAllocator> response(*memoryAllocator);
|
||||
|
|
Loading…
Reference in a new issue