e_comp: socket permission init added (change permission and symlink creation) 44/87544/6
authorJunghwan Choi <jhhh.choi@samsung.com>
Thu, 8 Sep 2016 12:16:44 +0000 (21:16 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Mon, 26 Sep 2016 07:06:35 +0000 (00:06 -0700)
Change-Id: I306f98f5b3f6ad26fc2c6de75633937dbc3f423e
Signed-off-by: Junghwan Choi <jhhh.choi@samsung.com>
src/bin/e_comp.c
src/bin/e_comp.h
src/bin/e_comp_screen.c
src/bin/e_comp_wl.c
src/bin/e_comp_wl_tbm.c
src/bin/e_config.c
src/bin/e_config.h

index 1bbf6e9203fac7145d2dfbda94ef3bbe067152b4..0b72ed9fce090550647a526708640c6a5bd63205 100644 (file)
@@ -1851,3 +1851,117 @@ e_comp_vis_ec_list_get(E_Zone *zone)
 
    return ec_list;
 }
+
+E_API Eina_Bool
+e_comp_socket_init(const char *name)
+{
+   const char *dir = NULL;
+   char socket_path[108];
+   struct passwd *u;
+   struct group *g;
+   uid_t uid;
+   gid_t gid;
+   int res;
+   E_Config_Socket_Access *sa = NULL;
+   Eina_List *l = NULL;
+
+   dir = getenv("XDG_RUNTIME_DIR");
+   if (!dir) return EINA_FALSE;
+   if (!name) return EINA_FALSE;
+
+   snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, name);
+
+   EINA_LIST_FOREACH(e_config->sock_accesses, l, sa)
+     {
+        if (strcmp(sa->sock_access.name, name)) continue;
+        if (!sa->sock_access.use) break;
+
+        if ((sa->sock_access.owner) &&
+            (sa->sock_access.group))
+          {
+             u = getpwnam(sa->sock_access.owner);
+             uid = u ? u->pw_uid : 0;
+
+             g = getgrnam(sa->sock_access.group);
+             gid = g ? g->gr_gid : 0;
+
+             DBG("socket path: %s owner: %s (%d) group: %s (%d) permissions: %o",
+                 socket_path,
+                 sa->sock_access.owner, uid,
+                 sa->sock_access.group, gid,
+                 sa->sock_access.permissions);
+
+             res = chmod(socket_path, sa->sock_access.permissions);
+             if (res < 0)
+               {
+                  ERR("Could not change modes of socket file:%s (%s)",
+                      socket_path,
+                      strerror(errno));
+                  PRCTL("[Winsys] Could not chane modes of socket file: %s", socket_path);
+                  return EINA_FALSE;
+               }
+
+             res = chown(socket_path, uid, gid);
+             if (res < 0)
+               {
+                  ERR("Could not change owner of socket file:%s (%s)",
+                      socket_path,
+                      strerror(errno));
+                  PRCTL("[Winsys] Could not change owner of socket file: %s", socket_path);
+                  return EINA_FALSE;
+               }
+          }
+
+        if (sa->sock_access.smack.use)
+          {
+             res = setxattr(socket_path,
+                            sa->sock_access.smack.name,
+                            sa->sock_access.smack.value,
+                            strlen(sa->sock_access.smack.value),
+                            sa->sock_access.smack.flags);
+             if (res < 0)
+               {
+                  PRCTL("[Winsys] Could not change smack variable for socket file: %s", socket_path);
+                  return EINA_FALSE;
+               }
+          }
+
+        if (sa->sock_symlink_access.use)
+          {
+             res = symlink(socket_path,
+                           sa->sock_symlink_access.link_name);
+             if (res < 0)
+               {
+                  PRCTL("[Winsys] Could not make symbolic link: %s", sa->sock_symlink_access.link_name);
+                  break;
+               }
+
+             u = getpwnam(sa->sock_symlink_access.owner);
+             uid = u ? u->pw_uid : 0;
+
+             g = getgrnam(sa->sock_symlink_access.group);
+             gid = g ? g->gr_gid : 0;
+
+             res = lchown(sa->sock_symlink_access.link_name, uid, gid);
+             if (res < 0)
+               {
+                  PRCTL("[Winsys] chown -h owner:users %s failed!", sa->sock_symlink_access.link_name);
+                  break;
+               }
+
+             res = setxattr(sa->sock_symlink_access.link_name,
+                            sa->sock_symlink_access.smack.name,
+                            sa->sock_symlink_access.smack.value,
+                            strlen(sa->sock_symlink_access.smack.value),
+                            sa->sock_symlink_access.smack.flags);
+             if (res < 0)
+               {
+                  PRCTL("[Winsys] Chould not change smack variable for symbolic link: %s", sa->sock_symlink_access.link_name);
+                  break;
+               }
+          }
+        break;
+     }
+
+   return EINA_TRUE;
+}
index f4a3d8834a30a29350ce3856d143156c46924791..dbf4b52f00304d624fb987747e86a6f9d4b7d0b9 100644 (file)
@@ -241,5 +241,7 @@ E_API Eina_List *e_comp_vis_ec_list_get(E_Zone *zone); // visible ec list sorted
 E_API void e_comp_hwc_end(const char *location);
 #endif
 
