Beispiel #1
0
static LogTransportAuxData *
construct_aux_with_some_data(void)
{
  LogTransportAuxData *aux = construct_empty_aux();

  /* set peer_addr twice to validate that peer_addr is correctly reference counted */
  log_transport_aux_data_set_peer_addr_ref(aux, g_sockaddr_inet_new("1.2.3.4", 5555));
  log_transport_aux_data_set_peer_addr_ref(aux, g_sockaddr_inet_new("1.2.3.4", 5555));
  log_transport_aux_data_add_nv_pair(aux, "foo", "bar");
  return aux;
}
static gssize
_unix_socket_read(gint fd, gpointer buf, gsize buflen, LogTransportAuxData *aux)
{
  gint rc;
  struct msghdr msg;
  struct iovec iov[1];
  gchar ctlbuf[32];
  struct sockaddr_storage ss;

  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;
  msg.msg_control = ctlbuf;
  msg.msg_controllen = sizeof(ctlbuf);
  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;
}
Beispiel #3
0
static gssize
log_transport_dgram_socket_read_method(LogTransport *s, gpointer buf, gsize buflen, LogTransportAuxData *aux)
{
  LogTransportSocket *self = (LogTransportSocket *) s;
  gint rc;
  struct sockaddr_storage ss;

  socklen_t salen = sizeof(ss);

  do
    {
      rc = recvfrom(self->super.fd, buf, buflen, 0,
                    (struct sockaddr *) &ss, &salen);
    }
  while (rc == -1 && errno == EINTR);
  if (rc != -1 && salen && aux)
    log_transport_aux_data_set_peer_addr_ref(aux, g_sockaddr_new((struct sockaddr *) &ss, salen));
  if (rc == 0)
    {
      /* DGRAM sockets should never return EOF, they just need to be read again */
      rc = -1;
      errno = EAGAIN;
    }
  return rc;
}