e_comp_wl: added wl_socket initialization function for the sysvinit system. It can... 57/69257/1
authorGwanglim Lee <gl77.lee@samsung.com>
Thu, 12 May 2016 09:38:28 +0000 (18:38 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Thu, 12 May 2016 09:38:28 +0000 (18:38 +0900)
Change-Id: I13d245979cea47538c98874a14940d1d74017f12

src/bin/e_comp_wl.c
src/bin/e_config.c
src/bin/e_config.h

index 4160c6e63f03194dff4e0fadc4835bc0f6ca3fe1..ba951f40c467912026ca906e75b134e1281408d7 100644 (file)
@@ -7,6 +7,7 @@
 /* handle include for printing uint64_t */
 #define __STDC_FORMAT_MACROS
 #include <inttypes.h>
+#include <sys/xattr.h>
 
 #define COMPOSITOR_VERSION 3
 
@@ -4069,53 +4070,25 @@ _e_comp_wl_gl_idle(void *data)
 }
 
 static Eina_Bool
-_e_comp_wl_compositor_create(void)
+_e_comp_wl_socket_init(const char *name)
 {
-   E_Comp_Wl_Data *cdata;
-   const char *name;
-   int fd = 0;
-   E_Module *_mod;
-
-   /* create new compositor data */
-   if (!(cdata = E_NEW(E_Comp_Wl_Data, 1)))
-     {
-       ERR("Could not create compositor data: %m");
-       return EINA_FALSE;
-     }
+   const char *dir = NULL;
+   char socket_path[108];
+   struct passwd *u;
+   struct group *g;
+   uid_t uid;
+   gid_t gid;
+   int res;
 
-   /* set compositor wayland data */
-   e_comp_wl = e_comp->wl_comp_data = cdata;
-
-   /* try to create a wayland display */
-   if (!(cdata->wl.disp = wl_display_create()))
-     {
-        ERR("Could not create a Wayland display: %m");
-        goto disp_err;
-     }
-
-   /* try to setup wayland socket */
-   if (!(name = wl_display_add_socket_auto(cdata->wl.disp)))
-     {
-        ERR("Could not create Wayland display socket: %m");
-        goto sock_err;
-     }
+   dir = getenv("XDG_RUNTIME_DIR");
+   if (dir)
+     snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, name);
 
-   if (e_config->wl_sock_access.use)
+   if ((e_config->wl_sock_access.use) && (dir))
      {
-        const char *dir = getenv("XDG_RUNTIME_DIR");
-        if ((dir) &&
-            (e_config->wl_sock_access.owner) &&
+        if ((e_config->wl_sock_access.owner) &&
             (e_config->wl_sock_access.group))
           {
-             char socket_path[108];
-             struct passwd *u;
-             struct group *g;
-             uid_t uid;
-             gid_t gid;
-             int res;
-
-             snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, name);
-
              u = getpwnam(e_config->wl_sock_access.owner);
              uid = u ? u->pw_uid : 0;
 
@@ -4134,6 +4107,8 @@ _e_comp_wl_compositor_create(void)
                   ERR("Could not change modes of socket file:%s (%s)",
                       socket_path,
                       strerror(errno));
+                  PRCTL("[Winsys] Could not chane modes of socket file: /run/wayland-0");
+                  return EINA_FALSE;
                }
 
              res = chown(socket_path, uid, gid);
@@ -4142,10 +4117,102 @@ _e_comp_wl_compositor_create(void)
                   ERR("Could not change owner of socket file:%s (%s)",
                       socket_path,
                       strerror(errno));
+                  PRCTL("[Winsys] Could not change owner of socket file: /run/wayland-0");
+                  return EINA_FALSE;
                }
           }
