* dbus/dbus-sysdeps.h (_dbus_listen_tcp_socket): changed type or port to pointer...
authorRalf Habacker <ralf.habacker@freenet.de>
Sat, 10 Mar 2007 08:04:39 +0000 (08:04 +0000)
committerRalf Habacker <ralf.habacker@freenet.de>
Sat, 10 Mar 2007 08:04:39 +0000 (08:04 +0000)
* dbus/dbus-server-socket.c (_dbus_server_new_for_tcp_socket): implemented returning tcp port. Skipping port parameter and non integer port values in config <listen> statement needs more effort.
* dbus/dbus-sysdeps-unix.c, dbus/dbus-sysdeps-win.c (_dbus_listen_tcp_socket): return the real used tcp port.
* bus/dbus-daemon.1.in: added <listen> tcp examples

ChangeLog
bus/dbus-daemon.1.in
dbus/dbus-server-socket.c
dbus/dbus-sysdeps-unix.c
dbus/dbus-sysdeps-win.c
dbus/dbus-sysdeps.h

index 42f5854..fbac4bf 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 2007-03-09  Ralf Habacker  <ralf.habacker@freenet.de>
 
+       * dbus/dbus-sysdeps.h (_dbus_listen_tcp_socket):
+       changed type or port to pointer, because the port is given back.
+
+       * dbus/dbus-server-socket.c (_dbus_server_new_for_tcp_socket):
+       implemented returning tcp port. Skipping port parameter
+       and non integer port values in config <listen> statement
+       needs more effort.
+
+       * dbus/dbus-sysdeps-unix.c, dbus/dbus-sysdeps-win.c
+       (_dbus_listen_tcp_socket): return the real used tcp port.
+
+       * bus/dbus-daemon.1.in: added <listen> tcp examples
+
+2007-03-09  Ralf Habacker  <ralf.habacker@freenet.de>
+
        * cmake/config.h.cmake: win32 msvc bug fix
 
 2007-03-09  Ralf Habacker  <ralf.habacker@freenet.de>
index 5c84683..acee933 100644 (file)
@@ -211,12 +211,23 @@ a transport name plus possible parameters/options.
 Example: <listen>unix:path=/tmp/foo</listen>
 
 .PP
+Example: <listen>tcp:host=localhost,port=1234</listen>
+
+.PP
 If there are multiple <listen> elements, then the bus listens 
 on multiple addresses. The bus will pass its address to 
 started services or other interested parties with 
 the last address given in <listen> first. That is, 
 apps will try to connect to the last <listen> address first.
 
+.PP
+A special case is using a port number of zero which means to 
+pick up a random free port. The real used port number could be retrieved
+by using the --print-address command line parameter.
+
+.PP
+Example: <listen>tcp:host=localhost,port=0</listen>
+
 .TP
 .I "<auth>"
 
