X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_events.c;h=eaae4941baffbb84f14be0e56eff952ef553c66b;hp=231b7b38ee7750e8fd3d256a07b0c242f5ea59df;hb=9c48cab3239afea25eba069a9869a59ecd310c03;hpb=748bde765422ca3b2868999cdc7cb5a2de6d5d0e diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c index 231b7b38e..eaae4941b 100644 --- a/src/bin/lttng/commands/enable_events.c +++ b/src/bin/lttng/commands/enable_events.c @@ -336,6 +336,39 @@ const char *print_raw_channel_name(const char *name) return name ? : ""; } +/* + * Return allocated string for pretty-printing exclusion names. + */ +static +char *print_exclusions(int count, char **names) +{ + int length = 0; + int i; + const char *preamble = " excluding "; + char *ret; + + if (count == 0) { + return strdup(""); + } + + /* calculate total required length */ + for (i = 0; i < count; i++) { + length += strlen(names[i]) + 1; + } + + /* add length of preamble + one for NUL - one for last (missing) comma */ + length += strlen(preamble); + ret = malloc(length); + strncpy(ret, preamble, length); + for (i = 0; i < count; i++) { + strcat(ret, names[i]); + if (i != count - 1) { + strcat(ret, ","); + } + } + return ret; +} + /* * Compare list of exclusions against an event name. * Return a list of legal exclusion names. @@ -433,6 +466,8 @@ static int enable_events(char *session_name) char *event_name, *channel_name = NULL; struct lttng_event ev; struct lttng_domain dom; + int exclusion_count = 0; + char **exclusion_list = NULL; memset(&ev, 0, sizeof(ev)); memset(&dom, 0, sizeof(dom)); @@ -466,6 +501,12 @@ static int enable_events(char *session_name) goto error; } + if (opt_kernel && opt_exclude) { + ERR("Event name exclusions are not yet implemented for kernel events"); + ret = CMD_ERROR; + goto error; + } + channel_name = opt_channel_name; handle = lttng_create_handle(session_name, &dom); @@ -497,8 +538,18 @@ static int enable_events(char *session_name) } } + if (opt_exclude) { + ret = check_exclusion_subsets("*", opt_exclude, + &exclusion_count, &exclusion_list); + if (ret == CMD_ERROR) { + goto error; + } + } if (!opt_filter) { - ret = lttng_enable_event(handle, &ev, channel_name); + ret = lttng_enable_event_with_exclusions(handle, + &ev, channel_name, + NULL, + exclusion_count, exclusion_list); if (ret < 0) { switch (-ret) { case LTTNG_ERR_KERN_EVENT_EXIST: @@ -520,14 +571,20 @@ static int enable_events(char *session_name) switch (opt_event_type) { case LTTNG_EVENT_TRACEPOINT: if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) { - MSG("All %s tracepoints are enabled in channel %s for loglevel %s", + char *exclusion_string = print_exclusions(exclusion_count, exclusion_list); + MSG("All %s tracepoints%s are enabled in channel %s for loglevel %s", get_domain_str(dom.type), + exclusion_string, print_channel_name(channel_name), opt_loglevel); + free(exclusion_string); } else { - MSG("All %s tracepoints are enabled in channel %s", + char *exclusion_string = print_exclusions(exclusion_count, exclusion_list); + MSG("All %s tracepoints%s are enabled in channel %s", get_domain_str(dom.type), + exclusion_string, print_channel_name(channel_name)); + free(exclusion_string); } break; case LTTNG_EVENT_SYSCALL: @@ -538,14 +595,20 @@ static int enable_events(char *session_name) break; case LTTNG_EVENT_ALL: if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) { - MSG("All %s events are enabled in channel %s for loglevel %s", + char *exclusion_string = print_exclusions(exclusion_count, exclusion_list); + MSG("All %s events%s are enabled in channel %s for loglevel %s", get_domain_str(dom.type), + exclusion_string, print_channel_name(channel_name), opt_loglevel); + free(exclusion_string); } else { - MSG("All %s events are enabled in channel %s", + char *exclusion_string = print_exclusions(exclusion_count, exclusion_list); + MSG("All %s events%s are enabled in channel %s", get_domain_str(dom.type), + exclusion_string, print_channel_name(channel_name)); + free(exclusion_string); } break; default: @@ -557,8 +620,8 @@ static int enable_events(char *session_name) } } if (opt_filter) { - ret = lttng_enable_event_with_filter(handle, &ev, channel_name, - opt_filter); + ret = lttng_enable_event_with_exclusions(handle, &ev, channel_name, + opt_filter, exclusion_count, exclusion_list); if (ret < 0) { switch (-ret) { case LTTNG_ERR_FILTER_EXIST: @@ -665,6 +728,28 @@ static int enable_events(char *session_name) goto error; } + if (opt_exclude) { + if (opt_event_type != LTTNG_EVENT_ALL && opt_event_type != LTTNG_EVENT_TRACEPOINT) { + ERR("Exclusion option can only be used with tracepoint events"); + ret = CMD_ERROR; + goto error; + } + /* Free previously allocated items */ + if (exclusion_list != NULL) { + while (exclusion_count--) { + free(exclusion_list[exclusion_count]); + } + free(exclusion_list); + exclusion_list = NULL; + } + /* Check for proper subsets */ + ret = check_exclusion_subsets(event_name, opt_exclude, + &exclusion_count, &exclusion_list); + if (ret == CMD_ERROR) { + goto error; + } + } + ev.loglevel_type = opt_loglevel_type; if (opt_loglevel) { ev.loglevel = loglevel_str_to_value(opt_loglevel); @@ -693,17 +778,24 @@ static int enable_events(char *session_name) } if (!opt_filter) { - ret = lttng_enable_event(handle, &ev, channel_name); + char *exclusion_string; + + ret = lttng_enable_event_with_exclusions(handle, + &ev, channel_name, + NULL, exclusion_count, exclusion_list); + exclusion_string = print_exclusions(exclusion_count, exclusion_list); if (ret < 0) { /* Turn ret to positive value to handle the positive error code */ switch (-ret) { case LTTNG_ERR_KERN_EVENT_EXIST: - WARN("Kernel event %s already enabled (channel %s, session %s)", + WARN("Kernel event %s%s already enabled (channel %s, session %s)", event_name, + exclusion_string, print_channel_name(channel_name), session_name); break; default: - ERR("Event %s: %s (channel %s, session %s)", event_name, + ERR("Event %s%s: %s (channel %s, session %s)", event_name, + exclusion_string, lttng_strerror(ret), ret == -LTTNG_ERR_NEED_CHANNEL_NAME ? print_raw_channel_name(channel_name) @@ -713,25 +805,33 @@ static int enable_events(char *session_name) } warn = 1; } else { - MSG("%s event %s created in channel %s", + MSG("%s event %s%s created in channel %s", get_domain_str(dom.type), event_name, + exclusion_string, print_channel_name(channel_name)); } + free(exclusion_string); } if (opt_filter) { - ret = lttng_enable_event_with_filter(handle, &ev, channel_name, - opt_filter); + char *exclusion_string; + + ret = lttng_enable_event_with_exclusions(handle, &ev, channel_name, + opt_filter, exclusion_count, exclusion_list); + exclusion_string = print_exclusions(exclusion_count, exclusion_list); + if (ret < 0) { switch (-ret) { case LTTNG_ERR_FILTER_EXIST: - WARN("Filter on event %s is already enabled" + WARN("Filter on event %s%s is already enabled" " (channel %s, session %s)", event_name, + exclusion_string, print_channel_name(channel_name), session_name); break; default: - ERR("Event %s: %s (channel %s, session %s, filter \'%s\')", ev.name, + ERR("Event %s%s: %s (channel %s, session %s, filter \'%s\')", ev.name, + exclusion_string, lttng_strerror(ret), ret == -LTTNG_ERR_NEED_CHANNEL_NAME ? print_raw_channel_name(channel_name) @@ -741,8 +841,11 @@ static int enable_events(char *session_name) } goto error; } else { - MSG("Filter '%s' successfully set", opt_filter); + MSG("Event %s%s: Filter '%s' successfully set", + event_name, exclusion_string, + opt_filter); } + free(exclusion_string); } /* Next event */ @@ -756,6 +859,13 @@ error: } lttng_destroy_handle(handle); + if (exclusion_list != NULL) { + while (exclusion_count--) { + free(exclusion_list[exclusion_count]); + } + free(exclusion_list); + } + return ret; }