[phodav: 2/4] avahi: move common code to a file
- From: Victor Toso <victortoso src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [phodav: 2/4] avahi: move common code to a file
- Date: Tue, 3 Mar 2020 10:50:18 +0000 (UTC)
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]