diff options
Diffstat (limited to 'plugins-root')
| -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 d2f637fd..07713257 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 |
