util: add the cat function as a utility
[akaros.git] / user / vmm / util.c
1 /* Copyright (c) 2017 Google Inc.
2  * See LICENSE for details.
3  *
4  * Utility functions. */
5
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <errno.h>
10 #include <sys/fcntl.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <vmm/util.h>
14
15 ssize_t cat(char *filename, void *where, size_t memsize)
16 {
17         int fd;
18         ssize_t amt, tot = 0;
19         struct stat buf;
20
21         fd = open(filename, O_RDONLY);
22         if (fd < 0) {
23                 fprintf(stderr, "Can't open %s: %r\n", filename);
24                 return -1;
25         }
26
27         if (fstat(fd, &buf) < 0) {
28                 fprintf(stderr, "Can't stat %s: %r\n", filename);
29                 close(fd);
30                 return -1;
31         }
32
33         if (buf.st_size > memsize) {
34                 fprintf(stderr,
35                         "file is %d bytes, but we only have %d bytes to place it\n",
36                         buf.st_size, memsize);
37                 errno = ENOMEM;
38                 close(fd);
39                 return -1;
40         }
41
42         while (tot < buf.st_size) {
43                 amt = read(fd, where, buf.st_size - tot);
44                 if (amt < 0) {
45                         tot = -1;
46                         break;
47                 }
48                 if (amt == 0)
49                         break;
50                 where += amt;
51                 tot += amt;
52         }
53
54         close(fd);
55         return tot;
56 }