summaryrefslogtreecommitdiff
path: root/host
diff options
context:
space:
mode:
authorRandall Spangler <rspangler@chromium.org>2014-11-19 12:48:36 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-11-27 05:22:32 +0000
commit02e11b323b819140590d99b6af440d36c12d161b (patch)
tree005edf6e64093741553e8520028ef0ad26a978b8 /host
parent8577b5360ca4c9514d9091ed9aded2bb3193f1f0 (diff)
downloadvboot-02e11b323b819140590d99b6af440d36c12d161b.tar.gz
vboot2: Add host library functions to read/write files and objects
And unit tests for them. Move roundup32() into hostlib. Fix WriteFile() returning success even if it failed to write to the file. BUG=chromium:423882 BRANCH=none TEST=VBOOT2=1 make runtests Change-Id: I8a115335c088dc5c66c88423d1ccbda7eaca1996 Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/230844
Diffstat (limited to 'host')
-rw-r--r--host/lib/host_misc.c1
-rw-r--r--host/lib/host_misc2.c84
-rw-r--r--host/lib/include/host_misc.h41
3 files changed, 126 insertions, 0 deletions
diff --git a/host/lib/host_misc.c b/host/lib/host_misc.c
index adc39420..3fb9b24e 100644
--- a/host/lib/host_misc.c
+++ b/host/lib/host_misc.c
@@ -108,6 +108,7 @@ int WriteFile(const char* filename, const void *data, uint64_t size) {
VBDEBUG(("Unable to write to file %s\n", filename));
fclose(f);
unlink(filename); /* Delete any partial file */
+ return 1;
}
fclose(f);
diff --git a/host/lib/host_misc2.c b/host/lib/host_misc2.c
new file mode 100644
index 00000000..88b58f5b
--- /dev/null
+++ b/host/lib/host_misc2.c
@@ -0,0 +1,84 @@
+/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ *
+ * Host functions for verified boot.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+
+#include "2sysincludes.h"
+#include "2common.h"
+#include "host_common.h"
+
+int vb2_read_file(const char *filename, uint8_t **data_ptr, uint32_t *size_ptr)
+{
+ FILE *f;
+ uint8_t *buf;
+ long size;
+
+ *data_ptr = NULL;
+ *size_ptr = 0;
+
+ f = fopen(filename, "rb");
+ if (!f) {
+ VB2_DEBUG("Unable to open file %s\n", filename);
+ return VB2_ERROR_READ_FILE_OPEN;
+ }
+
+ fseek(f, 0, SEEK_END);
+ size = ftell(f);
+ rewind(f);
+
+ if (size < 0 || size > UINT32_MAX) {
+ fclose(f);
+ return VB2_ERROR_READ_FILE_SIZE;
+ }
+
+ buf = malloc(size);
+ if (!buf) {
+ fclose(f);
+ return VB2_ERROR_READ_FILE_ALLOC;
+ }
+
+ if(1 != fread(buf, size, 1, f)) {
+ VB2_DEBUG("Unable to read file %s\n", filename);
+ fclose(f);
+ free(buf);
+ return VB2_ERROR_READ_FILE_DATA;
+ }
+
+ fclose(f);
+
+ *data_ptr = buf;
+ *size_ptr = size;
+ return VB2_SUCCESS;
+}
+
+int vb2_write_file(const char *filename, const void *buf, uint32_t size)
+{
+ FILE *f = fopen(filename, "wb");
+
+ if (!f) {
+ VB2_DEBUG("Unable to open file %s\n", filename);
+ return VB2_ERROR_WRITE_FILE_OPEN;
+ }
+
+ if (1 != fwrite(buf, size, 1, f)) {
+ VB2_DEBUG("Unable to write to file %s\n", filename);
+ fclose(f);
+ unlink(filename); /* Delete any partial file */
+ return VB2_ERROR_WRITE_FILE_DATA;
+ }
+
+ fclose(f);
+ return VB2_SUCCESS;
+}
+
+int vb2_write_object(const char *filename, const void *buf)
+{
+ const struct vb2_struct_common *cptr = buf;
+
+ return vb2_write_file(filename, buf, cptr->total_size);
+}
diff --git a/host/lib/include/host_misc.h b/host/lib/include/host_misc.h
index b2b4fb94..2e18d90b 100644
--- a/host/lib/include/host_misc.h
+++ b/host/lib/include/host_misc.h
@@ -43,4 +43,45 @@ int ReadFileBit(const char* filename, int bitmask);
* Returns 0 if success, 1 if error. */
int WriteFile(const char* filename, const void *data, uint64_t size);
+/**
+ * Read data from a file into a newly allocated buffer.
+ *
+ * @param filename Name of file to read from
+ * @param data_ptr On exit, pointer to newly allocated buffer with data
+ * will be stored here. Caller must free() the buffer
+ * when done with it.
+ * @param size_ptr On exit, size of data will be stored here.
+ * @return VB2_SUCCESS, or non-zero if error.
+ */
+int vb2_read_file(const char *filename, uint8_t **data_ptr, uint32_t *size_ptr);
+
+/**
+ * Write data to a file from a buffer.
+ *
+ * @param filename Name of file to write to
+ * @param buf Buffer to write
+ * @param size Number of bytes of data to write
+ * @return VB2_SUCCESS, or non-zero if error.
+ */
+int vb2_write_file(const char *filename, const void *buf, uint32_t size);
+
+/**
+ * Write a buffer which starts with a standard vb2_struct_common header.
+ *
+ * Determines the buffer size from the common header total size field.
+ *
+ * @param filename Name of file to write to
+ * @param buf Buffer to write
+ * @return VB2_SUCCESS, or non-zero if error.
+ */
+int vb2_write_object(const char *filename, const void *buf);
+
+/**
+ * Round up a size to a multiple of 32 bits (4 bytes).
+ */
+static __inline const uint32_t roundup32(uint32_t v)
+{
+ return (v + 3) & ~3;
+}
+
#endif /* VBOOT_REFERENCE_HOST_MISC_H_ */