+E_API Eina_Bool e_comp_socket_init(const char *name);
+
 #endif
 #endif
index b371878bea034a422c899102b199d77381a1abda..6018b6ef0d736c589905143726534724c37a2e1f 100644 (file)
@@ -251,6 +251,9 @@ _e_comp_screen_new(void)
              free(e_comp_screen);
              return NULL;
           }
+
+        if (e_comp_socket_init("tdm-socket"))
+          PRCTL("[Winsys] change permission and create sym link for %s", "tdm-socket");
      }
    else
      {
index b88a8b8918b49a24b63a78398caeb7b8836ff447..af869816f9e27ab501158bc52d38f8f4a7a369f0 100644 (file)
@@ -4432,112 +4432,6 @@ _e_comp_wl_gl_idle(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
-static Eina_Bool
-_e_comp_wl_socket_init(const char *name)
-{
-   const char *dir = NULL;
-   char socket_path[108];
-   struct passwd *u;
-   struct group *g;
-   uid_t uid;
-   gid_t gid;
-   int res;
-
-   dir = getenv("XDG_RUNTIME_DIR");
-   if (dir)
-     snprintf(socket_path, sizeof(socket_path), "%s/%s", dir, name);
-
-   if ((e_config->wl_sock_access.use) && (dir))
-     {
-        if ((e_config->wl_sock_access.owner) &&
-            (e_config->wl_sock_access.group))
-          {
-             u = getpwnam(e_config->wl_sock_access.owner);
-             uid = u ? u->pw_uid : 0;
-
-             g = getgrnam(e_config->wl_sock_access.group);
-             gid = g ? g->gr_gid : 0;
-
-             DBG("socket path: %s owner: %s (%d) group: %s (%d) permissions: %o",
-                 socket_path,
-                 e_config->wl_sock_access.owner, uid,
-                 e_config->wl_sock_access.group, gid,
-                 e_config->wl_sock_access.permissions);
-
-             res = chmod(socket_path, e_config->wl_sock_access.permissions);
-             if (res < 0)
-               {
-                  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);
-             if (res < 0)
-               {
-                  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)
 {
@@ -4572,9 +4466,9 @@ _e_comp_wl_compositor_create(void)
         goto sock_err;
      }
 
-   res = _e_comp_wl_socket_init(name);
+   res = e_comp_socket_init(name);
    EINA_SAFETY_ON_FALSE_GOTO(res, sock_err);
-   PRCTL("[Winsys] change permission and create sym link for wayland-0");
+   PRCTL("[Winsys] change permission and create sym link for %s", name);
 
    /* set wayland display environment variable */
    e_env_set("WAYLAND_DISPLAY", name);
index d15eda3649bf646ff1a239153086a80fda24bbe9..11fc6f7ca7da1b63ecf67c41259bc0f5415892e2 100644 (file)
@@ -64,6 +64,9 @@ e_comp_wl_tbm_init(void)
 
    _e_comp_wl_tbm_bind_wl_display(tbm_server, e_comp->wl_comp_data->wl.disp);
 
+   if (e_comp_socket_init("tbm-drm-auth"))
+     PRCTL("[Winsys] change permission and create sym link for %s", "tbm-drm-auth");
+
    return EINA_TRUE;
 }
 
@@ -151,4 +154,4 @@ e_comp_wl_tbm_remote_buffer_get(struct wl_resource *wl_tbm, struct wl_resource *
    }
 
    return remote_buffer;
-}
\ No newline at end of file
+}
index 0c73b8ec90bbdea63ecbdaf4594d41d3b3222690..e3c3622a331ee271877d1b204f85421e2f294417 100644 (file)
@@ -22,6 +22,7 @@ static E_Config_DD *_e_config_desktop_window_profile_edd = NULL;
 static E_Config_DD *_e_config_env_var_edd = NULL;
 static E_Config_DD *_e_config_client_type_edd = NULL;
 static E_Config_DD *_e_config_policy_desk_edd = NULL;
+static E_Config_DD *_e_config_socket_access_edd = NULL;
 
 E_API int E_EVENT_CONFIG_MODE_CHANGED = 0;
 
@@ -49,6 +50,7 @@ _e_config_edd_shutdown(void)
    E_CONFIG_DD_FREE(_e_config_env_var_edd);
    E_CONFIG_DD_FREE(_e_config_client_type_edd);
    E_CONFIG_DD_FREE(_e_config_policy_desk_edd);
+   E_CONFIG_DD_FREE(_e_config_socket_access_edd);
 }
 
 static void
@@ -123,6 +125,28 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, y, INT);
    E_CONFIG_VAL(D, T, enable, INT);
 
