[Telepathy-commits] [telepathy-salut/master] GibberListening: do not allow to listen several times

Alban Crequy alban.crequy at collabora.co.uk
Thu Nov 6 10:29:03 PST 2008


---
 lib/gibber/gibber-listener.c |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/lib/gibber/gibber-listener.c b/lib/gibber/gibber-listener.c
index 09ea07e..000a105 100644
--- a/lib/gibber/gibber-listener.c
+++ b/lib/gibber/gibber-listener.c
@@ -63,6 +63,9 @@ struct _GibberListenerPrivate
 {
   GSList *listeners;
 
+  /* Don't allow to listen again if it is already listening */
+  gboolean listening;
+
   gboolean dispose_has_run;
 };
 
@@ -109,6 +112,7 @@ gibber_listeners_clean_listeners (GibberListener *self)
     }
 
   priv->listeners = NULL;
+  priv->listening = FALSE;
 }
 
 static void
@@ -197,7 +201,7 @@ add_listener (GibberListener *self, int family, int type, int protocol,
   #define BACKLOG 5
   int fd = -1, ret, yes = 1;
   Listener *l;
-  GibberListenerPrivate *priv = self->priv;
+  GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (self);
   char name [NI_MAXHOST], portname[NI_MAXSERV];
   union {
       struct sockaddr addr;
@@ -312,11 +316,19 @@ static gboolean
 listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
     gboolean loopback, int *new_port, GError **error)
 {
+  GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
   struct addrinfo req, *ans = NULL, *a;
-  GibberListenerPrivate *priv = listener->priv;
   int ret;
   gchar sport[6];
 
+  if (priv->listening)
+    {
+      g_set_error (error, GIBBER_LISTENER_ERROR,
+          GIBBER_LISTENER_ERROR_ALREADY_LISTENING,
+          "GibberListener is already listening");
+      return FALSE;
+    }
+
   memset (&req, 0, sizeof (req));
   if (!loopback)
     req.ai_flags = AI_PASSIVE;
@@ -388,6 +400,11 @@ listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
           if (fatal)
               goto error;
         }
+      else
+        {
+          /* add_listener succeeded: don't allow to listen again */
+          priv->listening = TRUE;
+        }
     }
 
   /* If all listeners failed, report the last error */
@@ -453,9 +470,18 @@ gboolean
 gibber_listener_listen_socket (GibberListener *listener,
   gchar *path, gboolean abstract, GError **error)
 {
+  GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
   struct sockaddr_un addr;
   int ret;
 
+  if (priv->listening)
+    {
+      g_set_error (error, GIBBER_LISTENER_ERROR,
+          GIBBER_LISTENER_ERROR_ALREADY_LISTENING,
+          "GibberListener is already listening");
+      return FALSE;
+    }
+
   memset (&addr, 0, sizeof (addr));
   addr.sun_family = PF_UNIX;
   snprintf (addr.sun_path, sizeof (addr.sun_path) - 1, "%s", path);
@@ -463,5 +489,11 @@ gibber_listener_listen_socket (GibberListener *listener,
   ret = add_listener (listener, AF_UNIX, SOCK_STREAM, 0,
       (struct sockaddr *) &addr, sizeof (addr), NULL, error);
 
+  if (ret == TRUE)
+    {
+      /* add_listener succeeded: don't allow to listen again */
+      priv->listening = TRUE;
+    }
+
   return ret;
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list