1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2020 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker */
5*8617a60dSAndroid Build Coastguard Worker
6*8617a60dSAndroid Build Coastguard Worker #include <errno.h>
7*8617a60dSAndroid Build Coastguard Worker #include <limits.h>
8*8617a60dSAndroid Build Coastguard Worker #include <stdbool.h>
9*8617a60dSAndroid Build Coastguard Worker #include <stdint.h>
10*8617a60dSAndroid Build Coastguard Worker #include <stdio.h>
11*8617a60dSAndroid Build Coastguard Worker #include <stdlib.h>
12*8617a60dSAndroid Build Coastguard Worker #include <string.h>
13*8617a60dSAndroid Build Coastguard Worker
14*8617a60dSAndroid Build Coastguard Worker #include "2common.h"
15*8617a60dSAndroid Build Coastguard Worker #include "2return_codes.h"
16*8617a60dSAndroid Build Coastguard Worker #include "chromeos_config.h"
17*8617a60dSAndroid Build Coastguard Worker #include "host_misc.h"
18*8617a60dSAndroid Build Coastguard Worker
19*8617a60dSAndroid Build Coastguard Worker #define CHROMEOS_CONFIG_BASE "/run/chromeos-config/v1"
20*8617a60dSAndroid Build Coastguard Worker
chromeos_config_get_string(const char * path,const char * property,char ** val_out)21*8617a60dSAndroid Build Coastguard Worker vb2_error_t chromeos_config_get_string(const char *path, const char *property,
22*8617a60dSAndroid Build Coastguard Worker char **val_out)
23*8617a60dSAndroid Build Coastguard Worker {
24*8617a60dSAndroid Build Coastguard Worker vb2_error_t rv;
25*8617a60dSAndroid Build Coastguard Worker uint32_t size;
26*8617a60dSAndroid Build Coastguard Worker char filepath[PATH_MAX];
27*8617a60dSAndroid Build Coastguard Worker
28*8617a60dSAndroid Build Coastguard Worker *val_out = NULL;
29*8617a60dSAndroid Build Coastguard Worker
30*8617a60dSAndroid Build Coastguard Worker if (!path || path[0] != '/') {
31*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG("Path parameter must begin with /");
32*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_INVALID_PARAMETER;
33*8617a60dSAndroid Build Coastguard Worker }
34*8617a60dSAndroid Build Coastguard Worker
35*8617a60dSAndroid Build Coastguard Worker if (strstr(path, "//")) {
36*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG("Path cannot contain //");
37*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_INVALID_PARAMETER;
38*8617a60dSAndroid Build Coastguard Worker }
39*8617a60dSAndroid Build Coastguard Worker
40*8617a60dSAndroid Build Coastguard Worker if (strchr(property, '/')) {
41*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG("Property cannot contain /");
42*8617a60dSAndroid Build Coastguard Worker return VB2_ERROR_INVALID_PARAMETER;
43*8617a60dSAndroid Build Coastguard Worker }
44*8617a60dSAndroid Build Coastguard Worker
45*8617a60dSAndroid Build Coastguard Worker snprintf(filepath, sizeof(filepath), CHROMEOS_CONFIG_BASE "%s/%s", path,
46*8617a60dSAndroid Build Coastguard Worker property);
47*8617a60dSAndroid Build Coastguard Worker rv = vb2_read_file(filepath, (uint8_t **)val_out, &size);
48*8617a60dSAndroid Build Coastguard Worker
49*8617a60dSAndroid Build Coastguard Worker if (rv == VB2_SUCCESS) {
50*8617a60dSAndroid Build Coastguard Worker *val_out = realloc(*val_out, size + 1);
51*8617a60dSAndroid Build Coastguard Worker (*val_out)[size] = '\0';
52*8617a60dSAndroid Build Coastguard Worker }
53*8617a60dSAndroid Build Coastguard Worker
54*8617a60dSAndroid Build Coastguard Worker return rv;
55*8617a60dSAndroid Build Coastguard Worker }
56*8617a60dSAndroid Build Coastguard Worker
chromeos_config_get_boolean(const char * path,const char * property,bool * val_out)57*8617a60dSAndroid Build Coastguard Worker vb2_error_t chromeos_config_get_boolean(const char *path, const char *property,
58*8617a60dSAndroid Build Coastguard Worker bool *val_out)
59*8617a60dSAndroid Build Coastguard Worker {
60*8617a60dSAndroid Build Coastguard Worker char *val_string;
61*8617a60dSAndroid Build Coastguard Worker vb2_error_t rv;
62*8617a60dSAndroid Build Coastguard Worker
63*8617a60dSAndroid Build Coastguard Worker *val_out = false;
64*8617a60dSAndroid Build Coastguard Worker if ((rv = chromeos_config_get_string(path, property, &val_string)) !=
65*8617a60dSAndroid Build Coastguard Worker VB2_SUCCESS)
66*8617a60dSAndroid Build Coastguard Worker return rv;
67*8617a60dSAndroid Build Coastguard Worker
68*8617a60dSAndroid Build Coastguard Worker if (!strcmp(val_string, "false"))
69*8617a60dSAndroid Build Coastguard Worker goto exit;
70*8617a60dSAndroid Build Coastguard Worker
71*8617a60dSAndroid Build Coastguard Worker if (!strcmp(val_string, "true")) {
72*8617a60dSAndroid Build Coastguard Worker *val_out = true;
73*8617a60dSAndroid Build Coastguard Worker goto exit;
74*8617a60dSAndroid Build Coastguard Worker }
75*8617a60dSAndroid Build Coastguard Worker
76*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG("Config entry is not a boolean: %s:%s", path, property);
77*8617a60dSAndroid Build Coastguard Worker rv = VB2_ERROR_INVALID_PARAMETER;
78*8617a60dSAndroid Build Coastguard Worker
79*8617a60dSAndroid Build Coastguard Worker exit:
80*8617a60dSAndroid Build Coastguard Worker free(val_string);
81*8617a60dSAndroid Build Coastguard Worker return rv;
82*8617a60dSAndroid Build Coastguard Worker }
83*8617a60dSAndroid Build Coastguard Worker
chromeos_config_get_integer(const char * path,const char * property,int * val_out)84*8617a60dSAndroid Build Coastguard Worker vb2_error_t chromeos_config_get_integer(const char *path, const char *property,
85*8617a60dSAndroid Build Coastguard Worker int *val_out)
86*8617a60dSAndroid Build Coastguard Worker {
87*8617a60dSAndroid Build Coastguard Worker char *endptr;
88*8617a60dSAndroid Build Coastguard Worker char *val_string;
89*8617a60dSAndroid Build Coastguard Worker vb2_error_t rv;
90*8617a60dSAndroid Build Coastguard Worker
91*8617a60dSAndroid Build Coastguard Worker *val_out = -1;
92*8617a60dSAndroid Build Coastguard Worker if ((rv = chromeos_config_get_string(path, property, &val_string)) !=
93*8617a60dSAndroid Build Coastguard Worker VB2_SUCCESS)
94*8617a60dSAndroid Build Coastguard Worker goto exit;
95*8617a60dSAndroid Build Coastguard Worker
96*8617a60dSAndroid Build Coastguard Worker errno = 0;
97*8617a60dSAndroid Build Coastguard Worker *val_out = strtol(val_string, &endptr, 10);
98*8617a60dSAndroid Build Coastguard Worker if (errno || endptr) {
99*8617a60dSAndroid Build Coastguard Worker VB2_DEBUG("Config entry is not an integer: %s:%s", path,
100*8617a60dSAndroid Build Coastguard Worker property);
101*8617a60dSAndroid Build Coastguard Worker rv = VB2_ERROR_INVALID_PARAMETER;
102*8617a60dSAndroid Build Coastguard Worker goto exit;
103*8617a60dSAndroid Build Coastguard Worker }
104*8617a60dSAndroid Build Coastguard Worker
105*8617a60dSAndroid Build Coastguard Worker exit:
106*8617a60dSAndroid Build Coastguard Worker free(val_string);
107*8617a60dSAndroid Build Coastguard Worker return rv;
108*8617a60dSAndroid Build Coastguard Worker }
109