summaryrefslogtreecommitdiffstats
path: root/plugins-root/check_icmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins-root/check_icmp.c')
-rw-r--r--plugins-root/check_icmp.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c
index 58d8a545..e536e31c 100644
--- a/plugins-root/check_icmp.c
+++ b/plugins-root/check_icmp.c
@@ -277,15 +277,6 @@ typedef struct {
277 check_icmp_config config; 277 check_icmp_config config;
278} check_icmp_config_wrapper; 278} check_icmp_config_wrapper;
279check_icmp_config_wrapper process_arguments(int argc, char **argv) { 279check_icmp_config_wrapper process_arguments(int argc, char **argv) {
280 /* get calling name the old-fashioned way for portability instead
281 * of relying on the glibc-ism __progname */
282 char *ptr = strrchr(argv[0], '/');
283 if (ptr) {
284 progname = &ptr[1];
285 } else {
286 progname = argv[0];
287 }
288
289 check_icmp_config_wrapper result = { 280 check_icmp_config_wrapper result = {
290 .errorcode = OK, 281 .errorcode = OK,
291 .config = check_icmp_config_init(), 282 .config = check_icmp_config_init(),
@@ -828,6 +819,14 @@ int main(int argc, char **argv) {
828 /* POSIXLY_CORRECT might break things, so unset it (the portable way) */ 819 /* POSIXLY_CORRECT might break things, so unset it (the portable way) */
829 environ = NULL; 820 environ = NULL;
830 821
822 /* determine program- and service-name quickly */
823 progname = strrchr(argv[0], '/');
824 if (progname != NULL) {
825 progname++;
826 } else {
827 progname = argv[0];
828 }
829
831 /* Parse extra opts if any */ 830 /* Parse extra opts if any */
832 argv = np_extra_opts(&argc, argv, progname); 831 argv = np_extra_opts(&argc, argv, progname);
833 832
@@ -1470,10 +1469,13 @@ static recvfrom_wto_wrapper recvfrom_wto(const check_icmp_socket_set sockset, vo
1470 }; 1469 };
1471 1470
1472 ssize_t ret; 1471 ssize_t ret;
1473 if (FD_ISSET(sockset.socket4, &read_fds)) { 1472
1473 // Test explicitly whether sockets are in use
1474 // this is necessary at least on OpenBSD where FD_ISSET will segfault otherwise
1475 if ((sockset.socket4 != -1) && FD_ISSET(sockset.socket4, &read_fds)) {
1474 ret = recvmsg(sockset.socket4, &hdr, 0); 1476 ret = recvmsg(sockset.socket4, &hdr, 0);
1475 result.recv_proto = AF_INET; 1477 result.recv_proto = AF_INET;
1476 } else if (FD_ISSET(sockset.socket6, &read_fds)) { 1478 } else if ((sockset.socket6 != -1) && FD_ISSET(sockset.socket6, &read_fds)) {
1477 ret = recvmsg(sockset.socket6, &hdr, 0); 1479 ret = recvmsg(sockset.socket6, &hdr, 0);
1478 result.recv_proto = AF_INET6; 1480 result.recv_proto = AF_INET6;
1479 } else { 1481 } else {