Add start of xwayand module code
authorChris Michael <cp.michael@samsung.com>
Wed, 2 Jul 2014 15:46:22 +0000 (11:46 -0400)
committerMike Blumenkrantz <zmike@osg.samsung.com>
Fri, 26 Jun 2015 00:04:30 +0000 (20:04 -0400)
Signed-off-by: Chris Michael <cp.michael@samsung.com>
src/modules/xwayland/e_mod_main.c [new file with mode: 0644]

diff --git a/src/modules/xwayland/e_mod_main.c b/src/modules/xwayland/e_mod_main.c
new file mode 100644 (file)
index 0000000..a6e5ed7
--- /dev/null
@@ -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;
+}
+
+