2 * Copyright (C) 2019 Jonathan Rajotte-Julien <jonathan.rajotte-julien@efficios.com>
4 * SPDX-License-Identifier: LGPL-2.1-only
9 #include <common/defaults.h>
10 #include <common/error.h>
11 #include <common/macros.h>
12 #include <common/sessiond-comm/sessiond-comm.h>
13 #include <common/uri.h>
14 #include <lttng/tracker-internal.h>
18 struct lttng_tracker_id
*lttng_tracker_id_create(void)
20 struct lttng_tracker_id
*id
;
22 id
= zmalloc(sizeof(*id
));
27 id
->type
= LTTNG_ID_UNKNOWN
;
32 lttng_tracker_id_destroy(id
);
36 enum lttng_tracker_id_status
lttng_tracker_id_set_value(
37 struct lttng_tracker_id
*id
, int value
)
42 return LTTNG_TRACKER_ID_STATUS_INVALID
;
45 id
->type
= LTTNG_ID_VALUE
;
47 return LTTNG_TRACKER_ID_STATUS_OK
;
50 enum lttng_tracker_id_status
lttng_tracker_id_set_string(
51 struct lttng_tracker_id
*id
, const char *value
)
56 id
->type
= LTTNG_ID_STRING
;
57 id
->string
= strdup(value
);
58 if (id
->string
== NULL
) {
63 return LTTNG_TRACKER_ID_STATUS_OK
;
65 return LTTNG_TRACKER_ID_STATUS_INVALID
;
68 enum lttng_tracker_id_status
lttng_tracker_id_set_all(
69 struct lttng_tracker_id
*id
)
73 id
->type
= LTTNG_ID_ALL
;
75 return LTTNG_TRACKER_ID_STATUS_OK
;
78 static void lttng_tracker_id_reset(struct lttng_tracker_id
*id
)
84 if (id
->string
!= NULL
) {
89 id
->type
= LTTNG_ID_UNKNOWN
;
93 void lttng_tracker_id_destroy(struct lttng_tracker_id
*id
)
99 lttng_tracker_id_reset(id
);
104 enum lttng_tracker_id_type
lttng_tracker_id_get_type(
105 const struct lttng_tracker_id
*id
)
111 enum lttng_tracker_id_status
lttng_tracker_id_get_value(
112 const struct lttng_tracker_id
*id
, int *value
)
115 if (id
->type
== LTTNG_ID_UNKNOWN
) {
116 return LTTNG_TRACKER_ID_STATUS_UNSET
;
119 if (id
->type
!= LTTNG_ID_VALUE
) {
120 return LTTNG_TRACKER_ID_STATUS_INVALID
;
124 return LTTNG_TRACKER_ID_STATUS_OK
;
127 bool lttng_tracker_id_is_equal(const struct lttng_tracker_id
*left
,
128 const struct lttng_tracker_id
*right
)
130 if (left
->type
!= right
->type
) {
134 switch (left
->type
) {
138 if (left
->value
!= right
->value
) {
142 case LTTNG_ID_STRING
:
143 if (strcmp(left
->string
, right
->string
) != 0) {
149 * Normally this should return true, but comparing unset tracker
157 int lttng_tracker_id_copy(struct lttng_tracker_id
*dest
,
158 const struct lttng_tracker_id
*orig
)
161 enum lttng_tracker_id_status status
;
166 switch (orig
->type
) {
168 status
= lttng_tracker_id_set_all(dest
);
171 status
= lttng_tracker_id_set_value(dest
, orig
->value
);
173 case LTTNG_ID_STRING
:
174 status
= lttng_tracker_id_set_string(dest
, orig
->string
);
177 status
= LTTNG_TRACKER_ID_STATUS_OK
;
181 if (status
!= LTTNG_TRACKER_ID_STATUS_OK
) {
189 struct lttng_tracker_id
*lttng_tracker_id_duplicate(
190 const struct lttng_tracker_id
*orig
)
193 struct lttng_tracker_id
*copy
= NULL
;
195 copy
= lttng_tracker_id_create();
200 ret
= lttng_tracker_id_copy(copy
, orig
);
207 lttng_tracker_id_destroy(copy
);
211 enum lttng_tracker_id_status
lttng_tracker_id_get_string(
212 const struct lttng_tracker_id
*id
, const char **value
)
215 if (id
->type
== LTTNG_ID_UNKNOWN
) {
217 return LTTNG_TRACKER_ID_STATUS_UNSET
;
220 if (id
->type
!= LTTNG_ID_STRING
) {
222 return LTTNG_TRACKER_ID_STATUS_INVALID
;
226 return LTTNG_TRACKER_ID_STATUS_OK
;
229 struct lttng_tracker_ids
*lttng_tracker_ids_create(unsigned int count
)
231 struct lttng_tracker_ids
*ids
= NULL
;
233 ids
= zmalloc(sizeof(*ids
));
238 ids
->id_array
= zmalloc(sizeof(struct lttng_tracker_id
) * count
);
239 if (!ids
->id_array
) {
252 struct lttng_tracker_id
*lttng_tracker_ids_get_pointer_of_index(
253 const struct lttng_tracker_ids
*ids
, unsigned int index
)
256 if (index
>= ids
->count
) {
260 return &ids
->id_array
[index
];
263 const struct lttng_tracker_id
*lttng_tracker_ids_get_at_index(
264 const struct lttng_tracker_ids
*ids
, unsigned int index
)
267 return lttng_tracker_ids_get_pointer_of_index(ids
, index
);
270 enum lttng_tracker_id_status
lttng_tracker_ids_get_count(const struct lttng_tracker_ids
*ids
, unsigned int *count
)
273 enum lttng_tracker_id_status status
= LTTNG_TRACKER_ID_STATUS_OK
;
275 if (!ids
|| !count
) {
276 status
= LTTNG_TRACKER_ID_STATUS_INVALID
;
285 void lttng_tracker_ids_destroy(struct lttng_tracker_ids
*ids
)
293 for (i
= 0; i
< ids
->count
; i
++) {
294 lttng_tracker_id_reset(&ids
->id_array
[i
]);
300 int lttng_tracker_ids_serialize(const struct lttng_tracker_ids
*ids
,
301 struct lttng_dynamic_buffer
*buffer
)
305 const char *string
= NULL
;
307 enum lttng_tracker_id_status status
;
308 const struct lttng_tracker_id
*id
;
311 status
= lttng_tracker_ids_get_count(ids
, &count
);
312 if (status
!= LTTNG_TRACKER_ID_STATUS_OK
) {
313 ret
= LTTNG_ERR_INVALID
;
317 for (i
= 0; i
< count
; i
++) {
318 struct lttcomm_tracker_id_header id_hdr
;
319 size_t var_data_len
= 0;
321 id
= lttng_tracker_ids_get_at_index(ids
, i
);
323 ret
= -LTTNG_ERR_INVALID
;
327 memset(&id_hdr
, 0, sizeof(id_hdr
));
328 id_hdr
.type
= lttng_tracker_id_get_type(id
);
329 switch (id_hdr
.type
) {
333 status
= lttng_tracker_id_get_value(id
, &value
);
334 id_hdr
.u
.value
= value
;
335 if (status
!= LTTNG_TRACKER_ID_STATUS_OK
) {
336 ret
= -LTTNG_ERR_INVALID
;
340 case LTTNG_ID_STRING
:
341 status
= lttng_tracker_id_get_string(
343 if (status
!= LTTNG_TRACKER_ID_STATUS_OK
) {
344 ret
= -LTTNG_ERR_INVALID
;
348 id_hdr
.u
.var_data_len
= var_data_len
=
352 ret
= -LTTNG_ERR_INVALID
;
355 ret
= lttng_dynamic_buffer_append(
356 buffer
, &id_hdr
, sizeof(id_hdr
));
358 ret
= -LTTNG_ERR_NOMEM
;
361 ret
= lttng_dynamic_buffer_append(
362 buffer
, string
, var_data_len
);
364 ret
= -LTTNG_ERR_NOMEM
;