]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: yang: use common yang_ctx_new_setup()
authorDavid Lamparter <equinox@diac24.net>
Mon, 4 Feb 2019 21:56:50 +0000 (22:56 +0100)
committerDavid Lamparter <equinox@diac24.net>
Tue, 19 Feb 2019 20:41:39 +0000 (21:41 +0100)
After creating a libyang context, we need to hook up our callback to use
embedded built-in modules.  I hadn't added this to the yang translator
code.

Also, ly_ctx_new fails if the search directory doesn't exist.  Since
that's not a hard error for us, work around that and ignore inaccessible
YANG_MODELS_DIR.  (This is needed for snap packages.)

Signed-off-by: David Lamparter <equinox@diac24.net>
lib/yang.c
lib/yang.h
lib/yang_translator.c

index f62a8163f9760e0cd70d558529491ce154dbbdd7..1d8e82eb28d8b94891c62aca44509d58b52f618d 100644 (file)
@@ -649,6 +649,29 @@ CPP_NOTICE("lib/yang: time to remove non-LIBYANG_EXT_BUILTIN support")
 extern struct lytype_plugin_list frr_user_types[];
 #endif
 
+struct ly_ctx *yang_ctx_new_setup(void)
+{
+       struct ly_ctx *ctx;
+       const char *yang_models_path = YANG_MODELS_PATH;
+
+       if (access(yang_models_path, R_OK | X_OK)) {
+               yang_models_path = NULL;
+               if (errno == ENOENT)
+                       zlog_info("yang model directory \"%s\" does not exist",
+                                 YANG_MODELS_PATH);
+               else
+                       flog_err_sys(EC_LIB_LIBYANG,
+                                    "cannot access yang model directory \"%s\"",
+                                    YANG_MODELS_PATH);
+       }
+
+       ctx = ly_ctx_new(yang_models_path, LY_CTX_DISABLE_SEARCHDIR_CWD);
+       if (!ctx)
+               return NULL;
+       ly_ctx_set_module_imp_clb(ctx, yang_module_imp_clb, NULL);
+       return ctx;
+}
+
 void yang_init(void)
 {
 #ifndef LIBYANG_EXT_BUILTIN
@@ -677,13 +700,11 @@ CPP_NOTICE("lib/yang: deprecated libyang <0.16.74 extension loading in use!")
 #endif
 
        /* Initialize libyang container for native models. */
-       ly_native_ctx =
-               ly_ctx_new(YANG_MODELS_PATH, LY_CTX_DISABLE_SEARCHDIR_CWD);
+       ly_native_ctx = yang_ctx_new_setup();
        if (!ly_native_ctx) {
                flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
                exit(1);
        }
-       ly_ctx_set_module_imp_clb(ly_native_ctx, yang_module_imp_clb, NULL);
        ly_ctx_set_priv_dup_clb(ly_native_ctx, ly_dup_cb);
 
 #ifndef LIBYANG_EXT_BUILTIN
index 4680db08d40f012c3624b9a07520af8084c5e814..885218272a5fb0ef1853d074a29e655f3287222c 100644 (file)
@@ -513,6 +513,11 @@ extern void yang_data_free(struct yang_data *data);
  */
 extern struct list *yang_data_list_new(void);
 
+/*
+ * Create and set up a libyang context (for use by the translator)
+ */
+extern struct ly_ctx *yang_ctx_new_setup(void);
+
 /*
  * Initialize the YANG subsystem. Should be called only once during the
  * daemon initialization process.
index c3092e56e5e6334960171e1f3144c545bb159a27..6d6f92836fbf247167cfe1c86e204355ff934d25 100644 (file)
@@ -162,8 +162,7 @@ struct yang_translator *yang_translator_load(const char *path)
        RB_INSERT(yang_translators, &yang_translators, translator);
 
        /* Initialize the translator libyang context. */
-       translator->ly_ctx =
-               ly_ctx_new(YANG_MODELS_PATH, LY_CTX_DISABLE_SEARCHDIR_CWD);
+       translator->ly_ctx = yang_ctx_new_setup();
        if (!translator->ly_ctx) {
                flog_warn(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
                goto error;
@@ -525,8 +524,7 @@ static void str_replace(char *o_string, const char *s_string,
 
 void yang_translator_init(void)
 {
-       ly_translator_ctx =
-               ly_ctx_new(YANG_MODELS_PATH, LY_CTX_DISABLE_SEARCHDIR_CWD);
+       ly_translator_ctx = yang_ctx_new_setup();
        if (!ly_translator_ctx) {
                flog_err(EC_LIB_LIBYANG, "%s: ly_ctx_new() failed", __func__);
                exit(1);