From: Gwanglim Lee Date: Thu, 12 May 2016 09:38:28 +0000 (+0900) Subject: e_comp_wl: added wl_socket initialization function for the sysvinit system. It can... X-Git-Tag: submit/tizen/20160513.025859~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=26d36532c45cf47648e45ffeb96d1145ff654ffc;p=platform%2Fupstream%2Fenlightenment.git e_comp_wl: added wl_socket initialization function for the sysvinit system. It can make symbolic link for user session while init time if wl_sock_symlink_access of e config is enabled. Change-Id: I13d245979cea47538c98874a14940d1d74017f12 --- diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 4160c6e63f..ba951f40c4 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -7,6 +7,7 @@ /* handle include for printing uint64_t */ #define __STDC_FORMAT_MACROS #include +#include #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); diff --git a/src/bin/e_config.c b/src/bin/e_config.c index e2277ce31c..bfefc5b344 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -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) { diff --git a/src/bin/e_config.h b/src/bin/e_config.h index c262e28df3..e065a31981 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -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