|
|
|
Description: Fix broken apcupsd support in Conky 1.8.1
|
|
|
|
Revert apcupsd-related code to Conky 1.8.0 in order to fix broken apcupsd
|
|
|
|
support. This is a workaround until upstream properly addresses this issue.
|
|
|
|
From: Brian Derr <bderrly@gmail.com>
|
|
|
|
Forwarded: https://sourceforge.net/support/tracker.php?aid=3083859
|
|
|
|
Bug-Ubuntu: https://bugs.launchpad.net/bugs/897495
|
|
|
|
Last-Update: 2011-12-02
|
|
|
|
|
|
|
|
--- a/src/apcupsd.c
|
|
|
|
+++ b/src/apcupsd.c
|
|
|
|
@@ -154,7 +154,7 @@
|
|
|
|
//
|
|
|
|
// Conky update function for apcupsd data
|
|
|
|
//
|
|
|
|
-int update_apcupsd(void) {
|
|
|
|
+void update_apcupsd(void) {
|
|
|
|
|
|
|
|
int i;
|
|
|
|
APCUPSD_S apc;
|
|
|
|
@@ -164,41 +164,44 @@
|
|
|
|
memcpy(apc.items[i], "N/A", 4); // including \0
|
|
|
|
|
|
|
|
do {
|
|
|
|
- struct addrinfo hints;
|
|
|
|
- struct addrinfo *ai, *rp;
|
|
|
|
- int res;
|
|
|
|
+ struct hostent* he = 0;
|
|
|
|
+ struct sockaddr_in addr;
|
|
|
|
short sz = 0;
|
|
|
|
- char portbuf[8];
|
|
|
|
+#ifdef HAVE_GETHOSTBYNAME_R
|
|
|
|
+ struct hostent he_mem;
|
|
|
|
+ int he_errno;
|
|
|
|
+ char hostbuff[2048];
|
|
|
|
+#endif
|
|
|
|
//
|
|
|
|
// connect to apcupsd daemon
|
|
|
|
//
|
|
|
|
- memset(&hints, 0, sizeof(struct addrinfo));
|
|
|
|
- hints.ai_family = AF_UNSPEC;
|
|
|
|
- hints.ai_socktype = SOCK_STREAM;
|
|
|
|
- hints.ai_flags = 0;
|
|
|
|
- hints.ai_protocol = 0;
|
|
|
|
- snprintf(portbuf, 8, "%d", info.apcupsd.port);
|
|
|
|
- res = getaddrinfo(info.apcupsd.host, portbuf, &hints, &ai);
|
|
|
|
- if (res != 0) {
|
|
|
|
- NORM_ERR("APCUPSD getaddrinfo: %s", gai_strerror(res));
|
|
|
|
+ sock = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
+ if (sock < 0) {
|
|
|
|
+ perror("socket");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
- for (rp = ai; rp != NULL; rp = rp->ai_next) {
|
|
|
|
- sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
|
|
|
|
- if (sock == -1) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- if (connect(sock, rp->ai_addr, rp->ai_addrlen) != -1) {
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- close(sock);
|
|
|
|
+#ifdef HAVE_GETHOSTBYNAME_R
|
|
|
|
+ if (gethostbyname_r(info.apcupsd.host, &he_mem, hostbuff, sizeof(hostbuff), &he, &he_errno) || !he ) {
|
|
|
|
+ NORM_ERR("APCUPSD gethostbyname_r: %s", hstrerror(h_errno));
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+#else /* HAVE_GETHOSTBYNAME_R */
|
|
|
|
+ he = gethostbyname(info.apcupsd.host);
|
|
|
|
+ if (!he) {
|
|
|
|
+ herror("gethostbyname");
|
|
|
|
+ break;
|
|
|
|
}
|
|
|
|
- freeaddrinfo(ai);
|
|
|
|
- if (rp == NULL) {
|
|
|
|
+#endif /* HAVE_GETHOSTBYNAME_R */
|
|
|
|
+
|
|
|
|
+ memset(&addr, 0, sizeof(addr));
|
|
|
|
+ addr.sin_family = AF_INET;
|
|
|
|
+ addr.sin_port = info.apcupsd.port;
|
|
|
|
+ memcpy(&addr.sin_addr, he->h_addr, he->h_length);
|
|
|
|
+ if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr)) < 0) {
|
|
|
|
// no error reporting, the daemon is probably not running
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
-
|
|
|
|
+
|
|
|
|
//
|
|
|
|
// send status request - "status" - 6B
|
|
|
|
//
|
|
|
|
@@ -222,5 +225,5 @@
|
|
|
|
// "atomically" copy the data into working set
|
|
|
|
//
|
|
|
|
memcpy(info.apcupsd.items, apc.items, sizeof(info.apcupsd.items));
|
|
|
|
- return 0;
|
|
|
|
+ return;
|
|
|
|
}
|
|
|
|
--- a/src/apcupsd.h
|
|
|
|
+++ b/src/apcupsd.h
|
|
|
|
@@ -49,6 +49,6 @@
|
|
|
|
} APCUPSD_S, *PAPCUPSD_S;
|
|
|
|
|
|
|
|
/* Service routine for the conky main thread */
|
|
|
|
-int update_apcupsd(void);
|
|
|
|
+void update_apcupsd(void);
|
|
|
|
|
|
|
|
#endif /*APCUPSD_H_*/
|