Add logic for on-demand mdnsd daemon 40/65040/2 submit/tizen/20160407.054315
authorchleun.moon <chleun.moon@samsung.com>
Thu, 7 Apr 2016 04:41:00 +0000 (13:41 +0900)
committerchleun.moon <chleun.moon@samsung.com>
Thu, 7 Apr 2016 05:02:42 +0000 (14:02 +0900)
Change-Id: I688c0fb7cd9fdd6e0579daf7f6e4824f64638bb9
Signed-off-by: cheoleun <chleun.moon@samsung.com
packaging/capi-network-nsd.spec
src/dns-sd/dns-sd-util.h
src/dns-sd/dns-sd.c
test/dns-sd-test.c

index 980f3d2..b937deb 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-network-nsd
 Summary:    A Network Service Discovery libraries in Native API
-Version:    0.0.1
+Version:    0.0.2
 Release:    1
 Group:      System/Network
 License:    Apache-2.0
index 27f9091..d6b546f 100644 (file)
 #define IPV4_LEN 4
 #define IPV6_LEN 16
 
+#define NETCONFIG_SERVICE              "net.netconfig"
+#define NETCONFIG_NETWORK_INTERFACE    "net.netconfig.network"
+#define NETCONFIG_NETWORK_PATH         "/net/netconfig/network"
+#define NETCONFIG_NETWORK_LAUNCHMDNS   "LaunchMdns"
+#define NETCONFIG_NETWORK_REFMDNS              "RefMdns"
+#define NETCONFIG_NETWORK_UNREFMDNS            "UnrefMdns"
+#define DBUS_REPLY_TIMEOUT (120 * 1000)
+
+#define DNSSD_MDNSD_LAUNCH_RETRY_THRESHOLD 10
+#define DNSSD_MDNSD_LAUNCH_TRIAL_INTERVAL 150*1000     /* micro second */
+
 typedef enum {
        DNSSD_TYPE_UNKNOWN = 0  /**<DNS-SD service type unknown */,
        DNSSD_TYPE_REGISTER = 1 /**<DNS-SD service type register */,
index d889bf0..a4ed5ee 100644 (file)
@@ -17,6 +17,7 @@
 #include <net/if.h>
 #include <dlog.h>
 #include <glib.h>
+#include <gio/gio.h>
 #include <stdio.h>
 #include <string.h>
 #include <netinet/in.h>
@@ -67,9 +68,176 @@ static bool __dnssd_is_init(void)
        return g_is_init;
 }
 
+static int __dnssd_ref_mdns_dbus(void)
+{
+       GDBusConnection *netconfig_bus = NULL;
+       GError *g_error = NULL;
+
+       DNSSD_LOGD("Request to increase ref count for mdnsd");
+
+#if !GLIB_CHECK_VERSION(2,36,0)
+       g_type_init();
+#endif
+       netconfig_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &g_error);
+       if (netconfig_bus == NULL) {
+               if(g_error != NULL) {
+                       DNSSD_LOGE("Couldn't connect to system bus "
+                                       "error [%d: %s]", g_error->code, g_error->message);
+                       g_error_free(g_error);
+               }
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_dbus_connection_call_sync(netconfig_bus,
+                       NETCONFIG_SERVICE,
+                       NETCONFIG_NETWORK_PATH,
+                       NETCONFIG_NETWORK_INTERFACE,
+                       NETCONFIG_NETWORK_REFMDNS,
+                       NULL,
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT,
+                       NULL,
+                       &g_error);
+
+       if(g_error != NULL) {
+               DNSSD_LOGE("g_dbus_connection_call failed. "
+                               "error [%d: %s]", g_error->code, g_error->message);
+               g_error_free(g_error);
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_object_unref(netconfig_bus);
+
+       return DNSSD_ERROR_NONE;
+
+}
+
+static int __dnssd_unref_mdns_dbus(void)
+{
+       GDBusConnection *netconfig_bus = NULL;
+       GError *g_error = NULL;
+
+       DNSSD_LOGD("Request to decrease ref count for mdnsd");
+#if !GLIB_CHECK_VERSION(2,36,0)
+       g_type_init();
+#endif
+       netconfig_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &g_error);
+       if (netconfig_bus == NULL) {
+               if(g_error != NULL) {
+                       DNSSD_LOGE("Couldn't connect to system bus "
+                                       "error [%d: %s]", g_error->code, g_error->message);
+                       g_error_free(g_error);
+               }
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_dbus_connection_call_sync(netconfig_bus,
+                       NETCONFIG_SERVICE,
+                       NETCONFIG_NETWORK_PATH,
+                       NETCONFIG_NETWORK_INTERFACE,
+                       NETCONFIG_NETWORK_UNREFMDNS,
+                       NULL,
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT,
+                       NULL,
+                       &g_error);
+
+       if(g_error != NULL) {
+               DNSSD_LOGE("g_dbus_connection_call failed. "
+                               "error [%d: %s]", g_error->code, g_error->message);
+               g_error_free(g_error);
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_object_unref(netconfig_bus);
+
+       return DNSSD_ERROR_NONE;
+
+}
+
+static int __dnssd_launch_mdns_dbus(void)
+{
+       GDBusConnection *netconfig_bus = NULL;
+       GError *g_error = NULL;
+
+#if !GLIB_CHECK_VERSION(2,36,0)
+       g_type_init();
+#endif
+       netconfig_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &g_error);
+       if (netconfig_bus == NULL) {
+               if(g_error != NULL) {
+                       DNSSD_LOGE("Couldn't connect to system bus "
+                                       "error [%d: %s]", g_error->code, g_error->message);
+                       g_error_free(g_error);
+               }
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_dbus_connection_call_sync(netconfig_bus,
+                       NETCONFIG_SERVICE,
+                       NETCONFIG_NETWORK_PATH,
+                       NETCONFIG_NETWORK_INTERFACE,
+                       NETCONFIG_NETWORK_LAUNCHMDNS,
+                       NULL,
+                       NULL,
+                       G_DBUS_CALL_FLAGS_NONE,
+                       DBUS_REPLY_TIMEOUT,
+                       NULL,
+                       &g_error);
+
+       if(g_error != NULL) {
+               DNSSD_LOGE("g_dbus_connection_call_sync() failed. "
+                               "error [%d: %s]", g_error->code, g_error->message);
+               g_error_free(g_error);
+               return DNSSD_ERROR_OPERATION_FAILED;
+       }
+
+       g_object_unref(netconfig_bus);
+
+       DNSSD_LOGD("Successfully launched mdnsresponder");
+       return DNSSD_ERROR_NONE;
+}
+
+static int __dnssd_launch_mdns()
+{
+       int res = DNSSD_ERROR_NONE;
+       int dnssd_err = 0;
+       int retry_count = DNSSD_MDNSD_LAUNCH_RETRY_THRESHOLD;
+       uint32_t version = 0;
+       uint32_t size = sizeof(version);
+
+       while (retry_count >= 0) {
+               dnssd_err = DNSServiceGetProperty(kDNSServiceProperty_DaemonVersion, &version, &size);
+               if (!dnssd_err){
+                       DNSSD_LOGD("Daemon is running ver. %d.%d", version / 10000, version / 100 % 100);
+
+                       res = __dnssd_ref_mdns_dbus();
+                       if (res != DNSSD_ERROR_NONE)
+                               DNSSD_LOGE("Fail to increase ref count for mdnsd");
+                       else
+                               break;
+               } else {
+                       DNSSD_LOGE("Daemon is not running");
+               }
+
+               DNSSD_LOGD("Launching mdnsresponder. retry count: %d", retry_count);
+               res = __dnssd_launch_mdns_dbus();
+               if (res != DNSSD_ERROR_NONE)
+                       DNSSD_LOGE("Fail to send dbus msg");
+               retry_count--;
+
+               /* wait a little before retrying the next trial */
+               usleep(DNSSD_MDNSD_LAUNCH_TRIAL_INTERVAL);
+       }
+       return res;
+}
+
 int dnssd_initialize(void)
 {
        __DNSSD_LOG_FUNC_ENTER__;
+       int res = 0;
 
        CHECK_FEATURE_SUPPORTED(NETWORK_SERVICE_DISCOVERY_FEATURE);
 
@@ -79,6 +247,14 @@ int dnssd_initialize(void)
                return DNSSD_ERROR_INVALID_OPERATION;   //LCOV_EXCL_LINE
        }
 
+       res = __dnssd_launch_mdns();
+
+       if (res != DNSSD_ERROR_NONE) {
+               DNSSD_LOGE("Failed to launch mdnsresponder");
+               __DNSSD_LOG_FUNC_EXIT__;
+               return res;
+       }
+
        g_is_init = true;
 
        __DNSSD_LOG_FUNC_EXIT__;
@@ -99,6 +275,9 @@ int dnssd_deinitialize(void)
 
        g_is_init = false;
 
+       if (__dnssd_unref_mdns_dbus() != DNSSD_ERROR_NONE)
+               DNSSD_LOGE("Fail to decrease ref count for mdnsd");
+
        __DNSSD_LOG_FUNC_EXIT__;
        return DNSSD_ERROR_NONE;
 }
index 3dc88f6..089d7d6 100644 (file)
@@ -528,7 +528,7 @@ static void MenuScreen()
        printf("|_____________MENU-SCREEN___________|\n");
        printf("| 0 - EXIT                          |\n");
        printf("| 1 - Initialize DNS SD             |\n");
-       printf("| 2 - De-Initialize DNS SD             |\n");
+       printf("| 2 - De-Initialize DNS SD          |\n");
        printf("| 3 - DNS SD Create Service         |\n");
        printf("| 4 - DNS SD Destroy Service        |\n");
        printf("| 5 - Register DNS Service          |\n");