[Telepathy-commits] [telepathy-salut/master] GibberListener: if the port is 0, let a random port be chosen and use the same port on all address family

Alban Crequy alban.crequy at collabora.co.uk
Wed Nov 5 07:23:32 PST 2008


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

diff --git a/lib/gibber/gibber-listener.c b/lib/gibber/gibber-listener.c
index a8e0735..6e99c25 100644
--- a/lib/gibber/gibber-listener.c
+++ b/lib/gibber/gibber-listener.c
@@ -186,7 +186,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, GError **error)
+  struct sockaddr *address, socklen_t addrlen, int *port, GError **error)
 {
   #define BACKLOG 5
   int fd = -1, ret, yes = 1;
@@ -262,6 +262,22 @@ add_listener (GibberListener *self, int family, int type, int protocol,
 
   DEBUG ( "Listening on %s port %s...", name, portname);
 
+  if (port != NULL)
+    {
+      switch (((struct sockaddr *)&baddress)->sa_family)
+        {
+          case AF_INET:
+            *port = ((struct sockaddr_in *) &baddress)->sin_port;
+            break;
+          case AF_INET6:
+            *port = ((struct sockaddr_in6 *) &baddress)->sin6_port;
+            break;
+          default:
+            *port = 0;
+            break;
+        }
+    }
+
   l = g_slice_new(Listener);
 
   l->listener = g_io_channel_unix_new (fd);
@@ -279,6 +295,8 @@ error:
   return FALSE;
 }
 
+/* port: if 0, choose a random port
+ */
 static gboolean
 listen_tcp_af (GibberListener *listener, int port,
   GibberAddressFamily family, gboolean loopback, GError **error)
@@ -286,6 +304,7 @@ listen_tcp_af (GibberListener *listener, int port,
   struct addrinfo req, *ans = NULL, *a;
   GibberListenerPrivate *priv = listener->priv;
   int ret;
+  int new_port = 0;
   gchar sport[6];
 
   memset (&req, 0, sizeof (req));
@@ -324,8 +343,19 @@ listen_tcp_af (GibberListener *listener, int port,
       gboolean ret;
       GError *terror = NULL;
 
+      /* the caller let us choose a port and we are not in the first round */
+      if (port == 0 && new_port != 0)
+        {
+          if (a->ai_family == AF_INET)
+            ((struct sockaddr_in *) a->ai_addr)->sin_port = port;
+          else if (a->ai_family == AF_INET6)
+            ((struct sockaddr_in6 *) a->ai_addr)->sin6_port = 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, &terror);
+        a->ai_protocol, a->ai_addr, a->ai_addrlen, &new_port, &terror);
 
       if (ret == FALSE)
         {
@@ -399,7 +429,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), error);
+      (struct sockaddr *) &addr, sizeof (addr), NULL, error);
 
   return ret;
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list