X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Flibcollectdclient%2Fnetwork.c;h=7a866ee78c377408ff7187766eaf1061a9c2bdf5;hb=584f57cc8cfb14cbcc45714db5dc87304ccb2a0e;hp=ddb3b5b9b35c03b5aa93a74eb6fab8347b562b98;hpb=f7818fbc069c641e1ae40280dbd6f33dc613ec3a;p=collectd.git diff --git a/src/libcollectdclient/network.c b/src/libcollectdclient/network.c index ddb3b5b9..7a866ee7 100644 --- a/src/libcollectdclient/network.c +++ b/src/libcollectdclient/network.c @@ -1,6 +1,6 @@ /** * collectd - src/libcollectdclient/network.c - * Copyright (C) 2005-2013 Florian Forster + * Copyright (C) 2005-2015 Florian Forster * Copyright (C) 2010 Max Henkel * * Permission is hereby granted, free of charge, to any person obtaining a @@ -89,6 +89,7 @@ static int server_close_socket (lcc_server_t *srv) /* {{{ */ return (0); close (srv->fd); + srv->fd = -1; free (srv->sa); srv->sa = NULL; srv->sa_len = 0; @@ -107,12 +108,6 @@ static void int_server_destroy (lcc_server_t *srv) /* {{{ */ next = srv->next; - if (srv->fd >= 0) - { - close (srv->fd); - srv->fd = -1; - } - free (srv->node); free (srv->service); free (srv->username); @@ -154,7 +149,6 @@ static int server_open_socket (lcc_server_t *srv) /* {{{ */ if (ai_ptr->ai_family == AF_INET) { - struct sockaddr_in *addr = (struct sockaddr_in *) ai_ptr->ai_addr; int optname; @@ -163,9 +157,8 @@ static int server_open_socket (lcc_server_t *srv) /* {{{ */ else optname = IP_TTL; - setsockopt (srv->fd, IPPROTO_IP, optname, - &srv->ttl, - sizeof (srv->ttl)); + status = setsockopt (srv->fd, IPPROTO_IP, optname, + &srv->ttl, sizeof (srv->ttl)); } else if (ai_ptr->ai_family == AF_INET6) { @@ -178,9 +171,15 @@ static int server_open_socket (lcc_server_t *srv) /* {{{ */ else optname = IPV6_UNICAST_HOPS; - setsockopt (srv->fd, IPPROTO_IPV6, optname, - &srv->ttl, - sizeof (srv->ttl)); + status = setsockopt (srv->fd, IPPROTO_IPV6, optname, + &srv->ttl, sizeof (srv->ttl)); + } + if (status != 0) + { + /* setsockopt failed. */ + close (srv->fd); + srv->fd = -1; + continue; } srv->sa = malloc (ai_ptr->ai_addrlen); @@ -219,7 +218,13 @@ static int server_send_buffer (lcc_server_t *srv) /* {{{ */ memset (buffer, 0, sizeof (buffer)); buffer_size = sizeof (buffer); - lcc_network_buffer_finalize (srv->buffer); + status = lcc_network_buffer_finalize (srv->buffer); + if (status != 0) + { + lcc_network_buffer_initialize (srv->buffer); + return (status); + } + status = lcc_network_buffer_get (srv->buffer, buffer, &buffer_size); lcc_network_buffer_initialize (srv->buffer); @@ -387,7 +392,7 @@ int lcc_server_set_ttl (lcc_server_t *srv, uint8_t ttl) /* {{{ */ int lcc_server_set_interface (lcc_server_t *srv, char const *interface) /* {{{ */ { - int if_index; + unsigned int if_index; int status; if ((srv == NULL) || (interface == NULL)) @@ -415,7 +420,7 @@ int lcc_server_set_interface (lcc_server_t *srv, char const *interface) /* {{{ * memset (&mreq, 0, sizeof (mreq)); mreq.imr_multiaddr.s_addr = addr->sin_addr.s_addr; mreq.imr_address.s_addr = ntohl (INADDR_ANY); - mreq.imr_ifindex = if_index; + mreq.imr_ifindex = (int) if_index; #else struct ip_mreq mreq; @@ -451,8 +456,8 @@ int lcc_server_set_interface (lcc_server_t *srv, char const *interface) /* {{{ * /* else: Not a multicast interface. */ #if defined(SO_BINDTODEVICE) - status = setsockopt (srv->fd, SOL_SOCKET, SO_BINDTODEVICE, - interface, strlen (interface) + 1); + status = setsockopt (srv->fd, SOL_SOCKET, SO_BINDTODEVICE, interface, + (socklen_t) (strlen (interface) + 1)); if (status != 0) return (-1); #endif