blob: e3d3a0903a3d31e2e29b9c8a56d6e06c0415f5e9 [file] [log] [blame]
Radek Krejci0935f412019-08-20 16:15:18 +02001/**
2 * @file plugins_exts.c
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief Internally implemented YANG extensions.
5 *
6 * Copyright (c) 2019 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
Radek Krejci0935f412019-08-20 16:15:18 +020014
15#include "plugins_exts.h"
Radek Krejci77114102021-03-10 15:21:57 +010016#include "plugins_exts_compile.h"
17#include "plugins_exts_print.h"
Radek Krejci0935f412019-08-20 16:15:18 +020018
Radek Krejci47fab892020-11-05 17:02:41 +010019#include <stdint.h>
Radek Krejci535ea9f2020-05-29 16:01:05 +020020#include <string.h>
21
Radek Krejci883355a2021-03-11 11:54:41 +010022extern struct lyext_plugin metadata_plugin; /* plugins_exts_metadata.c */
23extern struct lyext_plugin nacm_plugin; /* plugins_exts_nacm.c */
24extern struct lyext_plugin yangdata_plugin; /* plugins_exts_yangdata.c */
Radek Krejci0935f412019-08-20 16:15:18 +020025
Radek Krejci5f9a3672021-03-05 21:35:22 +010026/* internal libyang headers - do not make them accessible to the extension plugins in plugins_exts_*.c */
27#include "common.h"
Radek Krejci77114102021-03-10 15:21:57 +010028#include "plugins_exts_internal.h"
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010029#include "printer_internal.h"
Radek Krejci5f9a3672021-03-05 21:35:22 +010030#include "schema_compile.h"
31
Radek Krejci0935f412019-08-20 16:15:18 +020032/**
33 * @brief list of all extension plugins implemented internally
34 */
Radek Krejcic0c872a2021-03-10 13:30:08 +010035struct lyext_plugin_record lyext_plugins_internal[] = {
Radek Krejci0935f412019-08-20 16:15:18 +020036 {"ietf-netconf-acm", "2012-02-22", "default-deny-write", &nacm_plugin},
37 {"ietf-netconf-acm", "2018-02-14", "default-deny-write", &nacm_plugin},
38 {"ietf-netconf-acm", "2012-02-22", "default-deny-all", &nacm_plugin},
39 {"ietf-netconf-acm", "2018-02-14", "default-deny-all", &nacm_plugin},
Radek Krejcid6b76452019-09-03 17:03:03 +020040 {"ietf-yang-metadata", "2016-08-05", "annotation", &metadata_plugin},
Radek Krejci5fa32a32021-02-08 18:12:38 +010041 {"ietf-restconf", "2017-01-26", "yang-data", &yangdata_plugin},
Radek Krejci0935f412019-08-20 16:15:18 +020042 {NULL, NULL, NULL, NULL} /* terminating item */
43};
44
45/* TODO support for external extension plugins */
46
47struct lyext_plugin *
48lyext_get_plugin(struct lysc_ext *ext)
49{
Radek Krejci1deb5be2020-08-26 16:43:36 +020050 for (uint8_t u = 0; lyext_plugins_internal[u].module; ++u) {
Radek Krejci0935f412019-08-20 16:15:18 +020051 if (!strcmp(ext->name, lyext_plugins_internal[u].name) &&
52 !strcmp(ext->module->name, lyext_plugins_internal[u].module) &&
53 (!lyext_plugins_internal[u].revision || !strcmp(ext->module->revision, lyext_plugins_internal[u].revision))) {
54 /* we have the match */
55 return lyext_plugins_internal[u].plugin;
56 }
57 }
58
59 return NULL;
60}
Radek Krejci5f9a3672021-03-05 21:35:22 +010061
62API struct ly_ctx *
63lysc_ctx_get_ctx(const struct lysc_ctx *ctx)
64{
65 return ctx->ctx;
66}
67
68API uint32_t *
69lysc_ctx_get_options(const struct lysc_ctx *ctx)
70{
71 return &((struct lysc_ctx *)ctx)->options;
72}
73
74API const char *
75lysc_ctx_get_path(const struct lysc_ctx *ctx)
76{
77 return ctx->path;
78}
Radek Krejcif8d7f9a2021-03-10 14:32:36 +010079
80API struct ly_out **
81lys_ypr_ctx_get_out(const struct lyspr_ctx *ctx)
82{
83 return &((struct lyspr_ctx *)ctx)->out;
84}
85
86API uint32_t *
87lys_ypr_ctx_get_options(const struct lyspr_ctx *ctx)
88{
89 return &((struct lyspr_ctx *)ctx)->options;
90}
91
92API uint16_t *
93lys_ypr_ctx_get_level(const struct lyspr_ctx *ctx)
94{
95 return &((struct lyspr_ctx *)ctx)->level;
96}