[phodav: 2/4] avahi: move common code to a file



commit a6195c81bd5b935d4f8178169f686f06d2592d69
Author: Jakub Janků <jjanku redhat com>
Date:   Tue Dec 24 14:02:02 2019 +0100

    avahi: move common code to a file
    
    Practically the same code is used by chezdav and spice-webdavd,
    so let's move it to a new file.
    
    Also make some slight changes, namely:
    - make mdns_service local
    - unref mdns_group when not needed
    
    Signed-off-by: Jakub Janků <jjanku redhat com>

 avahi-common.c        | 137 ++++++++++++++++++++++++++++++++++++++++++++++++++
 avahi-common.h        |  21 ++++++++
 libphodav/chezdav.c   |  97 ++---------------------------------
 libphodav/meson.build |   2 +-
 meson.build           |   2 +
 spice/meson.build     |   2 +-
 spice/spice-webdavd.c | 114 ++---------------------------------------
 7 files changed, 170 insertions(+), 205 deletions(-)
---
diff --git a/avahi-common.c b/avahi-common.c
new file mode 100644
index 0000000..9da1539
--- /dev/null
+++ b/avahi-common.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include "avahi-common.h"
+
+#include <avahi-gobject/ga-client.h>
+#include <avahi-gobject/ga-entry-group.h>
+
+static GaClient *mdns_client;
+static GaEntryGroup *mdns_group;
+
+static const gchar *s_name;
+static guint s_port;
+
+static void
+mdns_register_service (void)
+{
+  GaEntryGroupService *mdns_service;
+  GError *error = NULL;
+
+  if (!mdns_group)
+    {
+      mdns_group = ga_entry_group_new ();
+
+      if (!ga_entry_group_attach (mdns_group, mdns_client, &error))
+        {
+          g_warning ("Could not attach MDNS group to client: %s", error->message);
+          g_clear_error (&error);
+          return;
+        }
+    }
+
+  mdns_service = ga_entry_group_add_service (mdns_group,
+                                             s_name, "_webdav._tcp",
+                                             s_port, &error,
+                                             NULL);
+  if (!mdns_service)
+    {
+      g_warning ("Could not create service: %s", error->message);
+      g_clear_error (&error);
+      return;
+    }
+
+  ga_entry_group_service_freeze (mdns_service);
+  if (!ga_entry_group_service_set (mdns_service, "u", "", &error) ||
+      !ga_entry_group_service_set (mdns_service, "p", "", &error) ||
+      !ga_entry_group_service_set (mdns_service, "path", "/", &error) ||
+      !ga_entry_group_service_thaw (mdns_service, &error))
+    {
+      g_warning ("Could not update TXT: %s", error->message);
+      g_clear_error (&error);
+    }
+
+  if (!ga_entry_group_commit (mdns_group, &error))
+    {
+      g_warning ("Could not announce MDNS service: %s", error->message);
+      g_clear_error (&error);
+    }
+}
+
+static void
+mdns_unregister_service (void)
+{
+  GError *error = NULL;
+
+  if (mdns_group)
+    {
+      if (!ga_entry_group_reset (mdns_group, &error))
+        {
+          g_warning ("Could not disconnect MDNS service: %s", error->message);
+          g_clear_error (&error);
+        }
+      g_debug ("MDNS client disconected");
+    }
+}
+
+static void
+mdns_state_changed (GaClient *client, GaClientState state, gpointer user_data)
+{
+  switch (state)
+    {
+    case GA_CLIENT_STATE_FAILURE:
+      g_warning ("MDNS client state failure");
+      break;
+
+    case GA_CLIENT_STATE_S_RUNNING:
+      g_debug ("MDNS client found server running");
+      mdns_register_service ();
+      break;
+
+    case GA_CLIENT_STATE_S_COLLISION:
+    case GA_CLIENT_STATE_S_REGISTERING:
+      g_message ("MDNS collision");
+      mdns_unregister_service ();
+      break;
+
+    default:
+      // Do nothing
+      break;
+    }
+}
+
+gboolean
+avahi_client_start (const gchar *name, guint port, GError **error)
+{
+  g_return_val_if_fail (mdns_client == NULL, FALSE);
+
+  mdns_client = ga_client_new (GA_CLIENT_FLAG_NO_FLAGS);
+  s_name = name;
+  s_port = port;
+
+  g_signal_connect (mdns_client, "state-changed", G_CALLBACK (mdns_state_changed), NULL);
+  return ga_client_start (mdns_client, error);
+}
+
+void
+avahi_client_stop ()
+{
+  mdns_unregister_service ();
+  g_clear_object (&mdns_group);
+  g_clear_object (&mdns_client);
+}
diff --git a/avahi-common.h b/avahi-common.h
new file mode 100644
index 0000000..4e7990b
--- /dev/null
+++ b/avahi-common.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2019 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib-object.h>
+
+gboolean avahi_client_start (const gchar *name, guint port, GError **error);
+void avahi_client_stop ();
diff --git a/libphodav/chezdav.c b/libphodav/chezdav.c
index f9301f2..9a5a98d 100644
--- a/libphodav/chezdav.c
+++ b/libphodav/chezdav.c
@@ -27,12 +27,7 @@
 #endif
 
 #ifdef WITH_AVAHI
