X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_events.c;h=ebc46d87f5dd38bf6bdb63bb29b8e021af471a96;hb=b7f4ea0f4c6ac71da5e4e6fe988df4d35734332a;hp=9d05a9a2613517ac1ec15396479667666f8d7bfd;hpb=050dd63950efb32bc79cdb68866792d4f808a1b0;p=lttng-tools.git diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c index 9d05a9a26..ebc46d87f 100644 --- a/src/bin/lttng/commands/enable_events.c +++ b/src/bin/lttng/commands/enable_events.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011 David Goulet + * Copyright (C) 2011 EfficiOS Inc. * * SPDX-License-Identifier: GPL-2.0-only * @@ -25,6 +25,7 @@ /* Mi dependancy */ #include +#include #include #include "../command.h" @@ -35,7 +36,6 @@ #define LTTNG_SYMBOL_NAME_LEN_SCANF_IS_A_BROKEN_API "255" #endif -static char *opt_event_list; static int opt_event_type; static const char *opt_loglevel; static int opt_loglevel_type; @@ -129,7 +129,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt) ret = CMD_ERROR; goto end; } - ev->attr.probe.offset = strtoul(s_hex, NULL, 0); + ev->attr.probe.offset = strtoull(s_hex, NULL, 0); DBG("probe offset %" PRIu64, ev->attr.probe.offset); ev->attr.probe.addr = 0; goto end; @@ -163,7 +163,7 @@ static int parse_probe_opts(struct lttng_event *ev, char *opt) ret = CMD_ERROR; goto end; } - ev->attr.probe.addr = strtoul(s_hex, NULL, 0); + ev->attr.probe.addr = strtoull(s_hex, NULL, 0); DBG("probe addr %" PRIu64, ev->attr.probe.addr); ev->attr.probe.offset = 0; memset(ev->attr.probe.symbol_name, 0, LTTNG_SYMBOL_NAME_LEN); @@ -193,10 +193,11 @@ const char *print_raw_channel_name(const char *name) * Mi print exlcusion list */ static -int mi_print_exclusion(char **names) +int mi_print_exclusion(const struct lttng_dynamic_pointer_array *exclusions) { - int i, ret; - int count = names ? strutils_array_of_strings_len(names) : 0; + int ret; + size_t i; + const size_t count = lttng_dynamic_pointer_array_get_count(exclusions); assert(writer); @@ -204,14 +205,18 @@ int mi_print_exclusion(char **names) ret = 0; goto end; } + ret = mi_lttng_writer_open_element(writer, config_element_exclusions); if (ret) { goto end; } for (i = 0; i < count; i++) { + const char *exclusion = lttng_dynamic_pointer_array_get_pointer( + exclusions, i); + ret = mi_lttng_writer_write_element_string(writer, - config_element_exclusion, names[i]); + config_element_exclusion, exclusion); if (ret) { goto end; } @@ -228,21 +233,24 @@ end: * Return allocated string for pretty-printing exclusion names. */ static -char *print_exclusions(char **names) +char *print_exclusions(const struct lttng_dynamic_pointer_array *exclusions) { int length = 0; - int i; + size_t i; const char preamble[] = " excluding "; char *ret; - int count = names ? strutils_array_of_strings_len(names) : 0; + const size_t count = lttng_dynamic_pointer_array_get_count(exclusions); if (count == 0) { return strdup(""); } - /* calculate total required length */ + /* Calculate total required length. */ for (i = 0; i < count; i++) { - length += strlen(names[i]) + 4; + const char *exclusion = lttng_dynamic_pointer_array_get_pointer( + exclusions, i); + + length += strlen(exclusion) + 4; } length += sizeof(preamble); @@ -250,10 +258,14 @@ char *print_exclusions(char **names) if (!ret) { return NULL; } + strncpy(ret, preamble, length); for (i = 0; i < count; i++) { + const char *exclusion = lttng_dynamic_pointer_array_get_pointer( + exclusions, i); + strcat(ret, "\""); - strcat(ret, names[i]); + strcat(ret, exclusion); strcat(ret, "\""); if (i != count - 1) { strcat(ret, ", "); @@ -323,13 +335,10 @@ end: return ret; } -static -int create_exclusion_list_and_validate(const char *event_name, - const char *exclusions_arg, - char ***exclusion_list) +int validate_exclusion_list(const char *event_name, + const struct lttng_dynamic_pointer_array *exclusions) { - int ret = 0; - char **exclusions = NULL; + int ret; /* Event name must be a valid globbing pattern to allow exclusions. */ if (!strutils_is_star_glob_pattern(event_name)) { @@ -338,24 +347,24 @@ int create_exclusion_list_and_validate(const char *event_name, goto error; } - /* Split exclusions. */ - exclusions = strutils_split(exclusions_arg, ',', true); - if (!exclusions) { - goto error; - } - /* * If the event name is a star-at-end only globbing pattern, * then we can validate the individual exclusions. Otherwise * all exclusions are passed to the session daemon. */ if (strutils_is_star_at_the_end_only_glob_pattern(event_name)) { - char * const *exclusion; + size_t i, num_exclusions; + + num_exclusions = lttng_dynamic_pointer_array_get_count(exclusions); + + for (i = 0; i < num_exclusions; i++) { + const char *exclusion = + lttng_dynamic_pointer_array_get_pointer( + exclusions, i); - for (exclusion = exclusions; *exclusion; exclusion++) { - if (!strutils_is_star_glob_pattern(*exclusion) || - strutils_is_star_at_the_end_only_glob_pattern(*exclusion)) { - ret = check_exclusion_subsets(event_name, *exclusion); + if (!strutils_is_star_glob_pattern(exclusion) || + strutils_is_star_at_the_end_only_glob_pattern(exclusion)) { + ret = check_exclusion_subsets(event_name, exclusion); if (ret) { goto error; } @@ -363,27 +372,55 @@ int create_exclusion_list_and_validate(const char *event_name, } } - *exclusion_list = exclusions; + ret = 0; + goto end; + +error: + ret = -1; + +end: + return ret; +} + +static int create_exclusion_list_and_validate(const char *event_name, + const char *exclusions_arg, + struct lttng_dynamic_pointer_array *exclusions) +{ + int ret = 0; + + /* Split exclusions. */ + ret = strutils_split(exclusions_arg, ',', true, exclusions); + if (ret < 0) { + goto error; + } + + if (validate_exclusion_list(event_name, exclusions) != + 0) { + goto error; + } goto end; error: ret = -1; - strutils_free_null_terminated_array_of_strings(exclusions); + lttng_dynamic_pointer_array_reset(exclusions); end: return ret; } -static void warn_on_truncated_exclusion_names(char * const *exclusion_list, +static void warn_on_truncated_exclusion_names(const struct lttng_dynamic_pointer_array *exclusions, int *warn) { - char * const *exclusion; + size_t i; + const size_t num_exclusions = lttng_dynamic_pointer_array_get_count(exclusions); + + for (i = 0; i < num_exclusions; i++) { + const char * const exclusion = lttng_dynamic_pointer_array_get_pointer(exclusions, i); - for (exclusion = exclusion_list; *exclusion; exclusion++) { - if (strlen(*exclusion) >= LTTNG_SYMBOL_NAME_LEN) { + if (strlen(exclusion) >= LTTNG_SYMBOL_NAME_LEN) { WARN("Event exclusion \"%s\" will be truncated", - *exclusion); + exclusion); *warn = 1; } } @@ -393,17 +430,17 @@ static void warn_on_truncated_exclusion_names(char * const *exclusion_list, * Enabling event using the lttng API. * Note: in case of error only the last error code will be return. */ -static int enable_events(char *session_name) +static int enable_events(char *session_name, char *event_list) { int ret = CMD_SUCCESS, command_ret = CMD_SUCCESS; int error_holder = CMD_SUCCESS, warn = 0, error = 0, success = 1; char *event_name, *channel_name = NULL; struct lttng_event *ev; - struct lttng_domain dom; - char **exclusion_list = NULL; + struct lttng_domain dom = {}; + struct lttng_dynamic_pointer_array exclusions; struct lttng_userspace_probe_location *uprobe_loc = NULL; - memset(&dom, 0, sizeof(dom)); + lttng_dynamic_pointer_array_init(&exclusions, NULL); ev = lttng_event_create(); if (!ev) { @@ -449,7 +486,7 @@ static int enable_events(char *session_name) case LTTNG_DOMAIN_LOG4J: case LTTNG_DOMAIN_PYTHON: ERR("Event name exclusions are not yet implemented for %s events", - get_domain_str(dom.type)); + lttng_domain_type_str(dom.type)); ret = CMD_ERROR; goto error; case LTTNG_DOMAIN_UST: @@ -562,22 +599,22 @@ static int enable_events(char *session_name) if (opt_exclude) { ret = create_exclusion_list_and_validate("*", - opt_exclude, &exclusion_list); + opt_exclude, &exclusions); if (ret) { ret = CMD_ERROR; goto error; } ev->exclusion = 1; - warn_on_truncated_exclusion_names(exclusion_list, + warn_on_truncated_exclusion_names(&exclusions, &warn); } if (!opt_filter) { ret = lttng_enable_event_with_exclusions(handle, ev, channel_name, NULL, - exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0, - exclusion_list); + lttng_dynamic_pointer_array_get_count(&exclusions), + (char **) exclusions.array.buffer.data); if (ret < 0) { switch (-ret) { case LTTNG_ERR_KERN_EVENT_EXIST: @@ -611,7 +648,7 @@ static int enable_events(char *session_name) switch (opt_event_type) { case LTTNG_EVENT_TRACEPOINT: if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) { - char *exclusion_string = print_exclusions(exclusion_list); + char *exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); @@ -619,13 +656,13 @@ static int enable_events(char *session_name) goto end; } MSG("All %s tracepoints%s are enabled in channel %s for loglevel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), exclusion_string, print_channel_name(channel_name), opt_loglevel); free(exclusion_string); } else { - char *exclusion_string = print_exclusions(exclusion_list); + char *exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); @@ -633,7 +670,7 @@ static int enable_events(char *session_name) goto end; } MSG("All %s tracepoints%s are enabled in channel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), exclusion_string, print_channel_name(channel_name)); free(exclusion_string); @@ -642,13 +679,13 @@ static int enable_events(char *session_name) case LTTNG_EVENT_SYSCALL: if (opt_kernel) { MSG("All %s system calls are enabled in channel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), print_channel_name(channel_name)); } break; case LTTNG_EVENT_ALL: if (opt_loglevel && dom.type != LTTNG_DOMAIN_KERNEL) { - char *exclusion_string = print_exclusions(exclusion_list); + char *exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); @@ -656,13 +693,13 @@ static int enable_events(char *session_name) goto end; } MSG("All %s events%s are enabled in channel %s for loglevel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), exclusion_string, print_channel_name(channel_name), opt_loglevel); free(exclusion_string); } else { - char *exclusion_string = print_exclusions(exclusion_list); + char *exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); @@ -670,7 +707,7 @@ static int enable_events(char *session_name) goto end; } MSG("All %s events%s are enabled in channel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), exclusion_string, print_channel_name(channel_name)); free(exclusion_string); @@ -687,9 +724,9 @@ static int enable_events(char *session_name) if (opt_filter) { command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name, - opt_filter, - exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0, - exclusion_list); + opt_filter, + lttng_dynamic_pointer_array_get_count(&exclusions), + (char **) exclusions.array.buffer.data); if (command_ret < 0) { switch (-command_ret) { case LTTNG_ERR_FILTER_EXIST: @@ -749,7 +786,7 @@ static int enable_events(char *session_name) } /* print exclusion */ - ret = mi_print_exclusion(exclusion_list); + ret = mi_print_exclusion(&exclusions); if (ret) { ret = CMD_ERROR; goto error; @@ -775,7 +812,7 @@ static int enable_events(char *session_name) } /* Strip event list */ - event_name = strtok(opt_event_list, ","); + event_name = strtok(event_list, ","); while (event_name != NULL) { /* Copy name and type of the event */ strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN); @@ -884,20 +921,18 @@ static int enable_events(char *session_name) ret = CMD_ERROR; goto error; } - /* Free previously allocated items */ - strutils_free_null_terminated_array_of_strings( - exclusion_list); - exclusion_list = NULL; + /* Free previously allocated items. */ + lttng_dynamic_pointer_array_reset(&exclusions); ret = create_exclusion_list_and_validate( event_name, opt_exclude, - &exclusion_list); + &exclusions); if (ret) { ret = CMD_ERROR; goto error; } warn_on_truncated_exclusion_names( - exclusion_list, &warn); + &exclusions, &warn); } ev->loglevel_type = opt_loglevel_type; @@ -972,9 +1007,9 @@ static int enable_events(char *session_name) command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name, NULL, - exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0, - exclusion_list); - exclusion_string = print_exclusions(exclusion_list); + lttng_dynamic_pointer_array_get_count(&exclusions), + (char **) exclusions.array.buffer.data); + exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); error = 1; @@ -1024,7 +1059,7 @@ static int enable_events(char *session_name) case LTTNG_DOMAIN_KERNEL: case LTTNG_DOMAIN_UST: MSG("%s event %s%s created in channel %s", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), event_name, exclusion_string, print_channel_name(channel_name)); @@ -1037,7 +1072,7 @@ static int enable_events(char *session_name) * name for agent domains. */ MSG("%s event %s%s enabled", - get_domain_str(dom.type), + lttng_domain_type_str(dom.type), event_name, exclusion_string); break; @@ -1056,9 +1091,9 @@ static int enable_events(char *session_name) command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name, opt_filter, - exclusion_list ? strutils_array_of_strings_len(exclusion_list) : 0, - exclusion_list); - exclusion_string = print_exclusions(exclusion_list); + lttng_dynamic_pointer_array_get_count(&exclusions), + (char **) exclusions.array.buffer.data); + exclusion_string = print_exclusions(&exclusions); if (!exclusion_string) { PERROR("Cannot allocate exclusion_string"); error = 1; @@ -1121,7 +1156,7 @@ static int enable_events(char *session_name) } /* print exclusion */ - ret = mi_print_exclusion(exclusion_list); + ret = mi_print_exclusion(&exclusions); if (ret) { ret = CMD_ERROR; goto error; @@ -1167,7 +1202,7 @@ error: ret = CMD_ERROR; } lttng_destroy_handle(handle); - strutils_free_null_terminated_array_of_strings(exclusion_list); + lttng_dynamic_pointer_array_reset(&exclusions); lttng_userspace_probe_location_destroy(uprobe_loc); /* Overwrite ret with error_holder if there was an actual error with @@ -1187,6 +1222,8 @@ int cmd_enable_events(int argc, const char **argv) int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1; static poptContext pc; char *session_name = NULL; + char *event_list = NULL; + const char *arg_event_list = NULL; const char *leftover = NULL; int event_type = -1; @@ -1285,13 +1322,22 @@ int cmd_enable_events(int argc, const char **argv) } } - opt_event_list = (char*) poptGetArg(pc); - if (opt_event_list == NULL && opt_enable_all == 0) { - ERR("Missing event name(s).\n"); + arg_event_list = poptGetArg(pc); + if (arg_event_list == NULL && opt_enable_all == 0) { + ERR("Missing event name(s)."); ret = CMD_ERROR; goto end; } + if (opt_enable_all == 0) { + event_list = strdup(arg_event_list); + if (event_list == NULL) { + PERROR("Failed to copy event name(s)"); + ret = CMD_ERROR; + goto end; + } + } + leftover = poptGetArg(pc); if (leftover) { ERR("Unknown argument: %s", leftover); @@ -1310,7 +1356,7 @@ int cmd_enable_events(int argc, const char **argv) session_name = opt_session_name; } - command_ret = enable_events(session_name); + command_ret = enable_events(session_name, event_list); if (command_ret) { success = 0; goto mi_closing; @@ -1352,6 +1398,8 @@ end: free(session_name); } + free(event_list); + /* Overwrite ret if an error occurred in enable_events */ ret = command_ret ? command_ret : ret;