1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 28027efc97b4bec85f674570f878919cb72456745Havoc Pennington/* dbus-server-socket.c Server implementation for sockets 38027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 48027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Copyright (C) 2002, 2003, 2004, 2006 Red Hat Inc. 58027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 68027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Licensed under the Academic Free License version 2.1 7fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 88027efc97b4bec85f674570f878919cb72456745Havoc Pennington * This program is free software; you can redistribute it and/or modify 98027efc97b4bec85f674570f878919cb72456745Havoc Pennington * it under the terms of the GNU General Public License as published by 108027efc97b4bec85f674570f878919cb72456745Havoc Pennington * the Free Software Foundation; either version 2 of the License, or 118027efc97b4bec85f674570f878919cb72456745Havoc Pennington * (at your option) any later version. 128027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 138027efc97b4bec85f674570f878919cb72456745Havoc Pennington * This program is distributed in the hope that it will be useful, 148027efc97b4bec85f674570f878919cb72456745Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 158027efc97b4bec85f674570f878919cb72456745Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 168027efc97b4bec85f674570f878919cb72456745Havoc Pennington * GNU General Public License for more details. 17fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 188027efc97b4bec85f674570f878919cb72456745Havoc Pennington * You should have received a copy of the GNU General Public License 198027efc97b4bec85f674570f878919cb72456745Havoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 218027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 228027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 238027efc97b4bec85f674570f878919cb72456745Havoc Pennington 24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 258027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-internals.h" 268027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-server-socket.h" 278027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-transport-socket.h" 288027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-connection-internal.h" 290617102b4b156e40591e7af2a936a1988ef4b4d7Frank Osterfeld#include "dbus-memory.h" 30fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld#include "dbus-nonce.h" 318027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-string.h" 328027efc97b4bec85f674570f878919cb72456745Havoc Pennington 338027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 348027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @defgroup DBusServerSocket DBusServer implementations for SOCKET 358027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @ingroup DBusInternals 368027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @brief Implementation details of DBusServer on SOCKET 378027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 388027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @{ 398027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 408027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 41fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 428027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Opaque object representing a Socket server implementation. 438027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 448027efc97b4bec85f674570f878919cb72456745Havoc Penningtontypedef struct DBusServerSocket DBusServerSocket; 458027efc97b4bec85f674570f878919cb72456745Havoc Pennington 468027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 478027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Implementation details of DBusServerSocket. All members 488027efc97b4bec85f674570f878919cb72456745Havoc Pennington * are private. 498027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 508027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstruct DBusServerSocket 518027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 528027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer base; /**< Parent class members. */ 53ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int n_fds; /**< Number of active file handles */ 54ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int *fds; /**< File descriptor or -1 if disconnected. */ 55ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusWatch **watch; /**< File descriptor watch. */ 568027efc97b4bec85f674570f878919cb72456745Havoc Pennington char *socket_name; /**< Name of domain socket, to unlink if appropriate */ 57fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile; /**< Nonce file used to authenticate clients */ 588027efc97b4bec85f674570f878919cb72456745Havoc Pennington}; 598027efc97b4bec85f674570f878919cb72456745Havoc Pennington 608027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic void 618027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_finalize (DBusServer *server) 628027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 638027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 64ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 65fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 668027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_server_finalize_base (server); 678027efc97b4bec85f674570f878919cb72456745Havoc Pennington 68ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 69ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i]) 70ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 71ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 72ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 73ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 74fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 75ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->fds); 76ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->watch); 778027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_free (socket_server->socket_name); 787c0fbba5b566e339cc71732340b30229f7b0f811Ralf Habacker if (socket_server->noncefile) 797c0fbba5b566e339cc71732340b30229f7b0f811Ralf Habacker _dbus_noncefile_delete (socket_server->noncefile, NULL); 80fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld dbus_free (socket_server->noncefile); 818027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_free (server); 828027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 838027efc97b4bec85f674570f878919cb72456745Havoc Pennington 848027efc97b4bec85f674570f878919cb72456745Havoc Pennington/* Return value is just for memory, not other failures. */ 858027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic dbus_bool_t 868027efc97b4bec85f674570f878919cb72456745Havoc Penningtonhandle_new_client_fd_and_unlock (DBusServer *server, 878027efc97b4bec85f674570f878919cb72456745Havoc Pennington int client_fd) 888027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 898027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusConnection *connection; 908027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusTransport *transport; 918027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusNewConnectionFunction new_connection_function; 925e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld DBusServerSocket* socket_server; 938027efc97b4bec85f674570f878919cb72456745Havoc Pennington void *new_connection_data; 94fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 955e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld socket_server = (DBusServerSocket*)server; 968027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Creating new client connection with fd %d\n", client_fd); 978027efc97b4bec85f674570f878919cb72456745Havoc Pennington 988027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 99fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1008027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_set_fd_nonblocking (client_fd, NULL)) 1018027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1028027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1038027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 1048027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 105fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 106fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld transport = _dbus_transport_new_for_socket (client_fd, &server->guid_hex, FALSE); 1078027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (transport == NULL) 1088027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1098027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_close_socket (client_fd, NULL); 1108027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1118027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1128027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 1138027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1148027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_transport_set_auth_mechanisms (transport, 1158027efc97b4bec85f674570f878919cb72456745Havoc Pennington (const char **) server->auth_mechanisms)) 1168027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1178027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_transport_unref (transport); 1188027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1198027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1208027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 121fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1228027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* note that client_fd is now owned by the transport, and will be 1238027efc97b4bec85f674570f878919cb72456745Havoc Pennington * closed on transport disconnection/finalization 1248027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 125fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1268027efc97b4bec85f674570f878919cb72456745Havoc Pennington connection = _dbus_connection_new_for_transport (transport); 1278027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_transport_unref (transport); 1288027efc97b4bec85f674570f878919cb72456745Havoc Pennington transport = NULL; /* now under the connection lock */ 129fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1308027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (connection == NULL) 1318027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1328027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1338027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1348027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 135fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1368027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* See if someone wants to handle this new connection, self-referencing 1378027efc97b4bec85f674570f878919cb72456745Havoc Pennington * for paranoia. 1388027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 1398027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_function = server->new_connection_function; 1408027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_data = server->new_connection_data; 1418027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1428027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_server_ref_unlocked (server); 1438027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 144fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1458027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (new_connection_function) 1468027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1478027efc97b4bec85f674570f878919cb72456745Havoc Pennington (* new_connection_function) (server, connection, 1488027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_data); 1498027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 150a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington dbus_server_unref (server); 151fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1528027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* If no one grabbed a reference, the connection will die. */ 153a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington _dbus_connection_close_if_only_one_ref (connection); 1548027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_connection_unref (connection); 1558027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1568027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 1578027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 1588027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1598027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic dbus_bool_t 1608027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_handle_watch (DBusWatch *watch, 1618027efc97b4bec85f674570f878919cb72456745Havoc Pennington unsigned int flags, 1628027efc97b4bec85f674570f878919cb72456745Havoc Pennington void *data) 1638027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 1648027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server = data; 165cc321d4ab3c38236aa7a5be6630ea471ca222d2bSimon McVittie DBusServerSocket *socket_server = data; 166fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 167fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld#ifndef DBUS_DISABLE_ASSERT 168ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 169ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_bool_t found = FALSE; 170ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#endif 1718027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1728027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_LOCK (server); 173fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 174ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#ifndef DBUS_DISABLE_ASSERT 175ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 176ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 177ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i] == watch) 178ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange found = TRUE; 179ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 180ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_assert (found); 181ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#endif 1828027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1838027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Handling client connection, flags 0x%x\n", flags); 184fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1858027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_READABLE) 1868027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1878027efc97b4bec85f674570f878919cb72456745Havoc Pennington int client_fd; 1888027efc97b4bec85f674570f878919cb72456745Havoc Pennington int listen_fd; 189fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 19098f19852078cf03f8b50a93d49d83b85c0dd400bHavoc Pennington listen_fd = dbus_watch_get_socket (watch); 1918027efc97b4bec85f674570f878919cb72456745Havoc Pennington 192c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker if (socket_server->noncefile) 193c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker client_fd = _dbus_accept_with_noncefile (listen_fd, socket_server->noncefile); 194c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker else 195c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker client_fd = _dbus_accept (listen_fd); 196fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1978027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (client_fd < 0) 1988027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1998027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* EINTR handled for us */ 200fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 20143b944a0a6ea48e8a8b06ae3e638299f591cde8dHavoc Pennington if (_dbus_get_is_errno_eagain_or_ewouldblock ()) 2028027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("No client available to accept after all\n"); 2038027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 2048027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Failed to accept a client connection: %s\n", 20543b944a0a6ea48e8a8b06ae3e638299f591cde8dHavoc Pennington _dbus_strerror_from_errno ()); 2068027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2078027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 2088027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2098027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 2108027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 2118027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!handle_new_client_fd_and_unlock (server, client_fd)) 2128027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Rejected client connection due to lack of memory\n"); 2138027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2148027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2158027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2168027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_ERROR) 2178027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Error on server listening socket\n"); 2188027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2198027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_HANGUP) 2208027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Hangup on server listening socket\n"); 2218027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2228027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 2238027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 224fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 2258027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic void 2268027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_disconnect (DBusServer *server) 2278027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 2288027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 229ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 2308027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2318027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 232fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 233ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 2348027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 235ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i]) 236ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 237ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_remove_watch (server, 238ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i]); 239ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 240ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 241ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 242ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 243ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_close_socket (socket_server->fds[i], NULL); 244ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds[i] = -1; 2458027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2468027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2478027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (socket_server->socket_name != NULL) 2488027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 2498027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString tmp; 2508027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_init_const (&tmp, socket_server->socket_name); 2518027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_delete_file (&tmp, NULL); 2528027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2538027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2548027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 2558027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 2568027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2578027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic const DBusServerVTable socket_vtable = { 2588027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_finalize, 2598027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_disconnect 2608027efc97b4bec85f674570f878919cb72456745Havoc Pennington}; 2618027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2628027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 2638027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Creates a new server listening on the given file descriptor. The 2648027efc97b4bec85f674570f878919cb72456745Havoc Pennington * file descriptor should be nonblocking (use 2658027efc97b4bec85f674570f878919cb72456745Havoc Pennington * _dbus_set_fd_nonblocking() to make it so). The file descriptor 2668027efc97b4bec85f674570f878919cb72456745Havoc Pennington * should be listening for connections, that is, listen() should have 2678027efc97b4bec85f674570f878919cb72456745Havoc Pennington * been successfully invoked on it. The server will use accept() to 2688027efc97b4bec85f674570f878919cb72456745Havoc Pennington * accept new client connections. 2698027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 270ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param fds list of file descriptors. 271ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param n_fds number of file descriptors 2728027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param address the server's address 273fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param use_nonce whether to create and use a nonce for authentication 2748027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the new server, or #NULL if no memory. 275fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 2768027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 2778027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServer* 278ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange_dbus_server_new_for_socket (int *fds, 279ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int n_fds, 2805e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld const DBusString *address, 281fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile) 2828027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 2838027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server; 2848027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server; 285ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 286fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 2878027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_server = dbus_new0 (DBusServerSocket, 1); 2888027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (socket_server == NULL) 2898027efc97b4bec85f674570f878919cb72456745Havoc Pennington return NULL; 290ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 291fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld socket_server->noncefile = noncefile; 292fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 293ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds = dbus_new (int, n_fds); 294ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!socket_server->fds) 295ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_0; 296ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 297ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch = dbus_new0 (DBusWatch *, n_fds); 298ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!socket_server->watch) 299ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_1; 300ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 301ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 3028027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 303ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusWatch *watch; 304ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 305ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange watch = _dbus_watch_new (fds[i], 306ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBUS_WATCH_READABLE, 307ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange TRUE, 308ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_handle_watch, socket_server, 309ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange NULL); 310ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (watch == NULL) 311ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 312ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 313ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->n_fds++; 314ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds[i] = fds[i]; 315ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = watch; 3168027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 317ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 3188027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_server_init_base (&socket_server->base, 3198027efc97b4bec85f674570f878919cb72456745Havoc Pennington &socket_vtable, address)) 320ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 3218027efc97b4bec85f674570f878919cb72456745Havoc Pennington 322ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange server = (DBusServer*)socket_server; 3238027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3248027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_LOCK (server); 325fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 326ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 3278027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 328ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!_dbus_server_add_watch (&socket_server->base, 329ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i])) 330ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 331ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int j; 332ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (j = 0 ; j < i ; j++) 333ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_remove_watch (server, 334ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[j]); 335ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 336ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange SERVER_UNLOCK (server); 337ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_finalize_base (&socket_server->base); 338ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 339ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 3408027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 3418027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3428027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 343fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 3448027efc97b4bec85f674570f878919cb72456745Havoc Pennington return (DBusServer*) socket_server; 345ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 3465e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld failed_3: 347c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker if (socket_server->noncefile) 348c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker { 349c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker _dbus_noncefile_delete (socket_server->noncefile, NULL); 350c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker dbus_free (socket_server->noncefile ); 351c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker } 352ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_2: 353ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 354ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 355ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i] != NULL) 356ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 357ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 358ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 359ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 360ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 361ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->watch); 362ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 363ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_1: 364ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->fds); 365ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 366ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_0: 367ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server); 368ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange return NULL; 3698027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 3708027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3718027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 37272697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington * Creates a new server listening on TCP. 373ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If host is NULL, it will default to localhost. 374ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If bind is NULL, it will default to the value for the host 375ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * parameter, and if that is NULL, then localhost 376ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If bind is a hostname, it will be resolved and will listen 377ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * on all returned addresses. 378ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If family is NULL, hostname resolution will try all address 379ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * families, otherwise it can be ipv4 or ipv6 to restrict the 380ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * addresses considered. 3818027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 382ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param host the hostname to report for the listen address 383ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param bind the hostname to listen on 38472697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington * @param port the port to listen on or 0 to let the OS choose 385fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param family 3868027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param error location to store reason for failure. 387fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param use_nonce whether to use a nonce for low-level authentication (nonce-tcp transport) or not (tcp transport) 3888027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the new server, or #NULL on failure. 3898027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 3908027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServer* 3918027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_new_for_tcp_socket (const char *host, 392ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *bind, 393ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *port, 394ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *family, 3955e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld DBusError *error, 3965e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld dbus_bool_t use_nonce) 3978027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 3988027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server; 399ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int *listen_fds = NULL; 400ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int nlisten_fds = 0, i; 4018027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString address; 4028027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString host_str; 403ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusString port_str; 404fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile; 4058027efc97b4bec85f674570f878919cb72456745Havoc Pennington 4068027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4078027efc97b4bec85f674570f878919cb72456745Havoc Pennington 408fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld noncefile = NULL; 409fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 4108027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_string_init (&address)) 4118027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4128027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 4138027efc97b4bec85f674570f878919cb72456745Havoc Pennington return NULL; 4148027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4158027efc97b4bec85f674570f878919cb72456745Havoc Pennington 416ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!_dbus_string_init (&port_str)) 417ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 418ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 419ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_0; 420ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 421ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4228027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (host == NULL) 4238027efc97b4bec85f674570f878919cb72456745Havoc Pennington host = "localhost"; 424ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 425ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (port == NULL) 426ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange port = "0"; 427ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 428ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (bind == NULL) 429ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = host; 430ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange else if (strcmp (bind, "*") == 0) 431ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = NULL; 432ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 433ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange nlisten_fds =_dbus_listen_tcp_socket (bind, port, family, 434ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange &port_str, 435ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange &listen_fds, error); 436ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (nlisten_fds <= 0) 437ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 438ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _DBUS_ASSERT_ERROR_IS_SET(error); 439ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_1; 440ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 441ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4428027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_init_const (&host_str, host); 4435e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (!_dbus_string_append (&address, use_nonce ? "nonce-tcp:host=" : "tcp:host=") || 4448027efc97b4bec85f674570f878919cb72456745Havoc Pennington !_dbus_address_append_escaped (&address, &host_str) || 4458027efc97b4bec85f674570f878919cb72456745Havoc Pennington !_dbus_string_append (&address, ",port=") || 446ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange !_dbus_string_append (&address, _dbus_string_get_const_data(&port_str))) 4478027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4488027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 449ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4508027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 451ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (family && 452ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange (!_dbus_string_append (&address, ",family=") || 453ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange !_dbus_string_append (&address, family))) 4548027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 455ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 456ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4578027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4585e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 4595e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (use_nonce) 4605e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 461fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld noncefile = dbus_new0 (DBusNonceFile, 1); 462fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (noncefile == NULL) 4635e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 4645e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4655e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 4665e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 467fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (!_dbus_noncefile_create (noncefile, NULL)) 4685e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4695e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 470fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (!_dbus_string_append (&address, ",noncefile=") || 471fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld !_dbus_address_append_escaped (&address, _dbus_noncefile_get_path (noncefile))) 4725e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 4735e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4745e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 475fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 4765e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 4775e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 478fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld server = _dbus_server_new_for_socket (listen_fds, nlisten_fds, &address, noncefile); 4798027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (server == NULL) 4808027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4818027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 482ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4838027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4848027efc97b4bec85f674570f878919cb72456745Havoc Pennington 485ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&port_str); 4868027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_free (&address); 487ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free(listen_fds); 488ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4898027efc97b4bec85f674570f878919cb72456745Havoc Pennington return server; 4908027efc97b4bec85f674570f878919cb72456745Havoc Pennington 491ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_2: 492ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < nlisten_fds ; i++) 493ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_close_socket (listen_fds[i], NULL); 494ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free(listen_fds); 495ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 496ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_1: 497ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&port_str); 498ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 499ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_0: 500ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&address); 5018027efc97b4bec85f674570f878919cb72456745Havoc Pennington 502ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange return NULL; 5038027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5048027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5058027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 5068027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Tries to interpret the address entry for various socket-related 5075e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld * addresses (well, currently only tcp and nonce-tcp). 508fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5098027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Sets error if the result is not OK. 510fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5118027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param entry an address entry 5128027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param server_p a new DBusServer, or #NULL on failure. 5138027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param error location to store rationale for failure on bad address 5148027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the outcome 515fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5168027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 5178027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServerListenResult 5188027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_listen_socket (DBusAddressEntry *entry, 5198027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer **server_p, 5208027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusError *error) 5218027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 5228027efc97b4bec85f674570f878919cb72456745Havoc Pennington const char *method; 5238027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5248027efc97b4bec85f674570f878919cb72456745Havoc Pennington *server_p = NULL; 525fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 5268027efc97b4bec85f674570f878919cb72456745Havoc Pennington method = dbus_address_entry_get_method (entry); 527fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 5285e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (strcmp (method, "tcp") == 0 || strcmp (method, "nonce-tcp") == 0) 5298027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 53072697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington const char *host; 53172697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington const char *port; 532ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *bind; 533ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *family; 53472697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington 53572697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington host = dbus_address_entry_get_value (entry, "host"); 536ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = dbus_address_entry_get_value (entry, "bind"); 53772697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington port = dbus_address_entry_get_value (entry, "port"); 538ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange family = dbus_address_entry_get_value (entry, "family"); 53972697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington 540ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange *server_p = _dbus_server_new_for_tcp_socket (host, bind, port, 5415e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld family, error, strcmp (method, "nonce-tcp") == 0 ? TRUE : FALSE); 5428027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5438027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (*server_p) 5448027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5458027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR(error); 5468027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_OK; 5478027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5488027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 5498027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5508027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET(error); 5518027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_DID_NOT_CONNECT; 5528027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5538027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5548027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 5558027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5568027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR(error); 5578027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_NOT_HANDLED; 5588027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5598027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5608027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5618027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 5628027efc97b4bec85f674570f878919cb72456745Havoc Pennington * This is a bad hack since it's really unix domain socket 5638027efc97b4bec85f674570f878919cb72456745Havoc Pennington * specific. Also, the function weirdly adopts ownership 5648027efc97b4bec85f674570f878919cb72456745Havoc Pennington * of the passed-in string. 565fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5668027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param server a socket server 5678027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param filename socket filename to report/delete 568fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5698027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 5708027efc97b4bec85f674570f878919cb72456745Havoc Penningtonvoid 5718027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_socket_own_filename (DBusServer *server, 5728027efc97b4bec85f674570f878919cb72456745Havoc Pennington char *filename) 5738027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 5748027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 5758027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5768027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_server->socket_name = filename; 5778027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5788027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5798027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5808027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** @} */ 5818027efc97b4bec85f674570f878919cb72456745Havoc Pennington 582