blob: bf1c896c18f57836316c89a8fee494308134ef9d [file] [log] [blame] [edit]
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* dbus-server-win.c Server implementation for WIN network protocols.
*
* Copyright (C) 2002, 2003, 2004 Red Hat Inc.
* Copyright (C) 2007 Ralf Habacker <ralf.habacker@freenet.de>
*
* Licensed under the Academic Free License version 2.1
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
#include <config.h>
#include "dbus-internals.h"
#include "dbus-server-win.h"
#include "dbus-server-socket.h"
/**
* @defgroup DBusServerWin DBusServer implementations for Windows
* @ingroup DBusInternals
* @brief Implementation details of DBusServer on Windows
*
* @{
*/
/**
* Tries to interpret the address entry in a platform-specific
* way, creating a platform-specific server type if appropriate.
* Sets error if the result is not OK.
*
* @param entry an address entry
* @param server_p location to store a new DBusServer, or #NULL on failure.
* @param error location to store rationale for failure on bad address
* @returns the outcome
*
*/
DBusServerListenResult
_dbus_server_listen_platform_specific (DBusAddressEntry *entry,
DBusServer **server_p,
DBusError *error)
{
const char *method;
*server_p = NULL;
method = dbus_address_entry_get_method (entry);
if (strcmp (method, "nonce-tcp") == 0)
{
const char *host;
const char *port;
const char *bind;
const char *family;
host = dbus_address_entry_get_value (entry, "host");
bind = dbus_address_entry_get_value (entry, "bind");
port = dbus_address_entry_get_value (entry, "port");
family = dbus_address_entry_get_value (entry, "family");
*server_p = _dbus_server_new_for_tcp_socket (host, bind, port,
family, error, TRUE);
if (*server_p)
{
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
return DBUS_SERVER_LISTEN_OK;
}
else
{
_DBUS_ASSERT_ERROR_IS_SET(error);
return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
}
}
else if (strcmp (method, "autolaunch") == 0)
{
const char *host = "localhost";
const char *bind = "localhost";
const char *port = "0";
const char *family = "ipv4";
const char *scope = dbus_address_entry_get_value (entry, "scope");
if (_dbus_daemon_is_session_bus_address_published (scope))
return DBUS_SERVER_LISTEN_ADDRESS_ALREADY_USED;
*server_p = _dbus_server_new_for_tcp_socket (host, bind, port,
family, error, FALSE);
if (*server_p)
{
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
(*server_p)->published_address =
_dbus_daemon_publish_session_bus_address ((*server_p)->address, scope);
return DBUS_SERVER_LISTEN_OK;
}
else
{
// make sure no handle is open
_dbus_daemon_unpublish_session_bus_address ();
_DBUS_ASSERT_ERROR_IS_SET(error);
return DBUS_SERVER_LISTEN_DID_NOT_CONNECT;
}
}
else
{
_DBUS_ASSERT_ERROR_IS_CLEAR(error);
return DBUS_SERVER_LISTEN_NOT_HANDLED;
}
}
/** @} */