futex_nto1_wake(&ust_cmd_queue.futex);
}
+/*
+ * Close every consumer sockets.
+ */
+static void close_consumer_sockets(void)
+{
+ int ret;
+
+ if (kconsumer_data.err_sock >= 0) {
+ ret = close(kconsumer_data.err_sock);
+ if (ret < 0) {
+ PERROR("kernel consumer err_sock close");
+ }
+ }
+ if (ustconsumer32_data.err_sock >= 0) {
+ ret = close(ustconsumer32_data.err_sock);
+ if (ret < 0) {
+ PERROR("UST consumer32 err_sock close");
+ }
+ }
+ if (ustconsumer64_data.err_sock >= 0) {
+ ret = close(ustconsumer64_data.err_sock);
+ if (ret < 0) {
+ PERROR("UST consumer64 err_sock close");
+ }
+ }
+ if (kconsumer_data.cmd_sock >= 0) {
+ ret = close(kconsumer_data.cmd_sock);
+ if (ret < 0) {
+ PERROR("kernel consumer cmd_sock close");
+ }
+ }
+ if (ustconsumer32_data.cmd_sock >= 0) {
+ ret = close(ustconsumer32_data.cmd_sock);
+ if (ret < 0) {
+ PERROR("UST consumer32 cmd_sock close");
+ }
+ }
+ if (ustconsumer64_data.cmd_sock >= 0) {
+ ret = close(ustconsumer64_data.cmd_sock);
+ if (ret < 0) {
+ PERROR("UST consumer64 cmd_sock close");
+ }
+ }
+}
+
/*
* Cleanup the daemon
*/
modprobe_remove_lttng_all();
}
+ close_consumer_sockets();
+
/* <fun> */
DBG("%c[%d;%dm*** assert failed :-) *** ==> %c[%dm%c[%d;%dm"
"Matthew, BEET driven development works!%c[%dm",
pthread_mutex_lock(socket->lock);
ret = kernel_consumer_send_channel_stream(socket,
- channel, ksess);
+ channel, ksess,
+ session->output_traces ? 1 : 0);
pthread_mutex_unlock(socket->lock);
if (ret < 0) {
rcu_read_unlock();
lus->uid = session->uid;
lus->gid = session->gid;
+ lus->output_traces = session->output_traces;
session->ust_session = lus;
/* Copy session output to the newly created UST session */
session->kernel_session->uid = session->uid;
session->kernel_session->gid = session->gid;
+ session->kernel_session->output_traces = session->output_traces;
return LTTNG_OK;
}
case LTTNG_SNAPSHOT_ADD_OUTPUT:
{
- ret = LTTNG_ERR_UND;
+ struct lttcomm_lttng_output_id reply;
+
+ ret = cmd_snapshot_add_output(cmd_ctx->session,
+ &cmd_ctx->lsm->u.snapshot_output.output, &reply.id);
+ if (ret != LTTNG_OK) {
+ goto error;
+ }
+
+ ret = setup_lttng_msg(cmd_ctx, sizeof(reply));
+ if (ret < 0) {
+ goto setup_error;
+ }
+
+ /* Copy output list into message payload */
+ memcpy(cmd_ctx->llm->payload, &reply, sizeof(reply));
+ ret = LTTNG_OK;
break;
}
case LTTNG_SNAPSHOT_DEL_OUTPUT:
{
- ret = LTTNG_ERR_UND;
+ ret = cmd_snapshot_del_output(cmd_ctx->session,
+ &cmd_ctx->lsm->u.snapshot_output.output);
break;
}
case LTTNG_SNAPSHOT_LIST_OUTPUT:
{
- ret = LTTNG_ERR_UND;
+ ssize_t nb_output;
+ struct lttng_snapshot_output *outputs = NULL;
+
+ nb_output = cmd_snapshot_list_outputs(cmd_ctx->session, &outputs);
+ if (nb_output < 0) {
+ ret = -nb_output;
+ goto error;
+ }
+
+ ret = setup_lttng_msg(cmd_ctx,
+ nb_output * sizeof(struct lttng_snapshot_output));
+ if (ret < 0) {
+ free(outputs);
+ goto setup_error;
+ }
+
+ if (outputs) {
+ /* Copy output list into message payload */
+ memcpy(cmd_ctx->llm->payload, outputs,
+ nb_output * sizeof(struct lttng_snapshot_output));
+ free(outputs);
+ }
+
+ ret = LTTNG_OK;
break;
}
case LTTNG_SNAPSHOT_RECORD:
{
- ret = LTTNG_ERR_UND;
+ ret = cmd_snapshot_record(cmd_ctx->session,
+ &cmd_ctx->lsm->u.snapshot_record.output,
+ cmd_ctx->lsm->u.snapshot_record.wait);
break;
}
default: