-/*
- * Get one index for a stream.
- */
-int get_next_index(int id, struct packet_index *index)
-{
- struct lttng_viewer_cmd cmd;
- struct lttng_viewer_get_next_index rq;
- struct lttng_viewer_index rp;
- int ret;
-
- cmd.cmd = htobe32(VIEWER_GET_NEXT_INDEX);
- cmd.data_size = sizeof(rq);
- cmd.cmd_version = 0;
-
- fprintf(stderr, " - get next index for stream %" PRIu64 "\n",
- session->streams[id].id);
- rq.stream_id = htobe64(session->streams[id].id);
-
-retry:
- do {
- ret = send(control_sock, &cmd, sizeof(cmd), 0);
- } while (ret < 0 && errno == EINTR);
- if (ret < 0) {
- fprintf(stderr, "Error sending cmd\n");
- goto error;
- }
- do {
- ret = send(control_sock, &rq, sizeof(rq), 0);
- } while (ret < 0 && errno == EINTR);
- if (ret < 0) {
- fprintf(stderr, "Error sending get_next_index request\n");
- goto error;
- }
- do {
- ret = recv(control_sock, &rp, sizeof(rp), 0);
- } while (ret < 0 && errno == EINTR);
- if (ret < 0) {
- fprintf(stderr, "Error receiving index response\n");
- goto error;
- }
- fprintf(stderr, " - reply : %u ", be32toh(rp.status));
-
- rp.flags = be32toh(rp.flags);
-
- switch (be32toh(rp.status)) {
- case VIEWER_INDEX_INACTIVE:
- fprintf(stderr, "(INACTIVE)\n");
- memset(index, 0, sizeof(struct packet_index));
- index->timestamp_end = be64toh(rp.timestamp_end);
- break;
- case VIEWER_INDEX_OK:
- fprintf(stderr, "(OK), need metadata update : %u\n",
- rp.flags & LTTNG_VIEWER_FLAG_NEW_METADATA);
- index->offset = be64toh(rp.offset);
- index->packet_size = be64toh(rp.packet_size);
- index->content_size = be64toh(rp.content_size);
- index->timestamp_begin = be64toh(rp.timestamp_begin);
- index->timestamp_end = be64toh(rp.timestamp_end);
- index->events_discarded = be64toh(rp.events_discarded);
-
- if (rp.flags & LTTNG_VIEWER_FLAG_NEW_METADATA) {
- fprintf(stderr, "NEW METADATA NEEDED\n");
- ret = get_new_metadata(id);
- if (ret < 0) {
- goto error;
- }
- }
- break;
- case VIEWER_INDEX_RETRY:
- fprintf(stderr, "(RETRY)\n");
- sleep(1);
- goto retry;
- case VIEWER_INDEX_HUP:
- fprintf(stderr, "(HUP)\n");
- session->streams[id].id = -1ULL;
- session->streams[id].fd = -1;
- break;
- case VIEWER_INDEX_ERR:
- fprintf(stderr, "(ERR)\n");
- ret = -1;
- goto error;
- default:
- fprintf(stderr, "SHOULD NOT HAPPEN\n");
- ret = -1;
- goto error;
- }
-
-error:
- return ret;
-}