+ char *event_name;
+
+ DBG("Disable event command for event \'%s\'", event->name);
+
+ event_name = event->name;
+ if (validate_event_name(event_name)) {
+ ret = LTTNG_ERR_INVALID_EVENT_NAME;
+ goto error;
+ }
+
+ /* Error out on unhandled search criteria */
+ if (event->loglevel_type || event->loglevel != -1 || event->enabled
+ || event->pid || event->filter || event->exclusion) {
+ ret = LTTNG_ERR_UNK;
+ goto error;
+ }
+
+ rcu_read_lock();
+
+ switch (domain) {
+ case LTTNG_DOMAIN_KERNEL:
+ {
+ struct ltt_kernel_channel *kchan;
+ struct ltt_kernel_session *ksess;
+
+ ksess = session->kernel_session;
+
+ /*
+ * If a non-default channel has been created in the
+ * session, explicitely require that -c chan_name needs
+ * to be provided.
+ */
+ if (ksess->has_non_default_channel && channel_name[0] == '\0') {
+ ret = LTTNG_ERR_NEED_CHANNEL_NAME;
+ goto error_unlock;
+ }
+
+ kchan = trace_kernel_get_channel_by_name(channel_name, ksess);
+ if (kchan == NULL) {
+ ret = LTTNG_ERR_KERN_CHAN_NOT_FOUND;
+ goto error_unlock;
+ }
+
+ switch (event->type) {
+ case LTTNG_EVENT_ALL:
+ case LTTNG_EVENT_TRACEPOINT:
+ case LTTNG_EVENT_SYSCALL:
+ case LTTNG_EVENT_PROBE:
+ case LTTNG_EVENT_FUNCTION:
+ case LTTNG_EVENT_FUNCTION_ENTRY:/* fall-through */
+ if (event_name[0] == '\0') {
+ ret = event_kernel_disable_event(kchan,
+ NULL, event->type);
+ } else {
+ ret = event_kernel_disable_event(kchan,
+ event_name, event->type);
+ }
+ if (ret != LTTNG_OK) {
+ goto error_unlock;
+ }
+ break;
+ default:
+ ret = LTTNG_ERR_UNK;
+ goto error_unlock;
+ }
+
+ kernel_wait_quiescent(kernel_tracer_fd);
+ break;
+ }
+ case LTTNG_DOMAIN_UST:
+ {
+ struct ltt_ust_channel *uchan;
+ struct ltt_ust_session *usess;
+
+ usess = session->ust_session;
+
+ if (validate_ust_event_name(event_name)) {
+ ret = LTTNG_ERR_INVALID_EVENT_NAME;
+ goto error_unlock;
+ }
+
+ /*
+ * If a non-default channel has been created in the
+ * session, explicitly require that -c chan_name needs
+ * to be provided.
+ */
+ if (usess->has_non_default_channel && channel_name[0] == '\0') {
+ ret = LTTNG_ERR_NEED_CHANNEL_NAME;
+ goto error_unlock;
+ }
+
+ uchan = trace_ust_find_channel_by_name(usess->domain_global.channels,
+ channel_name);
+ if (uchan == NULL) {
+ ret = LTTNG_ERR_UST_CHAN_NOT_FOUND;
+ goto error_unlock;
+ }
+
+ switch (event->type) {
+ case LTTNG_EVENT_ALL:
+ /*
+ * An empty event name means that everything
+ * should be disabled.
+ */
+ if (event->name[0] == '\0') {
+ ret = event_ust_disable_all_tracepoints(usess, uchan);
+ } else {
+ ret = event_ust_disable_tracepoint(usess, uchan,
+ event_name);
+ }
+ if (ret != LTTNG_OK) {
+ goto error_unlock;
+ }
+ break;
+ default:
+ ret = LTTNG_ERR_UNK;
+ goto error_unlock;
+ }
+
+ DBG3("Disable UST event %s in channel %s completed", event_name,
+ channel_name);
+ break;
+ }
+ case LTTNG_DOMAIN_LOG4J:
+ case LTTNG_DOMAIN_JUL:
+ case LTTNG_DOMAIN_PYTHON:
+ {
+ struct agent *agt;
+ struct ltt_ust_session *usess = session->ust_session;
+
+ assert(usess);
+
+ switch (event->type) {
+ case LTTNG_EVENT_ALL:
+ break;
+ default:
+ ret = LTTNG_ERR_UNK;
+ goto error_unlock;
+ }
+
+ agt = trace_ust_find_agent(usess, domain);
+ if (!agt) {
+ ret = -LTTNG_ERR_UST_EVENT_NOT_FOUND;
+ goto error_unlock;
+ }
+ /*
+ * An empty event name means that everything
+ * should be disabled.
+ */
+ if (event->name[0] == '\0') {
+ ret = event_agent_disable_all(usess, agt);
+ } else {
+ ret = event_agent_disable(usess, agt, event_name);
+ }
+ if (ret != LTTNG_OK) {
+ goto error_unlock;
+ }
+
+ break;
+ }
+ default:
+ ret = LTTNG_ERR_UND;
+ goto error_unlock;
+ }
+
+ ret = LTTNG_OK;
+
+error_unlock:
+ rcu_read_unlock();
+error:
+ return ret;
+}
+
+/*
+ * Command LTTNG_ADD_CONTEXT processed by the client thread.
+ */
+int cmd_add_context(struct ltt_session *session, enum lttng_domain_type domain,
+ char *channel_name, struct lttng_event_context *ctx, int kwpipe)
+{
+ int ret, chan_kern_created = 0, chan_ust_created = 0;
+ char *app_ctx_provider_name = NULL, *app_ctx_name = NULL;
+
+ if (ctx->ctx == LTTNG_EVENT_CONTEXT_APP_CONTEXT) {
+ app_ctx_provider_name = ctx->u.app_ctx.provider_name;
+ app_ctx_name = ctx->u.app_ctx.ctx_name;
+ }