/*
- * Copyright (C) 2011 David Goulet <david.goulet@polymtl.ca>
+ * Copyright (C) 2011 EfficiOS Inc.
* Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
*
* SPDX-License-Identifier: GPL-2.0-only
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
-#include <errno.h>
#include <common/common.h>
+#include <common/compat/errno.h>
#include <common/sessiond-comm/sessiond-comm.h>
#include <common/fd-handle.h>
ssize_t ret = -1;
size_t len_last;
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = buf;
struct iovec iov[1];
ssize_t ret;
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = buf;
struct iovec iov[1];
ssize_t ret;
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = (void *) buf;
struct iovec iov[1];
ssize_t ret;
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
memset(&msg, 0, sizeof(msg));
iov[0].iov_base = (void *) buf;
char tmp[CMSG_SPACE(sizeof_fds)];
char dummy = 0;
+ assert(sock);
+ assert(fds);
+ assert(nb_fd > 0);
+
memset(&msg, 0, sizeof(msg));
memset(tmp, 0, sizeof(tmp));
char tmp[CMSG_SPACE(sizeof_fds)];
char dummy = 0;
+ assert(sock);
+ assert(fds);
+ assert(nb_fd > 0);
+
memset(&msg, 0, sizeof(msg));
memset(tmp, 0, sizeof(tmp));
struct msghdr msg;
char dummy;
+ assert(sock);
+ assert(fds);
+ assert(nb_fd > 0);
+
memset(&msg, 0, sizeof(msg));
/* Prepare to receive the structures */
int *raw_fd = (int *) lttng_dynamic_array_get_element(
raw_fds, i);
+ assert(*raw_fd != -1);
+
handle = fd_handle_create(*raw_fd);
if (!handle) {
ret_code = LTTNG_ERR_NOMEM;
ssize_t _lttcomm_recv_payload_fds_unix_sock(int sock, size_t nb_fd,
struct lttng_payload *payload, bool blocking)
{
+ int i = 0;
enum lttng_error_code add_ret;
ssize_t ret;
+ int default_value = -1;
struct lttng_dynamic_array raw_fds;
+ assert(sock);
+ assert(payload);
+ assert(nb_fd > 0);
+
lttng_dynamic_array_init(&raw_fds, sizeof(int), close_raw_fd);
- ret = lttng_dynamic_array_set_count(&raw_fds, nb_fd);
- if (ret) {
- ret = -LTTNG_ERR_NOMEM;
- goto end;
+
+ for (i = 0; i < nb_fd; i++) {
+ if (lttng_dynamic_array_add_element(&raw_fds, &default_value)) {
+ ret = -LTTNG_ERR_NOMEM;
+ goto end;
+ }
}
if (blocking) {
sock, (int *) raw_fds.buffer.data, nb_fd);
}
- if (ret < 0) {
+ if (ret <= 0) {
goto end;
}
struct cmsghdr *cmsg;
size_t sizeof_fds = nb_fd * sizeof(int);
+ assert(sock);
+ assert(fds);
+ assert(nb_fd > 0);
+
#ifdef __linux__
/* Account for the struct ucred cmsg in the buffer size */
#define LTTNG_SOCK_RECV_FDS_BUF_SIZE CMSG_SPACE(sizeof_fds) + CMSG_SPACE(sizeof(struct ucred))
struct msghdr msg;
struct iovec iov[1];
ssize_t ret = -1;
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
struct cmsghdr *cmptr;
size_t sizeof_cred = sizeof(lttng_sock_cred);
char anc_buf[CMSG_SPACE(sizeof_cred)];
lttng_sock_cred *creds;
memset(anc_buf, 0, CMSG_SPACE(sizeof_cred) * sizeof(char));
-#endif /* __linux__ */
+#endif /* __linux__, __CYGWIN__ */
memset(&msg, 0, sizeof(msg));
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+
iov[0].iov_base = (void *) buf;
iov[0].iov_len = len;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
msg.msg_control = (caddr_t) anc_buf;
msg.msg_controllen = CMSG_LEN(sizeof_cred);
LTTNG_SOCK_SET_UID_CRED(creds, geteuid());
LTTNG_SOCK_SET_GID_CRED(creds, getegid());
LTTNG_SOCK_SET_PID_CRED(creds, getpid());
-#endif /* __linux__ */
+#endif /* __linux__, __CYGWIN__ */
do {
ret = sendmsg(sock, &msg, 0);
struct iovec iov[1];
ssize_t ret;
size_t len_last;
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
struct cmsghdr *cmptr;
size_t sizeof_cred = sizeof(lttng_sock_cred);
char anc_buf[CMSG_SPACE(sizeof_cred)];
-#endif /* __linux__ */
+#endif /* __linux__, __CYGWIN__ */
- memset(&msg, 0, sizeof(msg));
+ assert(sock);
+ assert(buf);
+ assert(len > 0);
+ assert(creds);
- /* Not allowed */
- if (creds == NULL) {
- ret = -1;
- goto end;
- }
+ memset(&msg, 0, sizeof(msg));
/* Prepare to receive the structures */
iov[0].iov_base = buf;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
msg.msg_control = anc_buf;
msg.msg_controllen = sizeof(anc_buf);
-#endif /* __linux__ */
+#endif /* __linux__, __CYGWIN__ */
do {
len_last = iov[0].iov_len;
}
/* Else ret = 0 meaning an orderly shutdown. */
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
if (msg.msg_flags & MSG_CTRUNC) {
fprintf(stderr, "Error: Control message truncated.\n");
ret = -1;
}
memcpy(creds, CMSG_DATA(cmptr), sizeof_cred);
-#elif (defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__sun__) || defined(__APPLE__))
- {
- int peer_ret;
-
- peer_ret = getpeereid(sock, &creds->uid, &creds->gid);
- if (peer_ret != 0) {
- return peer_ret;
- }
+#elif (defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__))
+ if (lttng_get_unix_socket_peer_creds(sock, creds)) {
+ fprintf(stderr, "ARG\n");
+ ret = -1;
+ goto end;
}
#else
#error "Please implement credential support for your OS."
-#endif /* __linux__ */
+#endif /* __linux__, __CYGWIN__ */
end:
return ret;
/*
* Set socket option to use credentials passing.
*/
-#ifdef __linux__
+#if defined(__linux__) || defined(__CYGWIN__)
LTTNG_HIDDEN
int lttcomm_setsockopt_creds_unix_sock(int sock)
{
}
return ret;
}
-#elif (defined(__FreeBSD__) || defined(__CYGWIN__) || defined(__sun__) || defined(__APPLE__))
+#elif (defined(__FreeBSD__) || defined(__sun__) || defined(__APPLE__))
LTTNG_HIDDEN
int lttcomm_setsockopt_creds_unix_sock(int sock)
{