diff options
author | paulo <paul@bayleaf.org.uk> | 2010-01-08 16:18:52 +0000 |
---|---|---|
committer | paulo <paul@bayleaf.org.uk> | 2010-01-08 16:18:52 +0000 |
commit | 6d4aaf90ef68a92e456afc294da1f30051d2c5f6 (patch) | |
tree | ac3f150532c319aa1c989606d2ce1d6cd35071f0 /lib/command_queue.c | |
parent | 6e8c7923b6f25b7fc4ef47876fcdd82473b29280 (diff) | |
download | quagga-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.c | 53 |
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); } |