#include <unistd.h>
#include <errno.h>
-#include <common/defaults.h>
-#include <common/error.h>
+#include <common/common.h>
#include "sessiond-comm.h"
/* For Inet6 socket */
#include "inet6.h"
-struct lttcomm_net_family net_families[] = {
+static struct lttcomm_net_family net_families[] = {
{ LTTCOMM_INET, lttcomm_create_inet_sock },
{ LTTCOMM_INET6, lttcomm_create_inet6_sock },
};
*
* These code MUST be negative in other to treat that as an error value.
*/
+LTTNG_HIDDEN
const char *lttcomm_get_readable_code(enum lttcomm_return_code code)
{
code = -code;
- if (code < LTTCOMM_CONSUMERD_COMMAND_SOCK_READY && code > LTTCOMM_NR) {
+ if (code < LTTCOMM_CONSUMERD_COMMAND_SOCK_READY || code > LTTCOMM_NR) {
code = LTTCOMM_NR;
}
* Create socket from an already allocated lttcomm socket structure and init
* sockaddr in the lttcomm sock.
*/
+LTTNG_HIDDEN
int lttcomm_create_sock(struct lttcomm_sock *sock)
{
int ret, _sock_type, _sock_proto, domain;
/*
* Return allocated lttcomm socket structure.
*/
+LTTNG_HIDDEN
struct lttcomm_sock *lttcomm_alloc_sock(enum lttcomm_sock_proto proto)
{
struct lttcomm_sock *sock;
* This is mostly useful when lttcomm_sock are passed between process where the
* fd and ops have to be changed within the correct address space.
*/
+LTTNG_HIDDEN
struct lttcomm_sock *lttcomm_alloc_copy_sock(struct lttcomm_sock *src)
{
struct lttcomm_sock *sock;
* This is mostly useful when lttcomm_sock are passed between process where the
* fd and ops have to be changed within the correct address space.
*/
+LTTNG_HIDDEN
void lttcomm_copy_sock(struct lttcomm_sock *dst, struct lttcomm_sock *src)
{
/* Safety net */
/*
* Init IPv4 sockaddr structure.
*/
+LTTNG_HIDDEN
int lttcomm_init_inet_sockaddr(struct lttcomm_sockaddr *sockaddr,
const char *ip, unsigned int port)
{
/*
* Init IPv6 sockaddr structure.
*/
+LTTNG_HIDDEN
int lttcomm_init_inet6_sockaddr(struct lttcomm_sockaddr *sockaddr,
const char *ip, unsigned int port)
{
/*
* Return allocated lttcomm socket structure from lttng URI.
*/
+LTTNG_HIDDEN
struct lttcomm_sock *lttcomm_alloc_sock_from_uri(struct lttng_uri *uri)
{
int ret;
/*
* Destroy and free lttcomm socket.
*/
+LTTNG_HIDDEN
void lttcomm_destroy_sock(struct lttcomm_sock *sock)
{
- if (sock != NULL) {
- free(sock);
+ free(sock);
+}
+
+/*
+ * Allocate and return a relayd socket object using a given URI to initialize
+ * it and the major/minor version of the supported protocol.
+ *
+ * On error, NULL is returned.
+ */
+LTTNG_HIDDEN
+struct lttcomm_relayd_sock *lttcomm_alloc_relayd_sock(struct lttng_uri *uri,
+ uint32_t major, uint32_t minor)
+{
+ int ret;
+ struct lttcomm_sock *tmp_sock = NULL;
+ struct lttcomm_relayd_sock *rsock = NULL;
+
+ assert(uri);
+
+ rsock = zmalloc(sizeof(*rsock));
+ if (!rsock) {
+ PERROR("zmalloc relayd sock");
+ goto error;
}
+
+ /* Allocate socket object from URI */
+ tmp_sock = lttcomm_alloc_sock_from_uri(uri);
+ if (tmp_sock == NULL) {
+ goto error_free;
+ }
+
+ /*
+ * Create socket object which basically sets the ops according to the
+ * socket protocol.
+ */
+ lttcomm_copy_sock(&rsock->sock, tmp_sock);
+ /* Temporary socket pointer not needed anymore. */
+ lttcomm_destroy_sock(tmp_sock);
+ ret = lttcomm_create_sock(&rsock->sock);
+ if (ret < 0) {
+ goto error_free;
+ }
+
+ rsock->major = major;
+ rsock->minor = minor;
+
+ return rsock;
+
+error_free:
+ free(rsock);
+error:
+ return NULL;
}