summaryrefslogtreecommitdiffstats
path: root/plugins-root/check_icmp.d/check_icmp_helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins-root/check_icmp.d/check_icmp_helpers.c')
-rw-r--r--plugins-root/check_icmp.d/check_icmp_helpers.c64
1 files changed, 15 insertions, 49 deletions
diff --git a/plugins-root/check_icmp.d/check_icmp_helpers.c b/plugins-root/check_icmp.d/check_icmp_helpers.c
index a2b54c6a..47604952 100644
--- a/plugins-root/check_icmp.d/check_icmp_helpers.c
+++ b/plugins-root/check_icmp.d/check_icmp_helpers.c
@@ -1,7 +1,7 @@
1#include "./config.h" 1#include "./config.h"
2#include "states.h"
3#include <math.h> 2#include <math.h>
4#include <netinet/in.h> 3#include <netinet/in.h>
4#include <sys/socket.h>
5#include "./check_icmp_helpers.h" 5#include "./check_icmp_helpers.h"
6#include "../../plugins/netutils.h" 6#include "../../plugins/netutils.h"
7 7
@@ -38,7 +38,10 @@ check_icmp_config check_icmp_config_init() {
38 .pkt_interval = DEFAULT_PKT_INTERVAL, 38 .pkt_interval = DEFAULT_PKT_INTERVAL,
39 .target_interval = 0, 39 .target_interval = 0,
40 .number_of_packets = DEFAULT_NUMBER_OF_PACKETS, 40 .number_of_packets = DEFAULT_NUMBER_OF_PACKETS,
41
41 .source_ip = NULL, 42 .source_ip = NULL,
43 .need_v4 = false,
44 .need_v6 = false,
42 45
43 .sender_id = {}, 46 .sender_id = {},
44 47
@@ -71,68 +74,31 @@ check_icmp_state check_icmp_state_init() {
71 return tmp; 74 return tmp;
72} 75}
73 76
74ping_target_create_wrapper ping_target_create(char *name, struct sockaddr_storage *address) { 77ping_target_create_wrapper ping_target_create(struct sockaddr_storage address) {
75 struct sockaddr_in *sin;
76 struct sockaddr_in6 *sin6;
77 if (address_family == AF_INET) {
78 sin = (struct sockaddr_in *)address;
79 } else {
80 sin6 = (struct sockaddr_in6 *)address;
81 }
82
83 ping_target_create_wrapper result = { 78 ping_target_create_wrapper result = {
84 .errorcode = OK, 79 .errorcode = OK,
85 }; 80 };
86 81
82 struct sockaddr_storage *tmp_addr = &address;
83
87 /* disregard obviously stupid addresses 84 /* disregard obviously stupid addresses
88 * (I didn't find an ipv6 equivalent to INADDR_NONE) */ 85 * (I didn't find an ipv6 equivalent to INADDR_NONE) */
89 if (((address_family == AF_INET && 86 if (((tmp_addr->ss_family == AF_INET &&
90 (sin->sin_addr.s_addr == INADDR_NONE || sin->sin_addr.s_addr == INADDR_ANY))) || 87 (((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_NONE ||
91 (address_family == AF_INET6 && (sin6->sin6_addr.s6_addr == in6addr_any.s6_addr))) { 88 ((struct sockaddr_in *)tmp_addr)->sin_addr.s_addr == INADDR_ANY))) ||
89 (tmp_addr->ss_family == AF_INET6 &&
90 (((struct sockaddr_in6 *)tmp_addr)->sin6_addr.s6_addr == in6addr_any.s6_addr))) {
92 result.errorcode = ERROR; 91 result.errorcode = ERROR;
93 return result; 92 return result;
94 } 93 }
95 94
96 // TODO: Maybe add the following back in as a sanity check for the config
97 // /* no point in adding two identical IP's, so don't. ;) */
98 // struct sockaddr_in *host_sin;
99 // struct sockaddr_in6 *host_sin6;
100 // struct rta_host *host = host_list;
101
102 // while (host) {
103 // host_sin = (struct sockaddr_in *)&host->saddr_in;
104 // host_sin6 = (struct sockaddr_in6 *)&host->saddr_in;
105
106 // if ((address_family == AF_INET && host_sin->sin_addr.s_addr == sin->sin_addr.s_addr) ||
107 // (address_family == AF_INET6 &&
108 // host_sin6->sin6_addr.s6_addr == sin6->sin6_addr.s6_addr)) {
109 // if (debug) {
110 // printf("Identical IP already exists. Not adding %s\n", name);
111 // }
112 // return -1;
113 // }
114 // host = host->next;
115 // }
116
117 /* add the fresh ip */ 95 /* add the fresh ip */
118 ping_target host = ping_target_init(); 96 ping_target target = ping_target_init();
119
120 /* set the values. use calling name for output */
121 host.name = strdup(name);
122 97
123 /* fill out the sockaddr_storage struct */ 98 /* fill out the sockaddr_storage struct */
124 if (address_family == AF_INET) { 99 target.address = address;
125 struct sockaddr_in *host_sin = (struct sockaddr_in *)&host.saddr_in;
126 host_sin->sin_family = AF_INET;
127 host_sin->sin_addr.s_addr = sin->sin_addr.s_addr;
128 } else {
129 struct sockaddr_in6 *host_sin6 = (struct sockaddr_in6 *)&host.saddr_in;
130 host_sin6->sin6_family = AF_INET6;
131 memcpy(host_sin6->sin6_addr.s6_addr, sin6->sin6_addr.s6_addr,
132 sizeof host_sin6->sin6_addr.s6_addr);
133 }
134 100
135 result.host = host; 101 result.host = target;
136 102
137 return result; 103 return result;
138} 104}