Skip to content

Commit

Permalink
afsocket: refactor transport-unix-socket to use cmsg parsing framework
Browse files Browse the repository at this point in the history
When the support for timestamping was introduced, the use of recvmsg()
was added to the core LogTransport instances, but transport-unix-socket
was not refactored to use it.

Signed-off-by: Balazs Scheidler <[email protected]>
  • Loading branch information
bazsi committed Dec 23, 2023
1 parent ac34010 commit c78606b
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 85 deletions.
10 changes: 9 additions & 1 deletion lib/transport/transport-socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
*/

#include "transport-socket.h"
#include "messages.h"

#include <errno.h>
#include <string.h>
Expand Down Expand Up @@ -128,6 +129,13 @@ _parse_cmsg_to_aux(LogTransportSocket *self, struct msghdr *msg, LogTransportAux
{
struct cmsghdr *cmsg;

if (G_UNLIKELY(msg->msg_flags & MSG_CTRUNC))
{
msg_warning_once("WARNING: recvmsg() returned truncated control data, the size of the control data buffer needs to be increased",
evt_tag_int("control_len", msg->msg_controllen));
return;
}

if (!self->parse_cmsg || !aux)
return;

Expand Down Expand Up @@ -160,7 +168,7 @@ log_transport_socket_read_method(LogTransport *s, gpointer buf, gsize buflen, Lo
struct iovec iov[1];
struct sockaddr_storage ss;
#if defined(SYSLOG_NG_HAVE_CTRLBUF_IN_MSGHDR)
gchar ctlbuf[64];
gchar ctlbuf[256];
msg.msg_control = ctlbuf;
msg.msg_controllen = sizeof(ctlbuf);
#endif
Expand Down
92 changes: 8 additions & 84 deletions modules/afsocket/transport-unix-socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,89 +186,20 @@ _feed_aux_from_procfs(LogTransportAuxData *aux, pid_t pid)
#endif

static void
_feed_credentials_from_cmsg(LogTransportAuxData *aux, struct msghdr *msg)
_parse_cmsg(LogTransportSocket *s, struct cmsghdr *cmsg, LogTransportAuxData *aux)
{
#if defined(CRED_PASS_SUPPORTED)
struct cmsghdr *cmsg;
cred_t uc;

for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg))
if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS)
{
if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_CREDENTIALS)
{
memcpy(&uc, CMSG_DATA(cmsg), sizeof(uc));
memcpy(&uc, CMSG_DATA(cmsg), sizeof(uc));

_feed_aux_from_procfs(aux, cred_get(&uc, pid));
_feed_aux_from_ucred(aux, &uc);
break;
}
}
#endif
}

static void
_feed_aux_from_cmsg(LogTransportAuxData *aux, struct msghdr *msg)
{
if (G_UNLIKELY(msg->msg_flags & MSG_CTRUNC))
{
msg_warning_once("WARNING: recvmsg() returned truncated control data, the size of the control data buffer needs to be increased",
evt_tag_int("control_len", msg->msg_controllen));
_feed_aux_from_procfs(aux, cred_get(&uc, pid));
_feed_aux_from_ucred(aux, &uc);
}

_feed_credentials_from_cmsg(aux, msg);
}

static gssize
_unix_socket_read(gint fd, gpointer buf, gsize buflen, LogTransportAuxData *aux)
{
gint rc;
struct msghdr msg;
struct iovec iov[1];
struct sockaddr_storage ss;
#if defined(SYSLOG_NG_HAVE_CTRLBUF_IN_MSGHDR)
gchar ctlbuf[256];
msg.msg_control = ctlbuf;
msg.msg_controllen = sizeof(ctlbuf);
#endif



msg.msg_name = (struct sockaddr *) &ss;
msg.msg_namelen = sizeof(ss);
msg.msg_iovlen = 1;
msg.msg_iov = iov;
iov[0].iov_base = buf;
iov[0].iov_len = buflen;
do
{
rc = recvmsg(fd, &msg, 0);
}
while (rc == -1 && errno == EINTR);

if (rc >= 0)
{
if (msg.msg_namelen && aux)
log_transport_aux_data_set_peer_addr_ref(aux, g_sockaddr_new((struct sockaddr *) &ss, msg.msg_namelen));

_feed_aux_from_cmsg(aux, &msg);
}

return rc;
}

static gssize
log_transport_unix_dgram_socket_read_method(LogTransport *s, gpointer buf, gsize buflen, LogTransportAuxData *aux)
{
gint rc;

rc = _unix_socket_read(s->fd, buf, buflen, aux);
if (rc == 0)
{
/* DGRAM sockets should never return EOF, they just need to be read again */
rc = -1;
errno = EAGAIN;
}
return rc;
log_transport_socket_parse_cmsg_method(s, cmsg, aux);
}

LogTransport *
Expand All @@ -277,24 +208,17 @@ log_transport_unix_dgram_socket_new(gint fd)
LogTransportSocket *self = g_new0(LogTransportSocket, 1);

log_transport_dgram_socket_init_instance(self, fd);
self->super.read = log_transport_unix_dgram_socket_read_method;

self->parse_cmsg = _parse_cmsg;
return &self->super;
}

static gssize
log_transport_unix_stream_socket_read_method(LogTransport *s, gpointer buf, gsize buflen, LogTransportAuxData *aux)
{
return _unix_socket_read(s->fd, buf, buflen, aux);
}

LogTransport *
log_transport_unix_stream_socket_new(gint fd)
{
LogTransportSocket *self = g_new0(LogTransportSocket, 1);

log_transport_stream_socket_init_instance(self, fd);
self->super.read = log_transport_unix_stream_socket_read_method;
self->parse_cmsg = _parse_cmsg;

return &self->super;
}

0 comments on commit c78606b

Please sign in to comment.