+static enum lttng_error_code receive_lttng_event_context(
+ const struct command_ctx *cmd_ctx,
+ int sock,
+ int *sock_error,
+ struct lttng_event_context **out_event_context)
+{
+ int ret;
+ const size_t event_context_len =
+ (size_t) cmd_ctx->lsm.u.context.length;
+ ssize_t sock_recv_len;
+ enum lttng_error_code ret_code;
+ struct lttng_payload event_context_payload;
+
+ lttng_payload_init(&event_context_payload);
+
+ ret = lttng_dynamic_buffer_set_size(&event_context_payload.buffer,
+ event_context_len);
+ if (ret) {
+ ret_code = LTTNG_ERR_NOMEM;
+ goto end;
+ }
+
+ sock_recv_len = lttcomm_recv_unix_sock(
+ sock, event_context_payload.buffer.data,
+ event_context_len);
+ if (sock_recv_len < 0 || sock_recv_len != event_context_len) {
+ ERR("Failed to receive event context in command payload");
+ *sock_error = 1;
+ ret_code = LTTNG_ERR_INVALID_PROTOCOL;
+ goto end;
+ }
+
+ /* Deserialize event. */
+ {
+ struct lttng_payload_view event_context_view =
+ lttng_payload_view_from_payload(
+ &event_context_payload, 0, -1);
+
+ if (lttng_event_context_create_from_payload(
+ &event_context_view, out_event_context) !=
+ event_context_len) {
+ ERR("Invalid event context received as part of command payload");
+ ret_code = LTTNG_ERR_INVALID_PROTOCOL;
+ goto end;
+ }
+ }
+
+ ret_code = LTTNG_OK;
+
+end:
+ lttng_payload_reset(&event_context_payload);
+ return ret_code;
+}
+