blob: 6307318c29b2d38fd7d7bd177d1b22290837bf0c [file] [log] [blame]
/* 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;
}