[Telepathy-commits] [telepathy-salut/master] GibberListener: listen functions return a boolean and add a get_port function

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


---
 lib/gibber/gibber-bytestream-oob.c |    5 +-
 lib/gibber/gibber-listener.c       |   74 ++++++++++++++++-------------------
 lib/gibber/gibber-listener.h       |    9 ++--
 tests/check-gibber-listener.c      |    8 ++-
 4 files changed, 46 insertions(+), 50 deletions(-)

diff --git a/lib/gibber/gibber-bytestream-oob.c b/lib/gibber/gibber-bytestream-oob.c
index f2b00eb..0002237 100644
--- a/lib/gibber/gibber-bytestream-oob.c
+++ b/lib/gibber/gibber-bytestream-oob.c
@@ -1006,13 +1006,12 @@ gibber_bytestream_oob_initiate (GibberBytestreamIface *bytestream)
   g_signal_connect (gibber_listener_new, "new-connection",
       G_CALLBACK (new_connection_cb), self);
 
-  port = gibber_listener_listen_tcp (priv->listener, 0, NULL);
-
-  if (port <= 0)
+  if (!gibber_listener_listen_tcp (priv->listener, 0, NULL))
     {
       DEBUG ("can't listen for incoming connection");
       return FALSE;
     }
+  port = gibber_listener_get_port (priv->listener);
 
   url = g_strdup_printf ("x-tcp://%s:%d", priv->host, port);
 
diff --git a/lib/gibber/gibber-listener.c b/lib/gibber/gibber-listener.c
index 61b0f4e..adc476a 100644
--- a/lib/gibber/gibber-listener.c
+++ b/lib/gibber/gibber-listener.c
@@ -65,6 +65,7 @@ struct _GibberListenerPrivate
 
   /* Don't allow to listen again if it is already listening */
   gboolean listening;
+  int port;
 
   gboolean dispose_has_run;
 };
@@ -122,6 +123,7 @@ gibber_listeners_clean_listeners (GibberListener *self)
 
   priv->listeners = NULL;
   priv->listening = FALSE;
+  priv->port = 0;
 }
 
 static void
@@ -205,7 +207,7 @@ listener_io_in_cb (GIOChannel *source,
 
 static gboolean
 add_listener (GibberListener *self, int family, int type, int protocol,
-  struct sockaddr *address, socklen_t addrlen, int *port, GError **error)
+  struct sockaddr *address, socklen_t addrlen, GError **error)
 {
   #define BACKLOG 5
   int fd = -1, ret, yes = 1;
@@ -286,20 +288,17 @@ add_listener (GibberListener *self, int family, int type, int protocol,
 
   DEBUG ( "Listening on %s port %s...", name, portname);
 
-  if (port != NULL)
+  switch (family)
     {
-      switch (family)
-        {
-          case AF_INET:
-            *port = g_ntohs (baddress.in.sin_port);
-            break;
-          case AF_INET6:
-            *port = g_ntohs (baddress.in6.sin6_port);
-            break;
-          default:
-            *port = 0;
-            break;
-        }
+      case AF_INET:
+        priv->port = g_ntohs (baddress.in.sin_port);
+        break;
+      case AF_INET6:
+        priv->port = g_ntohs (baddress.in6.sin6_port);
+        break;
+      default:
+        priv->port = 0;
+        break;
     }
 
   l = g_slice_new(Listener);
@@ -319,11 +318,11 @@ error:
   return FALSE;
 }
 
-/* port: if 0, choose a random port and set new_port
+/* port: if 0, choose a random port
  */
 static gboolean
 listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
-    gboolean loopback, int *new_port, GError **error)
+    gboolean loopback, GError **error)
 {
   GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
   struct addrinfo req, *ans = NULL, *a;
@@ -369,7 +368,7 @@ listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
       goto error;
     }
 
