dbus-server-socket.c revision c0fa33dc5fd233573e9c211c77acdb36865575e6
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 248027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-internals.h" 258027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-server-socket.h" 268027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-transport-socket.h" 278027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-connection-internal.h" 280617102b4b156e40591e7af2a936a1988ef4b4d7Frank Osterfeld#include "dbus-memory.h" 29fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld#include "dbus-nonce.h" 308027efc97b4bec85f674570f878919cb72456745Havoc Pennington#include "dbus-string.h" 318027efc97b4bec85f674570f878919cb72456745Havoc Pennington 328027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 338027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @defgroup DBusServerSocket DBusServer implementations for SOCKET 348027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @ingroup DBusInternals 358027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @brief Implementation details of DBusServer on SOCKET 368027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 378027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @{ 388027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 398027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 40fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 418027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Opaque object representing a Socket server implementation. 428027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 438027efc97b4bec85f674570f878919cb72456745Havoc Penningtontypedef struct DBusServerSocket DBusServerSocket; 448027efc97b4bec85f674570f878919cb72456745Havoc Pennington 458027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 468027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Implementation details of DBusServerSocket. All members 478027efc97b4bec85f674570f878919cb72456745Havoc Pennington * are private. 488027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 498027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstruct DBusServerSocket 508027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 518027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer base; /**< Parent class members. */ 52ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int n_fds; /**< Number of active file handles */ 53ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int *fds; /**< File descriptor or -1 if disconnected. */ 54ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusWatch **watch; /**< File descriptor watch. */ 558027efc97b4bec85f674570f878919cb72456745Havoc Pennington char *socket_name; /**< Name of domain socket, to unlink if appropriate */ 56fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile; /**< Nonce file used to authenticate clients */ 578027efc97b4bec85f674570f878919cb72456745Havoc Pennington}; 588027efc97b4bec85f674570f878919cb72456745Havoc Pennington 598027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic void 608027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_finalize (DBusServer *server) 618027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 628027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 63ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 64fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 658027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_server_finalize_base (server); 668027efc97b4bec85f674570f878919cb72456745Havoc Pennington 67ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 68ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i]) 69ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 70ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 71ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 72ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 73fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 74ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->fds); 75ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->watch); 768027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_free (socket_server->socket_name); 777c0fbba5b566e339cc71732340b30229f7b0f811Ralf Habacker if (socket_server->noncefile) 787c0fbba5b566e339cc71732340b30229f7b0f811Ralf Habacker _dbus_noncefile_delete (socket_server->noncefile, NULL); 79fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld dbus_free (socket_server->noncefile); 808027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_free (server); 818027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 828027efc97b4bec85f674570f878919cb72456745Havoc Pennington 838027efc97b4bec85f674570f878919cb72456745Havoc Pennington/* Return value is just for memory, not other failures. */ 848027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic dbus_bool_t 858027efc97b4bec85f674570f878919cb72456745Havoc Penningtonhandle_new_client_fd_and_unlock (DBusServer *server, 868027efc97b4bec85f674570f878919cb72456745Havoc Pennington int client_fd) 878027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 888027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusConnection *connection; 898027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusTransport *transport; 908027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusNewConnectionFunction new_connection_function; 915e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld DBusServerSocket* socket_server; 928027efc97b4bec85f674570f878919cb72456745Havoc Pennington void *new_connection_data; 93fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 945e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld socket_server = (DBusServerSocket*)server; 958027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Creating new client connection with fd %d\n", client_fd); 968027efc97b4bec85f674570f878919cb72456745Havoc Pennington 978027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 98fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 998027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_set_fd_nonblocking (client_fd, NULL)) 1008027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1018027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1028027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 1038027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 104fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 105fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld transport = _dbus_transport_new_for_socket (client_fd, &server->guid_hex, FALSE); 1068027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (transport == NULL) 1078027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1088027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_close_socket (client_fd, NULL); 1098027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1108027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1118027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 1128027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1138027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_transport_set_auth_mechanisms (transport, 1148027efc97b4bec85f674570f878919cb72456745Havoc Pennington (const char **) server->auth_mechanisms)) 1158027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1168027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_transport_unref (transport); 1178027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1188027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1198027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 120fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1218027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* note that client_fd is now owned by the transport, and will be 1228027efc97b4bec85f674570f878919cb72456745Havoc Pennington * closed on transport disconnection/finalization 1238027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 124fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1258027efc97b4bec85f674570f878919cb72456745Havoc Pennington connection = _dbus_connection_new_for_transport (transport); 1268027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_transport_unref (transport); 1278027efc97b4bec85f674570f878919cb72456745Havoc Pennington transport = NULL; /* now under the connection lock */ 128fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1298027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (connection == NULL) 1308027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1318027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 1328027efc97b4bec85f674570f878919cb72456745Havoc Pennington return FALSE; 1338027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 134fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1358027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* See if someone wants to handle this new connection, self-referencing 1368027efc97b4bec85f674570f878919cb72456745Havoc Pennington * for paranoia. 1378027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 1388027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_function = server->new_connection_function; 1398027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_data = server->new_connection_data; 1408027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1418027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_server_ref_unlocked (server); 1428027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 143fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1448027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (new_connection_function) 1458027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1468027efc97b4bec85f674570f878919cb72456745Havoc Pennington (* new_connection_function) (server, connection, 1478027efc97b4bec85f674570f878919cb72456745Havoc Pennington new_connection_data); 1488027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 149a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington dbus_server_unref (server); 150fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1518027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* If no one grabbed a reference, the connection will die. */ 152a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington _dbus_connection_close_if_only_one_ref (connection); 1538027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_connection_unref (connection); 1548027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1558027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 1568027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 1578027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1588027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic dbus_bool_t 1598027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_handle_watch (DBusWatch *watch, 1608027efc97b4bec85f674570f878919cb72456745Havoc Pennington unsigned int flags, 1618027efc97b4bec85f674570f878919cb72456745Havoc Pennington void *data) 1628027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 1638027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server = data; 164cc321d4ab3c38236aa7a5be6630ea471ca222d2bSimon McVittie DBusServerSocket *socket_server = data; 165fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 166fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld#ifndef DBUS_DISABLE_ASSERT 167ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 168ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_bool_t found = FALSE; 169ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#endif 1708027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1718027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_LOCK (server); 172fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 173ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#ifndef DBUS_DISABLE_ASSERT 174ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 175ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 176ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i] == watch) 177ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange found = TRUE; 178ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 179ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_assert (found); 180ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange#endif 1818027efc97b4bec85f674570f878919cb72456745Havoc Pennington 1828027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Handling client connection, flags 0x%x\n", flags); 183fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1848027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_READABLE) 1858027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1868027efc97b4bec85f674570f878919cb72456745Havoc Pennington int client_fd; 1878027efc97b4bec85f674570f878919cb72456745Havoc Pennington int listen_fd; 188fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 18998f19852078cf03f8b50a93d49d83b85c0dd400bHavoc Pennington listen_fd = dbus_watch_get_socket (watch); 1908027efc97b4bec85f674570f878919cb72456745Havoc Pennington 191c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker if (socket_server->noncefile) 192c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker client_fd = _dbus_accept_with_noncefile (listen_fd, socket_server->noncefile); 193c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker else 194c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker client_fd = _dbus_accept (listen_fd); 195fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 1968027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (client_fd < 0) 1978027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 1988027efc97b4bec85f674570f878919cb72456745Havoc Pennington /* EINTR handled for us */ 199fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 20043b944a0a6ea48e8a8b06ae3e638299f591cde8dHavoc Pennington if (_dbus_get_is_errno_eagain_or_ewouldblock ()) 2018027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("No client available to accept after all\n"); 2028027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 2038027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Failed to accept a client connection: %s\n", 20443b944a0a6ea48e8a8b06ae3e638299f591cde8dHavoc Pennington _dbus_strerror_from_errno ()); 2058027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2068027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 2078027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2088027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 2098027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 2108027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!handle_new_client_fd_and_unlock (server, client_fd)) 2118027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Rejected client connection due to lack of memory\n"); 2128027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2138027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2148027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2158027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_ERROR) 2168027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Error on server listening socket\n"); 2178027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2188027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (flags & DBUS_WATCH_HANGUP) 2198027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_verbose ("Hangup on server listening socket\n"); 2208027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2218027efc97b4bec85f674570f878919cb72456745Havoc Pennington return TRUE; 2228027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 223fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 2248027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic void 2258027efc97b4bec85f674570f878919cb72456745Havoc Penningtonsocket_disconnect (DBusServer *server) 2268027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 2278027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 228ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 2298027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2308027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 231fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 232ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < socket_server->n_fds ; i++) 2338027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 234ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i]) 235ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 236ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_remove_watch (server, 237ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i]); 238ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 239ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 240ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 241ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 242ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_close_socket (socket_server->fds[i], NULL); 243ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds[i] = -1; 2448027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2458027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2468027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (socket_server->socket_name != NULL) 2478027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 2488027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString tmp; 2498027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_init_const (&tmp, socket_server->socket_name); 2508027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_delete_file (&tmp, NULL); 2518027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 2528027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2538027efc97b4bec85f674570f878919cb72456745Havoc Pennington HAVE_LOCK_CHECK (server); 2548027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 2558027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2568027efc97b4bec85f674570f878919cb72456745Havoc Penningtonstatic const DBusServerVTable socket_vtable = { 2578027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_finalize, 2588027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_disconnect 2598027efc97b4bec85f674570f878919cb72456745Havoc Pennington}; 2608027efc97b4bec85f674570f878919cb72456745Havoc Pennington 2618027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 2628027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Creates a new server listening on the given file descriptor. The 2638027efc97b4bec85f674570f878919cb72456745Havoc Pennington * file descriptor should be nonblocking (use 2648027efc97b4bec85f674570f878919cb72456745Havoc Pennington * _dbus_set_fd_nonblocking() to make it so). The file descriptor 2658027efc97b4bec85f674570f878919cb72456745Havoc Pennington * should be listening for connections, that is, listen() should have 2668027efc97b4bec85f674570f878919cb72456745Havoc Pennington * been successfully invoked on it. The server will use accept() to 2678027efc97b4bec85f674570f878919cb72456745Havoc Pennington * accept new client connections. 2688027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 269ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param fds list of file descriptors. 270ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param n_fds number of file descriptors 2718027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param address the server's address 272fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param use_nonce whether to create and use a nonce for authentication 2738027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the new server, or #NULL if no memory. 274fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 2758027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 2768027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServer* 277ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange_dbus_server_new_for_socket (int *fds, 278ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int n_fds, 2795e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld const DBusString *address, 280fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile) 2818027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 2828027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server; 2838027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server; 284ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int i; 285fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 2868027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_server = dbus_new0 (DBusServerSocket, 1); 2878027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (socket_server == NULL) 2888027efc97b4bec85f674570f878919cb72456745Havoc Pennington return NULL; 289ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 290fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld socket_server->noncefile = noncefile; 291fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 292ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds = dbus_new (int, n_fds); 293ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!socket_server->fds) 294ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_0; 295ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 296ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch = dbus_new0 (DBusWatch *, n_fds); 297ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!socket_server->watch) 298ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_1; 299ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 300ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 3018027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 302ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusWatch *watch; 303ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 304ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange watch = _dbus_watch_new (fds[i], 305ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBUS_WATCH_READABLE, 306ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange TRUE, 307ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_handle_watch, socket_server, 308ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange NULL); 309ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (watch == NULL) 310ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 311ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 312ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->n_fds++; 313ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->fds[i] = fds[i]; 314ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = watch; 3158027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 316ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 3178027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_server_init_base (&socket_server->base, 3188027efc97b4bec85f674570f878919cb72456745Havoc Pennington &socket_vtable, address)) 319ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 3208027efc97b4bec85f674570f878919cb72456745Havoc Pennington 321ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange server = (DBusServer*)socket_server; 3228027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3238027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_LOCK (server); 324fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 325ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 3268027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 327ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!_dbus_server_add_watch (&socket_server->base, 328ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i])) 329ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 330ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int j; 331ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (j = 0 ; j < i ; j++) 332ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_remove_watch (server, 333ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[j]); 334ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 335ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange SERVER_UNLOCK (server); 336ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_server_finalize_base (&socket_server->base); 337ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 338ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 3398027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 3408027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3418027efc97b4bec85f674570f878919cb72456745Havoc Pennington SERVER_UNLOCK (server); 342fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 3438027efc97b4bec85f674570f878919cb72456745Havoc Pennington return (DBusServer*) socket_server; 344ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 3455e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld failed_3: 346c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker if (socket_server->noncefile) 347c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker { 348c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker _dbus_noncefile_delete (socket_server->noncefile, NULL); 349c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker dbus_free (socket_server->noncefile ); 350c0fa33dc5fd233573e9c211c77acdb36865575e6Ralf Habacker } 351ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_2: 352ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < n_fds ; i++) 353ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 354ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (socket_server->watch[i] != NULL) 355ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 356ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_watch_unref (socket_server->watch[i]); 357ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange socket_server->watch[i] = NULL; 358ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 359ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 360ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->watch); 361ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 362ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_1: 363ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server->fds); 364ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 365ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_0: 366ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free (socket_server); 367ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange return NULL; 3688027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 3698027efc97b4bec85f674570f878919cb72456745Havoc Pennington 3708027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 37172697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington * Creates a new server listening on TCP. 372ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If host is NULL, it will default to localhost. 373ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If bind is NULL, it will default to the value for the host 374ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * parameter, and if that is NULL, then localhost 375ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If bind is a hostname, it will be resolved and will listen 376ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * on all returned addresses. 377ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * If family is NULL, hostname resolution will try all address 378ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * families, otherwise it can be ipv4 or ipv6 to restrict the 379ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * addresses considered. 3808027efc97b4bec85f674570f878919cb72456745Havoc Pennington * 381ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param host the hostname to report for the listen address 382ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange * @param bind the hostname to listen on 38372697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington * @param port the port to listen on or 0 to let the OS choose 384fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param family 3858027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param error location to store reason for failure. 386fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * @param use_nonce whether to use a nonce for low-level authentication (nonce-tcp transport) or not (tcp transport) 3878027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the new server, or #NULL on failure. 3888027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 3898027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServer* 3908027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_new_for_tcp_socket (const char *host, 391ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *bind, 392ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *port, 393ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *family, 3945e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld DBusError *error, 3955e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld dbus_bool_t use_nonce) 3968027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 3978027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer *server; 398ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int *listen_fds = NULL; 399ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange int nlisten_fds = 0, i; 4008027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString address; 4018027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusString host_str; 402ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange DBusString port_str; 403fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld DBusNonceFile *noncefile; 4048027efc97b4bec85f674570f878919cb72456745Havoc Pennington 4058027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 4068027efc97b4bec85f674570f878919cb72456745Havoc Pennington 407fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld noncefile = NULL; 408fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 4098027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (!_dbus_string_init (&address)) 4108027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4118027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 4128027efc97b4bec85f674570f878919cb72456745Havoc Pennington return NULL; 4138027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4148027efc97b4bec85f674570f878919cb72456745Havoc Pennington 415ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (!_dbus_string_init (&port_str)) 416ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 417ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 418ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_0; 419ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 420ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4218027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (host == NULL) 4228027efc97b4bec85f674570f878919cb72456745Havoc Pennington host = "localhost"; 423ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 424ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (port == NULL) 425ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange port = "0"; 426ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 427ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (bind == NULL) 428ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = host; 429ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange else if (strcmp (bind, "*") == 0) 430ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = NULL; 431ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 432ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange nlisten_fds =_dbus_listen_tcp_socket (bind, port, family, 433ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange &port_str, 434ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange &listen_fds, error); 435ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (nlisten_fds <= 0) 436ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange { 437ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _DBUS_ASSERT_ERROR_IS_SET(error); 438ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_1; 439ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange } 440ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4418027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_init_const (&host_str, host); 4425e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (!_dbus_string_append (&address, use_nonce ? "nonce-tcp:host=" : "tcp:host=") || 4438027efc97b4bec85f674570f878919cb72456745Havoc Pennington !_dbus_address_append_escaped (&address, &host_str) || 4448027efc97b4bec85f674570f878919cb72456745Havoc Pennington !_dbus_string_append (&address, ",port=") || 445ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange !_dbus_string_append (&address, _dbus_string_get_const_data(&port_str))) 4468027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4478027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 448ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4498027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 450ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange if (family && 451ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange (!_dbus_string_append (&address, ",family=") || 452ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange !_dbus_string_append (&address, family))) 4538027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 454ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 455ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4568027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4575e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 4585e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (use_nonce) 4595e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 460fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld noncefile = dbus_new0 (DBusNonceFile, 1); 461fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (noncefile == NULL) 4625e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 4635e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4645e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 4655e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 466fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (!_dbus_noncefile_create (noncefile, NULL)) 4675e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4685e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 469fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld if (!_dbus_string_append (&address, ",noncefile=") || 470fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld !_dbus_address_append_escaped (&address, _dbus_noncefile_get_path (noncefile))) 4715e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld { 4725e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld goto failed_2; 4735e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 474fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 4755e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld } 4765e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld 477fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld server = _dbus_server_new_for_socket (listen_fds, nlisten_fds, &address, noncefile); 4788027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (server == NULL) 4798027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 4808027efc97b4bec85f674570f878919cb72456745Havoc Pennington dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL); 481ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange goto failed_2; 4828027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 4838027efc97b4bec85f674570f878919cb72456745Havoc Pennington 484ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&port_str); 4858027efc97b4bec85f674570f878919cb72456745Havoc Pennington _dbus_string_free (&address); 486ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free(listen_fds); 487ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 4888027efc97b4bec85f674570f878919cb72456745Havoc Pennington return server; 4898027efc97b4bec85f674570f878919cb72456745Havoc Pennington 490ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_2: 491ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange for (i = 0 ; i < nlisten_fds ; i++) 492ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_close_socket (listen_fds[i], NULL); 493ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange dbus_free(listen_fds); 494ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 495ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_1: 496ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&port_str); 497ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange 498ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange failed_0: 499ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange _dbus_string_free (&address); 5008027efc97b4bec85f674570f878919cb72456745Havoc Pennington 501ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange return NULL; 5028027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5038027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5048027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 5058027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Tries to interpret the address entry for various socket-related 5065e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld * addresses (well, currently only tcp and nonce-tcp). 507fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5088027efc97b4bec85f674570f878919cb72456745Havoc Pennington * Sets error if the result is not OK. 509fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5108027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param entry an address entry 5118027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param server_p a new DBusServer, or #NULL on failure. 5128027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param error location to store rationale for failure on bad address 5138027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @returns the outcome 514fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5158027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 5168027efc97b4bec85f674570f878919cb72456745Havoc PenningtonDBusServerListenResult 5178027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_listen_socket (DBusAddressEntry *entry, 5188027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServer **server_p, 5198027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusError *error) 5208027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 5218027efc97b4bec85f674570f878919cb72456745Havoc Pennington const char *method; 5228027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5238027efc97b4bec85f674570f878919cb72456745Havoc Pennington *server_p = NULL; 524fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 5258027efc97b4bec85f674570f878919cb72456745Havoc Pennington method = dbus_address_entry_get_method (entry); 526fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld 5275e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld if (strcmp (method, "tcp") == 0 || strcmp (method, "nonce-tcp") == 0) 5288027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 52972697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington const char *host; 53072697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington const char *port; 531ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *bind; 532ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange const char *family; 53372697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington 53472697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington host = dbus_address_entry_get_value (entry, "host"); 535ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange bind = dbus_address_entry_get_value (entry, "bind"); 53672697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington port = dbus_address_entry_get_value (entry, "port"); 537ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange family = dbus_address_entry_get_value (entry, "family"); 53872697649524238bd8389670e71c9faa55b7b4a1aHavoc Pennington 539ee71e1ff6033ad1eb2385f11d4f3678259b8397bDaniel P. Berrange *server_p = _dbus_server_new_for_tcp_socket (host, bind, port, 5405e2a99c12c7e3531d908ed4fca82caca9cb02825Frank Osterfeld family, error, strcmp (method, "nonce-tcp") == 0 ? TRUE : FALSE); 5418027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5428027efc97b4bec85f674570f878919cb72456745Havoc Pennington if (*server_p) 5438027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5448027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR(error); 5458027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_OK; 5468027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5478027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 5488027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5498027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_SET(error); 5508027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_DID_NOT_CONNECT; 5518027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5528027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5538027efc97b4bec85f674570f878919cb72456745Havoc Pennington else 5548027efc97b4bec85f674570f878919cb72456745Havoc Pennington { 5558027efc97b4bec85f674570f878919cb72456745Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR(error); 5568027efc97b4bec85f674570f878919cb72456745Havoc Pennington return DBUS_SERVER_LISTEN_NOT_HANDLED; 5578027efc97b4bec85f674570f878919cb72456745Havoc Pennington } 5588027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5598027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5608027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** 5618027efc97b4bec85f674570f878919cb72456745Havoc Pennington * This is a bad hack since it's really unix domain socket 5628027efc97b4bec85f674570f878919cb72456745Havoc Pennington * specific. Also, the function weirdly adopts ownership 5638027efc97b4bec85f674570f878919cb72456745Havoc Pennington * of the passed-in string. 564fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5658027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param server a socket server 5668027efc97b4bec85f674570f878919cb72456745Havoc Pennington * @param filename socket filename to report/delete 567fbd21dd0977b9edd6114d56190fe0bb5ffa3a82fFrank Osterfeld * 5688027efc97b4bec85f674570f878919cb72456745Havoc Pennington */ 5698027efc97b4bec85f674570f878919cb72456745Havoc Penningtonvoid 5708027efc97b4bec85f674570f878919cb72456745Havoc Pennington_dbus_server_socket_own_filename (DBusServer *server, 5718027efc97b4bec85f674570f878919cb72456745Havoc Pennington char *filename) 5728027efc97b4bec85f674570f878919cb72456745Havoc Pennington{ 5738027efc97b4bec85f674570f878919cb72456745Havoc Pennington DBusServerSocket *socket_server = (DBusServerSocket*) server; 5748027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5758027efc97b4bec85f674570f878919cb72456745Havoc Pennington socket_server->socket_name = filename; 5768027efc97b4bec85f674570f878919cb72456745Havoc Pennington} 5778027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5788027efc97b4bec85f674570f878919cb72456745Havoc Pennington 5798027efc97b4bec85f674570f878919cb72456745Havoc Pennington/** @} */ 5808027efc97b4bec85f674570f878919cb72456745Havoc Pennington 581