X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fadd_trigger.c;h=ceaf3e807b71f07521bde5df95181e31f9b3f573;hb=a5c2d2a71919b8d1542b62f6d32579125cc2c8f8;hp=570ba4cf6de2da4e478c7aa49201558cc0da59b2;hpb=da76598b1e8dd87fb8f982f4f2f13ef204554564;p=lttng-tools.git diff --git a/src/bin/lttng/commands/add_trigger.c b/src/bin/lttng/commands/add_trigger.c index 570ba4cf6..ceaf3e807 100644 --- a/src/bin/lttng/commands/add_trigger.c +++ b/src/bin/lttng/commands/add_trigger.c @@ -7,6 +7,7 @@ #include #include +#include #include "../command.h" #include "../loglevel.h" @@ -126,13 +127,25 @@ bool assign_event_rule_type(enum lttng_event_rule_type *dest, const char *arg) if (strcmp(arg, "tracepoint") == 0 || strcmp(arg, "logging") == 0) { *dest = LTTNG_EVENT_RULE_TYPE_TRACEPOINT; - } else if (strcmp (arg, "kprobe") == 0 || strcmp(arg, "kernel-probe") == 0) { + } else if (strcmp(arg, "kprobe") == 0 || + strcmp(arg, "kernel-probe") == 0) { *dest = LTTNG_EVENT_RULE_TYPE_KERNEL_PROBE; - } else if (strcmp (arg, "uprobe") == 0 || strcmp(arg, "userspace-probe") == 0) { + } else if (strcmp(arg, "uprobe") == 0 || + strcmp(arg, "userspace-probe") == 0) { *dest = LTTNG_EVENT_RULE_TYPE_USERSPACE_PROBE; - } else if (strcmp (arg, "function") == 0) { + } else if (strcmp(arg, "function") == 0) { *dest = LTTNG_EVENT_RULE_TYPE_KERNEL_FUNCTION; - } else if (strcmp (arg, "syscall") == 0) { + } else if (strncmp(arg, "syscall", strlen("syscall")) == 0) { + /* + * Matches the following: + * - syscall + * - syscall:entry + * - syscall:exit + * - syscall:entry+exit + * - syscall:* + * + * Validation for the right side is left to further usage sites. + */ *dest = LTTNG_EVENT_RULE_TYPE_SYSCALL; } else { ERR("Invalid `--type` value: %s", arg); @@ -175,6 +188,27 @@ end: return ret; } +static bool parse_syscall_emission_site_from_type(const char *str, + enum lttng_event_rule_syscall_emission_site_type *type) +{ + bool ret = false; + if (strcmp(str, "syscall") == 0 || + strcmp(str, "syscall:entry+exit") == 0) { + *type = LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY_EXIT; + } else if (strcmp(str, "syscall:entry") == 0) { + *type = LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_ENTRY; + } else if (strcmp(str, "syscall:exit") == 0) { + *type = LTTNG_EVENT_RULE_SYSCALL_EMISSION_SITE_EXIT; + } else { + goto error; + } + + ret = true; + +error: + return ret; +} + /* This is defined in enable_events.c. */ LTTNG_HIDDEN int create_exclusion_list_and_validate(const char *event_name, @@ -622,6 +656,9 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) struct filter_parser_ctx *parser_ctx = NULL; struct lttng_log_level_rule *log_level_rule = NULL; + /* Event rule type option */ + char *event_rule_type_str = NULL; + /* Tracepoint and syscall options. */ char *name = NULL; char *exclude_names = NULL; @@ -681,6 +718,13 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) goto error; } + /* Save the string for later use. */ + if (!assign_string(&event_rule_type_str, + item_opt->arg, + "--type/-t")) { + goto error; + } + break; case OPT_LOCATION: if (!assign_string(&location, @@ -1077,8 +1121,15 @@ struct parse_event_rule_res parse_event_rule(int *argc, const char ***argv) case LTTNG_EVENT_RULE_TYPE_SYSCALL: { enum lttng_event_rule_status event_rule_status; + enum lttng_event_rule_syscall_emission_site_type emission_site_type; + + if (!parse_syscall_emission_site_from_type( + event_rule_type_str, &emission_site_type)) { + ERR("Failed to parse syscall type '%s'.", event_rule_type_str); + goto error; + } - res.er = lttng_event_rule_syscall_create(); + res.er = lttng_event_rule_syscall_create(emission_site_type); if (!res.er) { ERR("Failed to create syscall event rule."); goto error; @@ -1131,6 +1182,7 @@ end: free(log_level_str); free(location); free(event_name); + free(event_rule_type_str); strutils_free_null_terminated_array_of_strings(exclusion_list); lttng_kernel_probe_location_destroy(kernel_probe_location); @@ -1152,7 +1204,7 @@ struct lttng_condition *handle_condition_event(int *argc, const char ***argv) goto error; } - c = lttng_condition_on_event_create(res.er); + c = lttng_condition_event_rule_matches_create(res.er); lttng_event_rule_destroy(res.er); res.er = NULL; if (!c) { @@ -1168,7 +1220,7 @@ struct lttng_condition *handle_condition_event(int *argc, const char ***argv) assert(expr); assert(*expr); - status = lttng_condition_on_event_append_capture_descriptor( + status = lttng_condition_event_rule_matches_append_capture_descriptor( c, *expr); if (status != LTTNG_CONDITION_STATUS_OK) { if (status == LTTNG_CONDITION_STATUS_UNSUPPORTED) { @@ -1960,13 +2012,14 @@ int cmd_add_trigger(int argc, const char **argv) struct lttng_dynamic_pointer_array actions; struct argpar_state *argpar_state = NULL; struct argpar_item *argpar_item = NULL; - struct lttng_action *action_group = NULL; + struct lttng_action *action_list = NULL; struct lttng_action *action = NULL; struct lttng_trigger *trigger = NULL; char *error = NULL; char *name = NULL; int i; char *owner_uid = NULL; + enum lttng_error_code ret_code; lttng_dynamic_pointer_array_init(&actions, lttng_actions_destructor); @@ -2096,8 +2149,8 @@ int cmd_add_trigger(int argc, const char **argv) goto error; } - action_group = lttng_action_group_create(); - if (!action_group) { + action_list = lttng_action_list_create(); + if (!action_list) { goto error; } @@ -2106,34 +2159,24 @@ int cmd_add_trigger(int argc, const char **argv) action = lttng_dynamic_pointer_array_steal_pointer(&actions, i); - status = lttng_action_group_add_action(action_group, action); + status = lttng_action_list_add_action(action_list, action); if (status != LTTNG_ACTION_STATUS_OK) { goto error; } /* - * The `lttng_action_group_add_action()` takes a reference to + * The `lttng_action_list_add_action()` takes a reference to * the action. We can destroy ours. */ lttng_action_destroy(action); action = NULL; } - trigger = lttng_trigger_create(condition, action_group); + trigger = lttng_trigger_create(condition, action_list); if (!trigger) { goto error; } - if (name) { - enum lttng_trigger_status trigger_status = - lttng_trigger_set_name(trigger, name); - - if (trigger_status != LTTNG_TRIGGER_STATUS_OK) { - ERR("Failed to set trigger name."); - goto error; - } - } - if (owner_uid) { enum lttng_trigger_status trigger_status; char *end; @@ -2152,13 +2195,20 @@ int cmd_add_trigger(int argc, const char **argv) } } - ret = lttng_register_trigger(trigger); - if (ret) { - ERR("Failed to register trigger: %s.", lttng_strerror(ret)); + if (name) { + ret_code = lttng_register_trigger_with_name(trigger, name); + } else { + ret_code = lttng_register_trigger_with_automatic_name(trigger); + } + + if (ret_code != LTTNG_OK) { + ERR("Failed to register trigger: %s.", + lttng_strerror(-ret_code)); goto error; } MSG("Trigger registered successfully."); + ret = 0; goto end; @@ -2170,7 +2220,7 @@ end: argpar_item_destroy(argpar_item); lttng_dynamic_pointer_array_reset(&actions); lttng_condition_destroy(condition); - lttng_action_destroy(action_group); + lttng_action_destroy(action_list); lttng_action_destroy(action); lttng_trigger_destroy(trigger); free(error);