+
+        if (e_config->wl_sock_access.smack.use)
+          {
+             res = setxattr(socket_path,
+                            e_config->wl_sock_access.smack.name,
+                            e_config->wl_sock_access.smack.value,
+                            strlen(e_config->wl_sock_access.smack.value),
+                            e_config->wl_sock_access.smack.flags);
+             if (res < 0)
+               {
+                  PRCTL("[Winsys] Could not change smack variable for socket file: /run/wayland-0");
+                  return EINA_FALSE;
+               }
+          }
+     }
+
+   if ((e_config->wl_sock_symlink_access.use) && (dir))
+     {
+        res = symlink(socket_path,
+                      e_config->wl_sock_symlink_access.link_name);
+        if (res < 0)
+          {
+             PRCTL("[Winsys] Could not make symbolic link: /run/user/5001/wayland-0");
+             return EINA_FALSE;
+          }
+
+        u = getpwnam(e_config->wl_sock_symlink_access.owner);
+        uid = u ? u->pw_uid : 0;
+
+        g = getgrnam(e_config->wl_sock_symlink_access.group);
+        gid = g ? g->gr_gid : 0;
+
+        res = lchown(e_config->wl_sock_symlink_access.link_name, uid, gid);
+        if (res < 0)
+          {
+             PRCTL("[Winsys] chown -h owner:users /run/user/5001/wayland-0 failed!");
+             return EINA_FALSE;
+          }
+
+        res = setxattr(e_config->wl_sock_symlink_access.link_name,
+                       e_config->wl_sock_symlink_access.smack.name,
+                       e_config->wl_sock_symlink_access.smack.value,
+                       strlen(e_config->wl_sock_symlink_access.smack.value),
+                       e_config->wl_sock_symlink_access.smack.flags);
+        if (res < 0)
+          {
+             PRCTL("[Winsys] Chould not change smack variable for symbolic link: /run/user/5001/wayland-0");
+             return EINA_FALSE;
+          }
+     }
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_e_comp_wl_compositor_create(void)
+{
+   E_Comp_Wl_Data *cdata;
+   const char *name;
+   int fd = 0;
+   E_Module *_mod;
+   Eina_Bool res;
+
+   /* create new compositor data */
+   if (!(cdata = E_NEW(E_Comp_Wl_Data, 1)))
+     {
+       ERR("Could not create compositor data: %m");
+       return EINA_FALSE;
      }
 
+   /* set compositor wayland data */
+   e_comp_wl = e_comp->wl_comp_data = cdata;
+
+   /* try to create a wayland display */
+   if (!(cdata->wl.disp = wl_display_create()))
+     {
+        ERR("Could not create a Wayland display: %m");
+        goto disp_err;
+     }
+
+   /* try to setup wayland socket */
+   if (!(name = wl_display_add_socket_auto(cdata->wl.disp)))
+     {
+        ERR("Could not create Wayland display socket: %m");
+        PRCTL("[Winsys] Could not create Wayland display socket: /run/wayland-0");
+        goto sock_err;
+     }
+
+   res = _e_comp_wl_socket_init(name);
+   EINA_SAFETY_ON_FALSE_GOTO(res, sock_err);
+   PRCTL("[Winsys] change permission and create sym link for wayland-0");
+
    /* set wayland display environment variable */
    e_env_set("WAYLAND_DISPLAY", name);
 
index e2277ce31c53581e9a3fdf90de33080998bb1dd4..bfefc5b34447f472f49aee538199861917f51bdf 100644 (file)
@@ -200,6 +200,17 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, wl_sock_access.owner, STR);
    E_CONFIG_VAL(D, T, wl_sock_access.group, STR);
    E_CONFIG_VAL(D, T, wl_sock_access.permissions, INT);
+   E_CONFIG_VAL(D, T, wl_sock_access.smack.use, UCHAR);
+   E_CONFIG_VAL(D, T, wl_sock_access.smack.name, STR);
+   E_CONFIG_VAL(D, T, wl_sock_access.smack.value, STR);
+   E_CONFIG_VAL(D, T, wl_sock_access.smack.flags, INT);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.use, UCHAR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.link_name, STR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.owner, STR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.group, STR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.smack.name, STR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.smack.value, STR);
+   E_CONFIG_VAL(D, T, wl_sock_symlink_access.smack.flags, INT);
    E_CONFIG_VAL(D, T, sleep_for_dri, INT);
    E_CONFIG_VAL(D, T, create_wm_ready, INT);
    E_CONFIG_VAL(D, T, comp_canvas_bg.r, UCHAR);
@@ -783,8 +794,17 @@ _e_config_free(E_Config *ecf)
      }
 
    eina_stringshare_del(ecf->xkb.default_model);
+
    eina_stringshare_del(ecf->wl_sock_access.owner);
    eina_stringshare_del(ecf->wl_sock_access.group);
+   eina_stringshare_del(ecf->wl_sock_access.smack.name);
+   eina_stringshare_del(ecf->wl_sock_access.smack.value);
+
+   eina_stringshare_del(ecf->wl_sock_symlink_access.link_name);
+   eina_stringshare_del(ecf->wl_sock_symlink_access.owner);
+   eina_stringshare_del(ecf->wl_sock_symlink_access.group);
+   eina_stringshare_del(ecf->wl_sock_symlink_access.smack.name);
+   eina_stringshare_del(ecf->wl_sock_symlink_access.smack.value);
 
    EINA_LIST_FREE(ecf->modules, em)
      {
index c262e28df340b5fed7bc1bccdae6363ab4f1f8ae..e065a319814134ca7e346bb46742a9283fdebb86 100644 (file)
@@ -132,7 +132,27 @@ struct _E_Config
       const char   *owner;
       const char   *group;
       unsigned int  permissions;
+      struct
+      {
+         unsigned char use;
+         const char   *name;
+         const char   *value;
+         int           flags;
+      } smack;
    } wl_sock_access;
+   struct
+   {
+      unsigned char use;
+      const char   *link_name;
+      const char   *owner;
+      const char   *group;
+      struct
+      {
+         const char   *name;
+         const char   *value;
+         int           flags;
+      } smack;
+   } wl_sock_symlink_access;
    int                       sleep_for_dri;
    int                       create_wm_ready;
    struct