+   _e_config_socket_access_edd = E_CONFIG_DD_NEW("E_Config_Socket_Access", E_Config_Socket_Access);
+#undef T
+#undef D
+#define T E_Config_Socket_Access
+#define D _e_config_socket_access_edd
+   E_CONFIG_VAL(D, T, sock_access.use, UCHAR);
+   E_CONFIG_VAL(D, T, sock_access.name, STR);
+   E_CONFIG_VAL(D, T, sock_access.owner, STR);
+   E_CONFIG_VAL(D, T, sock_access.group, STR);
+   E_CONFIG_VAL(D, T, sock_access.permissions, INT);
+   E_CONFIG_VAL(D, T, sock_access.smack.use, UCHAR);
+   E_CONFIG_VAL(D, T, sock_access.smack.name, STR);
+   E_CONFIG_VAL(D, T, sock_access.smack.value, STR);
+   E_CONFIG_VAL(D, T, sock_access.smack.flags, INT);
+   E_CONFIG_VAL(D, T, sock_symlink_access.use, UCHAR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.link_name, STR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.owner, STR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.group, STR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.smack.name, STR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.smack.value, STR);
+   E_CONFIG_VAL(D, T, sock_symlink_access.smack.flags, INT);
+
    _e_config_edd = E_CONFIG_DD_NEW("E_Config", E_Config);
 #undef T
 #undef D
@@ -220,21 +244,6 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, cursor_timer_interval, INT);
    E_CONFIG_LIST(D, T, client_types, _e_config_client_type_edd);
    E_CONFIG_VAL(D, T, comp_shadow_file, STR);
