summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorneal <neal>2008-10-08 16:07:58 +0000
committerneal <neal>2008-10-08 16:07:58 +0000
commit8ab8295384ace533b8f17260b07e74327995658e (patch)
treede8c28bc557b30c28028ef3141b54c05ae00acaf
parentdc9064e55f993d79c6ed1ca7093812eaa2fececd (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/ChangeLog5
-rw-r--r--newlib/addon/newlib/libc/sys/hurd/readr.c18
-rw-r--r--viengoos/ChangeLog7
-rw-r--r--viengoos/rm.h6
-rw-r--r--viengoos/server.c24
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;