docs: Add supported versions and fix-backport policy
[lttng-tools.git] / src / common / payload-view.c
1 /*
2 * Copyright (C) 2020 Jérémie Galarneau <jeremie.galarneau@efficios.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only
5 *
6 */
7
8 #include <common/dynamic-array.h>
9 #include <common/buffer-view.h>
10 #include "payload-view.h"
11 #include "payload.h"
12 #include <stddef.h>
13
14 bool lttng_payload_view_is_valid(const struct lttng_payload_view *view)
15 {
16 return view && lttng_buffer_view_is_valid(&view->buffer);
17 }
18
19 struct lttng_payload_view lttng_payload_view_from_payload(
20 const struct lttng_payload *payload, size_t offset,
21 ptrdiff_t len)
22 {
23 return payload ? (struct lttng_payload_view) {
24 .buffer = lttng_buffer_view_from_dynamic_buffer(
25 &payload->buffer, offset, len),
26 ._fd_handles = payload->_fd_handles,
27 } : (struct lttng_payload_view) {};
28 }
29
30 struct lttng_payload_view lttng_payload_view_from_view(
31 struct lttng_payload_view *view, size_t offset,
32 ptrdiff_t len)
33 {
34 return view ? (struct lttng_payload_view) {
35 .buffer = lttng_buffer_view_from_view(
36 &view->buffer, offset, len),
37 ._fd_handles = view->_fd_handles,
38 ._iterator.p_fd_handles_position = view->_iterator.p_fd_handles_position ?:
39 &view->_iterator.fd_handles_position,
40 } : (struct lttng_payload_view) {};
41 }
42
43 struct lttng_payload_view lttng_payload_view_from_dynamic_buffer(
44 const struct lttng_dynamic_buffer *buffer, size_t offset,
45 ptrdiff_t len)
46 {
47 return buffer ? (struct lttng_payload_view) {
48 .buffer = lttng_buffer_view_from_dynamic_buffer(
49 buffer, offset, len)
50 } : (struct lttng_payload_view) {};
51 }
52
53 struct lttng_payload_view lttng_payload_view_from_buffer_view(
54 const struct lttng_buffer_view *view, size_t offset,
55 ptrdiff_t len)
56 {
57 return view ? (struct lttng_payload_view) {
58 .buffer = lttng_buffer_view_from_view(
59 view, offset, len)
60 } : (struct lttng_payload_view) {};
61 }
62
63 struct lttng_payload_view lttng_payload_view_init_from_buffer(
64 const char *src, size_t offset, ptrdiff_t len)
65 {
66 return (struct lttng_payload_view) {
67 .buffer = lttng_buffer_view_init(
68 src, offset, len)
69 };
70 }
71
72 int lttng_payload_view_get_fd_handle_count(
73 const struct lttng_payload_view *payload_view)
74 {
75 int ret;
76 size_t position;
77
78 if (!payload_view) {
79 ret = -1;
80 goto end;
81 }
82
83 ret = lttng_dynamic_pointer_array_get_count(&payload_view->_fd_handles);
84 if (ret < 0) {
85 goto end;
86 }
87
88 position = payload_view->_iterator.p_fd_handles_position ?
89 *payload_view->_iterator.p_fd_handles_position :
90 payload_view->_iterator.fd_handles_position;
91 ret = ret - (int) position;
92 end:
93 return ret;
94 }
95
96 struct fd_handle *lttng_payload_view_pop_fd_handle(
97 struct lttng_payload_view *view)
98 {
99 struct fd_handle *handle = NULL;
100 size_t fd_handle_count;
101 size_t *pos;
102
103 if (!view) {
104 goto end;
105 }
106
107 fd_handle_count = lttng_payload_view_get_fd_handle_count(view);
108 if (fd_handle_count == 0) {
109 goto end;
110 }
111
112 pos = view->_iterator.p_fd_handles_position ?
113 view->_iterator.p_fd_handles_position :
114 &view->_iterator.fd_handles_position;
115 handle = lttng_dynamic_pointer_array_get_pointer(&view->_fd_handles,
116 *pos);
117 (*pos)++;
118 fd_handle_get(handle);
119 end:
120 return handle;
121 }
This page took 0.030943 seconds and 4 git commands to generate.