/* * Xephyr - A kdrive X server thats runs in a host X window. * Authored by Matthew Allum * * 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 */ #ifdef HAVE_CONFIG_H #include #endif #include #define _HAVE_XALLOC_DECLS #include "ephyrlog.h" #include "ephyrhostproxy.h" #include "hostx.h" /* byte swap a short */ #define swaps(x, n) { \ n = ((char *) (x))[0];\ ((char *) (x))[0] = ((char *) (x))[1];\ ((char *) (x))[1] = n; } #define GetXReq(req) \ WORD64ALIGN ;\ if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\ _XFlush(dpy);\ req = (xReq *)(dpy->last_req = dpy->bufptr);\ dpy->bufptr += SIZEOF(xReq);\ dpy->request++ Bool ephyrHostProxyDoForward (pointer a_request_buffer, struct XReply *a_reply, Bool a_do_swap) { Bool is_ok = FALSE ; int n=0 ; Display *dpy=hostx_get_display () ; xReq *in_req = (xReq*) a_request_buffer ; xReq *forward_req=NULL ; struct XReply reply ; EPHYR_RETURN_VAL_IF_FAIL (in_req && dpy, FALSE) ; EPHYR_LOG ("enter\n") ; if (a_do_swap) { swaps (&in_req->length, n) ; } EPHYR_LOG ("Req {type:%d, data:%d, length:%d}\n", in_req->reqType, in_req->data, in_req->length) ; GetXReq (forward_req) ; memmove (forward_req, in_req, 4) ; if (!_XReply (dpy, (xReply*) &reply, 0, FALSE)) { EPHYR_LOG_ERROR ("failed to get reply\n") ; goto out; } EPHYR_LOG ("XReply{type:%d, foo:%d, seqnum:%d, length:%d}\n", reply.type, reply.foo, reply.sequence_number, reply.length) ; if (a_reply) { memmove (a_reply, &reply, sizeof (reply)) ; } is_ok = TRUE ; out: EPHYR_LOG ("leave\n") ; return is_ok ; }