Jelajahi Sumber

Merge pull request #853 from darkain/dev

Fix IPv6 address string representation
Adam Ierymenko 6 tahun lalu
induk
melakukan
60d5a3c631
1 mengubah file dengan 7 tambahan dan 36 penghapusan
  1. 7 36
      node/InetAddress.cpp

+ 7 - 36
node/InetAddress.cpp

@@ -139,33 +139,15 @@ char *InetAddress::toString(char buf[64]) const
 
 char *InetAddress::toIpString(char buf[64]) const
 {
+	buf[0] = (char)0;
 	switch(ss_family) {
 		case AF_INET: {
-			const uint8_t *a = reinterpret_cast<const uint8_t *>(&(reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr));
-			char *p = buf;
-			for(int i=0;;++i) {
-				Utils::decimal((unsigned long)a[i],p);
-				if (i != 3) {
-					while (*p) ++p;
-					*(p++) = '.';
-				} else break;
-			}
-		}	break;
+			inet_ntop(AF_INET, &reinterpret_cast<const struct sockaddr_in *>(this)->sin_addr.s_addr, buf, INET_ADDRSTRLEN);
+ 		}	break;
 
 		case AF_INET6: {
-			uint16_t a[8];
-			ZT_FAST_MEMCPY(a,reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr,16);
-			char *p = buf;
-			for(int i=0;i<8;++i) {
-				Utils::hex(Utils::ntoh(a[i]),p);
-				p[4] = (i == 7) ? (char)0 : ':';
-				p += 5;
-			}
+			inet_ntop(AF_INET6, reinterpret_cast<const struct sockaddr_in6 *>(this)->sin6_addr.s6_addr, buf, INET6_ADDRSTRLEN);
 		}	break;
-
-		default:
-			buf[0] = (char)0;
-			break;
 	}
 	return buf;
 }
@@ -191,28 +173,17 @@ bool InetAddress::fromString(const char *ipSlashPort)
 	}
 
 	if (strchr(buf,':')) {
-		uint16_t a[8];
-		unsigned int b = 0;
-		char *saveptr = (char *)0;
-		for(char *s=Utils::stok(buf,":",&saveptr);((s)&&(b<8));s=Utils::stok((char *)0,":",&saveptr))
-			a[b++] = Utils::hton((uint16_t)(Utils::hexStrToUInt(s) & 0xffff));
-
 		struct sockaddr_in6 *const in6 = reinterpret_cast<struct sockaddr_in6 *>(this);
+		inet_pton(AF_INET6, buf, &in6->sin6_addr.s6_addr);
 		in6->sin6_family = AF_INET6;
-		ZT_FAST_MEMCPY(in6->sin6_addr.s6_addr,a,16);
 		in6->sin6_port = Utils::hton((uint16_t)port);
 
+
 		return true;
 	} else if (strchr(buf,'.')) {
-		uint8_t a[4];
-		unsigned int b = 0;
-		char *saveptr = (char *)0;
-		for(char *s=Utils::stok(buf,".",&saveptr);((s)&&(b<4));s=Utils::stok((char *)0,".",&saveptr))
-			a[b++] = (uint8_t)(Utils::strToUInt(s) & 0xff);
-
 		struct sockaddr_in *const in = reinterpret_cast<struct sockaddr_in *>(this);
+		inet_pton(AF_INET, buf, &in->sin_addr.s_addr);
 		in->sin_family = AF_INET;
-		ZT_FAST_MEMCPY(&(in->sin_addr.s_addr),a,4);
 		in->sin_port = Utils::hton((uint16_t)port);
 
 		return true;