From: Matthias Kruk Date: Sat, 15 Aug 2020 06:16:43 +0000 (+0900) Subject: libc: Add implementations of read() and write() X-Git-Url: https://git.corax.cc/?a=commitdiff_plain;h=66072db87a4e5f8e44f4ae4c7ac71c51de925e40;p=corax libc: Add implementations of read() and write() --- diff --git a/include/unistd.h b/include/unistd.h index 900600e..eb44cb9 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -12,5 +12,7 @@ extern int execeve(void*, size_t, char *const [], char *const []); extern unsigned int sleep(unsigned int); extern int pipe(int pipefd[2]); +extern ssize_t read(int, void*, size_t); +extern ssize_t write(int, const void*, size_t); #endif /* _UNISTD_H */ diff --git a/libc/unistd.c b/libc/unistd.c index f0947d0..95334f3 100644 --- a/libc/unistd.c +++ b/libc/unistd.c @@ -46,3 +46,74 @@ int pipe(int pipefd[2]) return(ret_val); } + +ssize_t read(int fd, void *buf, size_t count) +{ + struct cxmsg msg; + struct cxio_read *data; + ssize_t ret_val; + + data = (struct cxio_read*)msg.cm_data; + data->fd = fd; + data->n = count; + + msg.cm_len = sizeof(*data); + msg.cm_type = CXIO_READ; + + ret_val = cxsendrecv(PID_IO, &msg); + + if(!ret_val) { + struct cxio_response *resp; + + resp = (struct cxio_response*)msg.cm_data; + + ret_val = resp->retval; + errno = resp->error; + + if(ret_val >= 0) { + memcpy(buf, resp->extradata, resp->extralen); + ret_val = resp->extralen; + } + } else { + errno = -ret_val; + ret_val = -1; + } + + return(ret_val); +} + +ssize_t write(int fd, const void *buf, size_t count) +{ + struct cxmsg msg; + struct cxio_write *data; + ssize_t ret_val; + + data = (struct cxio_write*)msg.cm_data; + data->fd = fd; + + if(count > CXIO_EXTRADATA_MAX) { + data->datalen = CXIO_EXTRADATA_MAX; + } else { + data->datalen = count; + } + + memcpy(data->data, buf, data->datalen); + msg.cm_len = sizeof(*data) + data->datalen; + msg.cm_type = CXIO_WRITE; + + ret_val = cxsendrecv(PID_IO, &msg); + + if(!ret_val) { + struct cxio_response *resp; + + resp = (struct cxio_response*)msg.cm_data; + + ret_val = resp->retval; + errno = resp->error; + } else { + errno = -ret_val; + ret_val = -1; + } + + return(ret_val); +}