/* handle include for printing uint64_t */
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
+#include <sys/xattr.h>
#define COMPOSITOR_VERSION 3
}
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;
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);
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);
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);
}
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)
{