X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fadd_trigger.c;h=9e70df107dccd97defadd720881f4b386f3d7796;hb=57739a6b3247c7ded74522906e214eff0d6dc14c;hp=b1ec6dd4780b11008a9583765b7ade979207e7d0;hpb=481c5310f698d32187c0f20bd0d1da3b8b696b06;p=lttng-tools.git diff --git a/src/bin/lttng/commands/add_trigger.c b/src/bin/lttng/commands/add_trigger.c index b1ec6dd47..9e70df107 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); @@ -1194,151 +1246,6 @@ end: return c; } -static -struct lttng_condition *handle_condition_session_consumed_size(int *argc, const char ***argv) -{ - struct lttng_condition *cond = NULL; - struct argpar_state *state = NULL; - struct argpar_item *item = NULL; - const char *threshold_arg = NULL; - const char *session_name_arg = NULL; - uint64_t threshold; - char *error = NULL; - enum lttng_condition_status condition_status; - - state = argpar_state_create(*argc, *argv, event_rule_opt_descrs); - if (!state) { - ERR("Failed to allocate an argpar state."); - goto error; - } - - while (true) { - enum argpar_state_parse_next_status status; - - ARGPAR_ITEM_DESTROY_AND_RESET(item); - status = argpar_state_parse_next(state, &item, &error); - if (status == ARGPAR_STATE_PARSE_NEXT_STATUS_ERROR) { - ERR("%s", error); - goto error; - } else if (status == ARGPAR_STATE_PARSE_NEXT_STATUS_ERROR_UNKNOWN_OPT) { - /* Just stop parsing here. */ - break; - } else if (status == ARGPAR_STATE_PARSE_NEXT_STATUS_END) { - break; - } - - assert(status == ARGPAR_STATE_PARSE_NEXT_STATUS_OK); - - if (item->type == ARGPAR_ITEM_TYPE_OPT) { - const struct argpar_item_opt *item_opt = - (const struct argpar_item_opt *) item; - - switch (item_opt->descr->id) { - default: - abort(); - } - } else { - const struct argpar_item_non_opt *item_non_opt; - - assert(item->type == ARGPAR_ITEM_TYPE_NON_OPT); - - item_non_opt = (const struct argpar_item_non_opt *) item; - - switch (item_non_opt->non_opt_index) { - case 0: - session_name_arg = item_non_opt->arg; - break; - case 1: - threshold_arg = item_non_opt->arg; - break; - default: - ERR("Unexpected argument `%s`.", - item_non_opt->arg); - goto error; - } - } - } - - *argc -= argpar_state_get_ingested_orig_args(state); - *argv += argpar_state_get_ingested_orig_args(state); - - if (!session_name_arg) { - ERR("Missing session name argument."); - goto error; - } - - if (!threshold_arg) { - ERR("Missing threshold argument."); - goto error; - } - - if (utils_parse_size_suffix(threshold_arg, &threshold) != 0) { - ERR("Failed to parse `%s` as a size.", threshold_arg); - goto error; - } - - cond = lttng_condition_session_consumed_size_create(); - if (!cond) { - ERR("Failed to allocate a session consumed size condition."); - goto error; - } - - condition_status = lttng_condition_session_consumed_size_set_session_name( - cond, session_name_arg); - if (condition_status != LTTNG_CONDITION_STATUS_OK) { - ERR("Failed to set session consumed size condition's session name to '%s'.", - session_name_arg); - goto error; - } - - condition_status = lttng_condition_session_consumed_size_set_threshold( - cond, threshold); - if (condition_status != LTTNG_CONDITION_STATUS_OK) { - ERR("Failed to set session consumed size condition threshold."); - goto error; - } - - goto end; - -error: - lttng_condition_destroy(cond); - cond = NULL; - -end: - argpar_state_destroy(state); - argpar_item_destroy(item); - free(error); - return cond; -} - -static -struct lttng_condition *handle_condition_buffer_usage_high(int *argc, const char ***argv) -{ - ERR("High buffer usage threshold conditions are unsupported for the moment."); - return NULL; -} - -static -struct lttng_condition *handle_condition_buffer_usage_low(int *argc, const char ***argv) -{ - ERR("Low buffer usage threshold conditions are unsupported for the moment."); - return NULL; -} - -static -struct lttng_condition *handle_condition_session_rotation_ongoing(int *argc, const char ***argv) -{ - ERR("Session rotation ongoing conditions are unsupported for the moment."); - return NULL; -} - -static -struct lttng_condition *handle_condition_session_rotation_completed(int *argc, const char ***argv) -{ - ERR("Session rotation completed conditions are unsupported for the moment."); - return NULL; -} - struct condition_descr { const char *name; struct lttng_condition *(*handler) (int *argc, const char ***argv); @@ -1347,11 +1254,6 @@ struct condition_descr { static const struct condition_descr condition_descrs[] = { { "event-rule-matches", handle_condition_event }, - { "on-session-consumed-size", handle_condition_session_consumed_size }, - { "on-buffer-usage-high", handle_condition_buffer_usage_high }, - { "on-buffer-usage-low", handle_condition_buffer_usage_low }, - { "on-session-rotation-ongoing", handle_condition_session_rotation_ongoing }, - { "on-session-rotation-completed", handle_condition_session_rotation_completed }, }; static