Commit | Line | Data |
---|---|---|
c0a66c84 JG |
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 | ||
c9e313bc SM |
8 | #include "payload-view.hpp" |
9 | #include "payload.hpp" | |
28ab034a JG |
10 | |
11 | #include <common/buffer-view.hpp> | |
12 | #include <common/dynamic-array.hpp> | |
13 | ||
c0a66c84 JG |
14 | #include <stddef.h> |
15 | ||
3e6e0df2 JG |
16 | bool lttng_payload_view_is_valid(const struct lttng_payload_view *view) |
17 | { | |
18 | return view && lttng_buffer_view_is_valid(&view->buffer); | |
19 | } | |
20 | ||
28ab034a JG |
21 | struct lttng_payload_view |
22 | lttng_payload_view_from_payload(const struct lttng_payload *payload, size_t offset, ptrdiff_t len) | |
c0a66c84 | 23 | { |
28ab034a JG |
24 | return payload ? |
25 | (struct lttng_payload_view){ | |
26 | .buffer = lttng_buffer_view_from_dynamic_buffer( | |
27 | &payload->buffer, offset, len), | |
28 | ._fd_handles = payload->_fd_handles, | |
29 | ._iterator = {}, | |
30 | } : | |
31 | (struct lttng_payload_view){ | |
32 | .buffer = {}, | |
33 | ._fd_handles = {}, | |
34 | ._iterator = {}, | |
35 | }; | |
c0a66c84 JG |
36 | } |
37 | ||
28ab034a JG |
38 | struct lttng_payload_view |
39 | lttng_payload_view_from_view(struct lttng_payload_view *view, size_t offset, ptrdiff_t len) | |
c0a66c84 | 40 | { |
3e6e0df2 | 41 | return view ? (struct lttng_payload_view) { |
c0a66c84 | 42 | .buffer = lttng_buffer_view_from_view( |
ddab38d1 | 43 | &view->buffer, offset, len), |
fe489250 | 44 | ._fd_handles = view->_fd_handles, |
a6bc4ca9 SM |
45 | ._iterator = { |
46 | .p_fd_handles_position = view->_iterator.p_fd_handles_position ?: | |
fe489250 | 47 | &view->_iterator.fd_handles_position, |
1c9a0b0e | 48 | .fd_handles_position = 0, |
a6bc4ca9 | 49 | } |
75864046 MJ |
50 | } : (struct lttng_payload_view) { |
51 | .buffer = {}, | |
1c9a0b0e MJ |
52 | ._fd_handles = {}, |
53 | ._iterator = {}, | |
75864046 | 54 | }; |
c0a66c84 JG |
55 | } |
56 | ||
c0a66c84 | 57 | struct lttng_payload_view lttng_payload_view_from_dynamic_buffer( |
28ab034a | 58 | const struct lttng_dynamic_buffer *buffer, size_t offset, ptrdiff_t len) |
c0a66c84 | 59 | { |
28ab034a JG |
60 | return buffer ? |
61 | (struct lttng_payload_view){ | |
62 | .buffer = lttng_buffer_view_from_dynamic_buffer(buffer, offset, len), | |
63 | ._fd_handles = {}, | |
64 | ._iterator = {}, | |
65 | } : | |
66 | (struct lttng_payload_view){ | |
67 | .buffer = {}, | |
68 | ._fd_handles = {}, | |
69 | ._iterator = {}, | |
70 | }; | |
c0a66c84 JG |
71 | } |
72 | ||
28ab034a JG |
73 | struct lttng_payload_view lttng_payload_view_from_buffer_view(const struct lttng_buffer_view *view, |
74 | size_t offset, | |
75 | ptrdiff_t len) | |
5a2f5f00 | 76 | { |
28ab034a JG |
77 | return view ? |
78 | (struct lttng_payload_view){ | |
79 | .buffer = lttng_buffer_view_from_view(view, offset, len), | |
80 | ._fd_handles = {}, | |
81 | ._iterator = {}, | |
82 | } : | |
83 | (struct lttng_payload_view){ | |
84 | .buffer = {}, | |
85 | ._fd_handles = {}, | |
86 | ._iterator = {}, | |
87 | }; | |
5a2f5f00 JG |
88 | } |
89 | ||
28ab034a JG |
90 | struct lttng_payload_view |
91 | lttng_payload_view_init_from_buffer(const char *src, size_t offset, ptrdiff_t len) | |
e368fb43 | 92 | { |
28ab034a JG |
93 | return (struct lttng_payload_view){ |
94 | .buffer = lttng_buffer_view_init(src, offset, len), | |
1c9a0b0e MJ |
95 | ._fd_handles = {}, |
96 | ._iterator = {}, | |
e368fb43 JG |
97 | }; |
98 | } | |
99 | ||
28ab034a | 100 | int lttng_payload_view_get_fd_handle_count(const struct lttng_payload_view *payload_view) |
5a2f5f00 JG |
101 | { |
102 | int ret; | |
103 | size_t position; | |
104 | ||
105 | if (!payload_view) { | |
106 | ret = -1; | |
107 | goto end; | |
108 | } | |
109 | ||
fe489250 | 110 | ret = lttng_dynamic_pointer_array_get_count(&payload_view->_fd_handles); |
5a2f5f00 JG |
111 | if (ret < 0) { |
112 | goto end; | |
113 | } | |
114 | ||
fe489250 | 115 | position = payload_view->_iterator.p_fd_handles_position ? |
28ab034a JG |
116 | *payload_view->_iterator.p_fd_handles_position : |
117 | payload_view->_iterator.fd_handles_position; | |
5a2f5f00 JG |
118 | ret = ret - (int) position; |
119 | end: | |
120 | return ret; | |
121 | } | |
122 | ||
28ab034a | 123 | struct fd_handle *lttng_payload_view_pop_fd_handle(struct lttng_payload_view *view) |
c0a66c84 | 124 | { |
cd9adb8b | 125 | struct fd_handle *handle = nullptr; |
fe489250 | 126 | size_t fd_handle_count; |
c0a66c84 JG |
127 | size_t *pos; |
128 | ||
129 | if (!view) { | |
c0a66c84 JG |
130 | goto end; |
131 | } | |
132 | ||
fe489250 JG |
133 | fd_handle_count = lttng_payload_view_get_fd_handle_count(view); |
134 | if (fd_handle_count == 0) { | |
c0a66c84 JG |
135 | goto end; |
136 | } | |
137 | ||
28ab034a JG |
138 | pos = view->_iterator.p_fd_handles_position ? view->_iterator.p_fd_handles_position : |
139 | &view->_iterator.fd_handles_position; | |
140 | handle = (fd_handle *) lttng_dynamic_pointer_array_get_pointer(&view->_fd_handles, *pos); | |
c0a66c84 | 141 | (*pos)++; |
fe489250 | 142 | fd_handle_get(handle); |
c0a66c84 | 143 | end: |
fe489250 | 144 | return handle; |
c0a66c84 | 145 | } |