diff options
Diffstat (limited to 'dbus/dbus-sysdeps-unix.c')
| -rw-r--r-- | dbus/dbus-sysdeps-unix.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index 23296712..13375fe8 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -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);  | 
