blob: 2333bb3bd18b0fea0238c4357686d7dc3f9b45c7 [file] [log] [blame]
Radek Krejci5aeea3a2018-09-05 13:29:36 +02001/**
2 * @file context.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief internal context structures and functions
5 *
6 * Copyright (c) 2015 - 2017 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 */
14
15#ifndef LY_CONTEXT_H_
16#define LY_CONTEXT_H_
17
Radek Krejci6caa6ab2018-10-24 10:04:48 +020018#include "log.h"
Radek Krejci5aeea3a2018-09-05 13:29:36 +020019#include "tree_schema.h"
20
Radek Krejci6caa6ab2018-10-24 10:04:48 +020021#ifdef __cplusplus
22extern "C" {
23#endif
24
Radek Krejci5aeea3a2018-09-05 13:29:36 +020025/**
Radek Krejci6caa6ab2018-10-24 10:04:48 +020026 * @defgroup context Context
27 * @{
28 *
29 * Structures and functions to manipulate with the libyang "containers". The \em context concept allows callers
30 * to work in environments with different sets of YANG schemas. More detailed information can be found at
31 * @ref howtocontext page.
Radek Krejci5aeea3a2018-09-05 13:29:36 +020032 */
Radek Krejci6caa6ab2018-10-24 10:04:48 +020033
34/**
35 * @struct ly_ctx
36 * @brief libyang context handler.
37 */
38struct ly_ctx;
39
40/**
41 * @defgroup contextoptions Context options
42 * @ingroup context
43 *
44 * Options to change context behavior.
45 * @{
46 */
47
48#define LY_CTX_ALLIMPLEMENTED 0x01 /**< All the imports of the schema being parsed are treated implemented. */
49#define LY_CTX_TRUSTED 0x02 /**< Handle the schema being parsed as trusted and skip its validation
50 tests. Note that while this option improves performance, it can
51 lead to an undefined behavior if the schema is not correct. */
52#define LY_CTX_NOYANGLIBRARY 0x04 /**< Do not internally implement ietf-yang-library module. The option
53 causes that function ly_ctx_info() does not work (returns NULL) until
54 the ietf-yang-library module is loaded manually. While any revision
55 of this schema can be loaded with this option, note that the only
56 revisions implemented by ly_ctx_info() are 2016-04-09 and 2018-01-17.
57 This option cannot be changed on existing context. */
58#define LY_CTX_DISABLE_SEARCHDIRS 0x08 /**< Do not search for schemas in context's searchdirs neither in current
59 working directory. It is entirely skipped and the only way to get
60 schema data for imports or for ly_ctx_load_module() is to use the
61 callbacks provided by caller via ly_ctx_set_module_imp_clb() */
62#define LY_CTX_DISABLE_SEARCHDIR_CWD 0x10 /**< Do not automatically search for schemas in current working
63 directory, which is by default searched automatically (despite not
64 recursively). */
65#define LY_CTX_PREFER_SEARCHDIRS 0x20 /**< When searching for schema, prefer searchdirs instead of user callback. */
66/**@} contextoptions */
67
68/**
69 * @brief Create libyang context.
70 *
71 * Context is used to hold all information about schemas. Usually, the application is supposed
72 * to work with a single context in which libyang is holding all schemas (and other internal
73 * information) according to which the data trees will be processed and validated. So, the schema
74 * trees are tightly connected with the specific context and they are held by the context internally
75 * - caller does not need to keep pointers to the schemas returned by lys_parse(), context knows
76 * about them. The data trees created with lyd_parse() are still connected with the specific context,
77 * but they are not internally held by the context. The data tree just points and lean on some data
78 * held by the context (schema tree, string dictionary, etc.). Therefore, in case of data trees, caller
79 * is supposed to keep pointers returned by the lyd_parse() and manage the data tree on its own. This
80 * also affects the number of instances of both tree types. While you can have only one instance of
81 * specific schema connected with a single context, number of data tree instances is not connected.
82 *
83 * @param[in] search_dir Directory where libyang will search for the imported or included modules
84 * and submodules. If no such directory is available, NULL is accepted.
85 * @param[in] options Context options, see @ref contextoptions.
86 * @param[out] new_ctx Pointer to the created libyang context if LY_SUCCESS returned.
87 * @return LY_ERR return value.
88 */
89LY_ERR ly_ctx_new(const char *search_dir, int options, struct ly_ctx **new_ctx);
90
91/**
92 * @brief Add the search path into libyang context
93 *
94 * To reset search paths set in the context, use ly_ctx_unset_searchdirs() and then
95 * set search paths again.
96 *
97 * @param[in] ctx Context to be modified.
98 * @param[in] search_dir New search path to add to the current paths previously set in ctx.
99 * @return LY_ERR return value.
100 */
101LY_ERR ly_ctx_set_searchdir(struct ly_ctx *ctx, const char *search_dir);
102
103/**
104 * @brief Clean the search path(s) from the libyang context
105 *
106 * @param[in] ctx Context to be modified.
107 * @param[in] value Searchdir to be removed, use NULL to remove them all.
108 * @return LY_ERR return value
109 */
110LY_ERR ly_ctx_unset_searchdirs(struct ly_ctx *ctx, const char *value);
111
112/**
113 * @brief Get the NULL-terminated list of the search paths in libyang context. Do not modify the result!
114 *
115 * @param[in] ctx Context to query.
116 * @return NULL-terminated list (array) of the search paths, NULL if no searchpath was set.
117 * Do not modify the provided data in any way!
118 */
119const char * const *ly_ctx_get_searchdirs(const struct ly_ctx *ctx);
120
121/**
122 * @brief Get the currently set context's options.
123 *
124 * @param[in] ctx Context to query.
125 * @return Combination of all the currently set context's options, see @ref contextoptions.
126 */
127int ly_ctx_get_options(const struct ly_ctx *ctx);
128
129/**
130 * @brief Set some of the context's options, see @ref contextoptions.
131 * @param[in] ctx Context to be modified.
132 * @param[in] option Combination of the context's options to be set, see @ref contextoptions.
133 * @return LY_ERR value.
134 */
135LY_ERR ly_ctx_set_option(struct ly_ctx *ctx, int option);
136
137/**
138 * @brief Unset some of the context's options, see @ref contextoptions.
139 * @param[in] ctx Context to be modified.
140 * @param[in] option Combination of the context's options to be unset, see @ref contextoptions.
141 * @return LY_ERR value.
142 */
143LY_ERR ly_ctx_unset_option(struct ly_ctx *ctx, int option);
144
145/**
146 * @brief Get current ID of the modules set. The value is available also
147 * as module-set-id in ly_ctx_info() result.
148 *
149 * @param[in] ctx Context to be examined.
150 * @return Numeric identifier of the current context's modules set.
151 */
152uint16_t ly_ctx_get_module_set_id(const struct ly_ctx *ctx);
153
154/**
Radek Krejcib7db73a2018-10-24 14:18:40 +0200155 * @brief Get YANG module of the given name and revision.
156 *
157 * @param[in] ctx Context to work in.
158 * @param[in] name Name of the YANG module to get.
159 * @param[in] revision Requested revision date of the YANG module to get. If not specified,
160 * the schema with no revision is returned, if it is present in the context.
161 * @return Pointer to the YANG module, NULL if no schema in the context follows the name and revision requirements.
162 */
163const struct lys_module *ly_ctx_get_module(const struct ly_ctx *ctx, const char *name, const char *revision);
164
165/**
166 * @brief Get the latest revision of the YANG module specified by its name.
167 *
168 * YANG modules with no revision are supposed to be the oldest one.
169 *
170 * @param[in] ctx Context where to search.
171 * @param[in] name Name of the YANG module to get.
172 * @return The latest revision of the specified YANG module in the given context, NULL if no YANG module of the
173 * given name is present in the context.
174 */
175const struct lys_module *ly_ctx_get_module_latest(const struct ly_ctx *ctx, const char *name);
176
177/**
178 * @brief Get the (only) implemented YANG module specified by its name.
179 *
180 * @param[in] ctx Context where to search.
181 * @param[in] name Name of the YANG module to get.
182 * @return The only implemented YANG module revision of the given name in the given context. NULL if there is no
183 * implemented module of the given name.
184 */
185const struct lys_module *ly_ctx_get_module_implemented(const struct ly_ctx *ctx, const char *name);
186
187/**
188 * @brief Get YANG module of the given namespace and revision.
189 *
190 * @param[in] ctx Context to work in.
191 * @param[in] ns Namespace of the YANG module to get.
192 * @param[in] revision Requested revision date of the YANG module to get. If not specified,
193 * the schema with no revision is returned, if it is present in the context.
194 * @return Pointer to the YANG module, NULL if no schema in the context follows the namespace and revision requirements.
195 */
196const struct lys_module *ly_ctx_get_module_ns(const struct ly_ctx *ctx, const char *ns, const char *revision);
197
198/**
199 * @brief Get the latest revision of the YANG module specified by its namespace.
200 *
201 * YANG modules with no revision are supposed to be the oldest one.
202 *
203 * @param[in] ctx Context where to search.
204 * @param[in] ns Namespace of the YANG module to get.
205 * @return The latest revision of the specified YANG module in the given context, NULL if no YANG module of the
206 * given namespace is present in the context.
207 */
208const struct lys_module *ly_ctx_get_module_latest_ns(const struct ly_ctx *ctx, const char *ns);
209
210/**
211 * @brief Get the (only) implemented YANG module specified by its namespace.
212 *
213 * @param[in] ctx Context where to search.
214 * @param[in] ns Namespace of the YANG module to get.
215 * @return The only implemented YANG module revision of the given namespace in the given context. NULL if there is no
216 * implemented module of the given namespace.
217 */
218const struct lys_module *ly_ctx_get_module_implemented_ns(const struct ly_ctx *ctx, const char *ns);
219
220/**
Radek Krejci6caa6ab2018-10-24 10:04:48 +0200221 * @brief Free all internal structures of the specified context.
222 *
223 * The function should be used before terminating the application to destroy
224 * and free all structures internally used by libyang. If the caller uses
225 * multiple contexts, the function should be called for each used context.
226 *
227 * All instance data are supposed to be freed before destroying the context.
228 * Data models are destroyed automatically as part of ly_ctx_destroy() call.
229 *
230 * @param[in] ctx libyang context to destroy
231 * @param[in] private_destructor Optional destructor function for private objects assigned
232 * to the nodes via lys_set_private(). If NULL, the private objects are not freed by libyang.
233 * Remember the differences between the structures derived from ::lysc_node and always check
234 * ::lysc_node#nodetype.
235 */
236void ly_ctx_destroy(struct ly_ctx *ctx, void (*private_destructor)(const struct lysc_node *node, void *priv));
237
238/** @} context */
239
240#ifdef __cplusplus
241}
242#endif
Radek Krejci5aeea3a2018-09-05 13:29:36 +0200243
Radek Krejci5aeea3a2018-09-05 13:29:36 +0200244#endif /* LY_CONTEXT_H_ */