*/
#define _LGPL_SOURCE
+#include <algorithm>
+#include <ctype.h>
+#include <fcntl.h>
#include <getopt.h>
#include <grp.h>
+#include <inttypes.h>
#include <limits.h>
#include <pthread.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <strings.h>
#include <sys/mman.h>
#include <sys/mount.h>
#include <sys/resource.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/resource.h>
-#include <inttypes.h>
+#include <unistd.h>
#include <urcu/futex.h>
-#include <urcu/uatomic.h>
#include <urcu/rculist.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <strings.h>
-#include <ctype.h>
-#include <algorithm>
+#include <urcu/uatomic.h>
-#include <lttng/lttng.h>
+#include <common/align.hpp>
+#include <common/buffer-view.hpp>
#include <common/common.hpp>
-#include <common/compat/poll.hpp>
-#include <common/compat/socket.hpp>
#include <common/compat/endian.hpp>
#include <common/compat/getenv.hpp>
-#include <common/defaults.hpp>
+#include <common/compat/poll.hpp>
+#include <common/compat/socket.hpp>
#include <common/daemonize.hpp>
+#include <common/defaults.hpp>
+#include <common/dynamic-buffer.hpp>
+#include <common/fd-tracker/fd-tracker.hpp>
+#include <common/fd-tracker/utils.hpp>
#include <common/futex.hpp>
-#include <common/sessiond-comm/sessiond-comm.hpp>
+#include <common/ini-config/ini-config.hpp>
+#include <common/path.hpp>
#include <common/sessiond-comm/inet.hpp>
#include <common/sessiond-comm/relayd.hpp>
+#include <common/sessiond-comm/sessiond-comm.hpp>
+#include <common/string-utils/format.hpp>
#include <common/uri.hpp>
#include <common/utils.hpp>
-#include <common/path.hpp>
-#include <common/align.hpp>
-#include <common/ini-config/ini-config.hpp>
-#include <common/dynamic-buffer.hpp>
-#include <common/buffer-view.hpp>
-#include <common/string-utils/format.hpp>
-#include <common/fd-tracker/fd-tracker.hpp>
-#include <common/fd-tracker/utils.hpp>
+#include <lttng/lttng.h>
+#include <lttng/trace-format-descriptor-internal.hpp>
#include "backward-compatibility-group-by.hpp"
#include "cmd.hpp"
*
* On success, send back the session id or else return a negative value.
*/
-static int relay_create_session(
- const struct lttcomm_relayd_hdr *recv_hdr __attribute__((unused)),
+static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr __attribute__((unused)),
struct relay_connection *conn,
const struct lttng_buffer_view *payload)
{
int ret = 0;
+ enum lttng_error_code ret_code;
ssize_t send_ret;
struct relay_session *session = NULL;
- struct lttcomm_relayd_create_session_reply_2_11 reply = {};
+ lttcomm_relayd_create_session_reply_2_15 reply = {};
char session_name[LTTNG_NAME_MAX] = {};
char hostname[LTTNG_HOST_NAME_MAX] = {};
uint32_t live_timer = 0;
LTTNG_OPTIONAL(uint64_t) id_sessiond = {};
LTTNG_OPTIONAL(uint64_t) current_chunk_id = {};
LTTNG_OPTIONAL(time_t) creation_time = {};
+ /* The default trace format is CTF1 */
+ enum relayd_trace_format trace_format = RELAYD_TRACE_FORMAT_CTF_1;
+
struct lttng_dynamic_buffer reply_payload;
lttng_dynamic_buffer_init(&reply_payload);
ret = 0;
} else if (conn->minor >= 4 && conn->minor < 11) {
/* From 2.4 to 2.10 */
- ret = cmd_create_session_2_4(payload, session_name,
- hostname, &live_timer, &snapshot);
- } else {
+ ret = cmd_create_session_2_4(
+ payload, session_name, hostname, &live_timer, &snapshot);
+ } else if (conn->minor >= 11 && conn->minor < 15) {
+ /* From 2.11 to 2.15 */
bool has_current_chunk;
uint64_t current_chunk_id_value;
time_t creation_time_value;
if (lttng_uuid_is_nil(sessiond_uuid)) {
/* The nil UUID is reserved for pre-2.11 clients. */
ERR("Illegal nil UUID announced by peer in create session command");
- ret = -1;
+ ret_code = LTTNG_ERR_FATAL;
+ goto send_reply;
+ }
+ LTTNG_OPTIONAL_SET(&id_sessiond, id_sessiond_value);
+ LTTNG_OPTIONAL_SET(&creation_time, creation_time_value);
+ if (has_current_chunk) {
+ LTTNG_OPTIONAL_SET(¤t_chunk_id, current_chunk_id_value);
+ }
+ } else {
+ /* From 2.15 to ... */
+ bool has_current_chunk;
+ uint64_t current_chunk_id_value;
+ time_t creation_time_value;
+ uint64_t id_sessiond_value;
+
+ /* From 2.11 to ... */
+ ret = cmd_create_session_2_15(payload, session_name, hostname, base_path,
+ &live_timer, &snapshot, &id_sessiond_value, sessiond_uuid,
+ &has_current_chunk, ¤t_chunk_id_value, &creation_time_value,
+ &session_name_contains_creation_timestamp, trace_format);
+ if (lttng_uuid_is_nil(sessiond_uuid)) {
+ /* The nil UUID is reserved for pre-2.11 clients. */
+ ERR("Illegal nil UUID announced by peer in create session command");
+ ret_code = LTTNG_ERR_FATAL;
goto send_reply;
}
+
LTTNG_OPTIONAL_SET(&id_sessiond, id_sessiond_value);
LTTNG_OPTIONAL_SET(&creation_time, creation_time_value);
if (has_current_chunk) {
}
if (ret < 0) {
+ ret_code = LTTNG_ERR_FATAL;
+ goto send_reply;
+ }
+
+ /*
+ * Trace format check. TODO: move to a separate function or inside
+ * session create?
+ */
+ if (trace_format == RELAYD_TRACE_FORMAT_CTF_2 && !opt_allow_ctf2) {
+ ret_code = LTTNG_ERR_TRACE_FORMAT_UNSUPPORTED_RELAY_DAEMON;
goto send_reply;
}
- session = session_create(session_name, hostname, base_path, live_timer,
- snapshot, sessiond_uuid,
- id_sessiond.is_set ? &id_sessiond.value : NULL,
+ session = session_create(session_name, hostname, base_path, live_timer, snapshot,
+ sessiond_uuid, id_sessiond.is_set ? &id_sessiond.value : NULL,
current_chunk_id.is_set ? ¤t_chunk_id.value : NULL,
- creation_time.is_set ? &creation_time.value : NULL,
- conn->major, conn->minor,
- session_name_contains_creation_timestamp);
+ creation_time.is_set ? &creation_time.value : NULL, conn->major,
+ conn->minor, session_name_contains_creation_timestamp, trace_format);
if (!session) {
- ret = -1;
+ ret_code = LTTNG_ERR_FATAL;
goto send_reply;
}
+
LTTNG_ASSERT(!conn->session);
conn->session = session;
DBG("Created session %" PRIu64, session->id);
reply.generic.session_id = htobe64(session->id);
+ ret_code = LTTNG_OK;
send_reply:
- if (ret < 0) {
- reply.generic.ret_code = htobe32(LTTNG_ERR_FATAL);
- } else {
- reply.generic.ret_code = htobe32(LTTNG_OK);
- }
+ reply.generic.ret_code = htobe32(ret_code);
if (conn->minor < 11) {
/* From 2.1 to 2.10 */
goto end;
}
} else {
- const uint32_t output_path_length =
- session ? strlen(session->output_path) + 1 : 0;
+ /* From 2.11 to ... */
+ const uint32_t output_path_length = session ? strlen(session->output_path) + 1 : 0;
reply.output_path_length = htobe32(output_path_length);
ret = lttng_dynamic_buffer_append(