diff --git a/src/network.c b/src/network.c
index b86d5a255b1f9f5897ab20d4c9d660d846a58392..3fe25fd46274c5d508a4e38b7877dca7640f1a8a 100644 (file)
--- a/src/network.c
+++ b/src/network.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
-#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <syslog.h>
#include <errno.h>
-#include <assert.h>
#include "network.h"
#include "common.h"
ai_hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
ai_hints.ai_family = PF_UNSPEC;
ai_hints.ai_socktype = SOCK_DGRAM;
- ai_hints.ai_protocol = IPPROTO_UDP; /* XXX is this right here?!? */
+ ai_hints.ai_protocol = IPPROTO_UDP;
if ((ai_return = getaddrinfo (node, service, &ai_hints, &ai_list)) != 0)
{
ret = 0;
- if (network_create_socket (NET_DEFAULT_V4_ADDR, NET_DEFAULT_PORT) > 0)
+ if (network_create_socket (NET_DEFAULT_V6_ADDR, NET_DEFAULT_PORT) > 0)
ret++;
- if (network_create_socket (NET_DEFAULT_V6_ADDR, NET_DEFAULT_PORT) > 0)
+ /* Don't use IPv4 and IPv6 in parallel by default.. */
+ if ((operating_mode == MODE_CLIENT) && (ret != 0))
+ return (ret);
+
+ if (network_create_socket (NET_DEFAULT_V4_ADDR, NET_DEFAULT_PORT) > 0)
ret++;
if (ret == 0)
if (socklist_head == NULL)
network_connect_default ();
- while (1)
+ FD_ZERO (&readfds);
+ max_fd = -1;
+ for (se = socklist_head; se != NULL; se = se->next)
{
- FD_ZERO (&readfds);
- max_fd = -1;
- for (se = socklist_head; se != NULL; se = se->next)
- {
- if (se->mode != operating_mode)
- continue;
+ if (se->mode != operating_mode)
+ continue;
- FD_SET (se->fd, &readfds);
- if (se->fd >= max_fd)
- max_fd = se->fd + 1;
- }
+ FD_SET (se->fd, &readfds);
+ if (se->fd >= max_fd)
+ max_fd = se->fd + 1;
+ }
- if (max_fd == -1)
- {
- syslog (LOG_WARNING, "No listen sockets found!");
- return (-1);
- }
+ if (max_fd == -1)
+ {
+ syslog (LOG_WARNING, "No listen sockets found!");
+ return (-1);
+ }
- status = select (max_fd, &readfds, NULL, NULL, NULL);
+ status = select (max_fd, &readfds, NULL, NULL, NULL);
- if ((status == -1) && (errno == EINTR))
- continue;
- else if (status == -1)
- {
+ if (status == -1)
+ {
+ if (errno != EINTR)
syslog (LOG_ERR, "select: %s", strerror (errno));
- return (-1);
- }
- else
- break;
- } /* while (true) */
+ return (-1);
+ }
fd = -1;
for (se = socklist_head; se != NULL; se = se->next)
if ((fd = network_get_listen_socket ()) < 0)
return (-1);
+ addrlen = sizeof (addr);
if (recvfrom (fd, buffer, BUFF_SIZE, 0, (struct sockaddr *) &addr, &addrlen) == -1)
{
syslog (LOG_ERR, "recvfrom: %s", strerror (errno));
else
{
syslog (LOG_ERR, "sendto: %s", strerror (errno));
+ ret = -1;
break;
}
}