120 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.8 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 ;
 | |
| }
 | |
| 
 |