Add start of xwayand module code

Signed-off-by: Chris Michael <cp.michael@samsung.com>
This commit is contained in:
Chris Michael 2014-07-02 11:46:22 -04:00 committed by Mike Blumenkrantz
parent c86c57bee0
commit 2724f92bc6
1 changed files with 129 additions and 0 deletions

View File

@ -0,0 +1,129 @@
#include "e.h"
#include "e_comp_wl.h"
/* local structures */
typedef struct _E_XWayland_Server E_XWayland_Server;
struct _E_XWayland_Server
{
int disp;
};
/* local variables */
static E_XWayland_Server *exs;
/* local functions */
static Eina_Bool
_lock_create(int disp)
{
char lock[256], pid[16], *end;
int fd, size;
pid_t opid;
/* assemble lock file name */
snprintf(lock, sizeof(lock), "/tmp/.X%d-lock", disp);
fd = open(lock, (O_WRONLY | O_CLOEXEC | O_CREAT | O_EXCL), 0444);
if ((fd < 0) && (errno == EEXIST))
{
fd = open(lock, (O_CLOEXEC | O_RDONLY));
if ((fd < 0) || (read(fd, pid, 11) != 11))
{
ERR("Could not read XWayland lock file: %m");
if (fd >= 0) close(fd);
errno = EEXIST;
return EINA_FALSE;
}
opid = strtol(pid, &end, 0);
if ((end != (pid + 10)))
{
if (fd >= 0) close(fd);
errno = EEXIST;
return EINA_FALSE;
}
if ((kill(opid, 0) < 0) && (errno == ESRCH))
{
/* close stale lock file */
if (fd >= 0) close(fd);
if (unlink(lock))
errno = EEXIST;
else
errno = EAGAIN;
return EINA_FALSE;
}
close(fd);
errno = EEXIST;
return EINA_FALSE;
}
else if (fd < 0)
{
ERR("Could not create XWayland lock file: %m");
return EINA_FALSE;
}
/* use the pid of the wayland compositor */
size = snprintf(pid, sizeof(pid), "%10d\n", getpid());
if (write(fd, pid, size) != size)
{
unlink(lock);
close(fd);
return EINA_FALSE;
}
close(fd);
return EINA_TRUE;
}
/* module functions */
EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "XWayland" };
EAPI void *
e_modapi_init(E_Module *m)
{
E_Comp *comp;
/* try to get the running compositor */
if (!(comp = e_comp_get(NULL))) return NULL;
/* make sure it's a wayland compositor */
if (comp->comp_type != E_PIXMAP_TYPE_WL) return NULL;
/* alloc space for server struct */
if (!(exs = calloc(1, sizeof(E_XWayland_Server))))
return NULL;
/* default display to zero */
exs->disp = 0;
lock:
if (!_lock_create(exs->disp))
{
if (errno == EAGAIN)
goto lock;
else if (errno == EEXIST)
{
exs->disp++;
goto lock;
}
else
{
free(exs);
return NULL;
}
}
/* TODO: bind sockets */
return m;
}
EAPI int
e_modapi_shutdown(E_Module *m)
{
return 1;
}