X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ffilter_chain.c;h=01cd224cde5d430bb4fcf9fe7b949d32ed1cdbea;hb=98fef31471541485002b5b87afa8991a280190d6;hp=98185421c3ca4a2977d62e1dd6f72a0ce89a179c;hpb=fb68990adb1523c2cbffd07c60171564ea5ca20c;p=collectd.git diff --git a/src/filter_chain.c b/src/filter_chain.c index 98185421..01cd224c 100644 --- a/src/filter_chain.c +++ b/src/filter_chain.c @@ -567,15 +567,15 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ DEBUG ("fc_process_chain (chain = %s);", chain->name); - status = FC_ACTION_CONTINUE; - + status = FC_TARGET_CONTINUE; for (rule = chain->rules; rule != NULL; rule = rule->next) { fc_match_t *match; if (rule->name[0] != 0) { - DEBUG ("fc_process_chain: Testing the `%s' rule.", rule->name); + DEBUG ("fc_process_chain (%s): Testing the `%s' rule.", + chain->name, rule->name); } /* N. B.: rule->matches may be NULL. */ @@ -585,7 +585,7 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ &match->user_data); if (status < 0) { - WARNING ("fc_process_chain: A match failed."); + WARNING ("fc_process_chain (%s): A match failed.", chain->name); break; } else if (status != FC_MATCH_MATCHES) @@ -594,11 +594,15 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ /* for-loop has been aborted: Either error or no match. */ if (match != NULL) + { + status = FC_TARGET_CONTINUE; continue; + } if (rule->name[0] != 0) { - DEBUG ("fc_process_chain: Rule `%s' matches.", rule->name); + DEBUG ("fc_process_chain (%s): Rule `%s' matches.", + chain->name, rule->name); } for (target = rule->targets; target != NULL; target = target->next) @@ -609,34 +613,54 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ &target->user_data); if (status < 0) { - WARNING ("fc_process_chain: A target failed."); + WARNING ("fc_process_chain (%s): A target failed.", chain->name); continue; } - else if (status == FC_ACTION_CONTINUE) + else if (status == FC_TARGET_CONTINUE) continue; - else if (status == FC_ACTION_STOP) + else if (status == FC_TARGET_STOP) + break; + else if (status == FC_TARGET_RETURN) break; else { - WARNING ("fc_process_chain: Unknown target return value: %i", status); + WARNING ("fc_process_chain (%s): Unknown return value " + "from target `%s': %i", + chain->name, target->name, status); } } - if (status == FC_ACTION_STOP) + if ((status == FC_TARGET_STOP) + || (status == FC_TARGET_RETURN)) { if (rule->name[0] != 0) { - DEBUG ("fc_process_chain: Rule `%s' signaled the stop condition.", - rule->name); + DEBUG ("fc_process_chain (%s): Rule `%s' signaled " + "the %s condition.", + chain->name, rule->name, + (status == FC_TARGET_STOP) ? "stop" : "return"); } break; } + else + { + status = FC_TARGET_CONTINUE; + } } /* for (rule) */ - /* for-loop has been aborted: A target returned `FC_ACTION_STOP' */ + if (status == FC_TARGET_STOP) + return (FC_TARGET_STOP); + else if (status == FC_TARGET_RETURN) + return (FC_TARGET_CONTINUE); + + /* for-loop has been aborted: A target returned `FC_TARGET_STOP' */ if (rule != NULL) - return (0); + return (FC_TARGET_CONTINUE); + + DEBUG ("fc_process_chain (%s): Executing the default targets.", + chain->name); + status = FC_TARGET_CONTINUE; for (target = chain->targets; target != NULL; target = target->next) { /* If we get here, all matches have matched the value. Execute the @@ -645,11 +669,41 @@ int fc_process_chain (const data_set_t *ds, value_list_t *vl, /* {{{ */ &target->user_data); if (status < 0) { - WARNING ("fc_process_chain: The default target failed."); + WARNING ("fc_process_chain (%s): The default target failed.", + chain->name); + } + else if (status == FC_TARGET_CONTINUE) + continue; + else if (status == FC_TARGET_STOP) + break; + else if (status == FC_TARGET_RETURN) + break; + else + { + WARNING ("fc_process_chain (%s): Unknown return value " + "from target `%s': %i", + chain->name, target->name, status); } } - return (0); + if ((status == FC_TARGET_STOP) + || (status == FC_TARGET_RETURN)) + { + assert (target != NULL); + DEBUG ("fc_process_chain (%s): Default target `%s' signaled " + "the %s condition.", + chain->name, target->name, + (status == FC_TARGET_STOP) ? "stop" : "return"); + if (status == FC_TARGET_STOP) + return (FC_TARGET_STOP); + else + return (FC_TARGET_CONTINUE); + } + + DEBUG ("fc_process_chain (%s): Signaling `continue' at end of chain.", + chain->name); + + return (FC_TARGET_CONTINUE); } /* }}} int fc_process_chain */ /* @@ -730,16 +784,24 @@ static int fc_bit_jump_invoke (const data_set_t *ds, /* {{{ */ status = fc_process_chain (ds, vl, chain); if (status < 0) return (status); - - return (FC_ACTION_CONTINUE); + else if (status == FC_TARGET_STOP) + return (FC_TARGET_STOP); + else + return (FC_TARGET_CONTINUE); } /* }}} int fc_bit_jump_invoke */ static int fc_bit_stop_invoke (const data_set_t *ds, /* {{{ */ value_list_t *vl, notification_meta_t **meta, void **user_data) { - return (FC_ACTION_STOP); + return (FC_TARGET_STOP); } /* }}} int fc_bit_stop_invoke */ +static int fc_bit_return_invoke (const data_set_t *ds, /* {{{ */ + value_list_t *vl, notification_meta_t **meta, void **user_data) +{ + return (FC_TARGET_RETURN); +} /* }}} int fc_bit_return_invoke */ + static int fc_bit_write_create (const oconfig_item_t *ci, /* {{{ */ void **user_data) { @@ -850,7 +912,7 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ } /* for (i = 0; plugin_list[i] != NULL; i++) */ } - return (FC_ACTION_CONTINUE); + return (FC_TARGET_CONTINUE); } /* }}} int fc_bit_write_invoke */ static int fc_init_once (void) /* {{{ */ @@ -874,6 +936,12 @@ static int fc_init_once (void) /* {{{ */ fc_register_target ("stop", tproc); memset (&tproc, 0, sizeof (tproc)); + tproc.create = NULL; + tproc.destroy = NULL; + tproc.invoke = fc_bit_return_invoke; + fc_register_target ("return", tproc); + + memset (&tproc, 0, sizeof (tproc)); tproc.create = fc_bit_write_create; tproc.destroy = fc_bit_write_destroy; tproc.invoke = fc_bit_write_invoke;