浏览代码

Fixed sg_ip() allowing to retrieve IPv4 mapped in IPv6.

silvioprog 6 年之前
父节点
当前提交
27a4227636
共有 3 个文件被更改,包括 13 次插入16 次删除
  1. 1 1
      include/sagui.h
  2. 12 13
      src/sg_utils.c
  3. 0 2
      test/test_utils.c

+ 1 - 1
include/sagui.h

@@ -74,7 +74,7 @@ extern "C" {
 
 #define SG_VERSION_MAJOR 2
 #define SG_VERSION_MINOR 5
-#define SG_VERSION_PATCH 1
+#define SG_VERSION_PATCH 2
 #define SG_VERSION_HEX                                                         \
   ((SG_VERSION_MAJOR << 16) | (SG_VERSION_MINOR << 8) | (SG_VERSION_PATCH))
 

+ 12 - 13
src/sg_utils.c

@@ -374,22 +374,21 @@ done:
 
 int sg_ip(const void *socket, char *buf, size_t size) {
   const struct sockaddr *sa;
+  const void *addr6;
+  size_t len;
   if (!socket || !buf || (ssize_t) size < 0)
     return EINVAL;
   sa = socket;
-  switch (sa->sa_family) {
-    case AF_INET:
-      if (!inet_ntop(AF_INET, &(((struct sockaddr_in *) sa)->sin_addr), buf,
-                     size))
-        return errno;
-      break;
-    case AF_INET6:
-      if (!inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) sa)->sin6_addr), buf,
-                     size))
-        return errno;
-      break;
-    default:
-      return EINVAL;
+  if (sa->sa_family == AF_INET6) {
+    addr6 = &(((struct sockaddr_in6 *) sa)->sin6_addr);
+    if (!inet_ntop(AF_INET6, addr6, buf, size))
+      return errno;
+    len = strlen("::ffff:");
+    if (IN6_IS_ADDR_V4MAPPED(addr6) && (size > len))
+      memcpy(buf, buf + len, strlen(buf + len) + 1);
+    return 0;
   }
+  if (!inet_ntop(AF_INET, &(((struct sockaddr_in *) sa)->sin_addr), buf, size))
+    return errno;
   return 0;
 }

+ 0 - 2
test/test_utils.c

@@ -447,8 +447,6 @@ static void test_ip(void) {
   ASSERT(sg_ip(NULL, buf, sizeof(buf)) == EINVAL);
   ASSERT(sg_ip(&sa, NULL, sizeof(buf)) == EINVAL);
   ASSERT(sg_ip(&sa, buf, -1) == EINVAL);
-  sa.sa_family = 123;
-  ASSERT(sg_ip(&sa, buf, sizeof(buf)) == EINVAL);
 
   sa.sa_family = AF_INET;
   ASSERT(sg_ip(&sa, buf, 16) == 0);