On Mon, Dec 6, 2021 at 2:28 PM Vishal Verma <[email protected]> wrote:
>
> From: QI Fuli <[email protected]>
>
> Add ndctl_configs to ndctl_ctx for supporting ndctl global configuration
> files. All files with .conf suffix under {sysconfdir}/ndctl can be

I expect this should be named a ".d" directory to match expectations
of when a directory supports multiple config-file snippets. Either
"{sysconfdir}/ndctl/ndctl.d", "{sysconfdir}/ndctl/conf.d",
""{sysconfdir}/ndctl.d"  would be ok with me. "{sysconfdir}/ndctl" is
still needed for the security keys.

> regarded as global configuration files that all ndctl commands can refer
> to. Add ndctl_set_configs() public function for setting ndctl default
> configuration files' path. Add ndctl_get_configs() public function for
> getting ndctl configuration files' path form ndctl_ctx.

s/form/from/

Lets those ndctl_{get,set}_config_path().


>
> Link: https://lore.kernel.org/r/[email protected]
> Signed-off-by: QI Fuli <[email protected]>
> Signed-off-by: Vishal Verma <[email protected]>
> ---
>  configure.ac           |  4 ++--
>  ndctl/lib/private.h    |  1 +
>  ndctl/lib/libndctl.c   | 54 ++++++++++++++++++++++++++++++++++++++++++
>  ndctl/libndctl.h       |  2 ++
>  ndctl/ndctl.c          |  1 +
>  ndctl/Makefile.am      |  5 ++--
>  ndctl/lib/Makefile.am  |  4 ++++
>  ndctl/lib/libndctl.sym |  2 ++
>  8 files changed, 69 insertions(+), 4 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index dc39dbe..42a66e1 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -171,9 +171,9 @@ fi
>  AC_SUBST([systemd_unitdir])
>  AM_CONDITIONAL([ENABLE_SYSTEMD_UNITS], [test "x$with_systemd" = "xyes"])
>
> -ndctl_monitorconfdir=${sysconfdir}/ndctl
> +ndctl_confdir=${sysconfdir}/ndctl
>  ndctl_monitorconf=monitor.conf
> -AC_SUBST([ndctl_monitorconfdir])
> +AC_SUBST([ndctl_confdir])
>  AC_SUBST([ndctl_monitorconf])
>
>  daxctl_modprobe_datadir=${datadir}/daxctl
> diff --git a/ndctl/lib/private.h b/ndctl/lib/private.h
> index 8f4510e..f4ca71f 100644
> --- a/ndctl/lib/private.h
> +++ b/ndctl/lib/private.h
> @@ -129,6 +129,7 @@ struct ndctl_ctx {
>         int regions_init;
>         void *userdata;
>         struct list_head busses;
> +       const char *configs;
>         int busses_init;
>         struct udev *udev;
>         struct udev_queue *udev_queue;
> diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
> index 536e142..6b68e3a 100644
> --- a/ndctl/lib/libndctl.c
> +++ b/ndctl/lib/libndctl.c
> @@ -24,6 +24,7 @@
>  #include <util/util.h>
>  #include <util/size.h>
>  #include <util/sysfs.h>
> +#include <util/strbuf.h>
>  #include <ndctl/libndctl.h>
>  #include <ndctl/namespace.h>
>  #include <daxctl/libdaxctl.h>
> @@ -265,6 +266,58 @@ NDCTL_EXPORT void ndctl_set_userdata(struct ndctl_ctx 
> *ctx, void *userdata)
>         ctx->userdata = userdata;
>  }
>
> +static int filter_conf(const struct dirent *dir)
> +{
> +       if (!dir)
> +               return 0;
> +
> +       if (dir->d_type == DT_REG) {
> +               const char *ext = strrchr(dir->d_name, '.');

Oh, I guess clang-format does not insert line breaks between
declarations and code.

> +               if ((!ext) || (ext == dir->d_name))
> +                       return 0;
> +               if (strcmp(ext, ".conf") == 0)
> +                       return 1;
> +       }
> +
> +       return 0;
> +}
> +
> +NDCTL_EXPORT void ndctl_set_configs_dir(struct ndctl_ctx **ctx, char 
> *conf_dir)

ndctl_set_config_path

Why is ctx a 'struct ndctl_ctx **' instead of a 'struct ndctl_ctx *'?

