Xext: Enable MIT-SHM FD-passing request definitions only when possible
Check to see if xtrans FD passing is available and use that to advertise the appropriate version of the SHM extension Signed-off-by: Keith Packard <keithp@keithp.com> Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
This commit is contained in:
parent
ea8acfe3e2
commit
bee2ec5404
14
Xext/shm.c
14
Xext/shm.c
|
@ -384,7 +384,7 @@ ProcShmAttach(ClientPtr client)
|
||||||
return BadValue;
|
return BadValue;
|
||||||
}
|
}
|
||||||
for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next) {
|
for (shmdesc = Shmsegs; shmdesc; shmdesc = shmdesc->next) {
|
||||||
if (!shmdesc->is_fd && shmdesc->shmid == stuff->shmid)
|
if (!SHMDESC_IS_FD(shmdesc) && shmdesc->shmid == stuff->shmid)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (shmdesc) {
|
if (shmdesc) {
|
||||||
|
@ -396,7 +396,9 @@ ProcShmAttach(ClientPtr client)
|
||||||
shmdesc = malloc(sizeof(ShmDescRec));
|
shmdesc = malloc(sizeof(ShmDescRec));
|
||||||
if (!shmdesc)
|
if (!shmdesc)
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
shmdesc->is_fd = FALSE;
|
shmdesc->is_fd = FALSE;
|
||||||
|
#endif
|
||||||
shmdesc->addr = shmat(stuff->shmid, 0,
|
shmdesc->addr = shmat(stuff->shmid, 0,
|
||||||
stuff->readOnly ? SHM_RDONLY : 0);
|
stuff->readOnly ? SHM_RDONLY : 0);
|
||||||
if ((shmdesc->addr == ((char *) -1)) || SHMSTAT(stuff->shmid, &buf)) {
|
if ((shmdesc->addr == ((char *) -1)) || SHMSTAT(stuff->shmid, &buf)) {
|
||||||
|
@ -435,9 +437,11 @@ ShmDetachSegment(pointer value, /* must conform to DeleteType */
|
||||||
|
|
||||||
if (--shmdesc->refcnt)
|
if (--shmdesc->refcnt)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
#if SHM_FD_PASSING
|
||||||
if (shmdesc->is_fd)
|
if (shmdesc->is_fd)
|
||||||
munmap(shmdesc->addr, shmdesc->size);
|
munmap(shmdesc->addr, shmdesc->size);
|
||||||
else
|
else
|
||||||
|
#endif
|
||||||
shmdt(shmdesc->addr);
|
shmdt(shmdesc->addr);
|
||||||
for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next);
|
for (prev = &Shmsegs; *prev != shmdesc; prev = &(*prev)->next);
|
||||||
*prev = shmdesc->next;
|
*prev = shmdesc->next;
|
||||||
|
@ -1094,6 +1098,7 @@ ProcShmCreatePixmap(ClientPtr client)
|
||||||
return BadAlloc;
|
return BadAlloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
static int
|
static int
|
||||||
ProcShmAttachFd(ClientPtr client)
|
ProcShmAttachFd(ClientPtr client)
|
||||||
{
|
{
|
||||||
|
@ -1209,6 +1214,7 @@ ProcShmCreateSegment(ClientPtr client)
|
||||||
WriteToClient(client, sizeof (xShmCreateSegmentReply), &rep);
|
WriteToClient(client, sizeof (xShmCreateSegmentReply), &rep);
|
||||||
return Success;
|
return Success;
|
||||||
}
|
}
|
||||||
|
#endif /* SHM_FD_PASSING */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ProcShmDispatch(ClientPtr client)
|
ProcShmDispatch(ClientPtr client)
|
||||||
|
@ -1239,10 +1245,12 @@ ProcShmDispatch(ClientPtr client)
|
||||||
return ProcPanoramiXShmCreatePixmap(client);
|
return ProcPanoramiXShmCreatePixmap(client);
|
||||||
#endif
|
#endif
|
||||||
return ProcShmCreatePixmap(client);
|
return ProcShmCreatePixmap(client);
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
case X_ShmAttachFd:
|
case X_ShmAttachFd:
|
||||||
return ProcShmAttachFd(client);
|
return ProcShmAttachFd(client);
|
||||||
case X_ShmCreateSegment:
|
case X_ShmCreateSegment:
|
||||||
return ProcShmCreateSegment(client);
|
return ProcShmCreateSegment(client);
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
@ -1343,6 +1351,7 @@ SProcShmCreatePixmap(ClientPtr client)
|
||||||
return ProcShmCreatePixmap(client);
|
return ProcShmCreatePixmap(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
static int
|
static int
|
||||||
SProcShmAttachFd(ClientPtr client)
|
SProcShmAttachFd(ClientPtr client)
|
||||||
{
|
{
|
||||||
|
@ -1364,6 +1373,7 @@ SProcShmCreateSegment(ClientPtr client)
|
||||||
swapl(&stuff->size);
|
swapl(&stuff->size);
|
||||||
return ProcShmCreateSegment(client);
|
return ProcShmCreateSegment(client);
|
||||||
}
|
}
|
||||||
|
#endif /* SHM_FD_PASSING */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
SProcShmDispatch(ClientPtr client)
|
SProcShmDispatch(ClientPtr client)
|
||||||
|
@ -1382,10 +1392,12 @@ SProcShmDispatch(ClientPtr client)
|
||||||
return SProcShmGetImage(client);
|
return SProcShmGetImage(client);
|
||||||
case X_ShmCreatePixmap:
|
case X_ShmCreatePixmap:
|
||||||
return SProcShmCreatePixmap(client);
|
return SProcShmCreatePixmap(client);
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
case X_ShmAttachFd:
|
case X_ShmAttachFd:
|
||||||
return SProcShmAttachFd(client);
|
return SProcShmAttachFd(client);
|
||||||
case X_ShmCreateSegment:
|
case X_ShmCreateSegment:
|
||||||
return SProcShmCreateSegment(client);
|
return SProcShmCreateSegment(client);
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
return BadRequest;
|
return BadRequest;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,16 +56,31 @@ typedef struct _ShmFuncs {
|
||||||
void (*PutImage) (XSHM_PUT_IMAGE_ARGS);
|
void (*PutImage) (XSHM_PUT_IMAGE_ARGS);
|
||||||
} ShmFuncs, *ShmFuncsPtr;
|
} ShmFuncs, *ShmFuncsPtr;
|
||||||
|
|
||||||
|
#include <protocol-versions.h>
|
||||||
|
|
||||||
|
#if SERVER_SHM_MAJOR_VERSION == 1 && SERVER_SHM_MINOR_VERSION >= 2
|
||||||
|
#define SHM_FD_PASSING 1
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct _ShmDesc {
|
typedef struct _ShmDesc {
|
||||||
struct _ShmDesc *next;
|
struct _ShmDesc *next;
|
||||||
int shmid;
|
int shmid;
|
||||||
int refcnt;
|
int refcnt;
|
||||||
char *addr;
|
char *addr;
|
||||||
Bool is_fd;
|
|
||||||
Bool writable;
|
Bool writable;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
|
Bool is_fd;
|
||||||
|
XID resource;
|
||||||
|
#endif
|
||||||
} ShmDescRec, *ShmDescPtr;
|
} ShmDescRec, *ShmDescPtr;
|
||||||
|
|
||||||
|
#ifdef SHM_FD_PASSING
|
||||||
|
#define SHMDESC_IS_FD(shmdesc) ((shmdesc)->is_fd)
|
||||||
|
#else
|
||||||
|
#define SHMDESC_IS_FD(shmdesc) (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
extern _X_EXPORT void
|
extern _X_EXPORT void
|
||||||
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
|
ShmRegisterFuncs(ScreenPtr pScreen, ShmFuncsPtr funcs);
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,11 @@
|
||||||
|
|
||||||
/* SHM */
|
/* SHM */
|
||||||
#define SERVER_SHM_MAJOR_VERSION 1
|
#define SERVER_SHM_MAJOR_VERSION 1
|
||||||
|
#if XTRANS_SEND_FDS
|
||||||
|
#define SERVER_SHM_MINOR_VERSION 2
|
||||||
|
#else
|
||||||
#define SERVER_SHM_MINOR_VERSION 1
|
#define SERVER_SHM_MINOR_VERSION 1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Sync */
|
/* Sync */
|
||||||
#define SERVER_SYNC_MAJOR_VERSION 3
|
#define SERVER_SYNC_MAJOR_VERSION 3
|
||||||
|
|
Loading…
Reference in New Issue