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