collectd dies when the port is forwarded using ssh and then the server exits.
Apparently ssh doesn't anser with a connection refused right away which may
result in problems..
This revision adds some debug messages and handles `EOF' correctly (when
reading).
{
nread = read (*fd, ptr, nleft);
{
nread = read (*fd, ptr, nleft);
- if (nread == -1 && (errno == EINTR || errno == EAGAIN))
+ if ((nread < 0) && (errno == EINTR || errno == EAGAIN))
- syslog (LOG_ERR, "apcups plugin: write failed: %s", strerror (errno));
+ DBG ("Reading from socket failed failed: %s; *fd = -1;", strerror (errno));
+ syslog (LOG_ERR, "apcups plugin: Reading from socket failed failed: %s", strerror (errno));
+ if (nread == 0)
+ {
+ DBG ("Received EOF. Closing socket %i.", *fd);
+ close (*fd);
+ *fd = -1;
+ return (nbytes - nleft);
+ }
+
nleft -= nread;
ptr += nread;
}
nleft -= nread;
ptr += nread;
}
{
nwritten = write (*fd, ptr, nleft);
{
nwritten = write (*fd, ptr, nleft);
- if ((nwritten == -1) && ((errno == EAGAIN) || (errno == EINTR)))
+ if ((nwritten < 0) && ((errno == EAGAIN) || (errno == EINTR)))
- syslog (LOG_ERR, "Writing to socket failed: %s", strerror (errno));
+ DBG ("Writing to socket failed: %s; *fd = -1;", strerror (errno));
+ syslog (LOG_ERR, "apcups plugin: Writing to socket failed: %s", strerror (errno));
+ DBG ("Gracefully shutting down socket %i.", *fd);
+
/* send EOF sentinel */
write_nbytes (fd, &pktsiz, sizeof (short));
/* send EOF sentinel */
write_nbytes (fd, &pktsiz, sizeof (short));
/*
* Open a TCP connection to the UPS network server
* Returns -1 on error
/*
* Open a TCP connection to the UPS network server
* Returns -1 on error
- 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) */
return (sd);
} /* int net_open (char *host, char *service, int port) */
short packet_size;
assert (len > 0);
short packet_size;
assert (len > 0);
/* send short containing size of data packet */
packet_size = htons ((short) len);
/* send short containing size of data packet */
packet_size = htons ((short) len);
value = atof (tokptr);
PRINT_VALUE (key, value);
value = atof (tokptr);
PRINT_VALUE (key, value);
- DBG ("key = %s; value = %f;", key, value);
if (strcmp ("LINEV", key) == 0)
apcups_detail->linev = value;
if (strcmp ("LINEV", key) == 0)
apcups_detail->linev = value;
{
syslog (LOG_WARNING, "apcups plugin: Error reading from socket");
return (-1);
{
syslog (LOG_WARNING, "apcups plugin: Error reading from socket");
return (-1);
/* close the opened socket */
/* close the opened socket */