summaryrefslogtreecommitdiffstats
path: root/lib/command_queue.c
diff options
context:
space:
mode:
authorpaulo <paul@bayleaf.org.uk>2010-01-08 16:18:52 +0000
committerpaulo <paul@bayleaf.org.uk>2010-01-08 16:18:52 +0000
commit6d4aaf90ef68a92e456afc294da1f30051d2c5f6 (patch)
treeac3f150532c319aa1c989606d2ce1d6cd35071f0 /lib/command_queue.c
parent6e8c7923b6f25b7fc4ef47876fcdd82473b29280 (diff)
downloadquagga-6d4aaf90ef68a92e456afc294da1f30051d2c5f6.tar.bz2
quagga-6d4aaf90ef68a92e456afc294da1f30051d2c5f6.tar.xz
Update peer from received open state. Threaded command. Peer index
wiring. New queue I/F handling. Routing engine nexus.
Diffstat (limited to 'lib/command_queue.c')
-rw-r--r--lib/command_queue.c53
1 files changed, 22 insertions, 31 deletions
diff --git a/lib/command_queue.c b/lib/command_queue.c
index 69c8eca6..3bb3473f 100644
--- a/lib/command_queue.c
+++ b/lib/command_queue.c
@@ -29,34 +29,18 @@
/* Prototypes */
static void cq_action(mqueue_block mqb, mqb_flag_t flag);
-/* 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;
+ mqueue_block mqb = mqb_init_new(NULL, cq_action, matched_element) ;
- wyatt->matched_element = matched_element;
- wyatt->vty = vty;
- wyatt->argc = argc;
- wyatt->argv = argc ? XCALLOC(MTYPE_MARSHAL, sizeof (char*) * argc) : NULL;
+ /* all parameters are pointers so use the queue's argv */
+ mqb_push_argv_p(mqb, vty);
for (i = 0; i < argc; ++i)
- {
- wyatt->argv[i] = XSTRDUP(MTYPE_MARSHAL, argv[i]);
- }
+ mqb_push_argv_p(mqb, XSTRDUP(MTYPE_MARSHAL, argv[i]));
- mqb = mqb_init_new(mqb, cq_action, 0) ;
- mqb->arg0 = wyatt;
mqueue_enqueue(bgp_nexus->queue, mqb, 0) ;
}
@@ -66,25 +50,32 @@ cq_action(mqueue_block mqb, mqb_flag_t flag)
{
int result;
int i;
- struct marshal *wyatt = mqb->arg0;
+ struct cmd_element *matched_element;
+ struct vty *vty;
+ void **argv;
+ int argc;
+
+ matched_element = mqb_get_arg0(mqb);
+ argc = mqb_get_argv_count(mqb);
+ argv = mqb_get_argv(mqb) ;
+
+ vty = argv[0];
+ argv++;
+ argc--;
if (flag == mqb_action)
{
/* Execute matched command. */
- result = (*wyatt->matched_element->func)
- (wyatt->matched_element, wyatt->vty, wyatt->argc, (const char **)wyatt->argv);
+ result = (matched_element->func)
+ (matched_element, vty, argc, (const char **)argv);
/* report */
- vty_queued_result(wyatt->vty, result);
+ vty_queued_result(vty, result);
}
/* clean up */
- for (i = 0; i< wyatt->argc; ++i)
- {
- XFREE(MTYPE_MARSHAL, wyatt->argv[i]);
- }
- if (wyatt->argv)
- XFREE(MTYPE_MARSHAL, wyatt->argv);
- XFREE(MTYPE_MARSHAL, wyatt);
+ for (i = 0; i < argc; ++i)
+ XFREE(MTYPE_MARSHAL, argv[i]);
+
mqb_free(mqb);
}