diff options
Diffstat (limited to 'host/lib/chromeos_config.c')
-rw-r--r-- | host/lib/chromeos_config.c | 108 |
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; +} |