-  *new_port = 0;
+  priv->port = 0;
   for (a = ans ; a != NULL ; a = a->ai_next)
     {
       union {
@@ -384,18 +383,18 @@ listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
       addr.addr = a->ai_addr;
 
       /* the caller let us choose a port and we are not in the first round */
-      if (port == 0 && *new_port != 0)
+      if (port == 0 && priv->port != 0)
         {
           if (a->ai_family == AF_INET)
-            addr.in->sin_port = *new_port;
+            addr.in->sin_port = priv->port;
           else if (a->ai_family == AF_INET6)
-            addr.in6->sin6_port = *new_port;
+            addr.in6->sin6_port = priv->port;
           else
             g_assert_not_reached ();
         }
 
       ret = add_listener (listener, a->ai_family, a->ai_socktype,
-        a->ai_protocol, a->ai_addr, a->ai_addrlen, new_port, &terror);
+        a->ai_protocol, a->ai_addr, a->ai_addrlen, &terror);
 
       if (ret == FALSE)
         {
@@ -435,26 +434,20 @@ error:
   return FALSE;
 }
 
-int
+gboolean
 gibber_listener_listen_tcp (GibberListener *listener, int port, GError **error)
 {
   return gibber_listener_listen_tcp_af (listener, port, GIBBER_AF_ANY, error);
 }
 
-int
+gboolean
 gibber_listener_listen_tcp_af (GibberListener *listener, int port,
   GibberAddressFamily family, GError **error)
 {
-  int new_port = 0;
-  int ret = listen_tcp_af (listener, port, family, FALSE, &new_port, error);
-
-  if (ret == FALSE)
-    return 0;
-  else
-    return new_port;
+  return listen_tcp_af (listener, port, family, FALSE, error);
 }
 
-int
+gboolean
 gibber_listener_listen_tcp_loopback (GibberListener *listener,
   int port, GError **error)
 {
@@ -462,17 +455,11 @@ gibber_listener_listen_tcp_loopback (GibberListener *listener,
     GIBBER_AF_ANY, error);
 }
 
-int
+gboolean
 gibber_listener_listen_tcp_loopback_af (GibberListener *listener,
   int port, GibberAddressFamily family, GError **error)
 {
-  int new_port = 0;
-  int ret = listen_tcp_af (listener, port, family, TRUE, &new_port, error);
-
-  if (ret == FALSE)
-    return 0;
-  else
-    return new_port;
+  return listen_tcp_af (listener, port, family, TRUE, error);
 }
 
 gboolean
@@ -499,7 +486,7 @@ gibber_listener_listen_socket (GibberListener *listener,
   snprintf (addr.sun_path, sizeof (addr.sun_path) - 1, "%s", path);
 
   ret = add_listener (listener, AF_UNIX, SOCK_STREAM, 0,
-      (struct sockaddr *) &addr, sizeof (addr), NULL, error);
+      (struct sockaddr *) &addr, sizeof (addr), error);
 
   if (ret == TRUE)
     {
@@ -509,3 +496,10 @@ gibber_listener_listen_socket (GibberListener *listener,
 
   return ret;
 }
+
+int
+gibber_listener_get_port (GibberListener *listener)
+{
+  GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
+  return priv->port;
+}
diff --git a/lib/gibber/gibber-listener.h b/lib/gibber/gibber-listener.h
index 9c8d070..7ca1501 100644
--- a/lib/gibber/gibber-listener.h
+++ b/lib/gibber/gibber-listener.h
@@ -77,21 +77,22 @@ GType gibber_listener_get_type (void);
 
 GibberListener *gibber_listener_new (void);
 
-int gibber_listener_listen_tcp (GibberListener *listener,
+gboolean gibber_listener_listen_tcp (GibberListener *listener,
   int port, GError **error);
 
-int gibber_listener_listen_tcp_af (GibberListener *listener,
+gboolean gibber_listener_listen_tcp_af (GibberListener *listener,
   int port, GibberAddressFamily family, GError **error);
 
-int gibber_listener_listen_tcp_loopback (GibberListener *listener,
+gboolean gibber_listener_listen_tcp_loopback (GibberListener *listener,
   int port, GError **error);
 
-int gibber_listener_listen_tcp_loopback_af (GibberListener *listener,
+gboolean gibber_listener_listen_tcp_loopback_af (GibberListener *listener,
   int port, GibberAddressFamily family, GError **error);
 
 gboolean gibber_listener_listen_socket (GibberListener *listener,
   gchar *path, gboolean abstract, GError **error);
 
+int gibber_listener_get_port (GibberListener *listener);
 
 G_END_DECLS
 
diff --git a/tests/check-gibber-listener.c b/tests/check-gibber-listener.c
index 820fe47..06475f1 100644
--- a/tests/check-gibber-listener.c
+++ b/tests/check-gibber-listener.c
@@ -118,7 +118,7 @@ START_TEST (test_tcp_listen)
   GibberListener *listener;
   GibberListener *listener_without_port;
   GibberListener *listener2;
-  int port;
+  int ret, port;
   GMainLoop *mainloop;
   GibberTransport *transport;
   GError *error = NULL;
@@ -132,8 +132,9 @@ START_TEST (test_tcp_listen)
   g_signal_connect (listener_without_port, "new-connection",
       G_CALLBACK (new_connection_cb), mainloop);
 
-  port = gibber_listener_listen_tcp (listener_without_port, 0, &error);
-  fail_if (port <= 0);
+  ret = gibber_listener_listen_tcp (listener_without_port, 0, &error);
+  fail_if (ret != TRUE);
+  port = gibber_listener_get_port (listener_without_port);
 
   signalled = FALSE;
   transport = connect_to_port (port, mainloop);
@@ -163,6 +164,7 @@ START_TEST (test_tcp_listen)
       error = NULL;
     }
   fail_if (port >= 5400);
+  fail_if (port != gibber_listener_get_port (listener));
 
   /* try a second listener on the same port */
   listener2 = gibber_listener_new ();
-- 
1.5.6.5




More information about the Telepathy-commits mailing list