-#include <avahi-gobject/ga-client.h>
-#include <avahi-gobject/ga-entry-group.h>
-
-static GaClient *mdns_client;
-static GaEntryGroup *mdns_group;
-static GaEntryGroupService *mdns_service;
+#include "avahi-common.h"
 #endif
 
 #include "libphodav/phodav.h"
@@ -77,88 +72,6 @@ get_realm (void)
     return g_strdup_printf ("%s\'s public share", g_get_user_name ());
 }
 
-#ifdef WITH_AVAHI
-static void
-mdns_register_service (void)
-{
-  GError *error = NULL;
-  gchar *name = NULL;
-
-  if (!mdns_group)
-    {
-      mdns_group = ga_entry_group_new ();
-
-      if (!ga_entry_group_attach (mdns_group, mdns_client, &error))
-        {
-          g_warning ("Could not attach MDNS group to client: %s", error->message);
-          g_clear_error (&error);
-          return;
-        }
-    }
-
-  name = get_realm ();
-  mdns_service = ga_entry_group_add_service (mdns_group,
-                                             name, "_webdav._tcp",
-                                             port, &error,
-                                             NULL);
-  if (!mdns_service)
-    {
-      g_warning ("Could not create service: %s", error->message);
-      g_clear_error (&error);
-      goto end;
-    }
-
-  ga_entry_group_service_freeze (mdns_service);
-  if (!ga_entry_group_service_set (mdns_service, "u", "", &error) ||
-      !ga_entry_group_service_set (mdns_service, "p", "", &error) ||
-      !ga_entry_group_service_set (mdns_service, "path", "/", &error) ||
-      !ga_entry_group_service_thaw (mdns_service, &error))
-    {
-      g_warning ("Could not update TXT: %s", error->message);
-      g_clear_error (&error);
-    }
-
-  if (!ga_entry_group_commit (mdns_group, &error))
-    {
-      g_warning ("Could not announce MDNS service: %s", error->message);
-      g_clear_error (&error);
-    }
-
-end:
-  g_free (name);
-}
-
-static void
-mdns_state_changed (GaClient *client, GaClientState state, gpointer user_data)
-{
-  switch (state)
-    {
-    case GA_CLIENT_STATE_FAILURE:
-      g_warning ("MDNS client state failure");
-      break;
-
-    case GA_CLIENT_STATE_S_RUNNING:
-      g_debug ("MDNS client found server running");
-      mdns_register_service ();
-      break;
-
-    case GA_CLIENT_STATE_S_COLLISION:
-    case GA_CLIENT_STATE_S_REGISTERING:
-      g_message ("MDNS collision");
-      if (mdns_group)
-        {
-          ga_entry_group_reset (mdns_group, NULL);
-          mdns_service = 0;
-        }
-      break;
-
-    default:
-      // Do nothing
-      break;
-    }
-}
-#endif // WITH_AVAHI
-
 gchar *htdigest = NULL;
 
 static gchar *
@@ -279,9 +192,8 @@ main (int argc, char *argv[])
 
 
 #ifdef WITH_AVAHI
-  mdns_client = ga_client_new (GA_CLIENT_FLAG_NO_FLAGS);
-  g_signal_connect (mdns_client, "state-changed", G_CALLBACK (mdns_state_changed), NULL);
-  if (!ga_client_start (mdns_client, &error))
+  gchar *name = get_realm ();
+  if (!avahi_client_start (name, port, &error))
     my_error (_ ("mDNS failed: %s\n"), error->message);
 #endif
 
@@ -303,7 +215,8 @@ main (int argc, char *argv[])
 
   g_main_loop_unref (mainloop);
 #ifdef WITH_AVAHI
-  g_object_unref (mdns_client);
+  avahi_client_stop ();
+  g_free (name);
 #endif
   g_object_unref (dav);
 
