summaryrefslogtreecommitdiff
blob: 9161fbcc5ebbf72dbc630813386217f01487cb7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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_*/