summaryrefslogtreecommitdiff
path: root/app-admin/conky/files/conky-1.9.0-apcupsd.patch
diff options
context:
space:
mode:
Diffstat (limited to 'app-admin/conky/files/conky-1.9.0-apcupsd.patch')
-rw-r--r--app-admin/conky/files/conky-1.9.0-apcupsd.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/app-admin/conky/files/conky-1.9.0-apcupsd.patch b/app-admin/conky/files/conky-1.9.0-apcupsd.patch
new file mode 100644
index 00000000000..9161fbcc5eb
--- /dev/null
+++ b/app-admin/conky/files/conky-1.9.0-apcupsd.patch
@@ -0,0 +1,106 @@
+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: http://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_*/