b1a44368da2001916b4f977d04865d5b2f97390a
[lttng-tools.git] / src / common / payload-view.cpp
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 = {
39 .p_fd_handles_position = view->_iterator.p_fd_handles_position ?:
40 &view->_iterator.fd_handles_position,
41 }
42 } : (struct lttng_payload_view) {};
43 }
44
45 struct lttng_payload_view lttng_payload_view_from_dynamic_buffer(
46 const struct lttng_dynamic_buffer *buffer, size_t offset,
47 ptrdiff_t len)
48 {
49 return buffer ? (struct lttng_payload_view) {
50 .buffer = lttng_buffer_view_from_dynamic_buffer(
51 buffer, offset, len)
52 } : (struct lttng_payload_view) {};
53 }
54
55 struct lttng_payload_view lttng_payload_view_from_buffer_view(
56 const struct lttng_buffer_view *view, size_t offset,
57 ptrdiff_t len)
58 {
59 return view ? (struct lttng_payload_view) {
60 .buffer = lttng_buffer_view_from_view(
61 view, offset, len)
62 } : (struct lttng_payload_view) {};
63 }
64
65 struct lttng_payload_view lttng_payload_view_init_from_buffer(
66 const char *src, size_t offset, ptrdiff_t len)
67 {
68 return (struct lttng_payload_view) {
69 .buffer = lttng_buffer_view_init(
70 src, offset, len)
71 };
72 }
73
74 int lttng_payload_view_get_fd_handle_count(
75 const struct lttng_payload_view *payload_view)
76 {
77 int ret;
78 size_t position;
79
80 if (!payload_view) {
81 ret = -1;
82 goto end;
83 }
84
85 ret = lttng_dynamic_pointer_array_get_count(&payload_view->_fd_handles);
86 if (ret < 0) {
87 goto end;
88 }
89
90 position = payload_view->_iterator.p_fd_handles_position ?
91 *payload_view->_iterator.p_fd_handles_position :
92 payload_view->_iterator.fd_handles_position;
93 ret = ret - (int) position;
94 end:
95 return ret;
96 }
97
98 struct fd_handle *lttng_payload_view_pop_fd_handle(
99 struct lttng_payload_view *view)
100 {
101 struct fd_handle *handle = NULL;
102 size_t fd_handle_count;
103 size_t *pos;
104
105 if (!view) {
106 goto end;
107 }
108
109 fd_handle_count = lttng_payload_view_get_fd_handle_count(view);
110 if (fd_handle_count == 0) {
111 goto end;
112 }
113
114 pos = view->_iterator.p_fd_handles_position ?
115 view->_iterator.p_fd_handles_position :
116 &view->_iterator.fd_handles_position;
117 handle = (fd_handle *) lttng_dynamic_pointer_array_get_pointer(&view->_fd_handles,
118 *pos);
119 (*pos)++;
120 fd_handle_get(handle);
121 end:
122 return handle;
123 }
This page took 0.030807 seconds and 4 git commands to generate.