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; }
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; }