common: add lttng_payload_view fd count accessor and buffer init
[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 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
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
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 }
This page took 0.030832 seconds and 4 git commands to generate.