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