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;
+}
E_API void e_comp_hwc_end(const char *location);
#endif
+E_API Eina_Bool e_comp_socket_init(const char *name);
+
#endif
#endif
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
{
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)
{
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);
_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;
}
}
return remote_buffer;
-}
\ No newline at end of file
+}
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;
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
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
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);
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 */
E_Config_Env_Var *evr;
E_Config_Desktop_Window_Profile *wp;
E_Config_Policy_Desk *pd;
+ E_Config_Socket_Access *sa;
if (!ecf) return;
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);
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);
}
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
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;
} comp_canvas_bg;
int delayed_load_idle_count;
Eina_Bool use_buffer_flush;
+ Eina_List *sock_accesses;
};
struct _E_Config_Desklock_Background
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);