Update tthis patch from the zabbix repo with a fixed socket leak

This commit is contained in:
robert 2010-12-13 10:40:52 +00:00
parent 5c291dcae9
commit 3f5c71ae57
2 changed files with 418 additions and 52 deletions

View File

@ -1,4 +1,4 @@
# $OpenBSD: Makefile,v 1.41 2010/12/11 12:57:37 ajacoutot Exp $
# $OpenBSD: Makefile,v 1.42 2010/12/13 10:40:52 robert Exp $
COMMENT-main = network and application monitoring - agent
COMMENT-server = network and application monitoring - server
@ -13,7 +13,7 @@ FULLPKGNAME-web = zabbix-web-${VERSION}
FULLPKGPATH-web = net/zabbix,-web
CATEGORIES = net
REVISION-main = 7
REVISION-main = 8
REVISION-server = 7
REVISION-web = 2

View File

@ -1,36 +1,45 @@
$OpenBSD: patch-src_libs_zbxsysinfo_openbsd_net_c,v 1.3 2010/09/27 08:10:32 robert Exp $
$OpenBSD: patch-src_libs_zbxsysinfo_openbsd_net_c,v 1.4 2010/12/13 10:40:52 robert Exp $
--- src/libs/zbxsysinfo/openbsd/net.c.orig Mon Aug 16 10:19:32 2010
+++ src/libs/zbxsysinfo/openbsd/net.c Sun Sep 26 16:28:44 2010
@@ -21,6 +21,10 @@
+++ src/libs/zbxsysinfo/openbsd/net.c Mon Dec 13 11:36:59 2010
@@ -21,6 +21,8 @@
#include "sysinfo.h"
+#include <sys/sockio.h>
+
+#define N_UNDF 0x00 /* undefined */
+
static struct nlist kernel_symbols[] =
{
{"_ifnet", N_UNDF, 0, 0, 0},
@@ -37,15 +41,50 @@ static int get_ifdata(const char *if_name, zbx_uint64_
@@ -32,69 +34,71 @@ static struct nlist kernel_symbols[] =
static int get_ifdata(const char *if_name, zbx_uint64_t *ibytes, zbx_uint64_t *ipackets, zbx_uint64_t *ierrors, zbx_uint64_t *idropped,
zbx_uint64_t *obytes, zbx_uint64_t *opackets, zbx_uint64_t *oerrors,
- zbx_uint64_t *tbytes, zbx_uint64_t *tpackets, zbx_uint64_t *terrors, zbx_uint64_t *tdropped,
+ zbx_uint64_t *tbytes, zbx_uint64_t *tpackets, zbx_uint64_t *terrors,
zbx_uint64_t *icollisions)
{
struct ifnet_head head;
struct ifnet *ifp;
- struct ifnet *ifp;
- struct ifnet v;
+ struct ifnet *ifp;
kvm_t *kp;
- kvm_t *kp;
+ kvm_t *kp;
int len = 0;
int ret = SYSINFO_RET_FAIL;
- int ret = SYSINFO_RET_FAIL;
+ int ret = SYSINFO_RET_FAIL;
+ /* if_ibytes; total number of octets received */
+ /* if_ipackets; packets received on interface */
+ /* if_ierrors; input errors on interface */
+ /* if_iqdrops; dropped on input, this interface */
+ /* if_obytes; total number of octets sent */
+ /* if_opackets; packets sent on interface */
+ /* if_oerrors; output errors on interface */
+ /* if_collisions; collisions on csma interfaces */
+
- kp = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
+ /* if(i)_ibytes; total number of octets received */
+ /* if(i)_ipackets; packets received on interface */
+ /* if(i)_ierrors; input errors on interface */
+ /* if(i)_iqdrops; dropped on input, this interface */
+ /* if(i)_obytes; total number of octets sent */
+ /* if(i)_opackets; packets sent on interface */
+ /* if(i)_oerrors; output errors on interface */
+ /* if(i)_collisions; collisions on csma interfaces */
- if (kp) {
+ if (ibytes)
+ *ibytes = 0;
+ if (ipackets)
@ -51,21 +60,25 @@ $OpenBSD: patch-src_libs_zbxsysinfo_openbsd_net_c,v 1.3 2010/09/27 08:10:32 robe
+ *tpackets = 0;
+ if (terrors)
+ *terrors = 0;
+ if (tdropped)
+ *tdropped = 0;
+ if (icollisions)
+ *icollisions = 0;
+
kp = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL);
if (kp) {
+ struct ifnet v;
+ if (NULL != (kp = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL))) /* requires root privileges */
+ {
+ struct ifnet v;
+
if (N_UNDF == kernel_symbols[IFNET_ID].n_type)
if (0 != kvm_nlist(kp, &kernel_symbols[0]))
kernel_symbols[IFNET_ID].n_type = N_UNDF;
@@ -56,40 +95,6 @@ static int get_ifdata(const char *if_name, zbx_uint64_
if (kvm_read(kp, kernel_symbols[IFNET_ID].n_value, &head, len) >= len) {
- if (N_UNDF != kernel_symbols[IFNET_ID].n_type) {
+ if (N_UNDF != kernel_symbols[IFNET_ID].n_type)
+ {
len = sizeof(struct ifnet_head);
- if (kvm_read(kp, kernel_symbols[IFNET_ID].n_value, &head, len) >= len) {
+ if (kvm_read(kp, kernel_symbols[IFNET_ID].n_value, &head, len) >= len)
+ {
len = sizeof(struct ifnet);
- /* if_ibytes; total number of octets received */
@ -102,28 +115,60 @@ $OpenBSD: patch-src_libs_zbxsysinfo_openbsd_net_c,v 1.3 2010/09/27 08:10:32 robe
- if (icollisions)
- *icollisions = 0;
-
for(ifp = head.tqh_first; ifp; ifp = v.if_list.tqe_next) {
- for(ifp = head.tqh_first; ifp; ifp = v.if_list.tqe_next) {
+ for (ifp = head.tqh_first; ifp; ifp = v.if_list.tqe_next)
+ {
if (kvm_read(kp, (u_long)ifp, &v, len) < len)
break;
@@ -125,8 +130,53 @@ static int get_ifdata(const char *if_name, zbx_uint64_
}
- if (*if_name == '\0' || 0 == strcmp(if_name, v.if_xname)) {
+ if ('\0' == *if_name || 0 == strcmp(if_name, v.if_xname))
+ {
if (ibytes)
*ibytes += v.if_ibytes;
if (ipackets)
@@ -115,8 +119,6 @@ static int get_ifdata(const char *if_name, zbx_uint64_
*tpackets += v.if_ipackets + v.if_opackets;
if (terrors)
*terrors += v.if_ierrors + v.if_oerrors;
- if (tdropped)
- *tdropped += v.if_iqdrops;
if (icollisions)
*icollisions += v.if_collisions;
ret = SYSINFO_RET_OK;
@@ -126,80 +128,63 @@ static int get_ifdata(const char *if_name, zbx_uint64_
}
kvm_close(kp);
+ } else { /* Fallback to using SIOCGIFDATA */
+ int if_s = -1;
+ struct ifreq ifr;
+ struct if_data v;
+
}
+ else
+ {
+ /* Fallback to using SIOCGIFDATA */
- return ret;
-}
+ int if_s;
+ struct ifreq ifr;
+ struct if_data v;
-static int NET_IF_IN_BYTES(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
+ if ((if_s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ goto out;
+
+ goto clean;
- if (SYSINFO_RET_OK != get_ifdata(if_name, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
- return SYSINFO_RET_FAIL;
+ zbx_strlcpy(ifr.ifr_name, if_name, IFNAMSIZ - 1);
+ ifr.ifr_data = (caddr_t)&v;
+
+ if (ioctl(if_s, SIOCGIFDATA, &ifr))
+ goto out;
+
+ if (*if_name == '\0' || 0 == strcmp(if_name, ifr.ifr_name)) {
- SET_UI64_RESULT(result, value);
+ if (ioctl(if_s, SIOCGIFDATA, &ifr) < 0)
+ goto clean;
- return SYSINFO_RET_OK;
-}
+ if ('\0' == *if_name || 0 == strcmp(if_name, ifr.ifr_name))
+ {
+ if (ibytes)
+ *ibytes += v.ifi_ibytes;
+ if (ipackets)
@ -144,18 +189,339 @@ $OpenBSD: patch-src_libs_zbxsysinfo_openbsd_net_c,v 1.3 2010/09/27 08:10:32 robe
+ *tpackets += v.ifi_ipackets + v.ifi_opackets;
+ if (terrors)
+ *terrors += v.ifi_ierrors + v.ifi_oerrors;
+ if (tdropped)
+ *tdropped += v.ifi_iqdrops;
+ if (icollisions)
+ *icollisions += v.ifi_collisions;
+ }
+
+ close(if_s);
+
+ ret = SYSINFO_RET_OK;
}
+out:
return ret;
-static int NET_IF_IN_PACKETS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
+ ret = SYSINFO_RET_OK;
+clean:
+ if (if_s >= 0)
+ close(if_s);
+ }
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
+ return ret;
}
-static int NET_IF_IN_ERRORS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
-static int NET_IF_IN_DROPPED(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
int NET_IF_IN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
-#define NET_FNCLIST struct net_fnclist_s
-NET_FNCLIST
-{
- char *mode;
- int (*function)();
-};
+ char if_name[MAX_STRING_LEN], mode[16];
+ zbx_uint64_t ibytes, ipackets, ierrors, idropped;
- NET_FNCLIST fl[] =
- {
- {"bytes", NET_IF_IN_BYTES},
- {"packets", NET_IF_IN_PACKETS},
- {"errors", NET_IF_IN_ERRORS},
- {"dropped", NET_IF_IN_DROPPED},
- {0, 0}
- };
-
- char if_name[MAX_STRING_LEN];
- char mode[MAX_STRING_LEN];
- int i;
-
assert(result);
init_result(result);
@@ -213,75 +198,36 @@ NET_FNCLIST
if (0 != get_param(param, 2, mode, sizeof(mode)))
*mode = '\0';
- /* default parameter */
- if (*mode == '\0')
- zbx_snprintf(mode, sizeof(mode), "bytes");
-
- for (i = 0; fl[i].mode != 0; i++)
- if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
- return (fl[i].function)(if_name, result);
-
- return SYSINFO_RET_FAIL;
-}
-
-static int NET_IF_OUT_BYTES(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
+ if (SYSINFO_RET_OK != get_ifdata(if_name, &ibytes, &ipackets, &ierrors, &idropped, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
return SYSINFO_RET_FAIL;
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
-static int NET_IF_OUT_PACKETS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL, NULL))
+ if ('\0' == *mode || 0 == strcmp(mode, "bytes")) /* default parameter */
+ {
+ SET_UI64_RESULT(result, ibytes);
+ }
+ else if (0 == strcmp(mode, "packets"))
+ {
+ SET_UI64_RESULT(result, ipackets);
+ }
+ else if (0 == strcmp(mode, "errors"))
+ {
+ SET_UI64_RESULT(result, ierrors);
+ }
+ else if (0 == strcmp(mode, "dropped"))
+ {
+ SET_UI64_RESULT(result, idropped);
+ }
+ else
return SYSINFO_RET_FAIL;
- SET_UI64_RESULT(result, value);
-
return SYSINFO_RET_OK;
}
-static int NET_IF_OUT_ERRORS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
int NET_IF_OUT(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
-#define NET_FNCLIST struct net_fnclist_s
-NET_FNCLIST
-{
- char *mode;
- int (*function)();
-};
+ char if_name[MAX_STRING_LEN], mode[16];
+ zbx_uint64_t obytes, opackets, oerrors;
- NET_FNCLIST fl[] =
- {
- {"bytes", NET_IF_OUT_BYTES},
- {"packets", NET_IF_OUT_PACKETS},
- {"errors", NET_IF_OUT_ERRORS},
-/* {"dropped", NET_IF_OUT_DROPPED},*/
- {0, 0}
- };
-
- char if_name[MAX_STRING_LEN];
- char mode[MAX_STRING_LEN];
- int i;
-
assert(result);
init_result(result);
@@ -295,87 +241,32 @@ NET_FNCLIST
if (0 != get_param(param, 2, mode, sizeof(mode)))
*mode = '\0';
- /* default parameter */
- if (*mode == '\0')
- zbx_snprintf(mode, sizeof(mode), "bytes");
-
- for (i = 0; fl[i].mode != 0; i++)
- if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
- return (fl[i].function)(if_name, result);
-
- return SYSINFO_RET_FAIL;
-}
-
-static int NET_IF_TOTAL_BYTES(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL, NULL))
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, &obytes, &opackets, &oerrors, NULL, NULL, NULL, NULL))
return SYSINFO_RET_FAIL;
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
-static int NET_IF_TOTAL_PACKETS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL, NULL))
+ if ('\0' == *mode || 0 == strcmp(mode, "bytes")) /* default parameter */
+ {
+ SET_UI64_RESULT(result, obytes);
+ }
+ else if (0 == strcmp(mode, "packets"))
+ {
+ SET_UI64_RESULT(result, opackets);
+ }
+ else if (0 == strcmp(mode, "errors"))
+ {
+ SET_UI64_RESULT(result, oerrors);
+ }
+ else
return SYSINFO_RET_FAIL;
- SET_UI64_RESULT(result, value);
-
return SYSINFO_RET_OK;
}
-static int NET_IF_TOTAL_ERRORS(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
-static int NET_IF_TOTAL_DROPPED(const char *if_name, AGENT_RESULT *result)
-{
- zbx_uint64_t value;
-
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value, NULL))
- return SYSINFO_RET_FAIL;
-
- SET_UI64_RESULT(result, value);
-
- return SYSINFO_RET_OK;
-}
-
int NET_IF_TOTAL(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
-#define NET_FNCLIST struct net_fnclist_s
-NET_FNCLIST
-{
- char *mode;
- int (*function)();
-};
+ char if_name[MAX_STRING_LEN], mode[16];
+ zbx_uint64_t tbytes, tpackets, terrors;
- NET_FNCLIST fl[] =
- {
- {"bytes", NET_IF_TOTAL_BYTES},
- {"packets", NET_IF_TOTAL_PACKETS},
- {"errors", NET_IF_TOTAL_ERRORS},
-/* {"dropped", NET_IF_TOTAL_DROPPED},*/ /* disabled because net.if.out does not support dropped packets */
- {0, 0}
- };
-
- char if_name[MAX_STRING_LEN];
- char mode[MAX_STRING_LEN];
- int i;
-
assert(result);
init_result(result);
@@ -389,18 +280,28 @@ NET_FNCLIST
if (0 != get_param(param, 2, mode, sizeof(mode)))
*mode = '\0';
- /* default parameter */
- if (*mode == '\0')
- zbx_snprintf(mode, sizeof(mode), "bytes");
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &tbytes, &tpackets, &terrors, NULL))
+ return SYSINFO_RET_FAIL;
- for (i = 0; fl[i].mode != 0; i++)
- if (0 == strncmp(mode, fl[i].mode, MAX_STRING_LEN))
- return (fl[i].function)(if_name, result);
+ if ('\0' == *mode || 0 == strcmp(mode, "bytes")) /* default parameter */
+ {
+ SET_UI64_RESULT(result, tbytes);
+ }
+ else if (0 == strcmp(mode, "packets"))
+ {
+ SET_UI64_RESULT(result, tpackets);
+ }
+ else if (0 == strcmp(mode, "errors"))
+ {
+ SET_UI64_RESULT(result, terrors);
+ }
+ else
+ return SYSINFO_RET_FAIL;
- return SYSINFO_RET_FAIL;
+ return SYSINFO_RET_OK;
}
-int NET_TCP_LISTEN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
+int NET_TCP_LISTEN(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
assert(result);
@@ -409,10 +310,10 @@ int NET_TCP_LISTEN(const char *cmd, const char *pa
return SYSINFO_RET_FAIL;
}
-int NET_IF_COLLISIONS(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
+int NET_IF_COLLISIONS(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result)
{
- zbx_uint64_t value;
char if_name[MAX_STRING_LEN];
+ zbx_uint64_t icollisions;
assert(result);
@@ -424,10 +325,10 @@ int NET_IF_COLLISIONS(const char *cmd, const char
if (0 != get_param(param, 1, if_name, sizeof(if_name)))
*if_name = '\0';
- if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &value))
+ if (SYSINFO_RET_OK != get_ifdata(if_name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &icollisions))
return SYSINFO_RET_FAIL;
- SET_UI64_RESULT(result, value);
+ SET_UI64_RESULT(result, icollisions);
return SYSINFO_RET_OK;
}