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 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_*/