diff options
author | paulo <paul@bayleaf.org.uk> | 2009-12-14 17:38:26 +0000 |
---|---|---|
committer | paulo <paul@bayleaf.org.uk> | 2009-12-14 17:38:26 +0000 |
commit | 73fe495cffb7eae3f68df3d3598b0f83df81b79a (patch) | |
tree | 2e67e49a094ad232bf883b6e5141798da03fa6f9 /lib/command_queue.c | |
parent | 9035f1d22beec82507c1c9137e7c9fb5c4d0fbc6 (diff) | |
download | quagga-73fe495cffb7eae3f68df3d3598b0f83df81b79a.tar.bz2 quagga-73fe495cffb7eae3f68df3d3598b0f83df81b79a.tar.xz |
Using message queue to send commands from cli thread to bgp thread.
Diffstat (limited to 'lib/command_queue.c')
-rw-r--r-- | lib/command_queue.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/lib/command_queue.c b/lib/command_queue.c new file mode 100644 index 00000000..a74398c3 --- /dev/null +++ b/lib/command_queue.c @@ -0,0 +1,83 @@ +/* Command Message Queue + * Copyright (C) 2009 Chris Hall (GMCH), Highwayman + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Zebra; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <zebra.h> + +#include "mqueue.h" +#include "qpnexus.h" +#include "memory.h" +#include "command_queue.h" + +/* Prototypes */ +static void cq_action(mqueue_block mqb); + +/* We have too many parameters for a message queue block so have to marshal */ +struct marshal +{ + struct cmd_element *matched_element; + struct vty *vty; + int argc; + char **argv; +}; + +void +cq_enqueue(struct cmd_element *matched_element, struct vty *vty, + int argc, const char *argv[], qpn_nexus bgp_nexus) +{ + struct marshal *wyatt = XCALLOC(MTYPE_MARSHAL, sizeof(struct marshal)) ; + int i; + mqueue_block mqb = NULL; + + wyatt->matched_element = matched_element; + wyatt->vty = vty; + wyatt->argc = argc; + wyatt->argv = XCALLOC(MTYPE_MARSHAL, sizeof (char*) * argc); + for (i = 0; i < argc; ++i) + { + wyatt->argv[i] = XSTRDUP(MTYPE_MARSHAL, argv[i]); + } + + mqb = mqb_init_new(mqb, cq_action, 0) ; + mqb_set_arg0_p(mqb, wyatt); + mqueue_enqueue(bgp_nexus->queue, mqb, 0) ; +} + +/* dispatch a command from the message queue block */ +static void +cq_action(mqueue_block mqb) +{ + int result; + int i; + struct marshal *wyatt = mqb_get_arg0_p(mqb); + + /* Execute matched command. */ + result = (*wyatt->matched_element->func) + (wyatt->matched_element, wyatt->vty, wyatt->argc, wyatt->argv); + + /* clean up */ + for (i = 0; i< wyatt->argc; ++i) + { + XFREE(MTYPE_MARSHAL, wyatt->argv[i]); + } + XFREE(MTYPE_MARSHAL, wyatt->argv); + XFREE(MTYPE_MARSHAL, wyatt); + mqb_free(mqb); +} |