summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/yang.c28
-rw-r--r--lib/yang.h2
-rw-r--r--yang/embedmodel.py21
3 files changed, 38 insertions, 13 deletions
diff --git a/lib/yang.c b/lib/yang.c
index db99c0339e..6ab9492d52 100644
--- a/lib/yang.c
+++ b/lib/yang.c
@@ -53,22 +53,30 @@ static const char *yang_module_imp_clb(const char *mod_name,
{
struct yang_module_embed *e;
- if (submod_name || submod_rev)
- return NULL;
-
for (e = embeds; e; e = e->next) {
- if (strcmp(e->mod_name, mod_name))
- continue;
- if (mod_rev && strcmp(e->mod_rev, mod_rev))
- continue;
+ if (e->sub_mod_name && submod_name) {
+ if (strcmp(e->sub_mod_name, submod_name))
+ continue;
+
+ if (submod_rev && strcmp(e->sub_mod_rev, submod_rev))
+ continue;
+ } else {
+ if (strcmp(e->mod_name, mod_name))
+ continue;
+
+ if (mod_rev && strcmp(e->mod_rev, mod_rev))
+ continue;
+ }
*format = e->format;
return e->data;
}
- flog_warn(EC_LIB_YANG_MODULE_LOAD,
- "YANG model \"%s@%s\" not embedded, trying external file",
- mod_name, mod_rev ? mod_rev : "*");
+ flog_warn(
+ EC_LIB_YANG_MODULE_LOAD,
+ "YANG model \"%s@%s\" \"%s@%s\"not embedded, trying external file",
+ mod_name, mod_rev ? mod_rev : "*",
+ submod_name ? submod_name : "*", submod_rev ? submod_rev : "*");
return NULL;
}
diff --git a/lib/yang.h b/lib/yang.h
index d526d2f5d6..cc048c44e8 100644
--- a/lib/yang.h
+++ b/lib/yang.h
@@ -48,6 +48,8 @@ extern "C" {
struct yang_module_embed {
struct yang_module_embed *next;
const char *mod_name, *mod_rev;
+ const char *sub_mod_name;
+ const char *sub_mod_rev;
const char *data;
LYS_INFORMAT format;
};
diff --git a/yang/embedmodel.py b/yang/embedmodel.py
index 624a11da9d..0a25c93da7 100644
--- a/yang/embedmodel.py
+++ b/yang/embedmodel.py
@@ -20,6 +20,8 @@ if not os.path.isdir(outdir):
# to make it even harder.
re_name = re.compile(r'\bmodule\s+([^\s]+)\s+\{')
+re_subname = re.compile(r'\bsubmodule\s+([^\s]+)\s+\{')
+re_mainname = re.compile(r'\bbelongs-to\s+([^\s]+)\s+\{')
re_rev = re.compile(r'\brevision\s+([\d-]+)\s+\{')
@@ -34,6 +36,8 @@ static const char model[] =
static struct yang_module_embed embed = {
\t.mod_name = "%s",
\t.mod_rev = "%s",
+\t.sub_mod_name = "%s",
+\t.sub_mod_rev = "%s",
\t.data = model,
\t.format = %s,
};
@@ -62,6 +66,10 @@ def escape(line):
with open(inname, 'r') as fd:
data = fd.read()
+sub_name = ""
+rev = ""
+sub_rev = ""
+
# XML support isn't actively used currently, but it's here in case the need
# arises. It does avoid the regex'ing.
if '<?xml' in data:
@@ -71,8 +79,15 @@ if '<?xml' in data:
rev = xml.find('{urn:ietf:params:xml:ns:yang:yin:1}revision').get('date')
fmt = 'LYS_YIN'
else:
- name = re_name.search(data).group(1)
- rev = re_rev.search(data).group(1)
+ search_name = re_name.search(data)
+ if search_name :
+ name = search_name.group(1)
+ rev = re_rev.search(data).group(1)
+ else :
+ search_name = re_subname.search(data)
+ sub_name = search_name.group(1)
+ name = re_mainname.search(data).group(1)
+ sub_rev = re_rev.search(data).group(1)
fmt = 'LYS_YANG'
if name is None or rev is None:
@@ -82,4 +97,4 @@ lines = [escape(row) for row in data.split('\n')]
text = '\\n"\n\t"'.join(lines)
with open(outname, 'w') as fd:
- fd.write(template % (text, escape(name), escape(rev), fmt))
+ fd.write(template % (text, escape(name), escape(rev), escape(sub_name), escape(sub_rev), fmt))