> +{
> +       struct dirent **namelist;
> +       struct strbuf value = STRBUF_INIT;
> +       int rc;
> +
> +       if ((!ctx) || (!conf_dir))

I think this function needs to return an error. If someone does:
ndctl_set_config_path(NULL, "/path") nothing will notify them that
/path is not established as the config directory. The ENOENT check is
helpful, but why not tell the caller?

> +               return;
> +
> +       rc = scandir(conf_dir, &namelist, filter_conf, alphasort);
> +       if (rc == -1) {
> +               if (errno != ENOENT)
> +                       err(*ctx, "scandir for configs failed: %s\n",
> +                               strerror(errno));
> +               return;
> +       }
> +
> +       while (rc--) {
> +               if (value.len)
> +                       strbuf_addstr(&value, " ");
> +               strbuf_addstr(&value, conf_dir);
> +               strbuf_addstr(&value, "/");
> +               strbuf_addstr(&value, namelist[rc]->d_name);
> +               free(namelist[rc]);
> +       }

Any reason this needs to be converted to a space separated list? What
if there are spaces in the path name?

This could just cache the scandir result in the ctx directly and skip
the strbuf usage.

> +       (*ctx)->configs = strbuf_detach(&value, NULL);
> +       free(namelist);
> +}
> +
> +NDCTL_EXPORT const char *ndctl_get_configs_dir(struct ndctl_ctx *ctx)
> +{
> +       if (ctx == NULL)
> +               return NULL;
> +       return ctx->configs;
> +}
> +
>  /**
>   * ndctl_new - instantiate a new library context
>   * @ctx: context to establish
> @@ -331,6 +384,7 @@ NDCTL_EXPORT int ndctl_new(struct ndctl_ctx **ctx)
>         c->daxctl_ctx = daxctl_ctx;
>
>         return 0;
> +

Unnecessary newline.

>   err_ctx:
>         daxctl_unref(daxctl_ctx);
>   err_daxctl:
> diff --git a/ndctl/libndctl.h b/ndctl/libndctl.h
> index 87d07b7..883a56f 100644
> --- a/ndctl/libndctl.h
> +++ b/ndctl/libndctl.h
> @@ -92,6 +92,8 @@ int ndctl_get_log_priority(struct ndctl_ctx *ctx);
>  void ndctl_set_log_priority(struct ndctl_ctx *ctx, int priority);
>  void ndctl_set_userdata(struct ndctl_ctx *ctx, void *userdata);
>  void *ndctl_get_userdata(struct ndctl_ctx *ctx);
> +void ndctl_set_configs_dir(struct ndctl_ctx **ctx, char *conf_dir);
> +const char *ndctl_get_configs_dir(struct ndctl_ctx *ctx);
>
>  enum ndctl_persistence_domain {
>         PERSISTENCE_NONE = 0,
> diff --git a/ndctl/ndctl.c b/ndctl/ndctl.c
> index 31d2c5e..0f908db 100644
> --- a/ndctl/ndctl.c
> +++ b/ndctl/ndctl.c
> @@ -125,6 +125,7 @@ int main(int argc, const char **argv)
>         rc = ndctl_new(&ctx);
>         if (rc)
>                 goto out;
> +       ndctl_set_configs_dir(&ctx, NDCTL_CONF_DIR);

I expect this to happen by default in ndctl_new().

In fact, ndctl_new() might want to grow a config path argument to
override the default.

>         main_handle_internal_command(argc, argv, ctx, commands,
>                         ARRAY_SIZE(commands), PROG_NDCTL);
>         ndctl_unref(ctx);
> diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am
> index a63b1e0..1caa031 100644
> --- a/ndctl/Makefile.am
> +++ b/ndctl/Makefile.am
> @@ -7,8 +7,9 @@ BUILT_SOURCES = config.h
>  config.h: $(srcdir)/Makefile.am
>         $(AM_V_GEN) echo "/* Autogenerated by ndctl/Makefile.am */" >$@ && \
>         echo '#define NDCTL_CONF_FILE \
> -               "$(ndctl_monitorconfdir)/$(ndctl_monitorconf)"' >>$@
> +               "$(ndctl_confdir)/$(ndctl_monitorconf)"' >>$@
>         $(AM_V_GEN) echo '#define NDCTL_KEYS_DIR  "$(ndctl_keysdir)"' >>$@
> +       $(AM_V_GEN) echo '#define NDCTL_CONF_DIR  "$(ndctl_confdir)"' >>$@
>
>  ndctl_SOURCES = ndctl.c \
>                 builtin.h \
> @@ -73,7 +74,7 @@ ndctl_SOURCES += ../test/libndctl.c \
>                  test.c
>  endif
>
> -monitor_configdir = $(ndctl_monitorconfdir)
> +monitor_configdir = $(ndctl_confdir)
>  monitor_config_DATA = $(ndctl_monitorconf)
>
>  if ENABLE_SYSTEMD_UNITS
> diff --git a/ndctl/lib/Makefile.am b/ndctl/lib/Makefile.am
> index e15bb22..f741c44 100644
> --- a/ndctl/lib/Makefile.am
> +++ b/ndctl/lib/Makefile.am
> @@ -14,6 +14,10 @@ libndctl_la_SOURCES =\
>         ../../util/log.h \
>         ../../util/sysfs.c \
>         ../../util/sysfs.h \
> +       ../../util/strbuf.h \
> +       ../../util/strbuf.c \
> +       ../../util/wrapper.c \
> +       ../../util/usage.c \

Seems this new utility code linking is not necessary per the above
recommendation to just cache the scandir results in the ctx.

>         ../../util/fletcher.h \
>         dimm.c \
>         inject.c \
> diff --git a/ndctl/lib/libndctl.sym b/ndctl/lib/libndctl.sym
> index 58afb74..6e1b510 100644
> --- a/ndctl/lib/libndctl.sym
> +++ b/ndctl/lib/libndctl.sym
> @@ -454,4 +454,6 @@ LIBNDCTL_25 {
>
>  LIBNDCTL_26 {
>         ndctl_bus_nfit_translate_spa;
> +       ndctl_set_configs_dir;
> +       ndctl_get_configs_dir;
>  } LIBNDCTL_25;
> --
> 2.33.1
>

Reply via email to