Lindent pass
[akaros.git] / kern / src / ns / util.c
1 /* misc utilities for plan9 */
2
3 #include <ns.h>
4 #include <string.h>
5
6 /* Copies n bytes from mem + offset into buf, similar to a read() call. */
7 int readmem(unsigned long offset, char *buf, unsigned long n,
8                         void *mem, size_t mem_len)
9 {
10         if (offset >= mem_len)
11                 return 0;
12         if (offset + n > mem_len)
13                 n = mem_len - offset;
14         memmove(buf, mem + offset, n);
15         return n;
16 }
17
18 /* Read a num/string to user mode, accounting for offset.  Not a huge fan of the
19  * 'size' parameter (the old plan9 users just picked NUMSIZE (12), though they
20  * seem to want to limit it).  */
21 int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
22                         size_t size)
23 {
24         char tmp[64];
25         size = MIN(sizeof(tmp), size);
26         /* we really need the %* format. */
27         size = snprintf(tmp, size, "%lu", val);
28         /* size is now strlen, so the rest of this is just like readstr. */
29         /* always include the \0 */
30         return readmem(off, buf, n, tmp, size + 1);
31 }
32
33 int readstr(unsigned long offset, char *buf, unsigned long n, char *str)
34 {
35         /* always include the \0 */
36         return readmem(offset, buf, n, str, strlen(str) + 1);
37 }