blob: d96d908bb9df6fddb22e4dbecfa07882049bdf78 [file] [log] [blame]
Elijah Newrena64acf72023-03-21 06:26:02 +00001#include "git-compat-util.h"
Jeff Hostetleree4512e2019-02-22 14:25:01 -08002#include "config.h"
Elijah Newrena64acf72023-03-21 06:26:02 +00003#include "strbuf.h"
4#include "trace2.h"
Jeff Hostetlerbce9db62019-04-15 13:39:47 -07005#include "trace2/tr2_cfg.h"
6#include "trace2/tr2_sysenv.h"
Elijah Newrendd77d582023-05-16 06:34:03 +00007#include "wildmatch.h"
Jeff Hostetleree4512e2019-02-22 14:25:01 -08008
9static struct strbuf **tr2_cfg_patterns;
10static int tr2_cfg_count_patterns;
11static int tr2_cfg_loaded;
12
Josh Steadmon3d3adaa2020-03-20 14:06:15 -070013static struct strbuf **tr2_cfg_env_vars;
14static int tr2_cfg_env_vars_count;
15static int tr2_cfg_env_vars_loaded;
16
Jeff Hostetleree4512e2019-02-22 14:25:01 -080017/*
18 * Parse a string containing a comma-delimited list of config keys
19 * or wildcard patterns into a list of strbufs.
20 */
21static int tr2_cfg_load_patterns(void)
22{
23 struct strbuf **s;
24 const char *envvar;
25
26 if (tr2_cfg_loaded)
27 return tr2_cfg_count_patterns;
28 tr2_cfg_loaded = 1;
29
Jeff Hostetlerbce9db62019-04-15 13:39:47 -070030 envvar = tr2_sysenv_get(TR2_SYSENV_CFG_PARAM);
Jeff Hostetleree4512e2019-02-22 14:25:01 -080031 if (!envvar || !*envvar)
32 return tr2_cfg_count_patterns;
33
34 tr2_cfg_patterns = strbuf_split_buf(envvar, strlen(envvar), ',', -1);
35 for (s = tr2_cfg_patterns; *s; s++) {
36 struct strbuf *buf = *s;
37
38 if (buf->len && buf->buf[buf->len - 1] == ',')
39 strbuf_setlen(buf, buf->len - 1);
40 strbuf_trim_trailing_newline(*s);
41 strbuf_trim(*s);
42 }
43
44 tr2_cfg_count_patterns = s - tr2_cfg_patterns;
45 return tr2_cfg_count_patterns;
46}
47
48void tr2_cfg_free_patterns(void)
49{
50 if (tr2_cfg_patterns)
51 strbuf_list_free(tr2_cfg_patterns);
52 tr2_cfg_count_patterns = 0;
53 tr2_cfg_loaded = 0;
54}
55
Josh Steadmon3d3adaa2020-03-20 14:06:15 -070056/*
57 * Parse a string containing a comma-delimited list of environment variable
58 * names into a list of strbufs.
59 */
60static int tr2_load_env_vars(void)
61{
62 struct strbuf **s;
63 const char *varlist;
64
65 if (tr2_cfg_env_vars_loaded)
66 return tr2_cfg_env_vars_count;
67 tr2_cfg_env_vars_loaded = 1;
68
69 varlist = tr2_sysenv_get(TR2_SYSENV_ENV_VARS);
70 if (!varlist || !*varlist)
71 return tr2_cfg_env_vars_count;
72
73 tr2_cfg_env_vars = strbuf_split_buf(varlist, strlen(varlist), ',', -1);
74 for (s = tr2_cfg_env_vars; *s; s++) {
75 struct strbuf *buf = *s;
76
77 if (buf->len && buf->buf[buf->len - 1] == ',')
78 strbuf_setlen(buf, buf->len - 1);
79 strbuf_trim_trailing_newline(*s);
80 strbuf_trim(*s);
81 }
82
83 tr2_cfg_env_vars_count = s - tr2_cfg_env_vars;
84 return tr2_cfg_env_vars_count;
85}
86
87void tr2_cfg_free_env_vars(void)
88{
89 if (tr2_cfg_env_vars)
90 strbuf_list_free(tr2_cfg_env_vars);
91 tr2_cfg_env_vars_count = 0;
92 tr2_cfg_env_vars_loaded = 0;
93}
94
Jeff Hostetleree4512e2019-02-22 14:25:01 -080095struct tr2_cfg_data {
96 const char *file;
97 int line;
98};
99
100/*
101 * See if the given config key matches any of our patterns of interest.
102 */
Glen Chooa4e7e312023-06-28 19:26:22 +0000103static int tr2_cfg_cb(const char *key, const char *value,
Glen Choodc902082023-06-28 19:26:26 +0000104 const struct config_context *ctx, void *d)
Jeff Hostetleree4512e2019-02-22 14:25:01 -0800105{
106 struct strbuf **s;
107 struct tr2_cfg_data *data = (struct tr2_cfg_data *)d;
108
109 for (s = tr2_cfg_patterns; *s; s++) {
110 struct strbuf *buf = *s;
111 int wm = wildmatch(buf->buf, key, WM_CASEFOLD);
112 if (wm == WM_MATCH) {
Glen Choodc902082023-06-28 19:26:26 +0000113 trace2_def_param_fl(data->file, data->line, key, value,
114 ctx->kvi);
Jeff Hostetleree4512e2019-02-22 14:25:01 -0800115 return 0;
116 }
117 }
118
119 return 0;
120}
121
122void tr2_cfg_list_config_fl(const char *file, int line)
123{
124 struct tr2_cfg_data data = { file, line };
125
126 if (tr2_cfg_load_patterns() > 0)
127 read_early_config(tr2_cfg_cb, &data);
128}
129
Josh Steadmon3d3adaa2020-03-20 14:06:15 -0700130void tr2_list_env_vars_fl(const char *file, int line)
131{
Glen Choodc902082023-06-28 19:26:26 +0000132 struct key_value_info kvi = KVI_INIT;
Josh Steadmon3d3adaa2020-03-20 14:06:15 -0700133 struct strbuf **s;
134
Glen Choodc902082023-06-28 19:26:26 +0000135 kvi_from_param(&kvi);
Josh Steadmon3d3adaa2020-03-20 14:06:15 -0700136 if (tr2_load_env_vars() <= 0)
137 return;
138
139 for (s = tr2_cfg_env_vars; *s; s++) {
140 struct strbuf *buf = *s;
141 const char *val = getenv(buf->buf);
142 if (val && *val)
Glen Choodc902082023-06-28 19:26:26 +0000143 trace2_def_param_fl(file, line, buf->buf, val, &kvi);
Josh Steadmon3d3adaa2020-03-20 14:06:15 -0700144 }
145}
146
Jeff Hostetleree4512e2019-02-22 14:25:01 -0800147void tr2_cfg_set_fl(const char *file, int line, const char *key,
148 const char *value)
149{
Glen Chooa4e7e312023-06-28 19:26:22 +0000150 struct key_value_info kvi = KVI_INIT;
151 struct config_context ctx = {
152 .kvi = &kvi,
153 };
Jeff Hostetleree4512e2019-02-22 14:25:01 -0800154 struct tr2_cfg_data data = { file, line };
155
156 if (tr2_cfg_load_patterns() > 0)
Glen Chooa4e7e312023-06-28 19:26:22 +0000157 tr2_cfg_cb(key, value, &ctx, &data);
Jeff Hostetleree4512e2019-02-22 14:25:01 -0800158}