Remove Profile Build Dependency: do it at runtime. 57/101357/2
authorMyungJoo Ham <myungjoo.ham@samsung.com>
Thu, 1 Dec 2016 04:08:52 +0000 (13:08 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Thu, 29 Dec 2016 06:55:08 +0000 (15:55 +0900)
Whether kernel is >=3.9 or not is better determined at runtime.

Change-Id: I94ae4fafce56f10f118185918bdbe164bc7b2619
Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
mDNSPosix/Makefile
mDNSPosix/mDNSPosix.c
packaging/mdnsresponder.spec

index 7b2261d..55c522b 100755 (executable)
@@ -157,9 +157,6 @@ else
 
 ifeq ($(os),tizen)
 CFLAGS_OS = -D_GNU_SOURCE -DHAVE_IPV6 -DNOT_HAVE_SA_LEN -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX -DTIZEN_EXT -fno-strict-aliasing $(shell pkg-config --cflags --libs glib-2.0)
-ifdef CONFIG_DISABLE_REUSEPORT
-CFLAGS_OS += -DCONFIG_DISABLE_REUSEPORT
-endif
 LD = $(CC) -shared
 FLEXFLAGS_OS = -l
 INSTBASE = $(DESTDIR)/usr
index eba81d3..a701eb8 100755 (executable)
@@ -51,6 +51,9 @@
 #endif // USES_NETLINK
 #include "mDNSUNP.h"
 #include "GenLinkedList.h"
+#ifdef TARGET_OS_LINUX
+#include <sys/utsname.h> // Check Linux Kernel Version with uname()
+#endif
 
 // ***************************************************************************
 // Structures
@@ -613,6 +616,61 @@ mDNSlocal void ClearInterfaceList(mDNS *const m)
     num_pkts_rejected = 0;
 }
 
+// Check Linux kernel version supports REUSEPORT
+mDNSlocal int IsAbleToReusePort()
+{
+#ifndef TARGET_OS_LINUX
+    return 0; // I just do not have any idea. (Not Linux)
+#else /* TARGET_OS_LINUX == defined */
+    /*
+     * 0  : unknown (probe it!)
+     * 1  : yes (Linux >= 3.9)
+     * -1 : no  (Linux <  3.9)
+     */
+    static int mayUse = 0;
+
+    if (__builtin_expect(mayUse != 0, 1)) {
+        return (mayUse > 0);
+    } else {
+       struct utsname buf;
+        int ret = uname(&buf);
+       int major, minor;
+       char *tok;
+
+
+       if (ret < 0)
+           return 0;
+
+       major = atoi(buf.release); /* First digits before '.' */
+
+
+       if (major < 3) {
+           mayUse = -1;
+           return mayUse;
+       }
+       if (major > 3) {
+           mayUse = 1;
+           return mayUse;
+       }
+
+       tok = strtok(buf.release, ".");
+       if (tok != NULL) {
+           tok = strtok(NULL, ".");
+           minor = atoi(tok);
+       } else {
+           minor = 0;
+       }
+
+       if (minor >= 9)
+           mayUse = 1;
+       else
+           mayUse = -1;
+    }
+
+    return mayUse;
+#endif /* TARGET_OS_LINUX */
+}
+
 // Sets up a send/receive socket.
 // If mDNSIPPort port is non-zero, then it's a multicast socket on the specified interface
 // If mDNSIPPort port is zero, then it's a randomly assigned port number, used for sending unicast queries
@@ -641,8 +699,10 @@ mDNSlocal int SetupSocket(struct sockaddr *intfAddr, mDNSIPPort port, int interf
     // ... with a shared UDP port, if it's for multicast receiving
     if (err == 0 && port.NotAnInteger)
     {
-        #if defined(SO_REUSEPORT) && !defined(CONFIG_DISABLE_REUSEPORT)
-        err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
+        #if defined(SO_REUSEPORT)
+       if (IsAbleToReusePort() > 0) {
+            err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEPORT, &kOn, sizeof(kOn));
+       }
         #elif defined(SO_REUSEADDR)
         err = setsockopt(*sktPtr, SOL_SOCKET, SO_REUSEADDR, &kOn, sizeof(kOn));
         #else
index 389f91f..6ca2916 100755 (executable)
@@ -47,18 +47,6 @@ cp -a %{SOURCE1002} .
 CONFIG_TIZEN_64BIT=y; export CONFIG_TIZEN_64BIT
 %endif
 
-%if "%{profile}" == "wearable"
-CONFIG_DISABLE_REUSEPORT=y; export CONFIG_DISABLE_REUSEPORT
-%endif
-
-%if "%{profile}" == "tv"
-CONFIG_DISABLE_REUSEPORT=y; export CONFIG_DISABLE_REUSEPORT
-%endif
-
-%if "%{?TIZEN_PRODUCT_TV}" == "1"
-CONFIG_DISABLE_REUSEPORT=y; export CONFIG_DISABLE_REUSEPORT
-%endif
-
 cd mDNSPosix
 make os=tizen %{?_smp_mflags}