Add a readnum() variant for hex
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jun 2016 20:59:12 +0000 (16:59 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jun 2016 21:04:18 +0000 (17:04 -0400)
Yet another read.* helper for read() on various devices.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/ns.h
kern/src/ns/util.c

index 126f335..d36fdc7 100644 (file)
@@ -854,6 +854,8 @@ 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 readnum_hex(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);
 unsigned long strtoul_from_ubuf(void *ubuf, size_t count, int base);
index 633d752..333e95e 100644 (file)
@@ -20,18 +20,30 @@ int readmem(unsigned long offset, char *buf, unsigned long 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)
+static int __readnum(unsigned long off, char *buf, unsigned long n,
+                     unsigned long val, size_t size, const char *fmt)
 {
        char tmp[64];
        size = MIN(sizeof(tmp), size);
        /* we really need the %* format. */
-       size = snprintf(tmp, size, "%lu", val);
+       size = snprintf(tmp, size, fmt, 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 readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
+            size_t size)
+{
+       return __readnum(off, buf, n, val, size, "%lu");
+}
+
+int readnum_hex(unsigned long off, char *buf, unsigned long n,
+                unsigned long val, size_t size)
+{
+       return __readnum(off, buf, n, val, size, "0x%lx");
+}
+
 int readstr(unsigned long offset, char *buf, unsigned long n, char *str)
 {
        /* always include the \0 */
@@ -48,7 +60,8 @@ unsigned long strtoul_from_ubuf(void *ubuf, size_t count, int base)
        if (count > sizeof(num64)) {
                set_errno(EINVAL);
                error(EFAIL, "attempted to write %d chars, max %d", count,
-                         sizeof(num64)); }
+                         sizeof(num64));
+       }
        memcpy(num64, ubuf, count);
        num64[count] = 0;       /* enforce trailing 0 */
        return strtoul(num64, 0, base);