summaryrefslogtreecommitdiff
path: root/host/lib/chromeos_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/chromeos_config.c')
-rw-r--r--host/lib/chromeos_config.c108
1 files changed, 108 insertions, 0 deletions
diff --git a/host/lib/chromeos_config.c b/host/lib/chromeos_config.c
new file mode 100644
index 00000000..6307318c
--- /dev/null
+++ b/host/lib/chromeos_config.c
@@ -0,0 +1,108 @@
+/* Copyright 2020 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.
+ */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "2common.h"
+#include "2return_codes.h"
+#include "chromeos_config.h"
+#include "host_misc.h"
+
+#define CHROMEOS_CONFIG_BASE "/run/chromeos-config/v1"
+
+vb2_error_t chromeos_config_get_string(const char *path, const char *property,
+ char **val_out)
+{
+ vb2_error_t rv;
+ uint32_t size;
+ char filepath[PATH_MAX];
+
+ *val_out = NULL;
+
+ if (!path || path[0] != '/') {
+ VB2_DEBUG("Path parameter must begin with /");
+ return VB2_ERROR_INVALID_PARAMETER;
+ }
+
+ if (strstr(path, "//")) {
+ VB2_DEBUG("Path cannot contain //");
+ return VB2_ERROR_INVALID_PARAMETER;
+ }
+
+ if (strchr(property, '/')) {
+ VB2_DEBUG("Property cannot contain /");
+ return VB2_ERROR_INVALID_PARAMETER;
+ }
+
+ snprintf(filepath, sizeof(filepath), CHROMEOS_CONFIG_BASE "%s/%s", path,
+ property);
+ rv = vb2_read_file(filepath, (uint8_t **)val_out, &size);
+
+ if (rv == VB2_SUCCESS) {
+ *val_out = realloc(*val_out, size + 1);
+ (*val_out)[size] = '\0';
+ }
+
+ return rv;
+}
+
+vb2_error_t chromeos_config_get_boolean(const char *path, const char *property,
+ bool *val_out)
+{
+ char *val_string;
+ vb2_error_t rv;
+
+ *val_out = false;
+ if ((rv = chromeos_config_get_string(path, property, &val_string)) !=
+ VB2_SUCCESS)
+ return rv;
+
+ if (!strcmp(val_string, "false"))
+ goto exit;
+
+ if (!strcmp(val_string, "true")) {
+ *val_out = true;
+ goto exit;
+ }
+
+ VB2_DEBUG("Config entry is not a boolean: %s:%s", path, property);
+ rv = VB2_ERROR_INVALID_PARAMETER;
+
+ exit:
+ free(val_string);
+ return rv;
+}
+
+vb2_error_t chromeos_config_get_integer(const char *path, const char *property,
+ int *val_out)
+{
+ char *endptr;
+ char *val_string;
+ vb2_error_t rv;
+
+ *val_out = -1;
+ if ((rv = chromeos_config_get_string(path, property, &val_string)) !=
+ VB2_SUCCESS)
+ goto exit;
+
+ errno = 0;
+ *val_out = strtol(val_string, &endptr, 10);
+ if (errno || endptr) {
+ VB2_DEBUG("Config entry is not an integer: %s:%s", path,
+ property);
+ rv = VB2_ERROR_INVALID_PARAMETER;
+ goto exit;
+ }
+
+ exit:
+ free(val_string);
+ return rv;
+}