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 | ||
5a2f5f00 | 8 | #include <common/dynamic-array.h> |
c0a66c84 JG |
9 | #include <common/buffer-view.h> |
10 | #include "payload-view.h" | |
11 | #include "payload.h" | |
12 | #include <stddef.h> | |
13 | ||
14 | LTTNG_HIDDEN | |
15 | struct lttng_payload_view lttng_payload_view_from_payload( | |
16 | const struct lttng_payload *payload, size_t offset, | |
17 | ptrdiff_t len) | |
18 | { | |
19 | return (struct lttng_payload_view) { | |
20 | .buffer = lttng_buffer_view_from_dynamic_buffer( | |
21 | &payload->buffer, offset, len), | |
22 | ._fds = payload->_fds, | |
23 | }; | |
24 | } | |
25 | ||
26 | LTTNG_HIDDEN | |
27 | struct lttng_payload_view lttng_payload_view_from_view( | |
28 | struct lttng_payload_view *view, size_t offset, | |
29 | ptrdiff_t len) | |
30 | { | |
31 | return (struct lttng_payload_view) { | |
32 | .buffer = lttng_buffer_view_from_view( | |
33 | &view->buffer, offset, len), | |
34 | ._fds = view->_fds, | |
35 | ._iterator.p_fds_position = &view->_iterator.fds_position, | |
36 | }; | |
37 | } | |
38 | ||
39 | LTTNG_HIDDEN | |
40 | struct lttng_payload_view lttng_payload_view_from_dynamic_buffer( | |
41 | const struct lttng_dynamic_buffer *buffer, size_t offset, | |
42 | ptrdiff_t len) | |
43 | { | |
44 | return (struct lttng_payload_view) { | |
45 | .buffer = lttng_buffer_view_from_dynamic_buffer( | |
46 | buffer, offset, len) | |
47 | }; | |
48 | } | |
49 | ||
5a2f5f00 JG |
50 | LTTNG_HIDDEN |
51 | struct lttng_payload_view lttng_payload_view_from_buffer_view( | |
52 | const struct lttng_buffer_view *view, size_t offset, | |
53 | ptrdiff_t len) | |
54 | { | |
55 | return (struct lttng_payload_view) { | |
56 | .buffer = lttng_buffer_view_from_view( | |
57 | view, offset, len) | |
58 | }; | |
59 | } | |
60 | ||
61 | LTTNG_HIDDEN | |
62 | int lttng_payload_view_get_fd_count(struct lttng_payload_view *payload_view) | |
63 | { | |
64 | int ret; | |
65 | size_t position; | |
66 | ||
67 | if (!payload_view) { | |
68 | ret = -1; | |
69 | goto end; | |
70 | } | |
71 | ||
72 | ret = lttng_dynamic_array_get_count(&payload_view->_fds); | |
73 | if (ret < 0) { | |
74 | goto end; | |
75 | } | |
76 | ||
77 | position = payload_view->_iterator.p_fds_position ? | |
78 | *payload_view->_iterator.p_fds_position : | |
79 | payload_view->_iterator.fds_position; | |
80 | ret = ret - (int) position; | |
81 | end: | |
82 | return ret; | |
83 | } | |
84 | ||
c0a66c84 JG |
85 | LTTNG_HIDDEN |
86 | int lttng_payload_view_pop_fd(struct lttng_payload_view *view) | |
87 | { | |
88 | int ret = 0; | |
89 | size_t fd_count; | |
90 | size_t *pos; | |
91 | ||
92 | if (!view) { | |
93 | ret = -1; | |
94 | goto end; | |
95 | } | |
96 | ||
97 | fd_count = lttng_dynamic_array_get_count(&view->_fds); | |
98 | pos = view->_iterator.p_fds_position ? view->_iterator.p_fds_position : | |
99 | &view->_iterator.fds_position; | |
100 | ||
101 | if (*pos >= fd_count) { | |
102 | ret = -1; | |
103 | goto end; | |
104 | } | |
105 | ||
106 | ret = *((int *) lttng_dynamic_array_get_element( | |
107 | &view->_fds, *pos)); | |
108 | (*pos)++; | |
109 | end: | |
110 | return ret; | |
111 | } |