diff options
-rw-r--r-- | plugins-root/check_icmp.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/plugins-root/check_icmp.c b/plugins-root/check_icmp.c index d2f637f..0771325 100644 --- a/plugins-root/check_icmp.c +++ b/plugins-root/check_icmp.c | |||
@@ -378,6 +378,9 @@ main(int argc, char **argv) | |||
378 | int icmp_sockerrno, udp_sockerrno, tcp_sockerrno; | 378 | int icmp_sockerrno, udp_sockerrno, tcp_sockerrno; |
379 | int result; | 379 | int result; |
380 | struct rta_host *host; | 380 | struct rta_host *host; |
381 | #ifdef SO_TIMESTAMP | ||
382 | int on = 1; | ||
383 | #endif | ||
381 | 384 | ||
382 | setlocale (LC_ALL, ""); | 385 | setlocale (LC_ALL, ""); |
383 | bindtextdomain (PACKAGE, LOCALEDIR); | 386 | bindtextdomain (PACKAGE, LOCALEDIR); |
@@ -403,7 +406,6 @@ main(int argc, char **argv) | |||
403 | setuid(getuid()); | 406 | setuid(getuid()); |
404 | 407 | ||
405 | #ifdef SO_TIMESTAMP | 408 | #ifdef SO_TIMESTAMP |
406 | int on = 1; | ||
407 | if(setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) | 409 | if(setsockopt(icmp_sock, SOL_SOCKET, SO_TIMESTAMP, &on, sizeof(on))) |
408 | if(debug) printf("Warning: no SO_TIMESTAMP support\n"); | 410 | if(debug) printf("Warning: no SO_TIMESTAMP support\n"); |
409 | #endif // SO_TIMESTAMP | 411 | #endif // SO_TIMESTAMP |
@@ -828,6 +830,8 @@ send_icmp_ping(int sock, struct rta_host *host) | |||
828 | } packet = { NULL }; | 830 | } packet = { NULL }; |
829 | long int len; | 831 | long int len; |
830 | struct icmp_ping_data data; | 832 | struct icmp_ping_data data; |
833 | struct msghdr hdr; | ||
834 | struct iovec iov; | ||
831 | struct timeval tv; | 835 | struct timeval tv; |
832 | struct sockaddr *addr; | 836 | struct sockaddr *addr; |
833 | 837 | ||
@@ -863,16 +867,16 @@ send_icmp_ping(int sock, struct rta_host *host) | |||
863 | printf("Sending ICMP echo-request of len %u, id %u, seq %u, cksum 0x%X to host %s\n", | 867 | printf("Sending ICMP echo-request of len %u, id %u, seq %u, cksum 0x%X to host %s\n", |
864 | sizeof(data), ntohs(packet.icp->icmp_id), ntohs(packet.icp->icmp_seq), packet.icp->icmp_cksum, host->name); | 868 | sizeof(data), ntohs(packet.icp->icmp_id), ntohs(packet.icp->icmp_seq), packet.icp->icmp_cksum, host->name); |
865 | 869 | ||
866 | struct msghdr hdr; | ||
867 | memset(&hdr, 0, sizeof(hdr)); | ||
868 | hdr.msg_name = addr; | ||
869 | hdr.msg_namelen = sizeof(struct sockaddr); | ||
870 | struct iovec iov; | ||
871 | memset(&iov, 0, sizeof(iov)); | 870 | memset(&iov, 0, sizeof(iov)); |
872 | iov.iov_base = packet.buf; | 871 | iov.iov_base = packet.buf; |
873 | iov.iov_len = icmp_pkt_size; | 872 | iov.iov_len = icmp_pkt_size; |
873 | |||
874 | memset(&hdr, 0, sizeof(hdr)); | ||
875 | hdr.msg_name = addr; | ||
876 | hdr.msg_namelen = sizeof(struct sockaddr); | ||
874 | hdr.msg_iov = &iov; | 877 | hdr.msg_iov = &iov; |
875 | hdr.msg_iovlen = 1; | 878 | hdr.msg_iovlen = 1; |
879 | |||
876 | len = sendmsg(sock, &hdr, MSG_CONFIRM); | 880 | len = sendmsg(sock, &hdr, MSG_CONFIRM); |
877 | 881 | ||
878 | if(len < 0 || (unsigned int)len != icmp_pkt_size) { | 882 | if(len < 0 || (unsigned int)len != icmp_pkt_size) { |
@@ -892,9 +896,15 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, | |||
892 | u_int *timo, struct timeval* tv) | 896 | u_int *timo, struct timeval* tv) |
893 | { | 897 | { |
894 | u_int slen; | 898 | u_int slen; |
895 | int n; | 899 | int n, ret; |
896 | struct timeval to, then, now; | 900 | struct timeval to, then, now; |
897 | fd_set rd, wr; | 901 | fd_set rd, wr; |
902 | char ans_data[4096]; | ||
903 | struct msghdr hdr; | ||
904 | struct iovec iov; | ||
905 | #ifdef SO_TIMESTAMP | ||
906 | struct cmsghdr* chdr; | ||
907 | #endif | ||
898 | 908 | ||
899 | if(!*timo) { | 909 | if(!*timo) { |
900 | if(debug) printf("*timo is not\n"); | 910 | if(debug) printf("*timo is not\n"); |
@@ -918,22 +928,20 @@ recvfrom_wto(int sock, void *buf, unsigned int len, struct sockaddr *saddr, | |||
918 | 928 | ||
919 | slen = sizeof(struct sockaddr); | 929 | slen = sizeof(struct sockaddr); |
920 | 930 | ||
921 | struct msghdr hdr; | ||
922 | memset(&hdr, 0, sizeof(hdr)); | ||
923 | hdr.msg_name = saddr; | ||
924 | hdr.msg_namelen = slen; | ||
925 | struct iovec iov; | ||
926 | memset(&iov, 0, sizeof(iov)); | 931 | memset(&iov, 0, sizeof(iov)); |
927 | iov.iov_base = buf; | 932 | iov.iov_base = buf; |
928 | iov.iov_len = len; | 933 | iov.iov_len = len; |
934 | |||
935 | memset(&hdr, 0, sizeof(hdr)); | ||
936 | hdr.msg_name = saddr; | ||
937 | hdr.msg_namelen = slen; | ||
929 | hdr.msg_iov = &iov; | 938 | hdr.msg_iov = &iov; |
930 | hdr.msg_iovlen = 1; | 939 | hdr.msg_iovlen = 1; |
931 | char ans_data[4096]; | ||
932 | hdr.msg_control = ans_data; | 940 | hdr.msg_control = ans_data; |
933 | hdr.msg_controllen = sizeof(ans_data); | 941 | hdr.msg_controllen = sizeof(ans_data); |
934 | int ret = recvmsg(sock, &hdr, 0); | 942 | |
943 | ret = recvmsg(sock, &hdr, 0); | ||
935 | #ifdef SO_TIMESTAMP | 944 | #ifdef SO_TIMESTAMP |
936 | struct cmsghdr* chdr; | ||
937 | for(chdr = CMSG_FIRSTHDR(&hdr); chdr; chdr = CMSG_NXTHDR(&hdr, chdr)) { | 945 | for(chdr = CMSG_FIRSTHDR(&hdr); chdr; chdr = CMSG_NXTHDR(&hdr, chdr)) { |
938 | if(chdr->cmsg_level == SOL_SOCKET | 946 | if(chdr->cmsg_level == SOL_SOCKET |
939 | && chdr->cmsg_type == SO_TIMESTAMP | 947 | && chdr->cmsg_type == SO_TIMESTAMP |