mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-04-21 07:40:38 +02:00
* 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
This commit is contained in:
parent
4350f5798e
commit
f3fd4d60ad
6 changed files with 53 additions and 18 deletions
15
ChangeLog
15
ChangeLog
|
|
@ -1,3 +1,18 @@
|
|||
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
|
||||
|
|
|
|||
|
|
@ -210,6 +210,9 @@ a transport name plus possible parameters/options.
|
|||
.PP
|
||||
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
|
||||
|
|
@ -217,6 +220,14 @@ 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>"
|
||||
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue