]> git.corax.cc Git - corax/commitdiff
libc: Add implementations of read() and write()
authorMatthias Kruk <m@m10k.eu>
Sat, 15 Aug 2020 06:16:43 +0000 (15:16 +0900)
committerMatthias Kruk <m@m10k.eu>
Sat, 15 Aug 2020 06:16:43 +0000 (15:16 +0900)
include/unistd.h
libc/unistd.c

index 900600e465ff21981fe8495b00c6eee9d24e2a82..eb44cb9985c8376ab336ff53f10d212a8387dd00 100644 (file)
@@ -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 */
index f0947d0aa2731c33510e6670770e2298c2347782..95334f30b2f8420a19ac801b6d3cfbb78d362e83 100644 (file)
@@ -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);
+}