4 * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Kyuho Jo <kyuho.jo@samsung.com>, Sunghyun Kwon <sh0701.kwon@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 * This file contains functionality related to KNOX
25 * to interact with email-service.
26 * @file email-core-container.c
29 * @brief This file contains functionality to provide KNOX support in email-service.
31 #ifdef __FEATURE_CONTAINER_ENABLE__
33 #endif /* __FEATURE_CONTAINER_ENABLE__ */
35 #include "email-utilities.h"
36 #include "email-core-container.h"
37 #include "email-debug-log.h"
39 int vsm_state_handle = 0;
40 int vsm_event_handle = 0;
41 #ifdef __FEATURE_CONTAINER_ENABLE__
42 vsm_context_h container;
45 static int container_state_listener(vsm_zone_h zone, vsm_zone_state_t state, void *user_data)
47 EM_DEBUG_FUNC_BEGIN();
48 EM_DEBUG_LOG("Container name : [%s]", vsm_get_zone_name(zone));
49 EM_DEBUG_LOG("Container state : [%d]", state);
54 static int container_event_listener(vsm_zone_h zone, vsm_zone_event_t event, void *user_data)
56 EM_DEBUG_FUNC_BEGIN();
57 EM_DEBUG_LOG("Container name : [%s]", vsm_get_zone_name(zone));
58 EM_DEBUG_LOG("Container event : [%d]", event);
62 #endif /* __FEATURE_CONTAINER_ENABLE__ */
64 INTERNAL_FUNC void emcore_create_container()
66 EM_DEBUG_FUNC_BEGIN();
67 #ifdef __FEATURE_CONTAINER_ENABLE__
70 container = vsm_create_context();
71 if (container == NULL) {
72 EM_DEBUG_EXCEPTION("vsm_create_context failed");
76 vsm_state_handle = vsm_add_state_changed_callback(container, container_state_listener, NULL);
78 vsm_event_handle = vsm_add_event_callback(container, container_event_listener, NULL);
79 #endif /* __FEATURE_CONTAINER_ENABLE__ */
83 INTERNAL_FUNC void emcore_destroy_container()
85 EM_DEBUG_FUNC_BEGIN();
86 #ifdef __FEATURE_CONTAINER_ENABLE__
89 vsm_del_state_changed_callback(container, vsm_state_handle);
91 vsm_del_event_callback(container, vsm_event_handle);
93 vsm_cleanup_context(container);
97 #endif /* __FEATURE_CONTAINER_ENABLE__ */
102 #ifdef __FEATURE_CONTAINER_ENABLE__
103 static gboolean mainloop_callback(GIOChannel *channel, GIOCondition condition, void *data)
105 EM_DEBUG_FUNC_BEGIN();
107 vsm_context_h ctx = (vsm_context_h)data;
109 EM_DEBUG_LOG("Enter event loop");
110 vsm_enter_eventloop(ctx, 0, 0);
111 EM_DEBUG_LOG("Finish event loop");
116 #endif /* __FEATURE_CONTAINER_ENABLE__ */
118 INTERNAL_FUNC void emcore_bind_vsm_context()
120 EM_DEBUG_FUNC_BEGIN();
122 #ifdef __FEATURE_CONTAINER_ENABLE__
125 GIOChannel *domain_channel = NULL;
127 fd = vsm_get_poll_fd(container);
129 domain_channel = g_io_channel_unix_new(fd);
130 if (domain_channel == NULL) {
131 EM_DEBUG_EXCEPTION("Channel allocation failed\n");
135 g_io_add_watch(domain_channel, G_IO_IN, mainloop_callback, container);
136 #endif /* __FEATURE_CONTAINER_ENABLE__ */
141 INTERNAL_FUNC int emcore_get_container_path(char *multi_user, char **container_path)
143 EM_DEBUG_FUNC_BEGIN();
144 int err = EMAIL_ERROR_NONE;
146 if (multi_user == NULL) {
147 EM_DEBUG_LOG("user_name is NULL");
148 return EMAIL_ERROR_INVALID_PARAM;
151 #ifdef __FEATURE_CONTAINER_ENABLE__
152 if (container == NULL) {
153 EM_DEBUG_LOG("Container not intialize");
154 return EMAIL_ERROR_CONTAINER_NOT_INITIALIZATION;
157 vsm_zone_h zone = NULL;
158 char *p_container_path = NULL;
159 char errno_buf[ERRNO_BUF_SIZE] = {0};
161 if (EM_SAFE_STRLEN(multi_user) == 0) {
162 EM_DEBUG_LOG("multi_user name is NULL");
166 EM_DEBUG_LOG("name : [%s], container : [%p]", multi_user, container);
167 zone = vsm_lookup_zone_by_name(container, multi_user);
169 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
170 err = EMAIL_ERROR_CONTAINER_GET_DOMAIN;
174 p_container_path = (char *)vsm_get_zone_rootpath(zone);
179 *container_path = EM_SAFE_STRDUP(p_container_path);
181 #endif /* __FEATURE_CONTAINER_ENABLE__ */
186 INTERNAL_FUNC int emcore_get_user_name(int pid, char **multi_user)
188 EM_DEBUG_FUNC_BEGIN();
190 int err = EMAIL_ERROR_NONE;
193 EM_DEBUG_EXCEPTION("Invalid parameter");
194 return EMAIL_ERROR_INVALID_PARAM;
196 #ifdef __FEATURE_CONTAINER_ENABLE__
198 char *user_name = NULL;
199 vsm_zone_h zone = NULL;
200 char errno_buf[ERRNO_BUF_SIZE] = {0};
202 EM_DEBUG_LOG("pid : [%d], container : [%p]", pid, container);
203 zone = vsm_lookup_zone_by_pid(container, pid);
205 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
206 err = EMAIL_ERROR_CONTAINER_GET_DOMAIN;
210 user_name = (char *)vsm_get_zone_name(zone);
211 EM_DEBUG_LOG("user_name : [%s]", user_name);
216 *multi_user = EM_SAFE_STRDUP(user_name);
218 #endif /* __FEATURE_CONTAINER_ENABLE__ */
223 INTERNAL_FUNC int emcore_lookup_zone_by_name(char *user_name)
225 EM_DEBUG_FUNC_BEGIN();
228 if (EM_SAFE_STRLEN(user_name) == 0) {
229 EM_DEBUG_LOG("user_name is NULL");
233 #ifdef __FEATURE_CONTAINER_ENABLE__
234 if (container == NULL) {
235 EM_DEBUG_LOG("Container not intialize");
239 vsm_zone_h zone = NULL;
240 char errno_buf[ERRNO_BUF_SIZE] = {0};
242 EM_DEBUG_LOG("name : [%s], container : [%p]", user_name, container);
243 zone = vsm_lookup_zone_by_name(container, user_name);
245 EM_DEBUG_EXCEPTION("NULL returned : %s, %d", EM_STRERROR(errno_buf), errno);
253 #endif /* __FEATURE_CONTAINER_ENABLE__ */
258 INTERNAL_FUNC void emcore_set_declare_link(const char *file_path)
260 EM_DEBUG_FUNC_BEGIN();
262 #ifdef __FEATURE_CONTAINER_ENABLE__
263 if (container == NULL) {
264 EM_DEBUG_EXCEPTION("Not initialize");
269 if ((ret = vsm_declare_link(container, file_path /* src path */, file_path /* dst path */)) != 0) {
270 EM_DEBUG_EXCEPTION("vsm_declare_link failed : [%s] [%d]", file_path, ret);
272 #endif /* __FEATURE_CONTAINER_ENABLE__ */
277 #ifdef __FEATURE_CONTAINER_ENABLE__
278 void iterate_callback(vsm_zone_h zone, void *user_data)
280 EM_DEBUG_FUNC_BEGIN();
281 char *zone_name = NULL;
282 GList *zone_name_list = (GList *)user_data;
284 zone_name = EM_SAFE_STRDUP(vsm_get_zone_name(zone));
285 if (EM_SAFE_STRLEN(zone_name) > 0)
286 zone_name_list = g_list_append(zone_name_list, zone_name);
290 #endif /* __FEATURE_CONTAINER_ENABLE__ */
292 INTERNAL_FUNC int emcore_get_zone_name_list(GList **output_name_list)
294 EM_DEBUG_FUNC_BEGIN();
295 int err = EMAIL_ERROR_NONE;
296 GList *zone_name_list = NULL;
299 if (output_name_list == NULL) {
300 EM_DEBUG_EXCEPTION("Invalid parameter");
301 err = EMAIL_ERROR_INVALID_PARAM;
305 #ifdef __FEATURE_CONTAINER_ENABLE__
308 if (container == NULL) {
309 EM_DEBUG_EXCEPTION("Not initialize");
310 err = EMAIL_ERROR_CONTAINER_CREATE_FAILED;
314 zone_name_list = g_list_alloc();
315 if (zone_name_list == NULL) {
316 EM_DEBUG_EXCEPTION("g_list_alloc failed");
317 err = EMAIL_ERROR_OUT_OF_MEMORY;
321 if ((ret = vsm_iterate_zone(container, iterate_callback, (void *)zone_name_list)) < 0) {
322 EM_DEBUG_EXCEPTION("vsm_iterate_domain failed : [%d]", ret);
323 err = EMAIL_ERROR_CONTAINER_ITERATE_DOMAIN;
326 #endif /* __FEATURE_CONTAINER_ENABLE__ */
330 if (err != EMAIL_ERROR_NONE) {
331 node = g_list_first(zone_name_list);
332 while (node != NULL) {
333 /* Free the domain name */
334 EM_SAFE_FREE(node->data);
335 node = g_list_next(node);
337 g_list_free(zone_name_list);
338 zone_name_list = NULL;
341 if (output_name_list)
342 *output_name_list = zone_name_list;
348 INTERNAL_FUNC int emcore_get_canonicalize_path(char *db_path, char **output_path)
350 EM_DEBUG_FUNC_BEGIN();
351 int err = EMAIL_ERROR_NONE;
353 #ifdef __FEATURE_CONTAINER_ENABLE__
355 ret = vsm_canonicalize_path(db_path, output_path);
357 EM_DEBUG_EXCEPTION("vsm_canonicalize_path failed : [%d]", ret);
358 err = EMAIL_ERROR_FILE_NOT_FOUND;
360 #endif /* __FEATURE_CONTAINER_ENABLE__ */
366 INTERNAL_FUNC int emcore_set_join_zone(char *multi_user_name, void **join_zone)
368 EM_DEBUG_FUNC_BEGIN();
369 int err = EMAIL_ERROR_NONE;
370 #ifdef __FEATURE_CONTAINER_ENABLE__
371 char errno_buf[ERRNO_BUF_SIZE] = {0};
372 vsm_zone_h temp_zone = NULL;
373 vsm_zone_h p_join_zone = NULL;
375 if (EM_SAFE_STRLEN(multi_user_name) == 0) {
376 EM_DEBUG_LOG("multi_user_name is NULL");
380 temp_zone = vsm_lookup_zone_by_name(container, multi_user_name);
381 if (temp_zone == NULL) {
382 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
383 err = EMAIL_ERROR_CONTAINER_LOOKUP_ZONE_FAILED;
387 p_join_zone = vsm_join_zone(temp_zone);
388 if (p_join_zone == NULL) {
389 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
390 err = EMAIL_ERROR_CONTAINER_JOIN_ZONE_FAILED;
397 *join_zone = (void *)p_join_zone;
399 #endif /* __FEATURE_CONTAINER_ENABLE__ */
404 INTERNAL_FUNC void emcore_unset_join_zone(void *join_zone)
406 EM_DEBUG_FUNC_BEGIN();
407 #ifdef __FEATURE_CONTAINER_ENABLE__
409 char errno_buf[ERRNO_BUF_SIZE] = {0};
410 vsm_zone_h temp_zone = NULL;
413 temp_zone = vsm_join_zone((vsm_zone_h)join_zone);
414 if (temp_zone == NULL) {
415 EM_DEBUG_EXCEPTION("NULL returned : %s %d", EM_STRERROR(errno_buf), errno);
418 #endif /* __FEATURE_CONTAINER_ENABLE__ */