]> git.seodisparate.com - UDPConnection/commitdiff
Add check for endianness, fix strtoa for ipv4
authorStephen Seo <seo.disparate@gmail.com>
Sun, 7 Jul 2019 05:44:37 +0000 (14:44 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Sun, 7 Jul 2019 05:44:37 +0000 (14:44 +0900)
cpp_impl/src/UDPC_Defines.hpp
cpp_impl/src/UDPConnection.cpp

index 5af1f18052f902e0c081128fb0dd93fb071cee3c..3e8f6f0a0799bf8537b77bdf810425dae106a0ae 100644 (file)
@@ -27,6 +27,8 @@ struct Context {
 
 bool VerifyContext(void *ctx);
 
+bool isBigEndian();
+
 } // namespace UDPC
 
 #endif
index 210cabc3005de40fe6b2fdab95fc613fe463a2d2..f18e4be05a048b85d383955854c7d2cc196b6770 100644 (file)
@@ -1,6 +1,9 @@
 #include "UDPC_Defines.hpp"
 #include "UDPConnection.h"
 
+
+#include <optional>
+
 UDPC::Context::Context(bool isThreaded)
     : _contextIdentifier(UDPC_CONTEXT_IDENTIFIER), flags(),
       isAcceptNewConnections(true), protocolID(UDPC_DEFAULT_PROTOCOL_ID),
@@ -29,6 +32,21 @@ bool UDPC::VerifyContext(void *ctx) {
     }
 }
 
+bool UDPC::isBigEndian() {
+    static std::optional<bool> isBigEndian = {};
+    if(isBigEndian) {
+        return *isBigEndian;
+    }
+    union {
+        uint32_t i;
+        char c[4];
+    } bint = { 0x01020304 };
+
+    isBigEndian = (bint.c[0] == 1);
+    return *isBigEndian;
+}
+
+
 void *UDPC_init(uint16_t listenPort, uint32_t listenAddr, int isClient) {
     UDPC::Context *ctx = new UDPC::Context(false);
 
@@ -156,7 +174,11 @@ uint32_t UDPC_strtoa(const char *addrStr) {
             temp *= 10;
             temp += *addrStr - '0';
         } else if (*addrStr == '.' && temp <= 0xFF && index < 3) {
-            addr |= (temp << (8 * index++));
+            if(UDPC::isBigEndian()) {
+                addr |= (temp << (24 - 8 * index++));
+            } else {
+                addr |= (temp << (8 * index++));
+            }
             temp = 0;
         } else {
             return 0;
@@ -165,7 +187,11 @@ uint32_t UDPC_strtoa(const char *addrStr) {
     }
 
     if (index == 3 && temp <= 0xFF) {
-        addr |= temp << 24;
+        if(UDPC::isBigEndian()) {
+            addr |= temp;
+        } else {
+            addr |= temp << 24;
+        }
         return addr;
     } else {
         return 0;