Implement read()

This commit is contained in:
avdgrinten 2015-12-14 20:53:20 +01:00
parent 74faa94805
commit 67309eccad
3 changed files with 37 additions and 6 deletions

View file

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

View file

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

View file

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