X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dbus%2Fdbus-server-debug-pipe.c;h=8f5ff5fba692104b7669011a57df75bb64125987;hb=61d97215c317a4154df47fbfb882aab60b92fbab;hp=c60632207f8e9d7505822f4a9eb3a5c49af412b4;hpb=44ed933284589134603913b05f55ca55e8c5a566;p=platform%2Fupstream%2Fdbus.git diff --git a/dbus/dbus-server-debug-pipe.c b/dbus/dbus-server-debug-pipe.c index c606322..8f5ff5f 100644 --- a/dbus/dbus-server-debug-pipe.c +++ b/dbus/dbus-server-debug-pipe.c @@ -1,10 +1,10 @@ -/* -*- mode: C; c-file-style: "gnu" -*- */ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* dbus-server-debug-pipe.c In-proc debug server implementation * * Copyright (C) 2003 CodeFactory AB - * Copyright (C) 2003 Red Hat, Inc. + * Copyright (C) 2003, 2004 Red Hat, Inc. * - * Licensed under the Academic Free License version 1.2 + * Licensed under the Academic Free License version 2.1 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,17 +18,20 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ +#include #include "dbus-internals.h" #include "dbus-server-debug-pipe.h" -#include "dbus-transport-unix.h" +#include "dbus-transport-socket.h" #include "dbus-connection-internal.h" #include "dbus-hash.h" +#include "dbus-string.h" +#include "dbus-protocol.h" -#ifdef DBUS_BUILD_TESTS +#ifdef DBUS_ENABLE_EMBEDDED_TESTS /** * @defgroup DBusServerDebugPipe DBusServerDebugPipe @@ -108,15 +111,6 @@ debug_finalize (DBusServer *server) dbus_free (server); } -static dbus_bool_t -debug_handle_watch (DBusServer *server, - DBusWatch *watch, - unsigned int flags) -{ - - return TRUE; -} - static void debug_disconnect (DBusServer *server) { @@ -125,7 +119,6 @@ debug_disconnect (DBusServer *server) static DBusServerVTable debug_vtable = { debug_finalize, - debug_handle_watch, debug_disconnect }; @@ -142,6 +135,7 @@ _dbus_server_debug_pipe_new (const char *server_name, { DBusServerDebugPipe *debug_server; DBusString address; + DBusString name_str; _DBUS_ASSERT_ERROR_IS_CLEAR (error); @@ -162,8 +156,9 @@ _dbus_server_debug_pipe_new (const char *server_name, if (!_dbus_string_init (&address)) goto nomem_1; + _dbus_string_init_const (&name_str, server_name); if (!_dbus_string_append (&address, "debug-pipe:name=") || - !_dbus_string_append (&address, server_name)) + !_dbus_address_append_escaped (&address, &name_str)) goto nomem_2; debug_server->name = _dbus_strdup (server_name); @@ -182,7 +177,8 @@ _dbus_server_debug_pipe_new (const char *server_name, _dbus_string_free (&address); /* server keeps the pipe hash ref */ - + + _dbus_server_trace_ref (&debug_server->base, 0, 1, "debug_pipe_new"); return (DBusServer *)debug_server; nomem_4: @@ -220,13 +216,19 @@ _dbus_transport_debug_pipe_new (const char *server_name, DBusString address; _DBUS_ASSERT_ERROR_IS_CLEAR (error); + + if (server_pipe_hash == NULL) + { + dbus_set_error (error, DBUS_ERROR_NO_SERVER, NULL); + return NULL; + } server = _dbus_hash_table_lookup_string (server_pipe_hash, server_name); if (server == NULL || ((DBusServerDebugPipe*)server)->disconnected) { - dbus_set_error (error, DBUS_ERROR_BAD_ADDRESS, NULL); + dbus_set_error (error, DBUS_ERROR_NO_SERVER, NULL); return NULL; } @@ -244,7 +246,7 @@ _dbus_transport_debug_pipe_new (const char *server_name, return NULL; } - if (!_dbus_full_duplex_pipe (&client_fd, &server_fd, + if (!_dbus_full_duplex_pipe (&client_fd, &server_fd, FALSE, NULL)) { _dbus_verbose ("failed to create full duplex pipe\n"); @@ -253,15 +255,12 @@ _dbus_transport_debug_pipe_new (const char *server_name, return NULL; } - _dbus_fd_set_close_on_exec (client_fd); - _dbus_fd_set_close_on_exec (server_fd); - - client_transport = _dbus_transport_new_for_fd (client_fd, - FALSE, &address); + client_transport = _dbus_transport_new_for_socket (client_fd, + NULL, &address); if (client_transport == NULL) { - _dbus_close (client_fd, NULL); - _dbus_close (server_fd, NULL); + _dbus_close_socket (client_fd, NULL); + _dbus_close_socket (server_fd, NULL); dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); _dbus_string_free (&address); return NULL; @@ -270,13 +269,13 @@ _dbus_transport_debug_pipe_new (const char *server_name, _dbus_string_free (&address); client_fd = -1; - - server_transport = _dbus_transport_new_for_fd (server_fd, - TRUE, NULL); + + server_transport = _dbus_transport_new_for_socket (server_fd, + &server->guid_hex, NULL); if (server_transport == NULL) { _dbus_transport_unref (client_transport); - _dbus_close (server_fd, NULL); + _dbus_close_socket (server_fd, NULL); dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); return NULL; } @@ -289,7 +288,7 @@ _dbus_transport_debug_pipe_new (const char *server_name, dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); _dbus_transport_unref (server_transport); _dbus_transport_unref (client_transport); - return FALSE; + return NULL; } connection = _dbus_connection_new_for_transport (server_transport); @@ -317,13 +316,116 @@ _dbus_transport_debug_pipe_new (const char *server_name, /* If no one grabbed a reference, the connection will die, * and the client transport will get an immediate disconnect */ + _dbus_connection_close_if_only_one_ref (connection); dbus_connection_unref (connection); return client_transport; } +/** + * Tries to interpret the address entry as a debug pipe entry. + * + * Sets error if the result is not OK. + * + * @param entry an address entry + * @param server_p location to store a new DBusServer, or #NULL on failure. + * @param error location to store rationale for failure on bad address + * @returns the outcome + * + */ +DBusServerListenResult +_dbus_server_listen_debug_pipe (DBusAddressEntry *entry, + DBusServer **server_p, + DBusError *error) +{ + const char *method; + + *server_p = NULL; + + method = dbus_address_entry_get_method (entry); + + if (strcmp (method, "debug-pipe") == 0) + { + const char *name = dbus_address_entry_get_value (entry, "name"); + + if (name == NULL) + { + _dbus_set_bad_address(error, "debug-pipe", "name", + NULL); + return DBUS_SERVER_LISTEN_BAD_ADDRESS; + } + + *server_p = _dbus_server_debug_pipe_new (name, error); + + if (*server_p) + { + _DBUS_ASSERT_ERROR_IS_CLEAR(error); + return DBUS_SERVER_LISTEN_OK; + } + else + { + _DBUS_ASSERT_ERROR_IS_SET(error); + return DBUS_SERVER_LISTEN_DID_NOT_CONNECT; + } + } + else + { + _DBUS_ASSERT_ERROR_IS_CLEAR(error); + return DBUS_SERVER_LISTEN_NOT_HANDLED; + } +} + +/** + * Opens a debug pipe transport, used in the test suite. + * + * @param entry the address entry to try opening as debug-pipe + * @param transport_p return location for the opened transport + * @param error error to be set + * @returns result of the attempt + */ +DBusTransportOpenResult +_dbus_transport_open_debug_pipe (DBusAddressEntry *entry, + DBusTransport **transport_p, + DBusError *error) +{ + const char *method; + + method = dbus_address_entry_get_method (entry); + _dbus_assert (method != NULL); + + if (strcmp (method, "debug-pipe") == 0) + { + const char *name = dbus_address_entry_get_value (entry, "name"); + + if (name == NULL) + { + _dbus_set_bad_address (error, "debug-pipe", "name", + NULL); + return DBUS_TRANSPORT_OPEN_BAD_ADDRESS; + } + + *transport_p = _dbus_transport_debug_pipe_new (name, 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; + } +} + /** @} */ -#endif /* DBUS_BUILD_TESTS */ +#endif /* DBUS_ENABLE_EMBEDDED_TESTS */