X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng%2Fcommands%2Fenable_events.c;h=bbf7c569906c1f9ef7d4db0c2f2fb7c0d446b1cd;hb=81663f073dbfb4b61c06a0ceb8ca33c4fc41b1c5;hp=627b7ebf9ebeaa1a91ee781adcc023b098780073;hpb=4624dad0d79b63be45c5c6d7eb2920ba09746f06;p=lttng-tools.git diff --git a/src/bin/lttng/commands/enable_events.c b/src/bin/lttng/commands/enable_events.c index 627b7ebf9..bbf7c5699 100644 --- a/src/bin/lttng/commands/enable_events.c +++ b/src/bin/lttng/commands/enable_events.c @@ -6,7 +6,6 @@ */ #define _LGPL_SOURCE -#include #include #include #include @@ -25,6 +24,7 @@ /* Mi dependancy */ #include +#include #include #include "../command.h" @@ -193,25 +193,30 @@ 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); + LTTNG_ASSERT(writer); if (count == 0) { 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,22 +335,10 @@ end: return ret; } -/* - * FIXME: find a good place to declare this since add trigger also uses it - */ -LTTNG_HIDDEN -int create_exclusion_list_and_validate(const char *event_name, - const char *exclusions_arg, - char ***exclusion_list); - - -LTTNG_HIDDEN -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)) { @@ -347,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; } @@ -372,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 (exclusion = exclusion_list; *exclusion; exclusion++) { - if (strlen(*exclusion) >= LTTNG_SYMBOL_NAME_LEN) { + for (i = 0; i < num_exclusions; i++) { + const char * const exclusion = lttng_dynamic_pointer_array_get_pointer(exclusions, i); + + if (strlen(exclusion) >= LTTNG_SYMBOL_NAME_LEN) { WARN("Event exclusion \"%s\" will be truncated", - *exclusion); + exclusion); *warn = 1; } } @@ -408,11 +436,11 @@ static int enable_events(char *session_name) 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) { @@ -448,7 +476,7 @@ static int enable_events(char *session_name) dom.buf_type = LTTNG_BUFFER_PER_UID; } else { /* Checked by the caller. */ - assert(0); + abort(); } if (opt_exclude) { @@ -458,14 +486,14 @@ 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: /* Exclusions supported */ break; default: - assert(0); + abort(); } } @@ -525,7 +553,7 @@ static int enable_events(char *session_name) if (opt_loglevel) { int name_search_ret; - assert(opt_userspace || opt_jul || opt_log4j || opt_python); + LTTNG_ASSERT(opt_userspace || opt_jul || opt_log4j || opt_python); if (opt_userspace) { enum lttng_loglevel loglevel; @@ -556,7 +584,7 @@ static int enable_events(char *session_name) goto error; } } else { - assert(opt_userspace || opt_jul || opt_log4j || opt_python); + LTTNG_ASSERT(opt_userspace || opt_jul || opt_log4j || opt_python); if (opt_userspace) { ev->loglevel = -1; } else if (opt_jul) { @@ -571,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: @@ -620,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"); @@ -628,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"); @@ -642,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); @@ -651,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"); @@ -665,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"); @@ -679,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); @@ -696,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: @@ -758,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; @@ -815,7 +843,7 @@ static int enable_events(char *session_name) } break; case LTTNG_EVENT_USERSPACE_PROBE: - assert(ev->type == LTTNG_EVENT_USERSPACE_PROBE); + LTTNG_ASSERT(ev->type == LTTNG_EVENT_USERSPACE_PROBE); ret = parse_userspace_probe_opts(opt_userspace_probe, &uprobe_loc); if (ret) { @@ -893,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,7 +998,7 @@ static int enable_events(char *session_name) strncpy(ev->name, event_name, LTTNG_SYMBOL_NAME_LEN); ev->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0'; } else { - assert(0); + abort(); } if (!opt_filter) { @@ -981,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; @@ -1033,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)); @@ -1046,12 +1072,12 @@ 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; default: - assert(0); + abort(); } } free(exclusion_string); @@ -1065,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; @@ -1130,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; @@ -1176,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