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