X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fapcups.c;h=cd64426afa01e42125f3b210b7e39dc40f991c12;hb=70a5b80271643b3c0384e03a77fcfb35c11f726a;hp=977b793918c200406a026649c2fbdf1ec0b66477;hpb=938f678eaaa16a7e087d7140ba6e2553583d36de;p=collectd.git diff --git a/src/apcups.c b/src/apcups.c index 977b7939..cd64426a 100644 --- a/src/apcups.c +++ b/src/apcups.c @@ -134,94 +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 == -1 && (errno == EINTR || errno == EAGAIN)) - continue; - - if (nread == -1) - { - *fd = -1; - syslog (LOG_ERR, "apcups plugin: write failed: %s", strerror (errno)); - return (-1); - } - - 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 == -1) && ((errno == EAGAIN) || (errno == EINTR))) - continue; - - if (nwritten == -1) - { - syslog (LOG_ERR, "Writing to socket failed: %s", strerror (errno)); - *fd = -1; - 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 @@ -279,10 +208,11 @@ 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); } - DBG ("Done opening a socket: %i", sd); + DBG ("Done opening a socket %i", sd); return (sd); } /* int net_open (char *host, char *service, int port) */ @@ -298,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 @@ -337,22 +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); } @@ -368,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) @@ -380,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."); } } @@ -419,7 +347,6 @@ static int apc_query_server (char *host, int port, value = atof (tokptr); PRINT_VALUE (key, value); - DBG ("key = %s; value = %f;", key, value); if (strcmp ("LINEV", key) == 0) apcups_detail->linev = value; @@ -446,10 +373,14 @@ static int apc_query_server (char *host, int port, { syslog (LOG_WARNING, "apcups plugin: Error reading from socket"); return (-1); - } else { + } +#if APCMAIN + else + { /* close the opened socket */ - net_close(&sockfd); + net_close (&sockfd); } +#endif /* APCMAIN */ return (0); }