+static
+void read_packet_header(struct ctf_stream_pos *pos,
+ struct ctf_file_stream *file_stream)
+{
+ int ret;
+
+ /* update trace_packet_header and stream_packet_context */
+ if (!(pos->prot & PROT_WRITE) &&
+ file_stream->parent.trace_packet_header) {
+ /* Read packet header */
+ ret = generic_rw(&pos->parent,
+ &file_stream->parent.trace_packet_header->p);
+ if (ret) {
+ pos->offset = EOF;
+ fprintf(stderr, "[error] trace packet "
+ "header read failed\n");
+ goto end;
+ }
+ }
+ if (!(pos->prot & PROT_WRITE) &&
+ file_stream->parent.stream_packet_context) {
+ /* Read packet context */
+ ret = generic_rw(&pos->parent,
+ &file_stream->parent.stream_packet_context->p);
+ if (ret) {
+ pos->offset = EOF;
+ fprintf(stderr, "[error] stream packet "
+ "context read failed\n");
+ goto end;
+ }
+ }
+ pos->data_offset = pos->offset;
+
+end:
+ return;
+}
+
+/*
+ * Handle the seek parameters.
+ * Returns 0 if the packet_seek can continue, a positive value to
+ * cleanly exit the packet_seek, a negative value on error.
+ */
+static
+int handle_seek_position(size_t index, int whence,
+ struct lttng_live_viewer_stream *viewer_stream,
+ struct ctf_stream_pos *pos,
+ struct ctf_file_stream *file_stream)
+{
+ int ret = 0;
+
+ switch (whence) {
+ case SEEK_CUR:
+ ret = 0;
+ goto end;
+ case SEEK_SET:
+ /*
+ * We only allow to seek to 0.
+ */
+ if (index != 0) {
+ fprintf(stderr, "[error] Arbitrary seek in lttng-live "
+ "trace not supported\n");
+ pos->offset = EOF;
+ ret = -1;
+ goto end;
+ }
+
+ ret = 0;
+ goto end;
+
+ default:
+ fprintf(stderr, "[error] Invalid seek parameter\n");
+ assert(0);
+ }
+
+end:
+ return ret;
+}
+