X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fpayload.c;h=635d3e3fbc65bdda94386ec1111ca92e45d01fb5;hp=592964a519b13ce6996e178df222b50e3cd81e5a;hb=e368fb4396b9bdb22de16f0c93512c9f6d7ab0b4;hpb=ddab38d1659326ae7933319adefc3dff243da352 diff --git a/src/common/payload.c b/src/common/payload.c index 592964a51..635d3e3fb 100644 --- a/src/common/payload.c +++ b/src/common/payload.c @@ -6,6 +6,9 @@ */ #include "payload.h" +#include +#include +#include LTTNG_HIDDEN void lttng_payload_init(struct lttng_payload *payload) @@ -15,6 +18,52 @@ void lttng_payload_init(struct lttng_payload *payload) lttng_dynamic_array_init(&payload->_fds, sizeof(int), NULL); } +LTTNG_HIDDEN +int lttng_payload_copy(const struct lttng_payload *src_payload, + struct lttng_payload *dst_payload) +{ + int ret; + size_t i; + + lttng_payload_init(dst_payload); + ret = lttng_dynamic_buffer_append_buffer( + &dst_payload->buffer, &src_payload->buffer); + if (ret) { + goto error; + } + + for (i = 0; i < lttng_dynamic_array_get_count(&src_payload->_fds); + i++) { + int dst_fd; + const int src_fd = *((int *) lttng_dynamic_array_get_element( + &src_payload->_fds, i)); + + dst_fd = dup(src_fd); + if (dst_fd < 0) { + PERROR("Failed to duplicate file descriptor while copying a payload"); + ret = dst_fd; + goto error; + } + + ret = lttng_payload_push_fd(dst_payload, dst_fd); + if (ret) { + const int close_ret = close(dst_fd); + + if (close_ret < 0) { + PERROR("Failed to close duplicated file descriptor while copying a payload"); + } + + goto error; + } + } + +end: + return ret; +error: + lttng_payload_reset(dst_payload); + goto end; +} + LTTNG_HIDDEN void lttng_payload_reset(struct lttng_payload *payload) {