From 93d1149925d98f480dbf511d3755a2fcebe26ec9 Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Thu, 14 Oct 2021 08:58:35 +0200 Subject: [PATCH] Dispatcher test additions --- lib/clixon/clixon_dispatcher.h | 2 +- lib/clixon/clixon_plugin.h | 5 +-- lib/src/clixon_dispatcher.c | 67 +++++++++++++++++++++++++++++---- lib/src/clixon_yang.c | 2 +- util/Makefile.in | 8 +++- util/clixon_util_dispatcher | Bin 18608 -> 0 bytes util/clixon_util_xpath.c | 4 +- 7 files changed, 72 insertions(+), 16 deletions(-) delete mode 100755 util/clixon_util_dispatcher diff --git a/lib/clixon/clixon_dispatcher.h b/lib/clixon/clixon_dispatcher.h index ff8bb0fd..c27e1881 100644 --- a/lib/clixon/clixon_dispatcher.h +++ b/lib/clixon/clixon_dispatcher.h @@ -105,6 +105,6 @@ struct _dispatcher_entry { int dispatcher_register_handler(dispatcher_entry_t **root, dispatcher_definition *x); int dispatcher_call_handlers(dispatcher_entry_t *root, void *handle, char *path, void *user_args); int dispatcher_free(dispatcher_entry_t *root); -int dispatcher_print(FILE *f, dispatcher_entry_t *root); +int dispatcher_print(FILE *f, int level, dispatcher_entry_t *root); #endif /* _CLIXON_DISPATCH_DISPATCHER_H */ diff --git a/lib/clixon/clixon_plugin.h b/lib/clixon/clixon_plugin.h index 62168e2d..ffebc982 100644 --- a/lib/clixon/clixon_plugin.h +++ b/lib/clixon/clixon_plugin.h @@ -50,7 +50,6 @@ /* * Types */ - /*! Registered RPC callback function * @param[in] h Clicon handle @@ -201,8 +200,8 @@ typedef int (plgreset_t)(clicon_handle h, const char *db); * A complete valid XML tree is created by the plugin and sent back via xtop, which is merged * into a complete state tree by the system. * The plugin should ensure that xpath is matched (using namspace context nsc) - * This callback may be replaced with a "dispatcher" type API in the future where the - * XPath binding is stricter, similar to the pagination API. + * XXX: This callback may be replaced with a "dispatcher" type API in the future where the + * XPath binding is stricter, similar to the pagination API. * * @param[in] h Clicon handle * @param[in] xpath Part of state requested diff --git a/lib/src/clixon_dispatcher.c b/lib/src/clixon_dispatcher.c index b38e78f9..05b3f911 100644 --- a/lib/src/clixon_dispatcher.c +++ b/lib/src/clixon_dispatcher.c @@ -1,5 +1,36 @@ /* - * Copyright 2021 Rubicon Communications LLC (Netgate) + * + ***** BEGIN LICENSE BLOCK ***** + + Copyright (C) 2021 Rubicon Communications, LLC(Netgate) + + This file is part of CLIXON. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Alternatively, the contents of this file may be used under the terms of + the GNU General Public License Version 3 or later (the "GPL"), + in which case the provisions of the GPL are applicable instead + of those above. If you wish to allow use of your version of this file only + under the terms of the GPL, and not to allow others to + use your version of this file under the terms of Apache License version 2, + indicate your decision by deleting the provisions above and replace them with + the notice and other provisions required by the GPL. If you do not delete + the provisions above, a recipient may use your version of this file under + the terms of any one of the Apache License version 2 or the GPL. + + ***** END LICENSE BLOCK ***** + * @see https://github.com/dcornejo/dispatcher */ @@ -285,11 +316,8 @@ get_entry(dispatcher_entry_t *root, /* some elements may have keys defined, strip them off */ for (int i = 0; i < split_path_len; i++) { - char *kptr = strchr(split_path_list[i], '='); - - if ((kptr != NULL) && (*kptr == '=')) { - *(kptr + 1) = 0; - } + char *kptr = split_path_list[i]; + strsep(&kptr, "=[]"); } /* search down the tree */ @@ -423,8 +451,12 @@ dispatcher_call_handlers(dispatcher_entry_t *root, void *user_args) { int ret = 0; - dispatcher_entry_t *best = get_entry(root, path); + dispatcher_entry_t *best; + if ((best = get_entry(root, path)) == NULL){ + errno = ENOENT; + return -1; + } if (best->children != NULL) { call_handler_helper(best->children, handle, path, user_args); } @@ -450,3 +482,24 @@ dispatcher_free(dispatcher_entry_t *root) free(root); return 0; } + +/*! Pretty-print dispatcher tree + */ +#define INDENT 3 +int +dispatcher_print(FILE *f, + int level, + dispatcher_entry_t *de) +{ + fprintf(f, "%*s%s", level*INDENT, "", de->node_name); + if (de->handler) + fprintf(f, " %p", de->handler); + if (de->arg) + fprintf(f, " (%p)", de->arg); + fprintf(f, "\n"); + if (de->children) + dispatcher_print(f, level+1, de->children); + if (de->peer) + dispatcher_print(f, level, de->peer); + return 0; +} diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index 7a588f26..6f3b45ab 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -3585,7 +3585,7 @@ yang_extension_value(yang_stmt *ys, clicon_err(OE_UNIX, errno, "cbuf_new"); goto done; } - yext = NULL; /* This loop gets complicated in trhe case the extension is augmented */ + yext = NULL; /* This loop gets complicated in the case the extension is augmented */ while ((yext = yn_each(ys, yext)) != NULL) { if (yang_keyword_get(yext) != Y_UNKNOWN) continue; diff --git a/util/Makefile.in b/util/Makefile.in index ed34e1ef..7e4d21ed 100644 --- a/util/Makefile.in +++ b/util/Makefile.in @@ -91,7 +91,8 @@ APPSRC += clixon_util_path.c APPSRC += clixon_util_datastore.c APPSRC += clixon_util_regexp.c APPSRC += clixon_util_socket.c -APPSRC += clixon_util_validate.c +APPSRC += clixon_util_validate.c +APPSRC += clixon_util_dispatcher.c APPSRC += clixon_netconf_ssh_callhome.c APPSRC += clixon_netconf_ssh_callhome_client.c ifdef with_restconf @@ -149,6 +150,9 @@ clixon_util_socket: clixon_util_socket.c $(LIBDEPS) clixon_util_validate: clixon_util_validate.c $(LIBDEPS) $(CC) $(INCLUDES) $(CPPFLAGS) @CFLAGS@ $(LDFLAGS) $^ -l clixon_backend -o $@ $(LIBS) +clixon_util_dispatcher: clixon_util_dispatcher.c $(LIBDEPS) + $(CC) $(INCLUDES) $(CPPFLAGS) @CFLAGS@ $(LDFLAGS) $^ -l clixon_backend -o $@ $(LIBS) + ifdef with_restconf clixon_util_stream: clixon_util_stream.c $(LIBDEPS) $(CC) $(INCLUDES) $(CPPFLAGS) @CFLAGS@ $(LDFLAGS) $^ $(LIBS) -lcurl -o $@ @@ -163,7 +167,7 @@ endif distclean: clean rm -f Makefile *~ .depend -install: +install: $(APPS) install -d -m 0755 $(DESTDIR)$(bindir) install -m 0755 $(INSTALLFLAGS) $(APPS) $(DESTDIR)$(bindir) diff --git a/util/clixon_util_dispatcher b/util/clixon_util_dispatcher deleted file mode 100755 index 4601c6a9c4dfb0e5784807463783c5fcae70dac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18608 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