-   E_CONFIG_VAL(D, T, wl_sock_access.use, UCHAR);
-   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, create_wm_start, INT);
@@ -245,6 +254,7 @@ _e_config_edd_init(Eina_Bool old)
    E_CONFIG_VAL(D, T, comp_canvas_bg.opmode, INT);
    E_CONFIG_VAL(D, T, delayed_load_idle_count, INT);
    E_CONFIG_VAL(D, T, use_buffer_flush, UCHAR);
+   E_CONFIG_LIST(D, T, sock_accesses, _e_config_socket_access_edd);
 }
 
 /* externally accessible functions */
@@ -823,6 +833,7 @@ _e_config_free(E_Config *ecf)
    E_Config_Env_Var *evr;
    E_Config_Desktop_Window_Profile *wp;
    E_Config_Policy_Desk *pd;
+   E_Config_Socket_Access *sa;
 
    if (!ecf) return;
 
@@ -839,17 +850,6 @@ _e_config_free(E_Config *ecf)
    eina_stringshare_del(ecf->xkb.default_rmlvo.variant);
    eina_stringshare_del(ecf->xkb.default_rmlvo.options);
 
-   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)
      {
         if (em->name) eina_stringshare_del(em->name);
@@ -873,6 +873,21 @@ _e_config_free(E_Config *ecf)
    eina_stringshare_del(ecf->launcher.title);
    eina_stringshare_del(ecf->launcher.clas);
 
+   EINA_LIST_FREE(ecf->sock_accesses, sa)
+     {
+        eina_stringshare_del(sa->sock_access.name);
+        eina_stringshare_del(sa->sock_access.owner);
+        eina_stringshare_del(sa->sock_access.group);
+        eina_stringshare_del(sa->sock_access.smack.name);
+        eina_stringshare_del(sa->sock_access.smack.value);
+        eina_stringshare_del(sa->sock_symlink_access.link_name);
+        eina_stringshare_del(sa->sock_symlink_access.owner);
+        eina_stringshare_del(sa->sock_symlink_access.group);
+        eina_stringshare_del(sa->sock_symlink_access.smack.name);
+        eina_stringshare_del(sa->sock_symlink_access.smack.value);
+        E_FREE(sa);
+     }
+
    E_FREE(ecf);
 }
 
index 4a458892ee14af2f15b38b6431eb9c36f155cd49..7e02f106dbe5df787c53383f4456e9fa11a5005c 100644 (file)
@@ -10,6 +10,7 @@ typedef struct _E_Config_Desktop_Background     E_Config_Desktop_Background;
 typedef struct _E_Config_Env_Var                E_Config_Env_Var;
 typedef struct _E_Config_Client_Type            E_Config_Client_Type;
 typedef struct _E_Config_Policy_Desk            E_Config_Policy_Desk;
+typedef struct _E_Config_Socket_Access          E_Config_Socket_Access;
 
 #else
 #ifndef E_CONFIG_H
@@ -145,33 +146,6 @@ struct _E_Config
    int cursor_timer_interval;
    Eina_List *client_types;
    const char *comp_shadow_file;
-   struct
-   {
-      unsigned char use;
-      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;
    int                       create_wm_start;
@@ -182,6 +156,7 @@ struct _E_Config
    } comp_canvas_bg;
    int delayed_load_idle_count;
    Eina_Bool use_buffer_flush;
+   Eina_List *sock_accesses;
 };
 
 struct _E_Config_Desklock_Background
@@ -258,6 +233,38 @@ struct _E_Config_Policy_Desk
    int enable;
 };
 
+struct _E_Config_Socket_Access
+{
+   struct
+   {
+      unsigned char use;
+      const char   *name;
+      const char   *owner;
+      const char   *group;
+      unsigned int  permissions;
+      struct
+      {
+         unsigned char use;
+         const char   *name;
+         const char   *value;
+         int           flags;
+      } smack;
+   } 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;
+   } sock_symlink_access;
+};
+
 EINTERN int                   e_config_init(void);
 EINTERN int                   e_config_shutdown(void);