Create the live viewer session before attaching
authorJulien Desfossez <jdesfossez@efficios.com>
Wed, 5 Feb 2014 23:34:26 +0000 (18:34 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sat, 8 Feb 2014 15:39:01 +0000 (10:39 -0500)
The lttng-live protocol now requires that we create a viewer session
before attaching to a trace.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
formats/lttng-live/lttng-live-functions.c

index 8f86eeaebf82640c0cbcc1142748df979e50d86a..0974b567a657c50314f10d98a477ebc96179a677 100644 (file)
@@ -972,6 +972,48 @@ end:
        return;
 }
 
+int lttng_live_create_viewer_session(struct lttng_live_ctx *ctx)
+{
+       struct lttng_viewer_cmd cmd;
+       struct lttng_viewer_create_session_response resp;
+       int ret;
+       ssize_t ret_len;
+
+       cmd.cmd = htobe32(LTTNG_VIEWER_CREATE_SESSION);
+       cmd.data_size = 0;
+       cmd.cmd_version = 0;
+
+       do {
+               ret_len = send(ctx->control_sock, &cmd, sizeof(cmd), 0);
+       } while (ret_len < 0 && errno == EINTR);
+       if (ret_len < 0) {
+               fprintf(stderr, "[error] Error sending cmd\n");
+               ret = ret_len;
+               goto error;
+       }
+       assert(ret_len == sizeof(cmd));
+
+       do {
+               ret_len = recv(ctx->control_sock, &resp, sizeof(resp), 0);
+       } while (ret_len < 0 && errno == EINTR);
+       if (ret_len < 0) {
+               fprintf(stderr, "[error] Error receiving create session reply\n");
+               ret = ret_len;
+               goto error;
+       }
+       assert(ret_len == sizeof(resp));
+
+       if (be32toh(resp.status) != LTTNG_VIEWER_CREATE_SESSION_OK) {
+               fprintf(stderr, "[error] Error creating viewer session\n");
+               ret = -1;
+               goto error;
+       }
+       ret = 0;
+
+error:
+       return ret;
+}
+
 void lttng_live_read(struct lttng_live_ctx *ctx, uint64_t session_id)
 {
        int ret, active_session = 0;
@@ -1006,6 +1048,11 @@ void lttng_live_read(struct lttng_live_ctx *ctx, uint64_t session_id)
        if (!sout->parent.event_cb)
                goto end_free;
 
+       ret = lttng_live_create_viewer_session(ctx);
+       if (ret < 0) {
+               goto end_free;
+       }
+
        /*
         * As long as the session is active, we try to reattach to it,
         * even if all the streams get closed.
This page took 0.026253 seconds and 4 git commands to generate.