commit-graph: bounds-check generation overflow chunk
[alt-git.git] / trace2 / tr2_sysenv.c
blobd3ecac27728efe8c06dd78f6e394d789d4c1bc7e
1 #include "git-compat-util.h"
2 #include "config.h"
3 #include "dir.h"
4 #include "tr2_sysenv.h"
6 /*
7 * Each entry represents a trace2 setting.
8 * See Documentation/technical/api-trace2.txt
9 */
10 struct tr2_sysenv_entry {
11 const char *env_var_name;
12 const char *git_config_name;
14 char *value;
15 unsigned int getenv_called : 1;
19 * This table must match "enum tr2_sysenv_variable" in tr2_sysenv.h.
21 * The strings in this table are constant and must match the published
22 * config and environment variable names as described in the documentation.
24 * We do not define entries for the GIT_TRACE2_PARENT_* environment
25 * variables because they are transient and used to pass information
26 * from parent to child git processes, rather than settings.
28 /* clang-format off */
29 static struct tr2_sysenv_entry tr2_sysenv_settings[] = {
30 [TR2_SYSENV_CFG_PARAM] = { "GIT_TRACE2_CONFIG_PARAMS",
31 "trace2.configparams" },
32 [TR2_SYSENV_ENV_VARS] = { "GIT_TRACE2_ENV_VARS",
33 "trace2.envvars" },
35 [TR2_SYSENV_DST_DEBUG] = { "GIT_TRACE2_DST_DEBUG",
36 "trace2.destinationdebug" },
38 [TR2_SYSENV_NORMAL] = { "GIT_TRACE2",
39 "trace2.normaltarget" },
40 [TR2_SYSENV_NORMAL_BRIEF] = { "GIT_TRACE2_BRIEF",
41 "trace2.normalbrief" },
43 [TR2_SYSENV_EVENT] = { "GIT_TRACE2_EVENT",
44 "trace2.eventtarget" },
45 [TR2_SYSENV_EVENT_BRIEF] = { "GIT_TRACE2_EVENT_BRIEF",
46 "trace2.eventbrief" },
47 [TR2_SYSENV_EVENT_NESTING] = { "GIT_TRACE2_EVENT_NESTING",
48 "trace2.eventnesting" },
50 [TR2_SYSENV_PERF] = { "GIT_TRACE2_PERF",
51 "trace2.perftarget" },
52 [TR2_SYSENV_PERF_BRIEF] = { "GIT_TRACE2_PERF_BRIEF",
53 "trace2.perfbrief" },
55 [TR2_SYSENV_MAX_FILES] = { "GIT_TRACE2_MAX_FILES",
56 "trace2.maxfiles" },
58 /* clang-format on */
60 static int tr2_sysenv_cb(const char *key, const char *value,
61 const struct config_context *ctx UNUSED,
62 void *d UNUSED)
64 int k;
66 if (!starts_with(key, "trace2."))
67 return 0;
69 for (k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++) {
70 if (!strcmp(key, tr2_sysenv_settings[k].git_config_name)) {
71 free(tr2_sysenv_settings[k].value);
72 tr2_sysenv_settings[k].value = xstrdup(value);
73 return 0;
77 return 0;
81 * Load Trace2 settings from the system config (usually "/etc/gitconfig"
82 * unless we were built with a runtime-prefix). These are intended to
83 * define the default values for Trace2 as requested by the administrator.
85 * Then override with the Trace2 settings from the global config.
87 void tr2_sysenv_load(void)
89 if (ARRAY_SIZE(tr2_sysenv_settings) != TR2_SYSENV_MUST_BE_LAST)
90 BUG("tr2_sysenv_settings size is wrong");
92 read_very_early_config(tr2_sysenv_cb, NULL);
96 * Return the value for the requested Trace2 setting from these sources:
97 * the system config, the global config, and the environment.
99 const char *tr2_sysenv_get(enum tr2_sysenv_variable var)
101 if (var >= TR2_SYSENV_MUST_BE_LAST)
102 BUG("tr2_sysenv_get invalid var '%d'", var);
104 if (!tr2_sysenv_settings[var].getenv_called) {
105 const char *v = getenv(tr2_sysenv_settings[var].env_var_name);
106 if (v && *v) {
107 free(tr2_sysenv_settings[var].value);
108 tr2_sysenv_settings[var].value = xstrdup(v);
110 tr2_sysenv_settings[var].getenv_called = 1;
113 return tr2_sysenv_settings[var].value;
117 * Return a friendly name for this setting that is suitable for printing
118 * in an error messages.
120 const char *tr2_sysenv_display_name(enum tr2_sysenv_variable var)
122 if (var >= TR2_SYSENV_MUST_BE_LAST)
123 BUG("tr2_sysenv_get invalid var '%d'", var);
125 return tr2_sysenv_settings[var].env_var_name;
128 void tr2_sysenv_release(void)
130 int k;
132 for (k = 0; k < ARRAY_SIZE(tr2_sysenv_settings); k++)
133 free(tr2_sysenv_settings[k].value);