/*
- * Copyright (C) 2019 - Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2019 Jérémie Galarneau <jeremie.galarneau@efficios.com>
*
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License, version 2.1 only,
- * as published by the Free Software Foundation.
+ * SPDX-License-Identifier: LGPL-2.1-only
*
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <lttng/destruction-handle.h>
if (ret) {
PERROR("Failed to close lttng-sessiond command socket");
}
- }
- lttng_poll_clean(&handle->communication.events);
+ }
+ lttng_poll_clean(&handle->communication.events);
lttng_dynamic_buffer_reset(&handle->communication.buffer);
- lttng_trace_archive_location_destroy(handle->location);
+ lttng_trace_archive_location_put(handle->location);
free(handle);
}
ret = lttng_poll_add(&handle->communication.events, sessiond_socket,
LPOLLIN | LPOLLHUP | LPOLLRDHUP | LPOLLERR);
- if (ret) {
+ if (ret) {
goto error;
- }
+ }
handle->communication.bytes_left_to_receive =
sizeof(struct lttcomm_lttng_msg);
ret = -1;
break;
} else {
+ /* Ownership is transferred to the destruction handle. */
handle->location = location;
handle->communication.state = COMMUNICATION_STATE_END;
}
lttng_destruction_handle_wait_for_completion(
struct lttng_destruction_handle *handle, int timeout_ms)
{
- int ret;
enum lttng_destruction_handle_status status;
unsigned long time_left_ms = 0;
const bool has_timeout = timeout_ms > 0;
- struct timespec initial_time;
+ struct timespec initial_time;
+
+ if (!handle) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
- if (handle->communication.state == COMMUNICATION_STATE_ERROR) {
+ if (handle->communication.state == COMMUNICATION_STATE_ERROR) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_ERROR;
goto end;
} else if (handle->communication.state == COMMUNICATION_STATE_END) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_COMPLETED;
goto end;
}
- if (has_timeout) {
- ret = lttng_clock_gettime(CLOCK_MONOTONIC, &initial_time);
+ if (has_timeout) {
+ int ret = lttng_clock_gettime(CLOCK_MONOTONIC, &initial_time);
if (ret) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_ERROR;
goto end;
}
time_left_ms = (unsigned long) timeout_ms;
- }
+ }
- while (handle->communication.state != COMMUNICATION_STATE_END &&
+ while (handle->communication.state != COMMUNICATION_STATE_END &&
(time_left_ms || !has_timeout)) {
int ret;
uint32_t revents;
- struct timespec current_time, diff;
+ struct timespec current_time, diff;
unsigned long diff_ms;
- ret = lttng_poll_wait(&handle->communication.events,
+ ret = lttng_poll_wait(&handle->communication.events,
has_timeout ? time_left_ms : -1);
- if (ret == 0) {
+ if (ret == 0) {
/* timeout */
break;
} else if (ret < 0) {
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !rotation_state) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->rotation_state.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !location) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->location) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
enum lttng_destruction_handle_status status =
LTTNG_DESTRUCTION_HANDLE_STATUS_OK;
+ if (!handle || !result) {
+ status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
+ goto end;
+ }
+
if (!handle->destruction_return_code.is_set) {
status = LTTNG_DESTRUCTION_HANDLE_STATUS_INVALID;
goto end;
int ret;
ssize_t comm_ret;
enum lttng_error_code ret_code = LTTNG_OK;
- struct lttcomm_session_msg lsm = {
+ struct lttcomm_session_msg lsm = {
.cmd_type = LTTNG_DESTROY_SESSION,
};
int sessiond_socket = -1;
struct lttng_destruction_handle *handle = NULL;
+ if (!session_name) {
+ ret_code = LTTNG_ERR_INVALID;
+ goto error;
+ }
+
ret = lttng_strncpy(lsm.session.name, session_name,
sizeof(lsm.session.name));
if (ret) {
goto error;
}
- comm_ret = lttcomm_send_unix_sock(sessiond_socket, &lsm, sizeof(lsm));
+ comm_ret = lttcomm_send_creds_unix_sock(sessiond_socket, &lsm, sizeof(lsm));
if (comm_ret < 0) {
ret_code = LTTNG_ERR_FATAL;
goto error;
error:
if (sessiond_socket >= 0) {
ret = close(sessiond_socket);
- PERROR("Failed to close the LTTng session daemon connection socket");
+ if (ret < 0) {
+ PERROR("Failed to close the LTTng session daemon connection socket");
+ }
}
if (handle) {
lttng_destruction_handle_destroy(handle);