readmem / readstr / readnum
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jan 2014 17:33:06 +0000 (09:33 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 17 Jan 2014 17:33:06 +0000 (09:33 -0800)
These are the ones we rewrote for 9ns.

Feel free to move them to another file.  Needed a dumping ground for
things needed for inferno but not part of their codebase.

kern/include/ns.h
kern/src/ns/Kbuild
kern/src/ns/util.c [new file with mode: 0644]

index 051735a..12d5395 100644 (file)
@@ -816,9 +816,12 @@ int                qwrite(struct queue*, void*, int);
 void           randominit(void);
 uint32_t       randomread(void*, uint32_t);
 void*  realloc(void*, uint32_t);
-int            readnum(uint32_t, char *unused_char_p_t, uint32_t, uint32_t, int);
+int readmem(unsigned long offset, char *buf, unsigned long n,
+            void *mem, size_t mem_len);
+int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
+            size_t size);
+int readstr(unsigned long offset, char *buf, unsigned long n, char *str);
 int            readnum_int64_t(uint32_t, char *unused_char_p_t, uint32_t, int64_t, int);
-int            readstr(uint32_t, char *unused_char_p_t, uint32_t, char*);
 void           ready(struct proc*);
 void           renameproguser( char *unused_char_p_t, char*);
 void           renameuser( char *unused_char_p_t, char*);
index cb7098c..fa51f86 100644 (file)
@@ -1,3 +1,4 @@
 obj-y                                          += chan.o
 obj-y                                          += error.o
 obj-y                                          += qio.o
+obj-y                                          += util.o
diff --git a/kern/src/ns/util.c b/kern/src/ns/util.c
new file mode 100644 (file)
index 0000000..9364f98
--- /dev/null
@@ -0,0 +1,37 @@
+/* misc utilities for plan9 */
+
+#include <ns.h>
+#include <string.h>
+
+/* Copies n bytes from mem + offset into buf, similar to a read() call. */
+int readmem(unsigned long offset, char *buf, unsigned long n,
+            void *mem, size_t mem_len)
+{
+       if (offset >= mem_len)
+               return 0;
+       if (offset + n > mem_len)
+               n = mem_len - offset;
+       memmove(buf, mem + offset, n);
+       return n;
+}
+
+/* Read a num/string to user mode, accounting for offset.  Not a huge fan of the
+ * 'size' parameter (the old plan9 users just picked NUMSIZE (12), though they
+ * seem to want to limit it).  */
+int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
+            size_t size)
+{
+       char tmp[64];
+       size = MIN(sizeof(tmp), size);
+       /* we really need the %* format. */
+       size = snprintf(tmp, size, "%lu", val);
+       /* size is now strlen, so the rest of this is just like readstr. */
+       /* always include the \0 */
+       return readmem(off, buf, n, tmp, size + 1);
+}
+
+int readstr(unsigned long offset, char *buf, unsigned long n, char *str)
+{
+       /* always include the \0 */
+       return readmem(offset, buf, n, str, strlen(str) + 1);
+}