static int write_event_exclusions(struct mi_writer *writer, struct lttng_event *event) { int i; int ret; int exclusion_count; /* Open event exclusions */ ret = mi_lttng_writer_open_element(writer, config_element_exclusions); if (ret) { goto end; } exclusion_count = lttng_event_get_exclusion_name_count(event); if (exclusion_count < 0) { ret = exclusion_count; goto end; } for (i = 0; i < exclusion_count; i++) { const char *name; ret = lttng_event_get_exclusion_name(event, i, &name); if (ret) { /* Close exclusions */ mi_lttng_writer_close_element(writer); goto end; } ret = mi_lttng_writer_write_element_string(writer, config_element_exclusion, name); if (ret) { /* Close exclusions */ mi_lttng_writer_close_element(writer); goto end; } } /* Close exclusions */ ret = mi_lttng_writer_close_element(writer); end: return ret; }
/* * Get exclusion names message for a single event. * * Returned pointer must be freed by caller. Returns NULL on error. */ static char *get_exclusion_names_msg(struct lttng_event *event) { int ret; int exclusion_count; char *exclusion_msg = NULL; char *at; size_t i; const char * const exclusion_fmt = " [exclusions: "; const size_t exclusion_fmt_len = strlen(exclusion_fmt); exclusion_count = lttng_event_get_exclusion_name_count(event); if (exclusion_count < 0) { goto end; } else if (exclusion_count == 0) { /* * No exclusions: return copy of empty string so that * it can be freed by caller. */ exclusion_msg = strdup(""); goto end; } /* * exclusion_msg's size is bounded by the exclusion_fmt string, * a comma per entry, the entry count (fixed-size), a closing * bracket, and a trailing \0. */ exclusion_msg = malloc(exclusion_count + exclusion_count * LTTNG_SYMBOL_NAME_LEN + exclusion_fmt_len + 1); if (!exclusion_msg) { goto end; } at = strcpy(exclusion_msg, exclusion_fmt) + exclusion_fmt_len; for (i = 0; i < exclusion_count; ++i) { const char *name; /* Append comma between exclusion names */ if (i > 0) { *at = ','; at++; } ret = lttng_event_get_exclusion_name(event, i, &name); if (ret) { /* Prints '?' on local error; should never happen */ *at = '?'; at++; continue; } /* Append exclusion name */ at += sprintf(at, "%s", name); } /* This also puts a final '\0' at the end of exclusion_msg */ strcpy(at, "]"); end: return exclusion_msg; }