diff options
author | neal <neal> | 2008-10-08 16:07:58 +0000 |
---|---|---|
committer | neal <neal> | 2008-10-08 16:07:58 +0000 |
commit | 8ab8295384ace533b8f17260b07e74327995658e (patch) | |
tree | de8c28bc557b30c28028ef3141b54c05ae00acaf | |
parent | dc9064e55f993d79c6ed1ca7093812eaa2fececd (diff) |
viengoos/origin
2008-10-08 Neal H. Walfield <neal@gnu.org>
* rm.h (enum rm_method_id): Add RM_read.
(rm_method_id_string): Handle it.
(read): New RPC.
* server.c (server_loop): Implement the read RPC.
newlib/
2008-10-08 Neal H. Walfield <neal@gnu.org>
* addon/newlib/libc/sys/hurd/readr.c: Include <hurd/rm.h>.
(read): Implement.
-rw-r--r-- | newlib/ChangeLog | 5 | ||||
-rw-r--r-- | newlib/addon/newlib/libc/sys/hurd/readr.c | 18 | ||||
-rw-r--r-- | viengoos/ChangeLog | 7 | ||||
-rw-r--r-- | viengoos/rm.h | 6 | ||||
-rw-r--r-- | viengoos/server.c | 24 |
5 files changed, 57 insertions, 3 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 9d2c310..b1a8624 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2008-10-08 Neal H. Walfield <neal@gnu.org> + + * addon/newlib/libc/sys/hurd/readr.c: Include <hurd/rm.h>. + (read): Implement. + 2008-06-27 Neal H. Walfield <neal@gnu.org> * Makefile.am (noinst_LIBRARIES): Remove variable. diff --git a/newlib/addon/newlib/libc/sys/hurd/readr.c b/newlib/addon/newlib/libc/sys/hurd/readr.c index bc1d6a0..1177a41 100644 --- a/newlib/addon/newlib/libc/sys/hurd/readr.c +++ b/newlib/addon/newlib/libc/sys/hurd/readr.c @@ -4,11 +4,25 @@ #include <unistd.h> #include <errno.h> +#include <hurd/rm.h> + _ssize_t read (int fd, void *buf, size_t cnt) { - errno = EOPNOTSUPP; - return -1; + if (fd != 0) + { + errno = EBADF; + return -1; + } + + if (cnt == 0) + return 0; + + struct io_buffer buffer; + rm_read (cnt, &buffer); + + memcpy (buf, buffer.data, buffer.len); + return buffer.len; } _ssize_t diff --git a/viengoos/ChangeLog b/viengoos/ChangeLog index e3b88a7..a3f14ea 100644 --- a/viengoos/ChangeLog +++ b/viengoos/ChangeLog @@ -1,3 +1,10 @@ +2008-10-08 Neal H. Walfield <neal@gnu.org> + + * rm.h (enum rm_method_id): Add RM_read. + (rm_method_id_string): Handle it. + (read): New RPC. + * server.c (server_loop): Implement the read RPC. + 2008-08-15 Neal H. Walfield <neal@gnu.org> * server.c (server_loop): In the implementation of cap_read, if diff --git a/viengoos/rm.h b/viengoos/rm.h index 04e2a06..366e759 100644 --- a/viengoos/rm.h +++ b/viengoos/rm.h @@ -31,6 +31,7 @@ enum rm_method_id { RM_write = 100, + RM_read, RM_as_dump, }; @@ -41,6 +42,8 @@ rm_method_id_string (int id) { case RM_write: return "write"; + case RM_read: + return "read"; case RM_as_dump: return "as_dump"; case RM_folio_alloc: @@ -107,6 +110,9 @@ struct io_buffer /* Echo the character CHR on the manager console. */ RPC_SIMPLE(write, 1, 0, struct io_buffer, io) +/* Read up to MAX characters from the console's input device. */ +RPC(read, 1, 1, int, max, struct io_buffer, io) + /* Dump the address space rooted at ROOT. */ RPC(as_dump, 2, 0, addr_t, principal, addr_t, root) diff --git a/viengoos/server.c b/viengoos/server.c index 3b72606..81f5411 100644 --- a/viengoos/server.c +++ b/viengoos/server.c @@ -307,7 +307,7 @@ server_loop (void) if (raise_fault) { - DEBUG (4, "fault (ip: %x; fault: %x.%c%s)!", + DEBUG (4, "Reflecting fault (ip: %x; fault: %x.%c%s)!", ip, fault, w ? 'w' : 'r', discarded ? " discarded" : ""); l4_word_t c = _L4_XCHG_REGS_DELIVER; @@ -527,6 +527,28 @@ server_loop (void) do_reply = 0; continue; } + else if (label == RM_read) + { + int max; + err = rm_read_send_unmarshal (&msg, &max); + if (err) + { + debug (0, "Read error!"); + REPLY (EINVAL); + } + + struct io_buffer buffer; + buffer.len = 0; + + if (max > 0) + { + buffer.len = 1; + buffer.data[0] = getchar (); + } + + rm_read_reply_marshal (&msg, buffer); + continue; + } do_reply = 1; |