+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;
+}
+