From: Marc-André Lureau Date: Thu, 17 Mar 2022 14:03:00 +0000 (+0400) Subject: dbus: move AF_UNIX code to transport-socket X-Git-Tag: dbus-1.15.0~26^2~19 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a508ab583de138c22934e4622e6884057e824c22;p=thirdparty%2Fdbus.git dbus: move AF_UNIX code to transport-socket Signed-off-by: Marc-André Lureau --- diff --git a/dbus/dbus-transport-socket.c b/dbus/dbus-transport-socket.c index 8f2d37a3b..9f9d95391 100644 --- a/dbus/dbus-transport-socket.c +++ b/dbus/dbus-transport-socket.c @@ -22,6 +22,9 @@ */ #include + +#include + #include "dbus-internals.h" #include "dbus-connection-internal.h" #include "dbus-nonce.h" @@ -1500,4 +1503,141 @@ _dbus_transport_open_socket(DBusAddressEntry *entry, } } +/** + * Creates a new transport for the given Unix domain socket + * path. This creates a client-side of a transport. + * + * @todo once we add a way to escape paths in a dbus + * address, this function needs to do escaping. + * + * @param path the path to the domain socket. + * @param abstract #TRUE to use abstract socket namespace + * @param error address where an error can be returned. + * @returns a new transport, or #NULL on failure. + */ +DBusTransport* +_dbus_transport_new_for_domain_socket (const char *path, + dbus_bool_t abstract, + DBusError *error) +{ + DBusSocket fd = DBUS_SOCKET_INIT; + DBusTransport *transport; + DBusString address; + + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + if (!_dbus_string_init (&address)) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + return NULL; + } + + if ((abstract && + !_dbus_string_append (&address, "unix:abstract=")) || + (!abstract && + !_dbus_string_append (&address, "unix:path=")) || + !_dbus_string_append (&address, path)) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + goto failed_0; + } + + fd = _dbus_connect_unix_socket (path, abstract, error); + if (!_dbus_socket_is_valid (fd)) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + goto failed_0; + } + + _dbus_verbose ("Successfully connected to unix socket %s\n", + path); + + transport = _dbus_transport_new_for_socket (fd, NULL, &address); + if (transport == NULL) + { + dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); + goto failed_1; + } + + _dbus_string_free (&address); + + return transport; + + failed_1: + _dbus_close_socket (&fd, NULL); + failed_0: + _dbus_string_free (&address); + return NULL; +} + +/** + * Opens a UNIX socket transport. + * + * @param entry the address entry to try opening as a unix transport. + * @param transport_p return location for the opened transport + * @param error error to be set + * @returns result of the attempt + */ +DBusTransportOpenResult +_dbus_transport_open_unix_socket (DBusAddressEntry *entry, + DBusTransport **transport_p, + DBusError *error) +{ + const char *method; + + method = dbus_address_entry_get_method (entry); + _dbus_assert (method != NULL); + + if (strcmp (method, "unix") == 0) + { + const char *path = dbus_address_entry_get_value (entry, "path"); + const char *tmpdir = dbus_address_entry_get_value (entry, "tmpdir"); + const char *abstract = dbus_address_entry_get_value (entry, "abstract"); + + if (tmpdir != NULL) + { + _dbus_set_bad_address (error, NULL, NULL, + "cannot use the \"tmpdir\" option for an address to connect to, only in an address to listen on"); + return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; + } + + if (path == NULL && abstract == NULL) + { + _dbus_set_bad_address (error, "unix", + "path or abstract", + NULL); + return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; + } + + if (path != NULL && abstract != NULL) + { + _dbus_set_bad_address (error, NULL, NULL, + "can't specify both \"path\" and \"abstract\" options in an address"); + return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; + } + + if (path) + *transport_p = _dbus_transport_new_for_domain_socket (path, FALSE, + error); + else + *transport_p = _dbus_transport_new_for_domain_socket (abstract, TRUE, + error); + if (*transport_p == NULL) + { + _DBUS_ASSERT_ERROR_IS_SET (error); + return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT; + } + else + { + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + return DBUS_TRANSPORT_OPEN_OK; + } + } + else + { + _DBUS_ASSERT_ERROR_IS_CLEAR (error); + return DBUS_TRANSPORT_OPEN_NOT_HANDLED; + } +} + /** @} */ diff --git a/dbus/dbus-transport-socket.h b/dbus/dbus-transport-socket.h index 24e4b6a2a..7c8efd2ab 100644 --- a/dbus/dbus-transport-socket.h +++ b/dbus/dbus-transport-socket.h @@ -39,7 +39,13 @@ DBusTransportOpenResult _dbus_transport_open_socket (DBusAddressEntry *e DBusTransport **transport_p, DBusError *error); +DBusTransport* _dbus_transport_new_for_domain_socket (const char *path, + dbus_bool_t abstract, + DBusError *error); +DBusTransportOpenResult _dbus_transport_open_unix_socket (DBusAddressEntry *entry, + DBusTransport **transport_p, + DBusError *error); DBUS_END_DECLS diff --git a/dbus/dbus-transport-unix.c b/dbus/dbus-transport-unix.c index 3afcb9397..f2e7228dc 100644 --- a/dbus/dbus-transport-unix.c +++ b/dbus/dbus-transport-unix.c @@ -42,73 +42,6 @@ * @{ */ -/** - * Creates a new transport for the given Unix domain socket - * path. This creates a client-side of a transport. - * - * @todo once we add a way to escape paths in a dbus - * address, this function needs to do escaping. - * - * @param path the path to the domain socket. - * @param abstract #TRUE to use abstract socket namespace - * @param error address where an error can be returned. - * @returns a new transport, or #NULL on failure. - */ -DBusTransport* -_dbus_transport_new_for_domain_socket (const char *path, - dbus_bool_t abstract, - DBusError *error) -{ - DBusSocket fd = DBUS_SOCKET_INIT; - DBusTransport *transport; - DBusString address; - - _DBUS_ASSERT_ERROR_IS_CLEAR (error); - - if (!_dbus_string_init (&address)) - { - dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); - return NULL; - } - - if ((abstract && - !_dbus_string_append (&address, "unix:abstract=")) || - (!abstract && - !_dbus_string_append (&address, "unix:path=")) || - !_dbus_string_append (&address, path)) - { - dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); - goto failed_0; - } - - fd = _dbus_connect_unix_socket (path, abstract, error); - if (!_dbus_socket_is_valid (fd)) - { - _DBUS_ASSERT_ERROR_IS_SET (error); - goto failed_0; - } - - _dbus_verbose ("Successfully connected to unix socket %s\n", - path); - - transport = _dbus_transport_new_for_socket (fd, NULL, &address); - if (transport == NULL) - { - dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); - goto failed_1; - } - - _dbus_string_free (&address); - - return transport; - - failed_1: - _dbus_close_socket (&fd, NULL); - failed_0: - _dbus_string_free (&address); - return NULL; -} - /** * Creates a new transport for the given binary and arguments. This * creates a client-side of a transport. The process will be forked @@ -209,75 +142,6 @@ _dbus_transport_new_for_exec (const char *path, return NULL; } -/** - * Opens a UNIX socket transport. - * - * @param entry the address entry to try opening as a unix transport. - * @param transport_p return location for the opened transport - * @param error error to be set - * @returns result of the attempt - */ -DBusTransportOpenResult -_dbus_transport_open_unix_socket (DBusAddressEntry *entry, - DBusTransport **transport_p, - DBusError *error) -{ - const char *method; - - method = dbus_address_entry_get_method (entry); - _dbus_assert (method != NULL); - - if (strcmp (method, "unix") == 0) - { - const char *path = dbus_address_entry_get_value (entry, "path"); - const char *tmpdir = dbus_address_entry_get_value (entry, "tmpdir"); - const char *abstract = dbus_address_entry_get_value (entry, "abstract"); - - if (tmpdir != NULL) - { - _dbus_set_bad_address (error, NULL, NULL, - "cannot use the \"tmpdir\" option for an address to connect to, only in an address to listen on"); - return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; - } - - if (path == NULL && abstract == NULL) - { - _dbus_set_bad_address (error, "unix", - "path or abstract", - NULL); - return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; - } - - if (path != NULL && abstract != NULL) - { - _dbus_set_bad_address (error, NULL, NULL, - "can't specify both \"path\" and \"abstract\" options in an address"); - return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; - } - - if (path) - *transport_p = _dbus_transport_new_for_domain_socket (path, FALSE, - error); - else - *transport_p = _dbus_transport_new_for_domain_socket (abstract, TRUE, - error); - if (*transport_p == NULL) - { - _DBUS_ASSERT_ERROR_IS_SET (error); - return DBUS_TRANSPORT_OPEN_DID_NOT_CONNECT; - } - else - { - _DBUS_ASSERT_ERROR_IS_CLEAR (error); - return DBUS_TRANSPORT_OPEN_OK; - } - } - else - { - _DBUS_ASSERT_ERROR_IS_CLEAR (error); - return DBUS_TRANSPORT_OPEN_NOT_HANDLED; - } -} DBusTransportOpenResult _dbus_transport_open_unixexec (DBusAddressEntry *entry, diff --git a/dbus/dbus-transport-unix.h b/dbus/dbus-transport-unix.h index 137311d76..7d3741a5a 100644 --- a/dbus/dbus-transport-unix.h +++ b/dbus/dbus-transport-unix.h @@ -27,14 +27,6 @@ DBUS_BEGIN_DECLS -DBusTransport* _dbus_transport_new_for_domain_socket (const char *path, - dbus_bool_t abstract, - DBusError *error); - -DBusTransportOpenResult _dbus_transport_open_unix_socket (DBusAddressEntry *entry, - DBusTransport **transport_p, - DBusError *error); - DBusTransportOpenResult _dbus_transport_open_unixexec (DBusAddressEntry *entry, DBusTransport **transport_p, DBusError *error); diff --git a/dbus/dbus-transport.c b/dbus/dbus-transport.c index dcb744048..0a18db16c 100644 --- a/dbus/dbus-transport.c +++ b/dbus/dbus-transport.c @@ -348,8 +348,8 @@ static const struct { DBusError *error); } open_funcs[] = { { _dbus_transport_open_socket }, -#ifndef _WIN32 /* FIXME: removed in next patch */ { _dbus_transport_open_unix_socket }, +#ifndef _WIN32 { _dbus_transport_open_unixexec }, #endif { _dbus_transport_open_platform_specific },