diff --git a/libphodav/meson.build b/libphodav/meson.build
index ad04523..c521756 100644
--- a/libphodav/meson.build
+++ b/libphodav/meson.build
@@ -53,7 +53,7 @@ pkgconfig.generate(
 
 executable(
   'chezdav',
-  [ 'chezdav.c' ],
+  [ 'chezdav.c' ] + avahi_common,
   include_directories : incdir,
   dependencies : avahi_deps + deps,
   link_with : [ libphodav ],
diff --git a/meson.build b/meson.build
index c67f64a..0d0fd58 100644
--- a/meson.build
+++ b/meson.build
@@ -40,8 +40,10 @@ deps += dependency('libxml-2.0')
 d1 = dependency('avahi-gobject', required : get_option('avahi'))
 d2 = dependency('avahi-client', required : get_option('avahi'))
 avahi_deps = []
+avahi_common = []
 if d1.found() and d2.found()
   avahi_deps += [ d1, d2 ]
+  avahi_common += [ '../avahi-common.c', ]
   conf.set('WITH_AVAHI', 1)
 endif
 
diff --git a/spice/meson.build b/spice/meson.build
index 06d20e6..906db4c 100644
--- a/spice/meson.build
+++ b/spice/meson.build
@@ -12,7 +12,7 @@ sources = [
 
 executable(
   'spice-webdavd',
-  sources,
+  sources + avahi_common,
   install_dir : sbindir,
   include_directories : incdir,
   dependencies : win32_deps + avahi_deps + deps,
diff --git a/spice/spice-webdavd.c b/spice/spice-webdavd.c
index 2358019..5830779 100644
--- a/spice/spice-webdavd.c
+++ b/spice/spice-webdavd.c
@@ -36,8 +36,7 @@
 #endif
 
 #ifdef WITH_AVAHI
-#include <avahi-gobject/ga-client.h>
-#include <avahi-gobject/ga-entry-group.h>
+#include "avahi-common.h"
 #endif
 
 #include "output-queue.h"
@@ -82,9 +81,6 @@ static HANDLE port_handle;
 #endif
 
 static void start_mux_read (GInputStream *istream);
-#ifdef WITH_AVAHI
-static void mdns_unregister_service (void);
-#endif
 
 static void
 quit (int sig)
@@ -421,107 +417,6 @@ static int port;
 static gboolean no_service;
 #endif
 
-#ifdef WITH_AVAHI
-static GaClient *mdns_client;
-static GaEntryGroup *mdns_group;
-static GaEntryGroupService *mdns_service;
-
-static void
-mdns_register_service (void)
-{
-  GError *error = NULL;
-  gchar *name = NULL;
-
-  if (!mdns_group)
-    {
-      mdns_group = ga_entry_group_new ();
-
-      if (!ga_entry_group_attach (mdns_group, mdns_client, &error))
-        {
-          g_warning ("Could not attach MDNS group to client: %s", error->message);
-          g_clear_error (&error);
-          goto end;
-        }
-    }
-
-  name = g_strdup_printf ("Spice client folder");
-  mdns_service = ga_entry_group_add_service (mdns_group,
-                                             name, "_webdav._tcp",
-                                             port, &error,
-                                             NULL);
-  if (!mdns_service)
-    {
-      g_warning ("Could not create service: %s", error->message);
-      g_clear_error (&error);
-      goto end;
-
-    }
-
-  ga_entry_group_service_freeze (mdns_service);
-  if (!ga_entry_group_service_set (mdns_service, "u", "", &error) ||
-      !ga_entry_group_service_set (mdns_service, "p", "", &error) ||
-      !ga_entry_group_service_set (mdns_service, "path", "/", &error) ||
-      !ga_entry_group_service_thaw (mdns_service, &error))
-    {
-      g_warning ("Could not update TXT: %s", error->message);
-      g_clear_error (&error);
-    }
-
-  if (!ga_entry_group_commit (mdns_group, &error))
-    {
-      g_warning ("Could not announce MDNS service: %s", error->message);
-      g_clear_error (&error);
-    }
-
-end:
-  g_free (name);
-}
-
-static void
-mdns_unregister_service (void)
-{
-  GError *error = NULL;
-
-  if (mdns_group)
-    {
-      if (!ga_entry_group_reset (mdns_group, &error))
-        {
-          g_warning ("Could not disconnect MDNS service: %s", error->message);
-          g_clear_error (&error);
-        }
-
-      mdns_service = 0;
-      g_debug ("MDNS client disconected");
-    }
-}
-
-static void
-mdns_state_changed (GaClient *client, GaClientState state, gpointer user_data)
-{
-  switch (state)
-    {
-    case GA_CLIENT_STATE_FAILURE:
-      g_warning ("MDNS client state failure");
-      break;
-
-    case GA_CLIENT_STATE_S_RUNNING:
-      g_debug ("MDNS client found server running");
-      mdns_register_service ();
-      break;
-
-    case GA_CLIENT_STATE_S_COLLISION:
-    case GA_CLIENT_STATE_S_REGISTERING:
-      g_message ("MDNS collision");
-      mdns_unregister_service ();
-      break;
-
-    default:
-      // Do nothing
-      break;
-    }
-}
-#endif
-
 #ifdef G_OS_UNIX
 static void
 wait_for_virtio_host (gint fd)
@@ -831,10 +726,7 @@ run_service (ServiceData *service_data)
 
 #ifdef WITH_AVAHI
   GError *error = NULL;
-
-  mdns_client = ga_client_new (GA_CLIENT_FLAG_NO_FLAGS);
-  g_signal_connect (mdns_client, "state-changed", G_CALLBACK (mdns_state_changed), NULL);
-  if (!ga_client_start (mdns_client, &error))
+  if (!avahi_client_start ("Spice client folder", port, &error))
     {
       g_printerr ("%s\n", error->message);
       exit (1);
@@ -859,7 +751,7 @@ run_service (ServiceData *service_data)
   g_hash_table_unref (clients);
 
 #ifdef WITH_AVAHI
-  mdns_unregister_service ();
+  avahi_client_stop ();
 #endif
   g_socket_service_stop (socket_service);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]