116 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Xephyr - A kdrive X server thats runs in a host X window.
 | 
						|
 *          Authored by Matthew Allum <mallum@openedhand.com>
 | 
						|
 * 
 | 
						|
 * Copyright © 2007 OpenedHand Ltd 
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
 * documentation for any purpose is hereby granted without fee, provided that
 | 
						|
 * the above copyright notice appear in all copies and that both that
 | 
						|
 * copyright notice and this permission notice appear in supporting
 | 
						|
 * documentation, and that the name of OpenedHand Ltd not be used in
 | 
						|
 * advertising or publicity pertaining to distribution of the software without
 | 
						|
 * specific, written prior permission. OpenedHand Ltd makes no
 | 
						|
 * representations about the suitability of this software for any purpose.  It
 | 
						|
 * is provided "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * OpenedHand Ltd DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | 
						|
 * EVENT SHALL OpenedHand Ltd BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
						|
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | 
						|
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | 
						|
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
 * PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 *
 | 
						|
 * Authors:
 | 
						|
 *    Dodji Seketeli <dodji@openedhand.com>
 | 
						|
 */
 | 
						|
 | 
						|
/*
 | 
						|
 * \file
 | 
						|
 * This file defines a proxy extension that forwards requests.
 | 
						|
 * When a request to extension FOO is sent to Xephyr, that request is forwared
 | 
						|
 * to the host X, without even trying to know what the request means.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include <kdrive-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include "misc.h"
 | 
						|
#include "dixstruct.h"
 | 
						|
#include "extnsionst.h"
 | 
						|
#include "ephyrproxyext.h"
 | 
						|
#define _HAVE_XALLOC_DECLS
 | 
						|
#include "ephyrlog.h"
 | 
						|
#include "ephyrhostproxy.h"
 | 
						|
#include "hostx.h"
 | 
						|
 | 
						|
static Bool ephyrProxyGetHostExtensionInfo(const char *a_ext_name,
 | 
						|
                                           int *a_major_opcode,
 | 
						|
                                           int *a_first_event,
 | 
						|
                                           int *a_first_error);
 | 
						|
 | 
						|
static int ephyrProxyProcDispatch(ClientPtr client);
 | 
						|
 | 
						|
static Bool
 | 
						|
ephyrProxyGetHostExtensionInfo(const char *a_ext_name,
 | 
						|
                               int *a_major_opcode,
 | 
						|
                               int *a_first_event, int *a_first_error)
 | 
						|
{
 | 
						|
    return hostx_get_extension_info(a_ext_name, a_major_opcode,
 | 
						|
                                    a_first_event, a_first_error);
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
ephyrProxyProcDispatch(ClientPtr a_client)
 | 
						|
{
 | 
						|
    int res = BadImplementation;
 | 
						|
    struct XReply reply;
 | 
						|
 | 
						|
    if (!ephyrHostProxyDoForward(a_client->requestBuffer, &reply, FALSE)) {
 | 
						|
        EPHYR_LOG_ERROR("forwarding failed\n");
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    reply.sequence_number = a_client->sequence;
 | 
						|
    res = Success;
 | 
						|
 | 
						|
    WriteToClient(a_client, 32, (char *) &reply);
 | 
						|
 | 
						|
 out:
 | 
						|
    return res;
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
ephyrProxyProcReset(ExtensionEntry * a_entry)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
Bool
 | 
						|
ephyrProxyExtensionInit(const char *a_extension_name)
 | 
						|
{
 | 
						|
    Bool is_ok = FALSE;
 | 
						|
    int major_opcode = 0, first_event = 0, first_error = 0;
 | 
						|
    ExtensionEntry *ext = NULL;
 | 
						|
 | 
						|
    if (!ephyrProxyGetHostExtensionInfo(a_extension_name,
 | 
						|
                                        &major_opcode,
 | 
						|
                                        &first_event, &first_error)) {
 | 
						|
        EPHYR_LOG("failed to query extension %s from host\n", a_extension_name);
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    ext = AddExtension((char *) a_extension_name, 0, 0,
 | 
						|
                       ephyrProxyProcDispatch,
 | 
						|
                       ephyrProxyProcDispatch,
 | 
						|
                       ephyrProxyProcReset, StandardMinorOpcode);
 | 
						|
    if (!ext) {
 | 
						|
        EPHYR_LOG_ERROR("failed to add the extension\n");
 | 
						|
        goto out;
 | 
						|
    }
 | 
						|
    is_ok = TRUE;
 | 
						|
 | 
						|
 out:
 | 
						|
    EPHYR_LOG("leave\n");
 | 
						|
    return is_ok;
 | 
						|
}
 |