Messages in this thread | | | Date | Mon, 18 Jan 2021 13:05:08 -0300 | From | Arnaldo Carvalho de Melo <> | Subject | Re: [PATCH 04/22] perf tools: Add perf_home_perfconfig function |
| |
Em Sat, Jan 02, 2021 at 11:04:23PM +0100, Jiri Olsa escreveu: > Factor out the perf_home_perfconfig, that looks for > .perfconfig in home directory including check for > PERF_CONFIG_NOGLOBAL and for proper permission.
Thanks, applied.
- Arnaldo
> Signed-off-by: Jiri Olsa <jolsa@kernel.org> > --- > tools/perf/util/config.c | 89 ++++++++++++++++++++++++---------------- > tools/perf/util/config.h | 1 + > 2 files changed, 54 insertions(+), 36 deletions(-) > > diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c > index 222cb2e2de25..34fe80ccdad1 100644 > --- a/tools/perf/util/config.c > +++ b/tools/perf/util/config.c > @@ -531,6 +531,56 @@ static int perf_config_global(void) > return !perf_env_bool("PERF_CONFIG_NOGLOBAL", 0); > } > > +static char *home_perfconfig(void) > +{ > + const char *home = NULL; > + char *config; > + struct stat st; > + > + home = getenv("HOME"); > + > + /* > + * Skip reading user config if: > + * - there is no place to read it from (HOME) > + * - we are asked not to (PERF_CONFIG_NOGLOBAL=1) > + */ > + if (!home || !*home || !perf_config_global()) > + return NULL; > + > + config = strdup(mkpath("%s/.perfconfig", home)); > + if (config == NULL) { > + pr_warning("Not enough memory to process %s/.perfconfig, ignoring it.", home); > + return NULL; > + } > + > + if (stat(config, &st) < 0) > + goto out_free; > + > + if (st.st_uid && (st.st_uid != geteuid())) { > + pr_warning("File %s not owned by current user or root, ignoring it.", config); > + goto out_free; > + } > + > + if (st.st_size) > + return config; > + > +out_free: > + free(config); > + return NULL; > +} > + > +const char *perf_home_perfconfig(void) > +{ > + static const char *config; > + static bool failed; > + > + config = failed ? NULL : home_perfconfig(); > + if (!config) > + failed = true; > + > + return config; > +} > + > static struct perf_config_section *find_section(struct list_head *sections, > const char *section_name) > { > @@ -676,9 +726,6 @@ int perf_config_set__collect(struct perf_config_set *set, const char *file_name, > static int perf_config_set__init(struct perf_config_set *set) > { > int ret = -1; > - const char *home = NULL; > - char *user_config; > - struct stat st; > > /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */ > if (config_exclusive_filename) > @@ -687,41 +734,11 @@ static int perf_config_set__init(struct perf_config_set *set) > if (perf_config_from_file(collect_config, perf_etc_perfconfig(), set) < 0) > goto out; > } > - > - home = getenv("HOME"); > - > - /* > - * Skip reading user config if: > - * - there is no place to read it from (HOME) > - * - we are asked not to (PERF_CONFIG_NOGLOBAL=1) > - */ > - if (!home || !*home || !perf_config_global()) > - return 0; > - > - user_config = strdup(mkpath("%s/.perfconfig", home)); > - if (user_config == NULL) { > - pr_warning("Not enough memory to process %s/.perfconfig, ignoring it.", home); > - goto out; > - } > - > - if (stat(user_config, &st) < 0) { > - if (errno == ENOENT) > - ret = 0; > - goto out_free; > - } > - > - ret = 0; > - > - if (st.st_uid && (st.st_uid != geteuid())) { > - pr_warning("File %s not owned by current user or root, ignoring it.", user_config); > - goto out_free; > + if (perf_config_global() && perf_home_perfconfig()) { > + if (perf_config_from_file(collect_config, perf_home_perfconfig(), set) < 0) > + goto out; > } > > - if (st.st_size) > - ret = perf_config_from_file(collect_config, user_config, set); > - > -out_free: > - free(user_config); > out: > return ret; > } > diff --git a/tools/perf/util/config.h b/tools/perf/util/config.h > index ee5a242446e9..d6c4f80f367c 100644 > --- a/tools/perf/util/config.h > +++ b/tools/perf/util/config.h > @@ -37,6 +37,7 @@ int perf_config_u64(u64 *dest, const char *, const char *); > int perf_config_bool(const char *, const char *); > int config_error_nonbool(const char *); > const char *perf_etc_perfconfig(void); > +const char *perf_home_perfconfig(void); > > struct perf_config_set *perf_config_set__new(void); > struct perf_config_set *perf_config_set__load_file(const char *file); > -- > 2.26.2 >
--
- Arnaldo
| |