lkml.org 
[lkml]   [2021]   [Jan]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [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

    \
     
     \ /
      Last update: 2021-01-18 17:07    [W:2.233 / U:0.160 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site