util: add the cat function as a utility
authorRonald G. Minnich <rminnich@gmail.com>
Wed, 2 Aug 2017 21:00:26 +0000 (14:00 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 1 Sep 2017 20:34:05 +0000 (16:34 -0400)
We need it more than one place, and it's just handy
to get it right once.

Change-Id: Ifd9493ae90c4f660d10e6333f62b421b337d6ba5
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
[ checkpatch, memsize a size_t, fixed 'int cat' in util.h ]
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
user/vmm/biostables.c
user/vmm/include/vmm/util.h [new file with mode: 0644]
user/vmm/initrd.c
user/vmm/util.c [new file with mode: 0644]

index 1ed67da..2d6b481 100644 (file)
@@ -8,6 +8,7 @@
 #include <sys/fcntl.h>
 #include <sys/mman.h>
 #include <ros/arch/mmu.h>
+#include <vmm/util.h>
 #include <vmm/vmm.h>
 
 #include <vmm/acpi/acpi.h>
@@ -153,32 +154,13 @@ static void *init_madt_local_x2apic(struct virtual_machine *vm, void *start)
        return apic;
 }
 
-static int cat(char *file, void *where)
-{
-       int fd;
-       int amt, tot = 0;
-
-       fd = open(file, O_RDONLY);
-       if (fd < 0)
-               return -1;
-
-       while (amt = read(fd, where, 4096)) {
-               if (amt < 0) {
-                       close(fd);
-                       return -1;
-               }
-               tot += amt;
-               where += amt;
-       }
-       close(fd);
-       return tot;
-}
-
+/* smbios reads the smbios into the e segment. By convention the
+ * e segment includes the f segment and is 128 kbytes. */
 static int smbios(char *smbiostable, void *esegment)
 {
        int amt;
 
-       amt = cat(smbiostable, esegment);
+       amt = cat(smbiostable, esegment, 128 * 1024);
        if (amt < 0) {
                fprintf(stderr, "%s: %r\n", smbiostable);
                exit(1);
diff --git a/user/vmm/include/vmm/util.h b/user/vmm/include/vmm/util.h
new file mode 100644 (file)
index 0000000..da49a31
--- /dev/null
@@ -0,0 +1,9 @@
+/* Copyright (c) 2015 Google Inc.
+ * Ron Minnich <rminnich@google.com>
+ * See LICENSE for details.
+ *
+ * util.h */
+
+#pragma once
+
+ssize_t cat(char *file, void *where, size_t size);
index d8a7c4b..4d4140d 100644 (file)
 #include <unistd.h>
 #include <fcntl.h>
 #include <err.h>
+#include <vmm/util.h>
 
-/* initrd loads the initrd and returns its place in the world. It has
- * to avoid the already loaded kernel. */
+/* initrd loads the initrd. It is currently just a wrapper for cat,
+ * but we leave it here in case we need to do more for initrd at
+ * some point. */
 ssize_t setup_initrd(char *filename, void *membase, size_t memsize)
 {
-       int fd;
-       struct stat buf;
-       void *where = membase;
-       int amt;
-       int tot = 0;
-
        if (!filename)
                return 0;
 
-       fd = open(filename, O_RDONLY);
-       if (fd < 0) {
-               fprintf(stderr, "Can't open %s: %r\n", filename);
-               return 0;
-       }
-
-       if (fstat(fd, &buf) < 0) {
-               fprintf(stderr, "Can't stat %s: %r\n", filename);
-               close(fd);
-               return 0;
-       }
-
-       if (buf.st_size > memsize) {
-               fprintf(stderr,
-                       "file is %d bytes, but we only have %d bytes to place it\n",
-                       buf.st_size, memsize);
-               close(fd);
-               return 0;
-       }
-
-       while (tot < buf.st_size) {
-               amt = read(fd, where, buf.st_size - tot);
-               if (amt < 0) {
-                       tot = 0;
-                       break;
-               }
-               where += amt;
-               tot += amt;
-       }
-
-       close(fd);
-       return tot;
+       return cat(filename, membase, memsize);
 }
diff --git a/user/vmm/util.c b/user/vmm/util.c
new file mode 100644 (file)
index 0000000..d63936c
--- /dev/null
@@ -0,0 +1,56 @@
+/* Copyright (c) 2017 Google Inc.
+ * See LICENSE for details.
+ *
+ * Utility functions. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <vmm/util.h>
+
+ssize_t cat(char *filename, void *where, size_t memsize)
+{
+       int fd;
+       ssize_t amt, tot = 0;
+       struct stat buf;
+
+       fd = open(filename, O_RDONLY);
+       if (fd < 0) {
+               fprintf(stderr, "Can't open %s: %r\n", filename);
+               return -1;
+       }
+
+       if (fstat(fd, &buf) < 0) {
+               fprintf(stderr, "Can't stat %s: %r\n", filename);
+               close(fd);
+               return -1;
+       }
+
+       if (buf.st_size > memsize) {
+               fprintf(stderr,
+                       "file is %d bytes, but we only have %d bytes to place it\n",
+                       buf.st_size, memsize);
+               errno = ENOMEM;
+               close(fd);
+               return -1;
+       }
+
+       while (tot < buf.st_size) {
+               amt = read(fd, where, buf.st_size - tot);
+               if (amt < 0) {
+                       tot = -1;
+                       break;
+               }
+               if (amt == 0)
+                       break;
+               where += amt;
+               tot += amt;
+       }
+
+       close(fd);
+       return tot;
+}