Kaynağa Gözat

check_icmp IPv6 work

Box293 7 yıl önce
ebeveyn
işleme
2c4f7f2308
1 değiştirilmiş dosya ile 29 ekleme ve 21 silme
  1. 29 21
      plugins-root/check_icmp.c

+ 29 - 21
plugins-root/check_icmp.c

@@ -421,6 +421,9 @@ main(int argc, char **argv)
 	/* print a helpful error message if geteuid != 0 */
 	np_warn_if_not_root();
 
+	/* Set default address_family to AF_INET (IPv4) */
+	address_family = AF_INET;
+			
 	/* we only need to be setsuid when we get the sockets, so do
 	 * that before pointer magic (esp. on network data) */
 	icmp_sockerrno = udp_sockerrno = tcp_sockerrno = sockets = 0;
@@ -513,7 +516,7 @@ main(int argc, char **argv)
 
 	/* parse the arguments */
 	for(i = 1; i < argc; i++) {
-		while((arg = getopt(argc, argv, "vhVw:c:n:p:t:H:s:i:b:I:l:m:P:R:J:S:M:O:6")) != EOF) {
+		while((arg = getopt(argc, argv, "vhVw:c:n:p:t:6:H:s:i:b:I:l:m:P:R:J:S:M:O")) != EOF) {
 			long size;
 			switch(arg) {
 			case 'v':
@@ -550,6 +553,9 @@ main(int argc, char **argv)
 				timeout = strtoul(optarg, NULL, 0);
 				if(!timeout) timeout = 10;
 				break;
+			case '6':
+				address_family = AF_INET6;
+				break;
 			case 'H':
 				add_target(optarg);
 				break;
@@ -568,13 +574,6 @@ main(int argc, char **argv)
 			case 's': /* specify source IP address */
 				set_source_ip(optarg);
 				break;
-			case '6':
-#ifdef USE_IPV6
-				address_family = AF_INET6;
-#else
-				usage4 (_("IPv6 support not available"));
-#endif
-				break;
 			case 'V': /* version */
 				print_revision (progname, NP_VERSION);
 				exit (STATE_OK);
@@ -608,18 +607,22 @@ main(int argc, char **argv)
 		}
 	}
 
+	if(debug > 0)
+		printf("address_family: %i (IPv4 = 2; IPv6 = 10)\n", address_family);
+
+	
 	/* If not AF_INET6 (IPv6) then set default to AF_INET (IPv4) */
-	if(address_family == AF_UNSPEC) {
-		address_family = AF_INET;
-		if(debug) {
-			printf("address_family: %i (IPv4)\n", address_family);
-		}
-	}
-	else {
-		if(debug) {
-			printf("address_family: %i (IPv6)\n", address_family);
-		}
-	}
+/* 	if(address_family == AF_UNSPEC) {*/
+/* 		address_family = AF_INET;*/
+/* 		if(debug) {*/
+/* 			printf("address_family: %i (IPv4)\n", address_family);*/
+/* 		}*/
+/* 	}*/
+/* 	else {*/
+/* 		if(debug) {*/
+/* 			printf("address_family: %i (IPv6)\n", address_family);*/
+/* 		}*/
+/* 	}*/
 
 	argv = &argv[optind];
 	while(*argv) {
@@ -975,7 +978,7 @@ send_icmp_ping(int sock, struct rta_host *host)
 		return -1;
 	}
 	addr = (struct sockaddr *)&host->saddr_in;
-
+	
 	if(!packet.buf) {
 		if (!(packet.buf = malloc(icmp_pkt_size))) {
 			crash("send_icmp_ping(): failed to malloc %d bytes for send buffer",
@@ -1461,8 +1464,13 @@ add_target(char *arg)
 	struct hostent *he;
 	struct in_addr *in, ip;
 
+	inet_pton(address_family, arg, &(ip.s_addr));
+	
+	/* don't resolve if we don't have to */
+	if(ip.s_addr != INADDR_NONE) {
+	
 	/* don't resolve if we don't have to */
-	if((ip.s_addr = inet_addr(arg)) != INADDR_NONE) {
+	/*if((ip.s_addr = inet_addr(arg)) != INADDR_NONE) {*/
 		/* don't add all ip's if we were given a specific one */
 		return add_target_ip(arg, &ip);
 		/* he = gethostbyaddr((char *)in, sizeof(struct in_addr), AF_INET); */