index 5c11e14..3a0da35 100644 (file)
@@ -323,6 +323,9 @@ _dbus_server_new_for_tcp_socket (const char     *host,
 
   if (host == NULL)
     host = "localhost";
+  
+  listen_fd = _dbus_listen_tcp_socket (host, &port, error);
+  _dbus_fd_set_close_on_exec (listen_fd);
 
   _dbus_string_init_const (&host_str, host);
   if (!_dbus_string_append (&address, "tcp:host=") ||
@@ -334,9 +337,7 @@ _dbus_server_new_for_tcp_socket (const char     *host,
       dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
       return NULL;
     }
-  
-  listen_fd = _dbus_listen_tcp_socket (host, port, error);
-  _dbus_fd_set_close_on_exec (listen_fd);
+
   
   if (listen_fd < 0)
     {
@@ -401,7 +402,7 @@ _dbus_server_listen_socket (DBusAddressEntry *entry,
       sresult = _dbus_string_parse_int (&str, 0, &lport, NULL);
       _dbus_string_free (&str);
           
-      if (sresult == FALSE || lport <= 0 || lport > 65535)
+      if (sresult == FALSE || lport < 0 || lport > 65535)
         {
           _dbus_set_bad_address(error, NULL, NULL, 
                                 "Port is not an integer between 0 and 65535");
index 2329671..13375fe 100644 (file)
@@ -766,21 +766,24 @@ _dbus_connect_tcp_socket (const char     *host,
  * Creates a socket and binds it to the given path,
  * then listens on the socket. The socket is
  * set to be nonblocking. 
+ * In case of port=0 a random free port is used and 
+ * returned in the port parameter. 
  *
  * @param host the host name to listen on
- * @param port the prot to listen on
+ * @param port the prot to listen on, if zero a free port will be used 
  * @param error return location for errors
  * @returns the listening file descriptor or -1 on error
  */
 int
 _dbus_listen_tcp_socket (const char     *host,
-                         dbus_uint32_t   port,
+                         dbus_uint32_t  *port,
                          DBusError      *error)
 {
   int listen_fd;
   struct sockaddr_in addr;
   struct hostent *he;
   struct in_addr *haddr;
+  socklen_t len = (socklen_t) sizeof (struct sockaddr);
 
   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
   
@@ -808,13 +811,13 @@ _dbus_listen_tcp_socket (const char     *host,
   _DBUS_ZERO (addr);
   memcpy (&addr.sin_addr, haddr, sizeof (struct in_addr));
   addr.sin_family = AF_INET;
-  addr.sin_port = htons (port);
+  addr.sin_port = htons (*port);
 
   if (bind (listen_fd, (struct sockaddr*) &addr, sizeof (struct sockaddr)))
     {
       dbus_set_error (error, _dbus_error_from_errno (errno),
                       "Failed to bind socket \"%s:%d\": %s",
-                      host, port, _dbus_strerror (errno));
+                      host, *port, _dbus_strerror (errno));
       _dbus_close (listen_fd, NULL);
       return -1;
     }
@@ -823,11 +826,14 @@ _dbus_listen_tcp_socket (const char     *host,
     {
       dbus_set_error (error, _dbus_error_from_errno (errno),  
                       "Failed to listen on socket \"%s:%d\": %s",
-                      host, port, _dbus_strerror (errno));
+                      host, *port, _dbus_strerror (errno));
       _dbus_close (listen_fd, NULL);
       return -1;
     }
 
+  getsockname(listen_fd, (struct sockaddr*) &addr, &len);
+  *port = (dbus_uint32_t) ntohs(addr.sin_port);
+
   if (!_dbus_set_fd_nonblocking (listen_fd, error))
     {
       _dbus_close (listen_fd, NULL);
index 32243d0..9f62e5b 100644 (file)
@@ -3438,16 +3438,18 @@ _dbus_daemon_init(const char *host, dbus_uint32_t port);
  * Creates a socket and binds it to the given port,
  * then listens on the socket. The socket is
  * set to be nonblocking. 
+ * In case of port=0 a random free port is used and 
+ * returned in the port parameter. 
  *
  * @param host the interface to listen on, NULL for loopback, empty for any
- * @param port the port to listen on, if zero a free port will be used
+ * @param port the port to listen on, if zero a free port will be used 
  * @param error return location for errors
  * @returns the listening file descriptor or -1 on error
  */
 
 int
 _dbus_listen_tcp_socket (const char     *host,
-                         dbus_uint32_t   port,
+                         dbus_uint32_t  *port,
                          DBusError      *error)
 {
   DBusSocket slisten;
@@ -3455,7 +3457,7 @@ _dbus_listen_tcp_socket (const char     *host,
   struct sockaddr_in addr;
   struct hostent *he;
   struct in_addr *haddr;
-  int len =  sizeof (struct sockaddr);
+  socklen_t len = (socklen_t) sizeof (struct sockaddr);
   struct in_addr ina;
 
 
@@ -3504,14 +3506,14 @@ _dbus_listen_tcp_socket (const char     *host,
   _DBUS_ZERO (addr);
   memcpy (&addr.sin_addr, haddr, sizeof (struct in_addr));
   addr.sin_family = AF_INET;
-  addr.sin_port = htons (port);
+  addr.sin_port = htons (*port);
 
   if (bind (slisten.fd, (struct sockaddr*) &addr, sizeof (struct sockaddr)))
     {
       DBUS_SOCKET_SET_ERRNO ();
       dbus_set_error (error, _dbus_error_from_errno (errno),
                       "Failed to bind socket \"%s:%d\": %s",
-                      host, port, _dbus_strerror (errno));
+                      host, *port, _dbus_strerror (errno));
       DBUS_CLOSE_SOCKET (slisten.fd);
       return -1;
     }
@@ -3521,14 +3523,14 @@ _dbus_listen_tcp_socket (const char     *host,
       DBUS_SOCKET_SET_ERRNO ();
       dbus_set_error (error, _dbus_error_from_errno (errno),
                       "Failed to listen on socket \"%s:%d\": %s",
-                      host, port, _dbus_strerror (errno));
+                      host, *port, _dbus_strerror (errno));
       DBUS_CLOSE_SOCKET (slisten.fd);
       return -1;
     }
 
-
   getsockname(slisten.fd, (struct sockaddr*) &addr, &len);
-
+  *port = (dbus_uint32_t) ntohs(addr.sin_port);
+  
   _dbus_daemon_init(host, ntohs(addr.sin_port));
 
   handle = _dbus_socket_to_handle (&slisten);
index 8ca1cad..9c1bec9 100644 (file)
@@ -141,7 +141,7 @@ int _dbus_connect_tcp_socket  (const char     *host,
                                dbus_uint32_t   port,
                                DBusError      *error);
 int _dbus_listen_tcp_socket   (const char     *host,
-                               dbus_uint32_t   port,
+                               dbus_uint32_t  *port,
                                DBusError      *error);
 int _dbus_accept              (int             listen_fd);