X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fapcups.c;h=cd64426afa01e42125f3b210b7e39dc40f991c12;hb=4c3b690f915df7b56170cee189096949adedefe5;hp=e2ad70cb0c4e6c243fc79f7d9a4021c9b283084a;hpb=c7c26fbfca476e9e9d84245ae8268783f787a70b;p=collectd.git diff --git a/src/apcups.c b/src/apcups.c index e2ad70cb..cd64426a 100644 --- a/src/apcups.c +++ b/src/apcups.c @@ -134,105 +134,23 @@ struct apc_detail_s #define BIG_BUF 4096 -/* - * Read nbytes from the network. - * It is possible that the total bytes require in several - * read requests - */ -static int read_nbytes (int *fd, char *ptr, int nbytes) -{ - int nleft; - int nread; - - nleft = nbytes; - nread = -1; - - assert (*fd >= 0); - - while ((nleft > 0) && (nread != 0)) - { - nread = read (*fd, ptr, nleft); - - if ((nread < 0) && (errno == EINTR || errno == EAGAIN)) - continue; - - if (nread < 0) - { - *fd = -1; - DBG ("Reading from socket failed failed: %s; *fd = -1;", strerror (errno)); - syslog (LOG_ERR, "apcups plugin: Reading from socket failed failed: %s", strerror (errno)); - return (-1); - } - - if (nread == 0) - { - DBG ("Received EOF. Closing socket %i.", *fd); - close (*fd); - *fd = -1; - return (nbytes - nleft); - } - - nleft -= nread; - ptr += nread; - } - - return (nbytes - nleft); -} - -/* - * Write nbytes to the network. - * It may require several writes. - */ -static int write_nbytes (int *fd, void *buf, int buflen) -{ - int nleft; - int nwritten; - char *ptr; - - assert (buflen > 0); - assert (*fd >= 0); - - ptr = (char *) buf; - - nleft = buflen; - while (nleft > 0) - { - nwritten = write (*fd, ptr, nleft); - - if ((nwritten < 0) && ((errno == EAGAIN) || (errno == EINTR))) - continue; - - if (nwritten < 0) - { - *fd = -1; - DBG ("Writing to socket failed: %s; *fd = -1;", strerror (errno)); - syslog (LOG_ERR, "apcups plugin: Writing to socket failed: %s", strerror (errno)); - return (-1); - } - - nleft -= nwritten; - ptr += nwritten; - } - - /* If we get here, (nleft <= 0) is true */ - return (buflen); -} - +#if APCMAIN /* Close the network connection */ static void net_close (int *fd) { - short pktsiz = 0; + uint16_t packet_size = 0; assert (*fd >= 0); DBG ("Gracefully shutting down socket %i.", *fd); /* send EOF sentinel */ - write_nbytes (fd, &pktsiz, sizeof (short)); + swrite (*fd, (void *) &packet_size, sizeof (packet_size)); close (*fd); *fd = -1; } +#endif /* APCMAIN */ /* * Open a TCP connection to the UPS network server @@ -290,6 +208,7 @@ static int net_open (char *host, char *service, int port) if (status != 0) /* `connect(2)' failed */ { DBG ("connect failed: %s", strerror (errno)); + close (sd); return (-1); } @@ -309,35 +228,34 @@ static int net_open (char *host, char *service, int port) */ static int net_recv (int *sockfd, char *buf, int buflen) { - int nbytes; - short pktsiz; + uint16_t packet_size; /* get data size -- in short */ - if ((nbytes = read_nbytes (sockfd, (char *) &pktsiz, sizeof (short))) <= 0) + if (sread (*sockfd, (void *) &packet_size, sizeof (packet_size)) != 0) + { + *sockfd = -1; return (-1); + } - if (nbytes != sizeof (short)) - return (-2); - - pktsiz = ntohs (pktsiz); - if (pktsiz > buflen) + packet_size = ntohs (packet_size); + if (packet_size > buflen) { DBG ("record length too large"); return (-2); } - if (pktsiz == 0) + if (packet_size == 0) return (0); /* now read the actual data */ - if ((nbytes = read_nbytes (sockfd, buf, pktsiz)) <= 0) - return (-2); - - if (nbytes != pktsiz) - return (-2); + if (sread (*sockfd, (void *) buf, packet_size) != 0) + { + *sockfd = -1; + return (-1); + } - return (nbytes); -} /* static int net_recv (int sockfd, char *buf, int buflen) */ + return ((int) packet_size); +} /* static int net_recv (int *sockfd, char *buf, int buflen) */ /* * Send a message over the network. The send consists of @@ -348,23 +266,26 @@ static int net_recv (int *sockfd, char *buf, int buflen) */ static int net_send (int *sockfd, char *buff, int len) { - int rc; - short packet_size; + uint16_t packet_size; assert (len > 0); assert (*sockfd >= 0); /* send short containing size of data packet */ - packet_size = htons ((short) len); + packet_size = htons ((uint16_t) len); - rc = write_nbytes (sockfd, &packet_size, sizeof (packet_size)); - if (rc != sizeof (packet_size)) + if (swrite (*sockfd, (void *) &packet_size, sizeof (packet_size)) != 0) + { + *sockfd = -1; return (-1); + } /* send data packet */ - rc = write_nbytes (sockfd, buff, len); - if (rc != len) - return (-1); + if (swrite (*sockfd, (void *) buff, len) != 0) + { + *sockfd = -1; + return (-2); + } return (0); } @@ -380,7 +301,7 @@ static int apc_query_server (char *host, int port, double value; static int sockfd = -1; - static unsigned int complain = 0; + static complain_t compl; #if APCMAIN # define PRINT_VALUE(name, val) printf(" Found property: name = %s; value = %f;\n", name, val) @@ -392,19 +313,14 @@ static int apc_query_server (char *host, int port, { if ((sockfd = net_open (host, NULL, port)) < 0) { - /* Complain once every six hours. */ - int complain_step = 21600 / atoi (COLLECTD_STEP); - - if ((complain % complain_step) == 0) - syslog (LOG_ERR, "apcups plugin: Connecting to the apcupsd failed."); - complain++; - + plugin_complain (LOG_ERR, &compl, "apcups plugin: " + "Connecting to the apcupsd failed."); return (-1); } - else if (complain > 1) + else { - syslog (LOG_NOTICE, "apcups plugin: Connection re-established to the apcupsd."); - complain = 0; + plugin_relief (LOG_NOTICE, &compl, "apcups plugin: " + "Connection re-established to the apcupsd."); } } @@ -458,11 +374,13 @@ static int apc_query_server (char *host, int port, syslog (LOG_WARNING, "apcups plugin: Error reading from socket"); return (-1); } +#if APCMAIN else { /* close the opened socket */ net_close (&sockfd); } +#endif /* APCMAIN */ return (0); }