+ if (!opt_filter) {
+ char *exclusion_string;
+
+ command_ret = lttng_enable_event_with_exclusions(handle,
+ ev, channel_name,
+ NULL,
+ 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;
+ goto end;
+ }
+ if (command_ret < 0) {
+ /* Turn ret to positive value to handle the positive error code */
+ switch (-command_ret) {
+ case LTTNG_ERR_KERN_EVENT_EXIST:
+ WARN("Kernel event %s%s already enabled (channel %s, session %s)",
+ event_name,
+ exclusion_string,
+ print_channel_name(channel_name), session_name);
+ warn = 1;
+ break;
+ case LTTNG_ERR_TRACE_ALREADY_STARTED:
+ {
+ const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
+ ERR("Event %s%s: %s (channel %s, session %s)", event_name,
+ exclusion_string,
+ msg,
+ print_channel_name(channel_name),
+ session_name);
+ error = 1;
+ break;
+ }
+ case LTTNG_ERR_SDT_PROBE_SEMAPHORE:
+ ERR("SDT probes %s guarded by semaphores are not supported (channel %s, session %s)",
+ event_name, print_channel_name(channel_name),
+ session_name);
+ error = 1;
+ break;
+ default:
+ ERR("Event %s%s: %s (channel %s, session %s)", event_name,
+ exclusion_string,
+ lttng_strerror(command_ret),
+ command_ret == -LTTNG_ERR_NEED_CHANNEL_NAME
+ ? print_raw_channel_name(channel_name)
+ : print_channel_name(channel_name),
+ session_name);
+ error = 1;
+ break;
+ }
+ error_holder = command_ret;
+ } else {
+ switch (dom.type) {
+ case LTTNG_DOMAIN_KERNEL:
+ case LTTNG_DOMAIN_UST:
+ MSG("%s event %s%s created in channel %s",
+ lttng_domain_type_str(dom.type),
+ event_name,
+ exclusion_string,
+ print_channel_name(channel_name));
+ break;
+ case LTTNG_DOMAIN_JUL:
+ case LTTNG_DOMAIN_LOG4J:
+ case LTTNG_DOMAIN_PYTHON:
+ /*
+ * Don't print the default channel
+ * name for agent domains.
+ */
+ MSG("%s event %s%s enabled",
+ lttng_domain_type_str(dom.type),
+ event_name,
+ exclusion_string);
+ break;
+ default:
+ abort();
+ }
+ }
+ free(exclusion_string);
+ }
+
+ if (opt_filter) {
+ char *exclusion_string;
+
+ /* Filter present */
+ ev->filter = 1;
+
+ command_ret = lttng_enable_event_with_exclusions(handle, ev, channel_name,
+ opt_filter,
+ 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;
+ goto end;
+ }
+ if (command_ret < 0) {
+ switch (-command_ret) {
+ case LTTNG_ERR_FILTER_EXIST:
+ WARN("Filter on event %s%s is already enabled"
+ " (channel %s, session %s)",
+ event_name,
+ exclusion_string,
+ print_channel_name(channel_name), session_name);
+ warn = 1;
+ break;
+ case LTTNG_ERR_TRACE_ALREADY_STARTED:
+ {
+ const char *msg = "The command tried to enable an event in a new domain for a session that has already been started once.";
+ ERR("Event %s%s: %s (channel %s, session %s, filter \'%s\')", ev->name,
+ exclusion_string,
+ msg,
+ print_channel_name(channel_name),
+ session_name, opt_filter);
+ error = 1;
+ break;
+ }
+ default:
+ ERR("Event %s%s: %s (channel %s, session %s, filter \'%s\')", ev->name,
+ exclusion_string,
+ lttng_strerror(command_ret),
+ command_ret == -LTTNG_ERR_NEED_CHANNEL_NAME
+ ? print_raw_channel_name(channel_name)
+ : print_channel_name(channel_name),
+ session_name, opt_filter);
+ error = 1;
+ break;
+ }
+ error_holder = command_ret;
+
+ } else {
+ MSG("Event %s%s: Filter '%s' successfully set",
+ event_name, exclusion_string,
+ opt_filter);
+ }
+ free(exclusion_string);
+ }
+
+ if (lttng_opt_mi) {
+ if (command_ret) {
+ success = 0;
+ ev->enabled = 0;
+ } else {
+ ev->enabled = 1;
+ }
+
+ ret = mi_lttng_event(writer, ev, 1, handle->domain.type);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto error;
+ }
+
+ /* print exclusion */
+ ret = mi_print_exclusion(&exclusions);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto error;
+ }
+
+ /* Success ? */
+ ret = mi_lttng_writer_write_element_bool(writer,
+ mi_lttng_element_command_success, success);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto end;
+ }
+
+ /* Close event element */
+ ret = mi_lttng_writer_close_element(writer);
+ if (ret) {
+ ret = CMD_ERROR;
+ goto end;
+ }