blob: 9b850e1a14730fd959c94e10f3c07d2b306d210e [file] [log] [blame]
Radek Krejci5aeea3a2018-09-05 13:29:36 +02001/**
2 * @file libyang.h
3 * @author Radek Krejci <rkrejci@cesnet.cz>
4 * @brief The main libyang public header.
5 *
6 * Copyright (c) 2015 - 2018 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_LIBYANG_H_
16#define LY_LIBYANG_H_
17
Radek Krejci0af5f5d2018-09-07 15:00:30 +020018#include <stdint.h>
19
Radek Krejci5aeea3a2018-09-05 13:29:36 +020020#ifdef __cplusplus
21extern "C" {
22#endif
23
24/**
Radek Krejci0af5f5d2018-09-07 15:00:30 +020025 * @defgroup context Context
26 * @{
27 *
28 * Structures and functions to manipulate with the libyang "containers". The \em context concept allows callers
29 * to work in environments with different sets of YANG schemas. More detailed information can be found at
30 * @ref howtocontext page.
31 */
32
33/**
Radek Krejci5aeea3a2018-09-05 13:29:36 +020034 * @struct ly_ctx
35 * @brief libyang context handler.
36 */
37struct ly_ctx;
38
Radek Krejci0af5f5d2018-09-07 15:00:30 +020039/**@} context */
Radek Krejci5aeea3a2018-09-05 13:29:36 +020040
41#include "log.h"
42#include "set.h"
43#include "dict.h"
Radek Krejci0af5f5d2018-09-07 15:00:30 +020044#include "tree_schema.h"
45
46/**
47 * @ingroup context
48 * @{
49 */
50
51/**
52 * @defgroup contextoptions Context options
53 * @ingroup context
54 *
55 * Options to change context behavior.
56 * @{
57 */
58
59#define LY_CTX_ALLIMPLEMENTED 0x01 /**< All the imports of the schema being parsed are treated implemented. */
60#define LY_CTX_TRUSTED 0x02 /**< Handle the schema being parsed as trusted and skip its validation
61 tests. Note that while this option improves performance, it can
62 lead to an undefined behavior if the schema is not correct. */
63#define LY_CTX_NOYANGLIBRARY 0x04 /**< Do not internally implement ietf-yang-library module. The option
64 causes that function ly_ctx_info() does not work (returns NULL) until
65 the ietf-yang-library module is loaded manually. While any revision
66 of this schema can be loaded with this option, note that the only
67 revisions implemented by ly_ctx_info() are 2016-04-09 and 2018-01-17.
68 This option cannot be used with ly_ctx_new_yl*() functions. */
69#define LY_CTX_DISABLE_SEARCHDIRS 0x08 /**< Do not search for schemas in context's searchdirs neither in current
70 working directory. It is entirely skipped and the only way to get
71 schema data for imports or for ly_ctx_load_module() is to use the
72 callbacks provided by caller via ly_ctx_set_module_imp_clb() */
73#define LY_CTX_DISABLE_SEARCHDIR_CWD 0x10 /**< Do not automatically search for schemas in current working
74 directory, which is by default searched automatically (despite not
75 recursively). */
76#define LY_CTX_PREFER_SEARCHDIRS 0x20 /**< When searching for schema, prefer searchdirs instead of user callback. */
77/**@} contextoptions */
78
79/**
80 * @brief Create libyang context.
81 *
82 * Context is used to hold all information about schemas. Usually, the application is supposed
83 * to work with a single context in which libyang is holding all schemas (and other internal
84 * information) according to which the data trees will be processed and validated. So, the schema
85 * trees are tightly connected with the specific context and they are held by the context internally
86 * - caller does not need to keep pointers to the schemas returned by lys_parse(), context knows
87 * about them. The data trees created with lyd_parse() are still connected with the specific context,
88 * but they are not internally held by the context. The data tree just points and lean on some data
89 * held by the context (schema tree, string dictionary, etc.). Therefore, in case of data trees, caller
90 * is supposed to keep pointers returned by the lyd_parse() and manage the data tree on its own. This
91 * also affects the number of instances of both tree types. While you can have only one instance of
92 * specific schema connected with a single context, number of data tree instances is not connected.
93 *
94 * @param[in] search_dir Directory where libyang will search for the imported or included modules
95 * and submodules. If no such directory is available, NULL is accepted.
96 * @param[in] options Context options, see @ref contextoptions.
97 * @param[out] new_ctx Pointer to the created libyang context if LY_SUCCESS returned.
98 * @return LY_ERR return value.
99 */
100LY_ERR ly_ctx_new(const char *search_dir, int options, struct ly_ctx **new_ctx);
101
102/**
103 * @brief Add the search path into libyang context
104 *
105 * To reset search paths set in the context, use ly_ctx_unset_searchdirs() and then
106 * set search paths again.
107 *
108 * @param[in] ctx Context to be modified.
109 * @param[in] search_dir New search path to add to the current paths previously set in ctx.
Radek Krejciad573502018-09-07 15:26:55 +0200110 * @return LY_ERR return value.
Radek Krejci0af5f5d2018-09-07 15:00:30 +0200111 */
Radek Krejciad573502018-09-07 15:26:55 +0200112LY_ERR ly_ctx_set_searchdir(struct ly_ctx *ctx, const char *search_dir);
Radek Krejci0af5f5d2018-09-07 15:00:30 +0200113
114/**
115 * @brief Clean the search path(s) from the libyang context
116 *
117 * @param[in] ctx Context to be modified.
Radek Krejci0759b792018-09-20 13:53:15 +0200118 * @param[in] value Searchdir to be removed, use NULL to remove them all.
Radek Krejci0af5f5d2018-09-07 15:00:30 +0200119 * @return LY_ERR return value
120 */
Radek Krejci0759b792018-09-20 13:53:15 +0200121LY_ERR ly_ctx_unset_searchdirs(struct ly_ctx *ctx, const char *value);
Radek Krejci0af5f5d2018-09-07 15:00:30 +0200122
123/**
124 * @brief Get the NULL-terminated list of the search paths in libyang context. Do not modify the result!
125 *
126 * @param[in] ctx Context to query.
127 * @return NULL-terminated list (array) of the search paths, NULL if no searchpath was set.
128 * Do not modify the provided data in any way!
129 */
130const char * const *ly_ctx_get_searchdirs(const struct ly_ctx *ctx);
131
132/**
133 * @brief Get the currently set context's options.
134 *
135 * @param[in] ctx Context to query.
136 * @return Combination of all the currently set context's options, see @ref contextoptions.
137 */
138int ly_ctx_get_options(struct ly_ctx *ctx);
139
140/**
141 * @brief Make context to stop searching for schemas (imported, included or requested via ly_ctx_load_module())
142 * in searchdirs set via ly_ctx_set_searchdir() functions. Searchdirs are still stored in the context, so by
143 * unsetting the option by ly_ctx_unset_disable_searchdirs() searching in all previously searchdirs is restored.
144 *
145 * The same effect is achieved by using #LY_CTX_DISABLE_SEARCHDIRS option when creating new context or parsing
146 * a specific schema.
147 *
148 * @param[in] ctx Context to be modified.
149 */
150void ly_ctx_set_disable_searchdirs(struct ly_ctx *ctx);
151
152/**
153 * @brief Reverse function to ly_ctx_set_disable_searchdirs().
154 *
155 * @param[in] ctx Context to be modified.
156 */
157void ly_ctx_unset_disable_searchdirs(struct ly_ctx *ctx);
158
159/**
160 * @brief Make context to stop implicitly searching for schemas (imported, included or requested via ly_ctx_load_module())
161 * in current working directory. This flag can be unset by ly_ctx_unset_disable_searchdir_cwd().
162 *
163 * The same effect is achieved by using #LY_CTX_DISABLE_SEARCHDIR_CWD option when creating new context or parsing
164 * a specific schema.
165 *
166 * @param[in] ctx Context to be modified.
167 */
168void ly_ctx_set_disable_searchdir_cwd(struct ly_ctx *ctx);
169
170/**
171 * @brief Reverse function to ly_ctx_set_disable_searchdir_cwd().
172 *
173 * @param[in] ctx Context to be modified.
174 */
175void ly_ctx_unset_disable_searchdir_cwd(struct ly_ctx *ctx);
176
177/**
178 * @brief Prefer context's searchdirs before the user callback (ly_module_imp_clb) provided via ly_ctx_set_module_imp_clb()).
179 *
180 * The same effect is achieved by using #LY_CTX_PREFER_SEARCHDIRS option when creating new context or parsing
181 * a specific schema.
182 *
183 * @param[in] ctx Context to be modified.
184 */
185void ly_ctx_set_prefer_searchdirs(struct ly_ctx *ctx);
186
187/**
188 * @brief Reverse function to ly_ctx_set_prefer_searchdirs().
189 *
190 * @param[in] ctx Context to be modified.
191 */
192void ly_ctx_unset_prefer_searchdirs(struct ly_ctx *ctx);
193
194/**
195 * @brief Make context to set all the imported modules to be implemented. By default,
196 * if the imported module is not used in leafref's path, augment or deviation, it is
197 * imported and its data tree is not taken into account.
198 *
199 * The same effect is achieved by using #LY_CTX_ALLIMPLEMENTED option when creating new context or parsing
200 * a specific schema.
201 *
202 * Note, that function does not make the currently loaded modules, it just change the
203 * schema parser behavior for the future parsing. This flag can be unset by ly_ctx_unset_allimplemented().
204 *
205 * @param[in] ctx Context to be modified.
206 */
207void ly_ctx_set_allimplemented(struct ly_ctx *ctx);
208
209/**
210 * @brief Reverse function to ly_ctx_set_allimplemented().
211 *
212 * @param[in] ctx Context to be modified.
213 */
214void ly_ctx_unset_allimplemented(struct ly_ctx *ctx);
215
216/**
217 * @brief Change the schema parser behavior when parsing new schemas forcing it to skip some of the schema
218 * validation checks to improve performance. Note that parsing invalid schemas this way may lead to an
219 * undefined behavior later, e.g. when working with data trees.
220 *
221 * The same effect is achieved by using #LY_CTX_TRUSTED option when creating new context or parsing
222 * a specific schema.
223 *
224 * This flag can be unset by ly_ctx_unset_trusted().
225 *
226 * @param[in] ctx Context to be modified.
227 */
228void ly_ctx_set_trusted(struct ly_ctx *ctx);
229
230/**
231 * @brief Reverse function to ly_ctx_set_trusted().
232 *
233 * @param[in] ctx Context to be modified.
234 */
235void ly_ctx_unset_trusted(struct ly_ctx *ctx);
236
237/**
238 * @brief Get current ID of the modules set. The value is available also
239 * as module-set-id in ly_ctx_info() result.
240 *
241 * @param[in] ctx Context to be examined.
242 * @return Numeric identifier of the current context's modules set.
243 */
244uint16_t ly_ctx_get_module_set_id(const struct ly_ctx *ctx);
245
246/**
247 * @brief Free all internal structures of the specified context.
248 *
249 * The function should be used before terminating the application to destroy
250 * and free all structures internally used by libyang. If the caller uses
251 * multiple contexts, the function should be called for each used context.
252 *
253 * All instance data are supposed to be freed before destroying the context.
254 * Data models are destroyed automatically as part of ly_ctx_destroy() call.
255 *
256 * @param[in] ctx libyang context to destroy
257 * @param[in] private_destructor Optional destructor function for private objects assigned
258 * to the nodes via lys_set_private(). If NULL, the private objects are not freed by libyang.
259 * Remember the differences between the structures derived from ::lys_node and always check
260 * ::lys_node#nodetype.
261 */
262void ly_ctx_destroy(struct ly_ctx *ctx, void (*private_destructor)(const struct lysc_node *node, void *priv));
263
264/** @} context */
265
266#ifdef __cplusplus
267}
268#endif
Radek Krejci5aeea3a2018-09-05 13:29:36 +0200269
270#endif /* LY_LIBYANG_H_ */