From 290565bdf4c1c7e017eca9df974d59a68acbc698 Mon Sep 17 00:00:00 2001 From: "jk7744.park" Date: Sat, 24 Oct 2015 16:28:35 +0900 Subject: [PATCH] tizen 2.4 release --- CMakeLists.txt | 13 +- alarm-manager-registry.c | 181 ++- alarm-manager-schedule.c | 68 +- alarm-manager-timer.c | 23 - alarm-manager.c | 1662 ++++++++++++++++++----- alarm-server.manifest | 12 + alarm_mgr.xml | 14 +- alarmmgr_log_dump.sh => alarmmgr_log_dump.sh.in | 4 +- include/alarm-internal.h | 60 +- include/alarm.h | 39 +- packaging/alarm-manager.spec | 37 +- packaging/alarm-server.service | 3 + src/alarm-lib-stub.c | 131 +- src/alarm-lib.c | 221 ++- 14 files changed, 1853 insertions(+), 615 deletions(-) mode change 100644 => 100755 alarm-manager-registry.c rename alarmmgr_log_dump.sh => alarmmgr_log_dump.sh.in (61%) mode change 100644 => 100755 mode change 100644 => 100755 include/alarm-internal.h mode change 100755 => 100644 include/alarm.h mode change 100755 => 100644 src/alarm-lib.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 15f407c..9ba03e3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,12 @@ INCLUDE_DIRECTORIES( include ) -SET(DEPS_PKGS "glib-2.0 dlog aul bundle security-server db-util appsvc pkgmgr-info vconf gio-2.0 gio-unix-2.0 capi-system-device") +SET(DEPS_PKGS "glib-2.0 dlog aul bundle security-server db-util appsvc pkgmgr-info vconf gio-2.0 gio-unix-2.0 capi-system-device vasum eventsystem") + +IF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) +ADD_DEFINITIONS("-D_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG") +ADD_DEFINITIONS("-DALARMMGR_LOG_FILE_PATH=\"${_APPFW_ALARM_MANAGER_MODULE_LOG_PATH}\"") +ENDIF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) message("${DEPS_PKGS}") @@ -55,7 +60,9 @@ TARGET_LINK_LIBRARIES(${this_target} "-lrt -lm -pie") TARGET_LINK_LIBRARIES(${this_target} alarm) ADD_SUBDIRECTORY(src) -ADD_SUBDIRECTORY(tool) INSTALL(TARGETS ${this_target} DESTINATION bin) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/alarmmgr_log_dump.sh DESTINATION /opt/etc/dump.d/module.d) +IF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/alarmmgr_log_dump.sh.in ${CMAKE_CURRENT_SOURCE_DIR}/alarmmgr_log_dump.sh @ONLY) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/alarmmgr_log_dump.sh DESTINATION /opt/etc/dump.d/module.d) +ENDIF(_APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG) diff --git a/alarm-manager-registry.c b/alarm-manager-registry.c old mode 100644 new mode 100755 index 21c4c12..9b67232 --- a/alarm-manager-registry.c +++ b/alarm-manager-registry.c @@ -41,13 +41,31 @@ #define MAX_QUERY_LEN 4096 extern __alarm_server_context_t alarm_context; -extern sqlite3 *alarmmgr_db; - +extern GSList *alarmmgr_db_list; bool _save_alarms(__alarm_info_t *__alarm_info); bool _update_alarms(__alarm_info_t *__alarm_info); -bool _delete_alarms(alarm_id_t alarm_id); +bool _delete_alarms(alarm_id_t alarm_id, const char *zone); bool _load_alarms_from_registry(void); +static gint _find_zone_alarmmgr_db(void *db_info, void *data) +{ + _zone_alarm_db_list_t *db_struct = (_zone_alarm_db_list_t *)db_info; + return strcmp(db_struct->zone, (char *)data); +} + +static sqlite3 *_find_db(const char *zone) +{ + sqlite3 *alarmmgr_db = NULL; + GSList *iter = g_slist_find_custom(alarmmgr_db_list, zone, (GCompareFunc)_find_zone_alarmmgr_db); + if (iter == NULL) { + SECURE_LOGE("failed to find db for zone[%s]", zone); + return NULL; + } + alarmmgr_db = ((_zone_alarm_db_list_t *)iter->data)->alarmmgr_db; + + return alarmmgr_db; +} + bool _save_alarms(__alarm_info_t *__alarm_info) { char *error_message = NULL; @@ -56,6 +74,13 @@ bool _save_alarms(__alarm_info_t *__alarm_info) alarm_date_t *start = &alarm_info->start; alarm_mode_t *mode = &alarm_info->mode; + SECURE_LOGE("__zone %s", g_quark_to_string(__alarm_info->zone)); + sqlite3 *alarmmgr_db = _find_db((const char *)g_quark_to_string(__alarm_info->zone)); + if (alarmmgr_db == NULL) { + SECURE_LOGE("failed to retrieve db"); + return false; + } + char *query = sqlite3_mprintf("insert into alarmmgr( alarm_id, start,\ end, pid, caller_pkgid, callee_pkgid, app_unique_name, app_service_name, app_service_name_mod, bundle, year,\ month, day, hour, min, sec, day_of_week, repeat,\ @@ -109,6 +134,12 @@ bool _update_alarms(__alarm_info_t *__alarm_info) alarm_date_t *start = &alarm_info->start; alarm_mode_t *mode = &alarm_info->mode; + sqlite3 *alarmmgr_db = _find_db((const char *)g_quark_to_string(__alarm_info->zone)); + if (alarmmgr_db == NULL) { + SECURE_LOGE("failed to retrieve db"); + return false; + } + char *query = sqlite3_mprintf("update alarmmgr set start=%d, end=%d,\ pid=%d, caller_pkgid=%Q, callee_pkgid=%Q, app_unique_name=%Q, app_service_name=%Q, app_service_name_mod=%Q,\ bundle=%Q, year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d,\ @@ -154,11 +185,17 @@ bool _update_alarms(__alarm_info_t *__alarm_info) return true; } -bool _delete_alarms(alarm_id_t alarm_id) +bool _delete_alarms(alarm_id_t alarm_id, const char *zone) { char *error_message = NULL; char *query = sqlite3_mprintf("delete from alarmmgr where alarm_id=%d", alarm_id); + sqlite3 *alarmmgr_db = _find_db(zone); + if (alarmmgr_db == NULL) { + SECURE_LOGE("failed to retrieve db"); + return false; + } + if (SQLITE_OK != sqlite3_exec(alarmmgr_db, query, NULL, NULL, &error_message)) { SECURE_LOGE("sqlite3_exec() is failed. query = %s, error message = %s", query, error_message); sqlite3_free(query); @@ -190,78 +227,92 @@ bool _load_alarms_from_registry() snprintf(query, MAX_QUERY_LEN, "select * from alarmmgr"); - if (SQLITE_OK != sqlite3_prepare(alarmmgr_db, query, strlen(query), &stmt, &tail)) { - ALARM_MGR_EXCEPTION_PRINT("sqlite3_prepare() is failed."); - return false; - } + GSList *iter; + sqlite3 *alarmmgr_db = NULL; + char *zone = NULL; + for (iter = alarmmgr_db_list; iter != NULL; iter = g_slist_next(iter)) { + alarmmgr_db = ((_zone_alarm_db_list_t *)iter->data)->alarmmgr_db; + zone = ((_zone_alarm_db_list_t *)iter->data)->zone; + + if (SQLITE_OK != sqlite3_prepare(alarmmgr_db, query, strlen(query), &stmt, &tail)) { + ALARM_MGR_EXCEPTION_PRINT("sqlite3_prepare() is failed."); + return false; + } + for (i = 0; SQLITE_ROW == sqlite3_step(stmt); i++) { + __alarm_info = malloc(sizeof(__alarm_info_t)); + + if (G_UNLIKELY(__alarm_info == NULL)) { + ALARM_MGR_EXCEPTION_PRINT("Memory allocation failed."); + return false; + } + alarm_info = (alarm_info_t *) &(__alarm_info->alarm_info); + start = &alarm_info->start; + mode = &alarm_info->mode; + + __alarm_info->alarm_id = sqlite3_column_int(stmt, 0); + __alarm_info->start = sqlite3_column_int(stmt, 1); + __alarm_info->end = sqlite3_column_int(stmt, 2); + __alarm_info->pid = sqlite3_column_int(stmt, 3); + + strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, 4), + MAX_PKG_ID_LEN - 1); + strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, 5), + MAX_PKG_ID_LEN - 1); + strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, 6), + MAX_SERVICE_NAME_LEN - 1); + strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, 7), + MAX_SERVICE_NAME_LEN - 1); + strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, 8), + MAX_SERVICE_NAME_LEN - 1); + strncpy(bundle, (const char *)sqlite3_column_text(stmt, 9), + MAX_BUNDLE_NAME_LEN - 1); + start->year = sqlite3_column_int(stmt, 10); + start->month = sqlite3_column_int(stmt, 11); + start->day = sqlite3_column_int(stmt, 12); + start->hour = sqlite3_column_int(stmt, 13); + start->min = sqlite3_column_int(stmt, 14); + start->sec = sqlite3_column_int(stmt, 15); + mode->u_interval.day_of_week = sqlite3_column_int(stmt, 16); + mode->repeat = sqlite3_column_int(stmt, 17); + alarm_info->alarm_type = sqlite3_column_int(stmt, 18); + alarm_info->reserved_info = sqlite3_column_int(stmt, 19); + strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, 20), + MAX_SERVICE_NAME_LEN - 1); + strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, 21), + MAX_SERVICE_NAME_LEN - 1); - for (i = 0; SQLITE_ROW == sqlite3_step(stmt); i++) { - __alarm_info = malloc(sizeof(__alarm_info_t)); + __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid); + __alarm_info->quark_app_unique_name = + g_quark_from_string(app_unique_name); + __alarm_info->quark_app_service_name = + g_quark_from_string(app_service_name); + __alarm_info->quark_app_service_name_mod= + g_quark_from_string(app_service_name_mod); + __alarm_info->quark_dst_service_name = + g_quark_from_string(dst_service_name); + __alarm_info->quark_dst_service_name_mod= + g_quark_from_string(dst_service_name_mod); + __alarm_info->quark_bundle = g_quark_from_string(bundle); + __alarm_info->zone = g_quark_from_string(zone); - if (G_UNLIKELY(__alarm_info == NULL)) { - ALARM_MGR_EXCEPTION_PRINT("Memory allocation failed."); + _alarm_next_duetime(__alarm_info); + alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info); + } + + if (SQLITE_OK != sqlite3_finalize(stmt)) { + ALARM_MGR_EXCEPTION_PRINT("sqlite3_finalize() is failed."); return false; } - alarm_info = (alarm_info_t *) &(__alarm_info->alarm_info); - start = &alarm_info->start; - mode = &alarm_info->mode; - - __alarm_info->alarm_id = sqlite3_column_int(stmt, 0); - __alarm_info->start = sqlite3_column_int(stmt, 1); - __alarm_info->end = sqlite3_column_int(stmt, 2); - __alarm_info->pid = sqlite3_column_int(stmt, 3); - - strncpy(caller_pkgid, (const char *)sqlite3_column_text(stmt, 4), - MAX_PKG_ID_LEN - 1); - strncpy(callee_pkgid, (const char *)sqlite3_column_text(stmt, 5), - MAX_PKG_ID_LEN - 1); - strncpy(app_unique_name, (const char *)sqlite3_column_text(stmt, 6), - MAX_SERVICE_NAME_LEN - 1); - strncpy(app_service_name, (const char *)sqlite3_column_text(stmt, 7), - MAX_SERVICE_NAME_LEN - 1); - strncpy(app_service_name_mod, (const char *)sqlite3_column_text(stmt, 8), - MAX_SERVICE_NAME_LEN - 1); - strncpy(bundle, (const char *)sqlite3_column_text(stmt, 9), - MAX_BUNDLE_NAME_LEN - 1); - start->year = sqlite3_column_int(stmt, 10); - start->month = sqlite3_column_int(stmt, 11); - start->day = sqlite3_column_int(stmt, 12); - start->hour = sqlite3_column_int(stmt, 13); - start->min = sqlite3_column_int(stmt, 14); - start->sec = sqlite3_column_int(stmt, 15); - mode->u_interval.day_of_week = sqlite3_column_int(stmt, 16); - mode->repeat = sqlite3_column_int(stmt, 17); - alarm_info->alarm_type = sqlite3_column_int(stmt, 18); - alarm_info->reserved_info = sqlite3_column_int(stmt, 19); - strncpy(dst_service_name, (const char *)sqlite3_column_text(stmt, 20), - MAX_SERVICE_NAME_LEN - 1); - strncpy(dst_service_name_mod, (const char *)sqlite3_column_text(stmt, 21), - MAX_SERVICE_NAME_LEN - 1); - - __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); - __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid); - __alarm_info->quark_app_unique_name = - g_quark_from_string(app_unique_name); - __alarm_info->quark_app_service_name = - g_quark_from_string(app_service_name); - __alarm_info->quark_app_service_name_mod= - g_quark_from_string(app_service_name_mod); - __alarm_info->quark_dst_service_name = - g_quark_from_string(dst_service_name); - __alarm_info->quark_dst_service_name_mod= - g_quark_from_string(dst_service_name_mod); - __alarm_info->quark_bundle = g_quark_from_string(bundle); - - _alarm_next_duetime(__alarm_info); - alarm_context.alarms = g_slist_append(alarm_context.alarms, __alarm_info); + stmt = NULL; } - _alarm_schedule(); if (SQLITE_OK != sqlite3_finalize(stmt)) { ALARM_MGR_EXCEPTION_PRINT("sqlite3_finalize() is failed."); return false; } + stmt = NULL; return true; } diff --git a/alarm-manager-schedule.c b/alarm-manager-schedule.c index 2f22f30..e5fc70a 100755 --- a/alarm-manager-schedule.c +++ b/alarm-manager-schedule.c @@ -32,12 +32,11 @@ #include"alarm.h" #include"alarm-internal.h" -#define WAKEUP_ALARM_APP_ID "org.tizen.alarm.ALARM" /*alarm ui - application's alarm's dbus_service name instead of 21 value */ #define DST_TIME_DIFF 1 extern __alarm_server_context_t alarm_context; extern GSList *g_scheduled_alarm_list; +extern bool is_time_changed; static time_t __alarm_next_duetime_once(__alarm_info_t *__alarm_info); static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info); @@ -94,33 +93,15 @@ bool _add_to_scheduled_alarm_list(__alarm_info_t *__alarm_info) g_quark_to_string(alarm->__alarm_info->quark_app_service_name), alarm->__alarm_info->quark_app_service_name); - if (alarm->__alarm_info->quark_app_service_name != g_quark_from_string(WAKEUP_ALARM_APP_ID)) { - g_scheduled_alarm_list = g_slist_append(g_scheduled_alarm_list, alarm); - } - else { - for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) { - count++; - entry = iter->data; - if (entry->__alarm_info->quark_app_service_name != g_quark_from_string(WAKEUP_ALARM_APP_ID)) { - prior = true; - break; - } - } + SECURE_LOGD("%s :target zone : [%s]\n", __FUNCTION__, g_quark_to_string(alarm->__alarm_info->zone)); + alarm->__alarm_info->zone = __alarm_info->zone; - if (!prior) { - g_scheduled_alarm_list = g_slist_append(g_scheduled_alarm_list, alarm); - ALARM_MGR_LOG_PRINT("appended : prior is %d\tcount is %d\n", prior, count); - } - else { - g_scheduled_alarm_list = g_slist_insert(g_scheduled_alarm_list, alarm, count - 1); - ALARM_MGR_LOG_PRINT("appended : prior is %d\tcount is %d\n", prior, count); - } - } + g_scheduled_alarm_list = g_slist_append(g_scheduled_alarm_list, alarm); return true; } -bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id) +bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id, const char *zone) { bool result = false; GSList *iter = NULL; @@ -128,6 +109,10 @@ bool _remove_from_scheduled_alarm_list(int pid, alarm_id_t alarm_id) for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) { alarm = iter->data; + + if (strcmp(g_quark_to_string(alarm->__alarm_info->zone), zone) != 0) + continue; + if (alarm->alarm_id == alarm_id) { g_scheduled_alarm_list = g_slist_remove(g_scheduled_alarm_list, iter->data); g_free(alarm); @@ -228,12 +213,26 @@ static time_t __alarm_next_duetime_repeat(__alarm_info_t *__alarm_info) duetime_tm.tm_mday = start->day; duetime_tm.tm_isdst = -1; - due_time = mktime(&duetime_tm); - - while (__alarm_info->start > due_time || current_time >= due_time) { - due_time += alarm_info->mode.u_interval.interval; + if (alarm_info->alarm_type & ALARM_TYPE_PERIOD && + alarm_info->mode.u_interval.interval > 0) { + /* For minimize 'while loop' + * Duetime should be "periodic_standard_time + (interval * x) >= current" */ + time_t periodic_standard_time = _get_periodic_alarm_standard_time(); + time_t temp; + temp = (current_time - periodic_standard_time) / alarm_info->mode.u_interval.interval; + due_time = periodic_standard_time + (temp * alarm_info->mode.u_interval.interval); + } else { + due_time = mktime(&duetime_tm); + } - /* due_time = mktime(&duetime_tm); */ + if (alarm_info->mode.u_interval.interval <= 0) { + ALARM_MGR_ASSERT_PRINT("Error! Despite repeated alarm, interval <= 0.\nalarm_id=%d, pid=%d, app_unique_name=%s, app_service_name=%s, start time=%d", + __alarm_info->alarm_id, __alarm_info->pid, g_quark_to_string(__alarm_info->quark_app_unique_name), + g_quark_to_string(__alarm_info->quark_app_service_name), __alarm_info->start); + } else { + while (__alarm_info->start > due_time || current_time > due_time || ((!is_time_changed) && (current_time == due_time))) { + due_time += alarm_info->mode.u_interval.interval; + } } if (due_time - current_time < 10) @@ -276,7 +275,7 @@ static time_t __alarm_next_duetime_annually(__alarm_info_t *__alarm_info) due_time = mktime(&duetime_tm); - while (__alarm_info->start > due_time || current_time > due_time) { + while (__alarm_info->start > due_time || current_time > due_time || ((!is_time_changed) && (current_time == due_time))) { duetime_tm.tm_year += 1; due_time = mktime(&duetime_tm); } @@ -305,7 +304,6 @@ static time_t __alarm_next_duetime_monthly(__alarm_info_t *__alarm_info) } if (start->month != 0) { - duetime_tm.tm_mon = start->month - 1; } @@ -313,7 +311,7 @@ static time_t __alarm_next_duetime_monthly(__alarm_info_t *__alarm_info) due_time = mktime(&duetime_tm); - while (__alarm_info->start > due_time || current_time > due_time) { + while (__alarm_info->start > due_time || current_time > due_time || ((!is_time_changed) && (current_time == due_time))) { duetime_tm.tm_mon += 1; if (duetime_tm.tm_mon == 12) { duetime_tm.tm_mon = 0; @@ -404,7 +402,7 @@ static time_t __alarm_next_duetime_weekly(__alarm_info_t *__alarm_info) return due_time; } - if (current_time >= due_time || !(mode->u_interval.day_of_week & 1 << wday)) { + if (current_time > due_time || !(mode->u_interval.day_of_week & 1 << wday) || ((!is_time_changed) && (current_time == due_time))) { int day = wday + 1; int interval = 1; /*this week */ @@ -489,7 +487,7 @@ time_t _alarm_next_duetime(__alarm_info_t *__alarm_info) due_time = mktime(due_tm); } - ALARM_MGR_EXCEPTION_PRINT("alarm_id: %d, next duetime: %d", __alarm_info->alarm_id, due_time); + ALARM_MGR_EXCEPTION_PRINT("alarm_id: %d, next duetime: %d", __alarm_info->alarm_id, due_time); if (__alarm_info->end != 0 && __alarm_info->end < due_time) { ALARM_MGR_LOG_PRINT("due time > end time"); @@ -526,7 +524,7 @@ static bool __find_next_alarm_to_be_scheduled(time_t *min_due_time) interval = difftime(due_time, current_time); - if (interval <= 0) /*2008.08.06 when the alarm expires, it may makes an error.*/ { + if (interval < 0) /*2008.08.06 when the alarm expires, it may makes an error.*/ { ALARM_MGR_EXCEPTION_PRINT("The duetime of alarm(%d) is OVER.", entry->alarm_id); continue; } diff --git a/alarm-manager-timer.c b/alarm-manager-timer.c index 01f4fe1..e2153dc 100755 --- a/alarm-manager-timer.c +++ b/alarm-manager-timer.c @@ -108,26 +108,3 @@ bool _alarm_set_timer(__alarm_server_context_t *alarm_context, int timer, time_t alarm_context->c_due_time = due_time; return true; } - -int _set_sys_time(time_t _time) -{ - struct tm result; - /* Ignore return value of gmtime_r(). */ - (void) gmtime_r(&_time, &result); - - stime(&_time); - - return 1; -} - -int _set_time(time_t _time) -{ - ALARM_MGR_LOG_PRINT("ENTER FUNC _set_time(%d)", _time); - _set_rtc_time(_time); - //_set_sys_time(_time); - - /* inoti (broadcasting without data - * send system noti that time has changed */ - - return 0; -} diff --git a/alarm-manager.c b/alarm-manager.c index 51f1b3c..9589412 100755 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -54,11 +54,12 @@ #include #include #include +#include +#include +#include +#define SYSTEM_UID 200 #define SIG_TIMER 0x32 -#define WAKEUP_ALARM_APP_ID "org.tizen.alarm.ALARM" - /* alarm ui application's alarm's dbus_service name instead of 21 - (alarm application's app_id) value */ __alarm_server_context_t alarm_context; bool g_dummy_timer_is_set = FALSE; @@ -88,14 +89,17 @@ GSList *g_expired_alarm_list = NULL; #define ALARM_SET_RTC _IOW('a', 5, struct timespec) #define ALARM_CLEAR(type) _IO('a', 0 | ((type) << 4)) +#define MAX_ZONE_NAME_LEN 128 // For module log +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG #define ALARMMGR_LOG_BUFFER_SIZE 10000 #define ALARMMGR_LOG_BUFFER_STRING_SIZE 200 #define ALARMMGR_LOG_TAG_SIZE 20 #define ALARMMGR_LOG_MESSAGE_SIZE 120 -#define ALARMMGR_LOG_FILE_PATH "/var/log/alarmmgr.log" +// ALARMMGR_LOG_FILE_PATH is defined in CMakeLists.txt static int log_index = 0; static int log_fd = 0; +#endif // display lock and unlock #define DEVICED_BUS_NAME "org.tizen.system.deviced" @@ -123,13 +127,19 @@ static int gfd = 0; GDBusObjectManagerServer *alarmmgr_server = NULL; static AlarmManager* interface = NULL; +GSList *alarmmgr_db_list = NULL; +bool is_time_changed = false; // for calculating next duetime + +#define BILLION 1000000000 // for calculating nano seconds +static time_t periodic_alarm_standard_time = 0; + static bool __alarm_add_to_list(__alarm_info_t *__alarm_info); static void __alarm_generate_alarm_id(__alarm_info_t *__alarm_info, alarm_id_t *alarm_id); static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id, __alarm_info_t *__alarm_info, int *error_code); static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id, - int *error_code); + int *error_code, const char *zone); static bool __alarm_set_start_and_end_time(alarm_info_t *alarm_info, __alarm_info_t *__alarm_info); static bool __alarm_update_due_time_of_all_items_in_list(double diff_time); @@ -137,19 +147,21 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, int pid, periodic_method_e method, long requested_interval, int is_ref, char *app_service_name, char *app_service_name_mod, const char *dst_service_name, const char *dst_service_name_mod, - int *error_code); + int *error_code, const char *zone); static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - int pid, char *bundle_data, int *error_code); + long requested_interval, int pid, char *bundle_data, + int *error_code, const char *zone); -static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code); +static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code, const char *zone); static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int *error_code); + alarm_info_t *alarm_info, int *error_code, const char *zone); static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id); static void __alarm_expired(); static gboolean __alarm_handler_idle(gpointer user_data); static void __clean_registry(); static bool __alarm_manager_reset(); static void __on_system_time_external_changed(keynode_t *node, void *data); + static void __initialize_timer(); static void __initialize_alarm_list(); static void __initialize_scheduled_alarm_list(); @@ -160,24 +172,28 @@ static bool __initialize_db(); static void __initialize(); void on_bus_name_owner_changed(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, const gchar *interface_name, const gchar *signal_name, GVariant *parameters, gpointer user_data); -bool __get_caller_unique_name(int pid, char *unique_name); +bool __get_caller_unique_name(int pid, char *unique_name, const char *zone); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG static void __initialize_module_log(void); static bool __save_module_log(const char *tag, const char *messgae); +#endif int __display_lock_state(char *state, char *flag, unsigned int timeout); int __display_unlock_state(char *state, char *flag); +int __set_time(time_t _time); + static void __rtc_set() { #ifdef __WAKEUP_USING_RTC__ const char *rtc = default_rtc; - struct rtc_wkalrm rtc_wk; struct tm due_tm; struct timespec alarm_time; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; -#ifdef _SIMUL /*if build is simulator, we don't need to set - RTC because RTC does not work in simulator.*/ +#endif +#ifdef _SIMUL // RTC does not work in simulator. ALARM_MGR_EXCEPTION_PRINT("because it is simulator's mode, we don't set RTC."); return; #endif @@ -192,16 +208,15 @@ static void __rtc_set() /* Read the RTC time/date */ int retval = 0; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char *timebuf = ctime(&alarm_context.c_due_time); - if (timebuf == NULL) { - ALARM_MGR_EXCEPTION_PRINT("timebuf is NULL."); - return; + if (timebuf) { + timebuf[strlen(timebuf) - 1] = '\0'; // to avoid new line + snprintf(log_message, sizeof(log_message), "wakeup time: %d, %s", (int)alarm_context.c_due_time, timebuf); } +#endif - timebuf[strlen(timebuf) - 1] = '\0'; // to avoid new line - sprintf(log_message, "wakeup time: %d, %s", alarm_context.c_due_time, timebuf); - - ALARM_MGR_LOG_PRINT("alarm_context.c_due_time is %d.", alarm_context.c_due_time); + ALARM_MGR_LOG_PRINT("alarm_context.c_due_time is %d.", (int)alarm_context.c_due_time); if (alarm_context.c_due_time != -1) { retval = ioctl(gfd, ALARM_CLEAR(ALARM_RTC_WAKEUP)); @@ -229,11 +244,15 @@ static void __rtc_set() ALARM_MGR_EXCEPTION_PRINT("Alarm IRQs is not supported."); } ALARM_MGR_EXCEPTION_PRINT("RTC ALARM_SET ioctl is failed. errno = %s", strerror(errno)); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG __save_module_log("FAIL: SET RTC", log_message); +#endif return; } ALARM_MGR_EXCEPTION_PRINT("[alarm-server]RTC ALARM_SET ioctl is successfully done."); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG __save_module_log("SET RTC", log_message); +#endif } else { ALARM_MGR_EXCEPTION_PRINT("[alarm-server]alarm_context.c_due_time is" @@ -243,19 +262,21 @@ static void __rtc_set() return; } -int _set_rtc_time(time_t _time) +int __set_time(time_t _time) { + // Using /dev/alarm, this function changes both OS time and RTC. int ret = 0; const char *rtc0 = default_rtc; struct timespec rtc_time; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif if (gfd == 0) { gfd = open(rtc0, O_RDWR); - if (gfd == -1) { - ALARM_MGR_LOG_PRINT("error to open /dev/alarm."); + ALARM_MGR_EXCEPTION_PRINT("Opening the /dev/alarm is failed."); perror("\t"); } } @@ -263,26 +284,300 @@ int _set_rtc_time(time_t _time) rtc_time.tv_sec = _time; rtc_time.tv_nsec = 0; - strncpy(log_tag, "SET RTC", strlen("SET RTC")); - char *timebuf = ctime(&_time); - if (timebuf) { - timebuf[strlen(timebuf) - 1] = '\0'; // to avoid new line - sprintf(log_message, "rtc time = %d, %s", _time, timebuf); - } - ret = ioctl(gfd, ALARM_SET_RTC, &rtc_time); if (ret == -1) { - ALARM_MGR_LOG_PRINT("ALARM_SET_RTC ioctl is failed. errno = %s", strerror(errno)); + ALARM_MGR_EXCEPTION_PRINT("ALARM_SET_RTC ioctl is failed. errno = %s", strerror(errno)); + #ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: SET RTC", strlen("FAIL: SET RTC")); - + #endif perror("\t"); } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + else { + strncpy(log_tag, "SET RTC", strlen("SET RTC")); + } + + char *timebuf = ctime(&_time); + if (timebuf) { + timebuf[strlen(timebuf) - 1] = '\0'; // to avoid new line + snprintf(log_message, sizeof(log_message), "RTC & OS =%d, %s", (int)_time, timebuf); + } __save_module_log(log_tag, log_message); +#endif return 1; } + +#define ZONE_PREFIX_PATH "/var/lib/lxc" +#define ZONE_INFIX_PATH "/rootfs" + +static inline int __read_proc(const char *path, char *buf, int size) +{ + int fd = 0; + int ret = 0; + + if (buf == NULL || path == NULL) + return -1; + + fd = open(path, O_RDONLY); + if (fd < 0) + return -1; + + ret = read(fd, buf, size - 1); + if (ret <= 0) { + close(fd); + return -1; + } else + buf[ret] = 0; + + close(fd); + + return ret; +} + +static char *__proc_get_cmdline_bypid(int pid) +{ + char buf[1024] = {'\0', }; + int ret = 0; + + snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); + ret = __read_proc(buf, buf, sizeof(buf)); + if (ret <= 0) + return NULL; + + /* support app launched by shell script*/ + if (strncmp(buf, "/bin/sh", 7) == 0) + return strdup(&buf[7 + 1]); + else + return strdup(buf); +} + +int __get_appid_func(const pkgmgrinfo_appinfo_h handle, void *user_data) +{ + int ret = -1; + char *appid; + char **return_appid = (char **)user_data; + ret = pkgmgrinfo_appinfo_get_appid(handle, &appid); + ALARM_MGR_LOG_PRINT("appid %s.", appid); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("Failed to get appid\n"); + } else { + *return_appid = strdup(appid); + ret = 0; + } + + return ret; +} + +static int __zone_get_appid_bypid(int pid, const char *zone, char **appid) +{ + int ret = -1; + char cmdline[PATH_MAX]; + char *appid_tmp = NULL; + int i = 0; + + ret = aul_app_get_cmdline_bypid(pid, cmdline, PATH_MAX); + if (ret != 0) { + ALARM_MGR_EXCEPTION_PRINT("get_cmdline_bypid is failed\n"); + return -1; + } + + ALARM_MGR_LOG_PRINT("cmdline(%s)", cmdline); + + if (strncmp(zone, "/", 1) == 0) { + pkgmgrinfo_pkginfo_set_zone(NULL, NULL, 0); + } else { + pkgmgrinfo_pkginfo_set_zone(zone, NULL, 0); + } + + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("appinfo filter handle create failed\n"); + return -1; + } + + ret = pkgmgrinfo_appinfo_filter_add_string(handle, + PMINFO_APPINFO_PROP_APP_EXEC, cmdline); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_add_string() failed: exec(%s)", cmdline); + goto catch; + } + + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, __get_appid_func, &appid_tmp); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_foreach_appinfo() failed\n"); + goto catch; + } + + if (appid_tmp) { + ALARM_MGR_LOG_PRINT("appid_tmp(%s)", appid_tmp); + ret = 0; + } else + ret = -1; + + *appid = appid_tmp; + +catch: + pkgmgrinfo_appinfo_filter_destroy(handle); + + return ret; +} + +int __get_pkgid_func(const pkgmgrinfo_appinfo_h handle, void *user_data) +{ + int ret = -1; + char *pkgid; + char **return_pkgid = (char **)user_data; + ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid); + ALARM_MGR_LOG_PRINT("pkgid %s.", pkgid); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("Failed to get pkgid\n"); + } else { + *return_pkgid = strdup(pkgid); + ret = 0; + } + + return ret; +} + +static int __zone_get_pkgid_bypid(int pid, const char *zone, char **pkgid) +{ + int ret = -1; + char cmdline[PATH_MAX]; + char *pkgid_tmp = NULL; + int i = 0; + + ret = aul_app_get_cmdline_bypid(pid, cmdline, PATH_MAX); + if (ret != 0) { + ALARM_MGR_EXCEPTION_PRINT("get_cmdline_bypid is failed\n"); + return -1; + } + + ALARM_MGR_LOG_PRINT("cmdline(%s)", cmdline); + + if (strncmp(zone, "/", 1) == 0) { + pkgmgrinfo_pkginfo_set_zone(NULL, NULL, 0); + } else { + pkgmgrinfo_pkginfo_set_zone(zone, NULL, 0); + } + + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("appinfo filter handle create failed\n"); + return -1; + } + + ret = pkgmgrinfo_appinfo_filter_add_string(handle, + PMINFO_APPINFO_PROP_APP_EXEC, cmdline); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_add_string() failed: exec(%s)", cmdline); + goto catch; + } + + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, __get_pkgid_func, &pkgid_tmp); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_foreach_appinfo() failed\n"); + goto catch; + } + + if (pkgid_tmp) { + ALARM_MGR_LOG_PRINT("pkgid_tmp(%s)", pkgid_tmp); + ret = 0; + } else + ret = -1; + + *pkgid = pkgid_tmp; + +catch: + pkgmgrinfo_appinfo_filter_destroy(handle); + + return ret; +} + +static int __zone_get_pkgid_byappid(const char *appid, const char *zone, char **pkgid) +{ + int ret = -1; + char *pkgid_tmp = NULL; + int i; + + if (strncmp(zone, "/", 1) == 0) { + pkgmgrinfo_pkginfo_set_zone(NULL, NULL, 0); + } else { + pkgmgrinfo_pkginfo_set_zone(zone, NULL, 0); + } + + pkgmgrinfo_appinfo_filter_h handle; + ret = pkgmgrinfo_appinfo_filter_create(&handle); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("appinfo filter handle create failed\n"); + return -1; + } + + ret = pkgmgrinfo_appinfo_filter_add_string(handle, + PMINFO_APPINFO_PROP_APP_ID, appid); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_add_string() failed : appid(%s)", appid); + goto catch; + } + + ret = pkgmgrinfo_appinfo_filter_foreach_appinfo(handle, __get_pkgid_func, &pkgid_tmp); + if (ret < 0) { + ALARM_MGR_EXCEPTION_PRINT("pkgmgrinfo_appinfo_filter_foreach_appinfo() failed\n"); + goto catch; + } + + if (pkgid_tmp) { + ALARM_MGR_LOG_PRINT("pkgid_tmp(%s)", pkgid_tmp); + ret = 0; + } else + ret = -1; + + *pkgid = pkgid_tmp; +catch: + pkgmgrinfo_appinfo_filter_destroy(handle); + return ret; +} + +bool _get_zone_name(int pid, char *zone_name, int len) +{ + vsm_zone_h zone; + vsm_context_h ctx = vsm_create_context(); + const char *zone_name_tmp = NULL; + bool ret = true; + if (ctx == NULL) { + ALARM_MGR_EXCEPTION_PRINT("vsm_create_context failed"); + return false; + } + zone = vsm_lookup_zone_by_pid(ctx, pid); + + if (zone != NULL && !vsm_is_host_zone(zone)) { + zone_name_tmp = vsm_get_zone_name(zone); + if (zone_name_tmp == NULL) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone"); + ret = false; + goto err; + } + } else if (vsm_is_host_zone(zone)) { + zone_name_tmp = "/"; + } else { + ALARM_MGR_EXCEPTION_PRINT("could not get zone name"); + ret = false; + goto err; + } + + snprintf(zone_name, len, "%s", zone_name_tmp); + ALARM_MGR_EXCEPTION_PRINT("zone name [%s]", zone_name); +err: + if (vsm_cleanup_context(ctx) != 0) + ALARM_MGR_EXCEPTION_PRINT("vsm cleanup failed"); + return ret; +} + + bool __alarm_clean_list() { g_slist_free_full(alarm_context.alarms, g_free); @@ -355,6 +650,10 @@ static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id, for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = iter->data; + + if (strcmp(g_quark_to_string(entry->zone), g_quark_to_string(__alarm_info->zone)) != 0) + continue; + if (entry->alarm_id == alarm_id) { found = true; @@ -384,27 +683,33 @@ static bool __alarm_update_in_list(int pid, alarm_id_t alarm_id, } static bool __alarm_remove_from_list(int pid, alarm_id_t alarm_id, - int *error_code) + int *error_code, const char *zone) { bool found = false; - alarm_info_t *alarm_info = NULL; - GSList *iter = NULL; __alarm_info_t *entry = NULL; /*list alarms */ ALARM_MGR_LOG_PRINT("[alarm-server]: before del : alarm id(%d)", alarm_id); + if (zone == NULL) { + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: zone is NULL"); + return false; + } for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = iter->data; + + if (zone && strcmp(g_quark_to_string(entry->zone), zone) != 0) + continue; + if (entry->alarm_id == alarm_id) { alarm_info = &entry->alarm_info; - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Remove alarm id(%d)", entry->alarm_id); + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]:Remove alarm id(%d) zone(%s)", entry->alarm_id, zone); if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { - _delete_alarms(alarm_id); + _delete_alarms(alarm_id, zone); } alarm_context.alarms = g_slist_remove(alarm_context.alarms, iter->data); @@ -522,6 +827,44 @@ static bool alarm_get_tz_info(int *gmt_idx, int *dst) } */ +gboolean __update_relative_alarms(gpointer user_data) +{ + GSList *iter = NULL; + GSList *iter_db = NULL; + __alarm_info_t *entry = NULL; + char *error_message = NULL; + int ret = SQLITE_OK; + sqlite3 *alarmmgr_db = NULL; + + for (iter_db = alarmmgr_db_list; iter_db != NULL; iter_db = g_slist_next(iter_db)) { + alarmmgr_db = ((_zone_alarm_db_list_t *)iter_db->data)->alarmmgr_db; + ret = sqlite3_exec(alarmmgr_db, "BEGIN EXCLUSIVE", NULL, NULL, &error_message); + if (ret != SQLITE_OK) { + SECURE_LOGE("sqlite3_exec() is failed. ret = %d, error message = %s", ret, error_message); + return false; + } + } + + for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { + entry = iter->data; + alarm_info_t *alarm_info = &(entry->alarm_info); + if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) { + _update_alarms(entry); + } + } + + for (iter_db = alarmmgr_db_list; iter_db != NULL; iter_db = g_slist_next(iter_db)) { + alarmmgr_db = ((_zone_alarm_db_list_t *)iter_db->data)->alarmmgr_db; + ret = sqlite3_exec(alarmmgr_db, "COMMIT", NULL, NULL, &error_message); + if (ret != SQLITE_OK) { + SECURE_LOGE("sqlite3_exec() is failed. ret = %d, error message = %s", ret, error_message); + return false; + } + } + + return false; +} + static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) { time_t current_time; @@ -532,22 +875,18 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) struct tm *p_time = NULL ; struct tm due_time_result ; struct tm fixed_time = { 0, }; + is_time_changed = true; - for (iter = alarm_context.alarms; iter != NULL; - iter = g_slist_next(iter)) { + tzset(); + for (iter = alarm_context.alarms; iter != NULL; iter = g_slist_next(iter)) { entry = iter->data; alarm_info_t *alarm_info = &(entry->alarm_info); if (alarm_info->alarm_type & ALARM_TYPE_RELATIVE) { - /*diff_time ó\B8\AE */ - entry->due_time += diff_time; - alarm_date_t *start = &alarm_info->start; /**< start - time of the alarm */ - alarm_date_t *end = &alarm_info->end;; - /**< end time of the alarm */ + alarm_date_t *start = &alarm_info->start; /**< start time of the alarm */ + alarm_date_t *end = &alarm_info->end; /**< end time of the alarm */ - tzset(); p_time = localtime_r(&entry->due_time, &due_time_result); if (p_time != NULL) { start->year = p_time->tm_year + 1900; @@ -561,7 +900,6 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) end->month = p_time->tm_mon + 1; end->day = p_time->tm_mday; - memset(&fixed_time, 0, sizeof(fixed_time)); fixed_time.tm_year = p_time->tm_year; fixed_time.tm_mon = p_time->tm_mon; @@ -577,15 +915,8 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) fixed_time.tm_sec = 59; entry->end = mktime(&fixed_time); - - ALARM_MGR_LOG_PRINT("alarm_info->alarm_type is " - "ALARM_TYPE_RELATIVE\n"); - - _update_alarms(entry); } - _alarm_next_duetime(entry); - ALARM_MGR_LOG_PRINT("entry->due_time is %d\n", entry->due_time); } time(¤t_time); @@ -596,15 +927,14 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) double interval = 0; - ALARM_MGR_LOG_PRINT("alarm[%d] with duetime(%u) at " - "current(%u)\n", entry->alarm_id, due_time, current_time); + ALARM_MGR_LOG_PRINT("alarm[%d] with duetime(%u) at current(%u)", entry->alarm_id, due_time, current_time); if (due_time == 0) { /* 0 means this alarm has been disabled */ continue; } interval = difftime(due_time, current_time); - if (interval <= 0) { + if (interval < 0) { ALARM_MGR_EXCEPTION_PRINT("The duetime of alarm(%d) is OVER.", entry->alarm_id); continue; } @@ -614,16 +944,18 @@ static bool __alarm_update_due_time_of_all_items_in_list(double diff_time) if ((interval < 0) || min_time == -1) { min_time = due_time; } - } + is_time_changed = false; alarm_context.c_due_time = min_time; + g_idle_add(__update_relative_alarms, NULL); return true; } static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id, - int pid, char *bundle_data, int *error_code) + long requested_interval, int pid, char *bundle_data, + int *error_code, const char *zone) { time_t current_time; time_t due_time; @@ -632,7 +964,7 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id char app_name[512] = { 0 }; bundle *b; char caller_appid[256] = { 0 }; - char* callee_appid = NULL; + const char* callee_appid = NULL; char* caller_pkgid = NULL; char* callee_pkgid = NULL; pkgmgrinfo_pkginfo_h caller_handle; @@ -651,8 +983,12 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id __alarm_info->pid = pid; __alarm_info->alarm_id = -1; + __alarm_info->requested_interval = requested_interval; + if (alarm_info->alarm_type & ALARM_TYPE_PERIOD) + __alarm_info->method = QUANTUMIZE; - if (!__get_caller_unique_name(pid, app_name)) { + if (!__get_caller_unique_name(pid, app_name, zone)) { + ALARM_MGR_EXCEPTION_PRINT("get_caller_unique_name failed with pid[%d]\n", pid); *error_code = ERR_ALARM_SYSTEM_FAIL; free(__alarm_info); return false; @@ -663,14 +999,30 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id // caller __alarm_info->quark_caller_pkgid = g_quark_from_string("null"); - if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) { - if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) { - if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) { - if (caller_pkgid) { - __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + if (zone == NULL) { + ALARM_MGR_EXCEPTION_PRINT("zone is null"); + *error_code = ERR_ALARM_SYSTEM_FAIL; + free(__alarm_info); + return false; + } + + __alarm_info->zone = g_quark_from_string(zone); + if (strcmp(zone, "/") != 0) { + if (__zone_get_pkgid_bypid(pid, zone, &caller_pkgid) == 0) { + __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + free(caller_pkgid); + } + } else { + /*request from host, such as pushd*/ + if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) { + if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) { + if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) { + if (caller_pkgid) { + __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + } } + pkgmgrinfo_appinfo_destroy_appinfo(caller_handle); } - pkgmgrinfo_appinfo_destroy_appinfo(caller_handle); } } @@ -679,13 +1031,24 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id b = bundle_decode((bundle_raw *)bundle_data, strlen(bundle_data)); callee_appid = appsvc_get_appid(b); - if (pkgmgrinfo_appinfo_get_appinfo(callee_appid, &callee_handle) == PMINFO_R_OK) { - if (pkgmgrinfo_appinfo_get_pkgid(callee_handle, &callee_pkgid) == PMINFO_R_OK) { - if (callee_pkgid) { - __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid); + + if (strcmp(zone, "/") != 0) { + if (!__zone_get_pkgid_byappid(callee_appid, zone, &callee_pkgid)) { + __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid); + free(callee_pkgid); + } + + } + else { + /*it is now happened in host side. */ + if (pkgmgrinfo_appinfo_get_appinfo(callee_appid, &callee_handle) == PMINFO_R_OK) { + if (pkgmgrinfo_appinfo_get_pkgid(callee_handle, &callee_pkgid) == PMINFO_R_OK) { + if (callee_pkgid) { + __alarm_info->quark_callee_pkgid = g_quark_from_string(callee_pkgid); + } } + pkgmgrinfo_appinfo_destroy_appinfo(callee_handle); } - pkgmgrinfo_appinfo_destroy_appinfo(callee_handle); } SECURE_LOGD("caller_pkgid = %s, callee_pkgid = %s", @@ -763,7 +1126,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, int pid, periodic_method_e method, long requested_interval, int is_ref, char *app_service_name, char *app_service_name_mod, const char *dst_service_name, const char *dst_service_name_mod, - int *error_code) + int *error_code, const char *zone) { time_t current_time; time_t due_time; @@ -789,21 +1152,30 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, __alarm_info->is_ref = is_ref; // Get caller_appid to get caller's package id. There is no callee. - if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) { - if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) { - if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) { - if (caller_pkgid) { - __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + + __alarm_info->zone = g_quark_from_string(zone); + if (strcmp(zone, "/") != 0) { + if (__zone_get_pkgid_bypid(pid, zone, &caller_pkgid) == 0) { + __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + free(caller_pkgid); + } + } else { + /*request from host, such as pushd*/ + if (aul_app_get_appid_bypid(pid, caller_appid, 256) == AUL_R_OK) { + if (pkgmgrinfo_appinfo_get_appinfo(caller_appid, &caller_handle) == PMINFO_R_OK) { + if (pkgmgrinfo_appinfo_get_pkgid(caller_handle, &caller_pkgid) == PMINFO_R_OK) { + if (caller_pkgid) { + __alarm_info->quark_caller_pkgid = g_quark_from_string(caller_pkgid); + } } + pkgmgrinfo_appinfo_destroy_appinfo(caller_handle); } - pkgmgrinfo_appinfo_destroy_appinfo(caller_handle); } } __alarm_info->quark_callee_pkgid = g_quark_from_string("null"); SECURE_LOGD("caller_pkgid = %s, callee_pkgid = null", g_quark_to_string(__alarm_info->quark_caller_pkgid)); - - if (!__get_caller_unique_name(pid, app_name)) { + if (!__get_caller_unique_name(pid, app_name, zone)) { *error_code = ERR_ALARM_SYSTEM_FAIL; free(__alarm_info); return false; @@ -815,7 +1187,6 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, __alarm_info->quark_dst_service_name = g_quark_from_string(dst_service_name); __alarm_info->quark_dst_service_name_mod = g_quark_from_string(dst_service_name_mod); __alarm_info->quark_bundle = g_quark_from_string("null"); - __alarm_set_start_and_end_time(alarm_info, __alarm_info); memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t)); __alarm_generate_alarm_id(__alarm_info, alarm_id); @@ -877,7 +1248,7 @@ static bool __alarm_create(alarm_info_t *alarm_info, alarm_id_t *alarm_id, } static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id, - alarm_info_t *alarm_info, int *error_code) + alarm_info_t *alarm_info, int *error_code, const char *zone) { time_t current_time; time_t due_time; @@ -910,6 +1281,7 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id, "(%d) is less than current time(%d)", alarm_context.c_due_time, current_time); alarm_context.c_due_time = -1; } + __alarm_info->zone = g_quark_from_string(zone); due_time = _alarm_next_duetime(__alarm_info); if (!__alarm_update_in_list(pid, alarm_id, __alarm_info, error_code)) { @@ -919,7 +1291,7 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id, return false; } - result = _remove_from_scheduled_alarm_list(pid, alarm_id); + result = _remove_from_scheduled_alarm_list(pid, alarm_id, zone); if (result == true && g_slist_length(g_scheduled_alarm_list) == 0) { /*there is no scheduled alarm */ @@ -983,14 +1355,14 @@ static bool __alarm_update(int pid, char *app_service_name, alarm_id_t alarm_id, return true; } -static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code) +static bool __alarm_delete(int pid, alarm_id_t alarm_id, int *error_code, const char *zone) { bool result = false; SECURE_LOGD("[alarm-server]:delete alarm: alarm(%d) pid(%d)\n", alarm_id, pid); - result = _remove_from_scheduled_alarm_list(pid, alarm_id); + result = _remove_from_scheduled_alarm_list(pid, alarm_id, zone); - if (!__alarm_remove_from_list(pid, alarm_id, error_code)) { + if (!__alarm_remove_from_list(pid, alarm_id, error_code, zone)) { SECURE_LOGE("[alarm-server]:delete alarm: " "alarm(%d) pid(%d) has failed with error_code(%d)\n", @@ -1023,7 +1395,7 @@ static bool __can_skip_expired_cb(alarm_id_t alarm_id) int dur = entry->requested_interval; int from, to; - if (!(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF) + if (dur == 0 || !(alarm->alarm_type & ALARM_TYPE_PERIOD) || entry->method == CUT_OFF) return false; ts_tm.tm_hour = alarm->start.hour; @@ -1103,6 +1475,34 @@ static int __get_caller_pid(const char *name) return pid; } +static int __is_ui_app(const char *appid) +{ + if (appid == NULL) + return 0; + + int ret = 0; + pkgmgrinfo_appinfo_h appinfo_h = NULL; + + ret = pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_h); + + if (ret < 0 ) { + return 0; + } + + char *component = NULL; + int found = 0; + + ret = pkgmgrinfo_appinfo_get_component_type(appinfo_h, &component); + if (ret == 0 && component != NULL && strncmp(component, "uiapp", 5) == 0) { + found = 1; + } + + if (appinfo_h) + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + + return found; +} + static void __alarm_expired() { const char *destination_app_service_name = NULL; @@ -1113,7 +1513,9 @@ static void __alarm_expired() int b_len = 0; bundle *b = NULL; char *appid = NULL; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif GError *error = NULL; GVariant *result = NULL; gboolean name_has_owner_reply = false; @@ -1126,7 +1528,7 @@ static void __alarm_expired() time(¤t_time); interval = difftime(alarm_context.c_due_time, current_time); - ALARM_MGR_LOG_PRINT("[alarm-server]: c_due_time(%d), current_time(%d), interval(%d)", + ALARM_MGR_LOG_PRINT("[alarm-server]: c_due_time(%d), current_time(%d), interval(%f)", alarm_context.c_due_time, current_time, interval); if (alarm_context.c_due_time > current_time + 1) { @@ -1136,7 +1538,7 @@ static void __alarm_expired() } // 10 seconds is maximum permitted delay from timer expire to this function if (alarm_context.c_due_time + 10 < current_time) { - ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds past\n", + ALARM_MGR_EXCEPTION_PRINT("[alarm-server]: False Alarm. due time is (%d) seconds past.", current_time - alarm_context.c_due_time); goto done; } @@ -1145,58 +1547,99 @@ static void __alarm_expired() __scheduled_alarm_t *alarm = NULL; for (iter = g_scheduled_alarm_list; iter != NULL; iter = g_slist_next(iter)) { - const gchar *quark_bundle = NULL; alarm = iter->data; alarm_id = alarm->alarm_id; - __alarm_info = alarm->__alarm_info; - app_pid = __alarm_info->pid; - quark_bundle = g_quark_to_string(__alarm_info->quark_bundle); - if (quark_bundle && strncmp(quark_bundle, "null", 4) != 0) { - b_len = strlen(quark_bundle); + char *old_zone; + const char *zone = g_quark_to_string(__alarm_info->zone); + ALARM_MGR_EXCEPTION_PRINT("zone %s\n", zone); - b = bundle_decode((bundle_raw *)quark_bundle, b_len); + if (zone && strncmp(zone, "/", 1) == 0) { + aul_set_zone(NULL, &old_zone); + pkgmgrinfo_pkginfo_set_zone(NULL, NULL, 0); + } + else { + aul_set_zone(zone, &old_zone); + pkgmgrinfo_pkginfo_set_zone(zone, NULL, 0); + } - if (b == NULL) - { - ALARM_MGR_EXCEPTION_PRINT("Error!!!..Unable to decode the bundle!!\n"); + // Case #1. The process is an application launched by app_control. + // It registered an alarm using launch-based APIs like alarm_schedule_xxx, alarmmgr_xxx_appsvc. + if (g_quark_to_string(__alarm_info->quark_bundle) != NULL && strncmp(g_quark_to_string(__alarm_info->quark_bundle), "null", 4) != 0) { + b_len = strlen(g_quark_to_string(__alarm_info->quark_bundle)); + + b = bundle_decode((bundle_raw *)g_quark_to_string(__alarm_info->quark_bundle), b_len); + + if (b == NULL) + { + ALARM_MGR_EXCEPTION_PRINT("Error!!!..Unable to decode the bundle!!\n"); + } + else + { + snprintf(alarm_id_val,31,"%d",alarm_id); + + if (bundle_add_str(b,"http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)){ + ALARM_MGR_EXCEPTION_PRINT("Unable to add alarm id to the bundle\n"); } else { - snprintf(alarm_id_val,31,"%d",alarm_id); - - if (bundle_add_str(b,"http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)){ - ALARM_MGR_EXCEPTION_PRINT("Unable to add alarm id to the bundle\n"); + // Checking api version + int ret; + int result = 0; + pkgmgrinfo_pkginfo_h pkginfo = NULL; + const char *api_version = "2.4"; + const char *pkgid = g_quark_to_string(__alarm_info->quark_caller_pkgid); + + if (pkgid != NULL) { + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkginfo); + if (ret != PMINFO_R_OK) { + ALARM_MGR_EXCEPTION_PRINT("Failed to get pkginfo\n"); + } + else { + ret = pkgmgrinfo_pkginfo_check_api_version(pkginfo, api_version, &result); + if (ret != PMINFO_R_OK) { + ALARM_MGR_EXCEPTION_PRINT("Failed to check api version\n"); + } + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); + } } - else - { + + if (result < 0) { /* before 2.4 */ + if ( appsvc_run_service(b, 0, NULL, NULL) < 0) { + ALARM_MGR_EXCEPTION_PRINT("Unable to run app svc\n"); + } + else { + ALARM_MGR_LOG_PRINT("Successfuly ran app svc\n"); + } + } else { /* since 2.4 */ appid = (char *)appsvc_get_appid(b); - if( (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) - { + if( (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_NOLAUNCH) && !aul_app_is_running(appid)) { ALARM_MGR_EXCEPTION_PRINT("This alarm is ignored\n"); - } - else - { - if ( appsvc_run_service(b, 0, NULL, NULL) < 0) - { - ALARM_MGR_EXCEPTION_PRINT("Unable to run app svc\n"); + } else if ( !(__alarm_info->alarm_info.alarm_type & ALARM_TYPE_INEXACT) || + !__can_skip_expired_cb(__alarm_info->alarm_id) ) { + if (appsvc_run_service(b, 0, NULL, NULL ) < 0) { + ALARM_MGR_EXCEPTION_PRINT("Unable to launch app [%s] \n", appid); } - else - { + else { ALARM_MGR_LOG_PRINT("Successfuly ran app svc\n"); + if (__is_ui_app(appid)) { + device_display_change_state(DISPLAY_STATE_NORMAL); + } } } } - bundle_free(b); } - + bundle_free(b); + } } else { - const gchar *dst_service_name = g_quark_to_string(__alarm_info->quark_dst_service_name); - if (dst_service_name && strncmp(dst_service_name, "null", 4) == 0) { + char appid[MAX_SERVICE_NAME_LEN] = { 0, }; + pkgmgrinfo_appinfo_h appinfo_handle = NULL; + + if (g_quark_to_string(__alarm_info->quark_bundle) != NULL && strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null", 4) == 0) { SECURE_LOGD("[alarm-server]:destination is null, so we send expired alarm to %s(%u).", g_quark_to_string(__alarm_info->quark_app_service_name), __alarm_info->quark_app_service_name); destination_app_service_name = g_quark_to_string(__alarm_info->quark_app_service_name_mod); @@ -1227,19 +1670,33 @@ static void __alarm_expired() NULL, &error); if (result == NULL) { - ALARM_MGR_EXCEPTION_PRINT("g_dbus_connection_call_sync() is failed. err: %s", error->message); - g_error_free(error); + ALARM_MGR_EXCEPTION_PRINT("g_dbus_connection_call_sync() is failed"); + if (error) { + ALARM_MGR_EXCEPTION_PRINT("dbus error message: %s", error->message); + g_error_free(error); + } } else { g_variant_get (result, "(b)", &name_has_owner_reply); } - if (name_has_owner_reply == false) { + if (g_quark_to_string(__alarm_info->quark_dst_service_name) != NULL && strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null",4) == 0) + if (g_quark_to_string(__alarm_info->quark_app_service_name) != NULL && strlen(g_quark_to_string(__alarm_info->quark_app_service_name)) > 6) + strncpy(appid, g_quark_to_string(__alarm_info->quark_app_service_name) + 6, strlen(g_quark_to_string(__alarm_info->quark_app_service_name)) - 6); + else + if (g_quark_to_string(__alarm_info->quark_dst_service_name) != NULL && strlen(g_quark_to_string(__alarm_info->quark_dst_service_name)) > 6) + strncpy(appid, g_quark_to_string(__alarm_info->quark_dst_service_name) + 6, strlen(g_quark_to_string(__alarm_info->quark_dst_service_name)) - 6); + + pkgmgrinfo_appinfo_get_appinfo(appid, &appinfo_handle); + ALARM_MGR_LOG_PRINT("appid : %s (%x)", appid, appinfo_handle); + + // Case #2. The process was killed && App type + // This app is launched and owner of DBus connection is changed. and then, expiration noti is sent by DBus. + if (name_has_owner_reply == false && appinfo_handle) { __expired_alarm_t *expire_info; - char appid[MAX_SERVICE_NAME_LEN] = { 0, }; char alarm_id_str[32] = { 0, }; if (__alarm_info->alarm_info.alarm_type & ALARM_TYPE_WITHCB) { - __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL); + __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL, zone); goto done; } @@ -1253,13 +1710,6 @@ static void __alarm_expired() expire_info->alarm_id = alarm_id; g_expired_alarm_list = g_slist_append(g_expired_alarm_list, expire_info); - if (strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null",4) == 0) { - strncpy(appid,g_quark_to_string(__alarm_info->quark_app_service_name)+6,strlen(g_quark_to_string(__alarm_info->quark_app_service_name))-6); - } - else { - strncpy(appid,g_quark_to_string(__alarm_info->quark_dst_service_name)+6,strlen(g_quark_to_string(__alarm_info->quark_dst_service_name))-6); - } - snprintf(alarm_id_str, 31, "%d", alarm_id); SECURE_LOGD("before aul_launch appid(%s) alarm_id_str(%s)", appid, alarm_id_str); @@ -1267,27 +1717,30 @@ static void __alarm_expired() bundle *kb; kb = bundle_create(); bundle_add_str(kb, "__ALARM_MGR_ID", alarm_id_str); - aul_launch_app(appid, kb); + aul_launch_app(appid, kb); // on_bus_name_owner_changed will be called. bundle_free(kb); } else { + // Case #3. The process is alive or was killed && non-app type(daemon) + // Expiration noti is sent by DBus. it makes the process alive. (dbus auto activation) ALARM_MGR_LOG_PRINT("before alarm_send_noti_to_application"); ALARM_MGR_LOG_PRINT("WAKEUP pid: %d", __alarm_info->pid); aul_update_freezer_status(__alarm_info->pid, "wakeup"); - __alarm_send_noti_to_application(destination_app_service_name, alarm_id); + __alarm_send_noti_to_application(destination_app_service_name, alarm_id); // dbus auto activation ALARM_MGR_LOG_PRINT("after __alarm_send_noti_to_application"); } } - ALARM_MGR_EXCEPTION_PRINT("alarm_id[%d] is expired.", alarm_id); + ALARM_MGR_LOG_PRINT("alarm_id[%d] is expired.", alarm_id); - sprintf(log_message, "alarmID: %d, pid: %d, unique_name: %s, duetime: %d", - alarm_id, app_pid, g_quark_to_string(__alarm_info->quark_app_unique_name), __alarm_info->due_time); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, duetime: %d", alarm_id, app_pid, (int)__alarm_info->due_time); __save_module_log("EXPIRED", log_message); memset(log_message, '\0', sizeof(log_message)); +#endif if (__alarm_info->alarm_info.mode.repeat == ALARM_REPEAT_MODE_ONCE) { - __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL); + __alarm_remove_from_list(__alarm_info->pid, alarm_id, NULL, zone); } else { _alarm_next_duetime(__alarm_info); } @@ -1304,10 +1757,13 @@ static gboolean __alarm_handler_idle(gpointer user_data) { GPollFD *gpollfd = (GPollFD *) user_data; uint64_t exp; + time_t current_time; + if (gpollfd == NULL) { ALARM_MGR_EXCEPTION_PRINT("gpollfd is NULL"); return false; } + if (read(gpollfd->fd, &exp, sizeof(uint64_t)) < 0) { ALARM_MGR_EXCEPTION_PRINT("Reading the fd is failed."); return false; @@ -1328,6 +1784,15 @@ static gboolean __alarm_handler_idle(gpointer user_data) _alarm_schedule(); + // Previous alarm can be expired late as tolerance of RTC. + // In this case, Expire alarms forcibly if real duetime is same to current time. + time(¤t_time); + if (alarm_context.c_due_time == current_time) { + ALARM_MGR_LOG_PRINT("Expire alarms forcibly when duetime is same to current time(%d).", current_time) + __alarm_expired(); + _alarm_schedule(); + } + __rtc_set(); ALARM_MGR_EXCEPTION_PRINT("Unlock the display from LCD OFF"); @@ -1378,39 +1843,20 @@ static void __on_system_time_external_changed(keynode_t *node, void *data) ALARM_MGR_EXCEPTION_PRINT("diff_time is %f, New time is %s\n", diff_time, ctime(&cur_time)); ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed externally\n"); - ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n", - alarm_context.c_due_time); + ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d", alarm_context.c_due_time); - // set rtc time only because the linux time is set externally - _set_rtc_time(cur_time); + __set_time(cur_time); vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time); + bundle *b = NULL; + b = bundle_create(); + bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE); + eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b); + bundle_free(b); __alarm_update_due_time_of_all_items_in_list(diff_time); - ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n", - alarm_context.c_due_time); - _clear_scheduled_alarm_list(); - _alarm_schedule(); - __rtc_set(); - - return; -} - -static void __on_time_zone_changed(keynode_t *node, void *data) -{ - double diff_time = 0; - - _alarm_disable_timer(alarm_context); - - tzset(); - - ALARM_MGR_LOG_PRINT("[alarm-server] time zone has been changed\n"); - ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n", alarm_context.c_due_time); - - __alarm_update_due_time_of_all_items_in_list(diff_time); - - ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n", alarm_context.c_due_time); + ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d", alarm_context.c_due_time); _clear_scheduled_alarm_list(); _alarm_schedule(); __rtc_set(); @@ -1420,12 +1866,13 @@ static void __on_time_zone_changed(keynode_t *node, void *data) static int __on_app_uninstalled(int req_id, const char *pkg_type, const char *pkgid, const char *key, const char *val, - const void *pmsg, void *user_data) + const void *pmsg, void *user_data, const char *sender_zone) { GSList* gs_iter = NULL; __alarm_info_t* entry = NULL; alarm_info_t* alarm_info = NULL; bool is_deleted = false; + const char *zone = NULL; SECURE_LOGD("pkg_type(%s), pkgid(%s), key(%s), value(%s)", pkg_type, pkgid, key, val); @@ -1436,13 +1883,27 @@ static int __on_app_uninstalled(int req_id, const char *pkg_type, bool is_found = false; entry = gs_iter->data; - char* caller_pkgid = g_quark_to_string(entry->quark_caller_pkgid); - char* callee_pkgid = g_quark_to_string(entry->quark_callee_pkgid); + const char* caller_pkgid = g_quark_to_string(entry->quark_caller_pkgid); + const char* callee_pkgid = g_quark_to_string(entry->quark_callee_pkgid); + + zone = g_quark_to_string(entry->zone); + if (zone == NULL) { + gs_iter = g_slist_next(gs_iter); + continue; + } + + if (sender_zone == NULL && strcmp(zone, "/") != 0) { //sender_zone is host, zone is not host + gs_iter = g_slist_next(gs_iter); + continue; + } else if(sender_zone != NULL && strcmp(sender_zone, zone) != 0) { + gs_iter = g_slist_next(gs_iter); + continue; + } if ((caller_pkgid && strncmp(pkgid, caller_pkgid, strlen(pkgid)) == 0) || (callee_pkgid && strncmp(pkgid, callee_pkgid, strlen(pkgid)) == 0)) { - if (_remove_from_scheduled_alarm_list(pkgid, entry->alarm_id)) + if (_remove_from_scheduled_alarm_list(entry->pid, entry->alarm_id, zone)) { is_deleted = true; } @@ -1450,7 +1911,7 @@ static int __on_app_uninstalled(int req_id, const char *pkg_type, alarm_info = &entry->alarm_info; if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { - if(!_delete_alarms(entry->alarm_id)) + if(!_delete_alarms(entry->alarm_id, zone)) { SECURE_LOGE("_delete_alarms() is failed. pkgid[%s], alarm_id[%d]", pkgid, entry->alarm_id); } @@ -1487,32 +1948,25 @@ int __check_privilege_by_cookie(char *e_cookie, const char *label, const char *a char buf[128] = {0,}; FILE *fp = NULL; char title[128] = {0,}; - int uid = -1; + uid_t uid = -1; + + cookie = g_base64_decode(e_cookie, &size); + if (cookie == NULL) { + ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!"); + return ERR_ALARM_SYSTEM_FAIL; + } if (check_root) { - // Gets the userID from /proc/pid/status to check if the process is the root or not. - snprintf(buf, sizeof(buf), "/proc/%d/status", pid); - fp = fopen(buf, "r"); - if(fp) { - while (fgets(buf, sizeof(buf), fp) != NULL) { - if(strncmp(buf, "Uid:", 4) == 0) { - sscanf(buf, "%s %d", title, &uid); - break; - } - } - fclose(fp); + // Gets the userID from security api to check if the process is the root or not. + retval = security_server_get_uid_by_cookie((const char *)cookie, &uid); + if (retval != SECURITY_SERVER_API_SUCCESS) { + ALARM_MGR_EXCEPTION_PRINT("Failed to security_server_get_uid_by_cookie[%d]", retval); } ALARM_MGR_LOG_PRINT("uid : %d", uid); } - if (uid != 0) { // Checks the cookie only when the process is not the root - cookie = g_base64_decode(e_cookie, &size); - if (cookie == NULL) { - ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!"); - return ERR_ALARM_SYSTEM_FAIL; - } - + if (uid != 0 && uid != SYSTEM_UID) { // Checks the cookie only when the process is not the root retval = security_server_check_privilege_by_cookie((const char *)cookie, label, access); g_free(cookie); @@ -1529,65 +1983,45 @@ int __check_privilege_by_cookie(char *e_cookie, const char *label, const char *a return ALARMMGR_RESULT_SUCCESS; } -bool __get_caller_unique_name(int pid, char *unique_name) +bool __get_caller_unique_name(int pid, char *unique_name, const char *zone) { - char caller_appid[256] = {0,}; - if (unique_name == NULL) { ALARM_MGR_EXCEPTION_PRINT("unique_name should not be NULL."); return false; } - if (aul_app_get_appid_bypid(pid, caller_appid, sizeof(caller_appid)) == AUL_R_OK) + char *caller_appid = NULL; + if (__zone_get_appid_bypid(pid, zone, &caller_appid) == 0) { // When a caller is an application, the unique name is appID. strncpy(unique_name, caller_appid, strlen(caller_appid)); + free(caller_appid); } else { // Otherwise, the unique name is /proc/pid/cmdline. - char proc_file[512] = {0,}; - char process_name[512] = {0,}; - int fd = 0; - int i = 0; - - snprintf(proc_file, 512, "/proc/%d/cmdline", pid); - - fd = open(proc_file, O_RDONLY); - if (fd < 0) { - SECURE_LOGE("Caution!! pid(%d) seems to be killed, so we failed to get proc file(%s) and do not create alarm_info.", pid, proc_file); + char caller_cmdline[PATH_MAX]; + int ret = 0; + ret = aul_app_get_cmdline_bypid(pid, caller_cmdline, PATH_MAX); + if (ret != 0) { + ALARM_MGR_EXCEPTION_PRINT("get cmdline is failed"); return false; - } - else { - if (read(fd, process_name, 512) <= 0) - { - ALARM_MGR_EXCEPTION_PRINT("Unable to get the process name."); - close(fd); - return false; - } - close(fd); - while (process_name[i] != '\0') { - if (process_name[i] == ' ') { - process_name[i] = '\0'; - break; - } - ++i; - } - strncpy(unique_name, process_name, strlen(process_name)); } + strncpy(unique_name, caller_cmdline, strlen(caller_cmdline)); } SECURE_LOGD("unique_name= %s", unique_name); return true; } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG static void __initialize_module_log(void) { - log_fd = open(ALARMMGR_LOG_FILE_PATH, O_CREAT | O_WRONLY, 0644); + log_fd = open(ALARMMGR_LOG_FILE_PATH, O_WRONLY); if (log_fd == -1) { - ALARM_MGR_EXCEPTION_PRINT("Opening the file for alarmmgr log is failed."); + ALARM_MGR_EXCEPTION_PRINT("Opening the file for alarmmgr log is failed. err: %s", strerror(errno)); return; } @@ -1624,7 +2058,7 @@ static bool __save_module_log(const char *tag, const char *message) int ret = write(log_fd, buffer, strlen(buffer)); if (ret < 0) { - ALARM_MGR_EXCEPTION_PRINT("Writing the alarmmgr log is failed."); + ALARM_MGR_EXCEPTION_PRINT("Writing the alarmmgr log is failed. err: %s", strerror(errno)); return false; } @@ -1633,13 +2067,13 @@ static bool __save_module_log(const char *tag, const char *message) } return true; } +#endif // _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG int __display_lock_state(char *state, char *flag, unsigned int timeout) { GDBusMessage *msg = NULL; GDBusMessage *reply = NULL; GVariant *body = NULL; - GError *error = NULL; int ret = ALARMMGR_RESULT_SUCCESS; int val = -1; @@ -1651,10 +2085,9 @@ int __display_lock_state(char *state, char *flag, unsigned int timeout) g_dbus_message_set_body(msg, g_variant_new("(sssi)", state, flag, "NULL", timeout)); - reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, &error); + reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL); if (!reply) { - ALARM_MGR_EXCEPTION_PRINT("No reply. error = %s", error->message); - g_error_free(error); + ALARM_MGR_EXCEPTION_PRINT("No reply. g_dbus_connection_send_message_with_reply_sync() is failed."); ret = ERR_ALARM_SYSTEM_FAIL; } else { body = g_dbus_message_get_body(reply); @@ -1674,7 +2107,8 @@ int __display_lock_state(char *state, char *flag, unsigned int timeout) g_dbus_connection_flush_sync(alarm_context.connection, NULL, NULL); g_object_unref(msg); - g_object_unref(reply); + if (reply) + g_object_unref(reply); return ret; } @@ -1684,7 +2118,6 @@ int __display_unlock_state(char *state, char *flag) GDBusMessage *msg = NULL; GDBusMessage *reply = NULL; GVariant *body = NULL; - GError *error = NULL; int ret = ALARMMGR_RESULT_SUCCESS; int val = -1; @@ -1696,10 +2129,9 @@ int __display_unlock_state(char *state, char *flag) g_dbus_message_set_body(msg, g_variant_new("(ss)", state, flag )); - reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, &error); + reply = g_dbus_connection_send_message_with_reply_sync(alarm_context.connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, DEVICED_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL); if (!reply) { - ALARM_MGR_EXCEPTION_PRINT("No reply. error = %s", error->message); - g_error_free(error); + ALARM_MGR_EXCEPTION_PRINT("No reply. g_dbus_connection_send_message_with_reply_sync() is failed."); ret = ERR_ALARM_SYSTEM_FAIL; } else { body = g_dbus_message_get_body(reply); @@ -1719,12 +2151,13 @@ int __display_unlock_state(char *state, char *flag) g_dbus_connection_flush_sync(alarm_context.connection, NULL, NULL); g_object_unref(msg); - g_object_unref(reply); + if (reply) + g_object_unref(reply); return ret; } -static long __get_proper_interval(long interval) +static long __get_proper_interval(long interval, int alarm_type) { GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; @@ -1740,13 +2173,82 @@ static long __get_proper_interval(long interval) } } - while (maxInterval * 2 <= interval) { + while (maxInterval * 2 <= interval || + (alarm_type & ALARM_TYPE_INEXACT && maxInterval < MIN_INEXACT_INTERVAL) ) { maxInterval *= 2; } return maxInterval; } +gboolean __alarm_expired_directly(gpointer user_data) +{ + if (g_scheduled_alarm_list == NULL || g_scheduled_alarm_list->data == NULL) { + return false; + } + + int time_sec = (int)user_data; + __scheduled_alarm_t *alarm = g_scheduled_alarm_list->data; + __alarm_info_t *alarm_info = alarm->__alarm_info; + + // Expire alarms with duetime equal to newtime by force + if (alarm_info->due_time == time_sec) { + if (__display_lock_state(DEVICED_LCD_OFF, DEVICED_STAY_CUR_STATE, 0) != ALARMMGR_RESULT_SUCCESS) { + ALARM_MGR_EXCEPTION_PRINT("__display_lock_state() is failed"); + } + + if (g_dummy_timer_is_set == true) { + ALARM_MGR_LOG_PRINT("dummy alarm timer has expired."); + } + else { + ALARM_MGR_LOG_PRINT("due_time=%d is expired.", alarm_info->due_time); + __alarm_expired(); + } + + _alarm_schedule(); + __rtc_set(); + + if (__display_unlock_state(DEVICED_LCD_OFF, DEVICED_SLEEP_MARGIN) != ALARMMGR_RESULT_SUCCESS) { + ALARM_MGR_EXCEPTION_PRINT("__display_unlock_state() is failed"); + } + } + + return false; +} + +void __reschedule_alarms_with_newtime(int cur_time, int new_time, double diff_time) +{ +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif + + vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time); + bundle *b = NULL; + b = bundle_create(); + bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE); + eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b); + bundle_free(b); + + __alarm_update_due_time_of_all_items_in_list(diff_time); // Rescheduling alarms with ALARM_TYPE_RELATIVE + ALARM_MGR_LOG_PRINT("Next duetime is %d", alarm_context.c_due_time); + + _clear_scheduled_alarm_list(); + _alarm_schedule(); + __rtc_set(); + +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + char *timebuf = ctime(&new_time); + if (timebuf) { + timebuf[strlen(timebuf) - 1] = '\0'; // to avoid newline + snprintf(log_message, sizeof(log_message), "Current: %d, New: %d, %s, diff: %f", cur_time, new_time, timebuf, diff_time); + } + __save_module_log("CHANGE TIME", log_message); +#endif + + g_idle_add(__alarm_expired_directly, (gpointer)new_time); // Expire alarms with duetime equal to newtime directly + return; +} + gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocation *invoc, int pid, int year, int mon, int day, int hour, int min, int sec, char *e_cookie, @@ -1755,13 +2257,12 @@ gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocat struct timespec alarm_time; int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; - - struct rtc_time rtc_tm = {0,}; - struct rtc_wkalrm rtc_wk; struct tm *alarm_tm = NULL; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "w", false, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { @@ -1809,68 +2310,106 @@ gboolean alarm_manager_alarm_set_rtc_time(AlarmManager *pObj, GDBusMethodInvocat } ALARM_MGR_EXCEPTION_PRINT("RTC ALARM_SET ioctl is failed. errno = %s", strerror(errno)); return_code = ERR_ALARM_SYSTEM_FAIL; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: SET RTC", strlen("FAIL: SET RTC")); +#endif } else{ ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is setted"); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "SET RTC", strlen("SET RTC")); +#endif } - sprintf(log_message, "wakeup rtc time: %d, %s", rtc_time, ctime(&rtc_time)); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "wakeup rtc time: %d, %s", (int)rtc_time, ctime(&rtc_time)); __save_module_log(log_tag, log_message); +#endif g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); return true; } -gboolean alarm_manager_alarm_set_time(AlarmManager *pObj, GDBusMethodInvocation *invoc, int _time, gpointer user_data) +static int accrue_msec = 0; // To check a millisecond part of current time at changing the system time(sec) + +gboolean alarm_manager_alarm_set_time(AlarmManager *pObj, GDBusMethodInvocation *invoc, int time_sec, gpointer user_data) { - static int diff_msec = 0; // To check a millisecond part of current time at changing the system time double diff_time = 0.0; - struct timeval before; + struct timeval cur_time = {0,}; int return_code = ALARMMGR_RESULT_SUCCESS; - char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; - _alarm_disable_timer(alarm_context); + _alarm_disable_timer(alarm_context); // Disable the timer to reschedule the alarm before the time is changed. - gettimeofday(&before, NULL); - diff_msec += (before.tv_usec / 1000); // Accrue the millisecond to compensate the time - ALARM_MGR_LOG_PRINT("Current time = %s. usec = %ld. diff_msec = %d.\n", ctime(&before.tv_sec), before.tv_usec, diff_msec); + tzset(); + gettimeofday(&cur_time, NULL); - if (diff_msec > 500) { - diff_time = difftime(_time, before.tv_sec) - 1; - diff_msec -= 1000; - } - else { - diff_time = difftime(_time, before.tv_sec); + accrue_msec += (cur_time.tv_usec / 1000); // Accrue the millisecond to compensate the time + if (accrue_msec > 500) { + diff_time = difftime(time_sec, cur_time.tv_sec) - 1; + accrue_msec -= 1000; + } else { + diff_time = difftime(time_sec, cur_time.tv_sec); } + __set_time(time_sec); // Change both OS time and RTC + ALARM_MGR_EXCEPTION_PRINT("[TIMESTAMP]Current time(%d), New time(%d)(%s), diff_time(%f)", + cur_time.tv_sec, time_sec, ctime(&time_sec), diff_time); + + __reschedule_alarms_with_newtime(cur_time.tv_sec, time_sec, diff_time); + g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); + return true; +} + +gboolean alarm_manager_alarm_set_time_with_propagation_delay(AlarmManager *pObj, GDBusMethodInvocation *invoc, + guint new_sec, guint new_nsec, guint req_sec, guint req_nsec, gpointer user_data) +{ + double diff_time = 0.0; + struct timespec cur_time = {0,}; + struct timespec delay = {0,}; + struct timespec sleep_time = {0,}; + guint real_newtime = 0; + accrue_msec = 0; // reset accrued msec + + _alarm_disable_timer(alarm_context); // Disable the timer to reschedule the alarm before the time is changed. + tzset(); + clock_gettime(CLOCK_REALTIME, &cur_time); - char *timebuf = ctime(&_time); - if (timebuf) { - timebuf[strlen(timebuf) - 1] = '\0'; // to avoid newline - sprintf(log_message, "Current: %d, New: %d, %s, diff: %f", before.tv_sec, _time, timebuf, diff_time); - __save_module_log("CHANGE TIME", log_message); + // Check validation of requested time + if (req_sec > cur_time.tv_sec || (req_sec == cur_time.tv_sec && req_nsec > cur_time.tv_nsec)) { + ALARM_MGR_EXCEPTION_PRINT("The requeted time(%d.%09d) must be equal to or less than current time(%d.%09d).", + req_sec, req_nsec, cur_time.tv_sec, cur_time.tv_nsec); + g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ERR_ALARM_INVALID_PARAM)); + return true; } - ALARM_MGR_EXCEPTION_PRINT("[TIMESTAMP]Current time(%d), New time(%d)(%s), diff_time(%f)", before.tv_sec, _time, ctime(&_time), diff_time); - - ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed\n"); - ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n", alarm_context.c_due_time); + // Compensate propagation delay + if (req_nsec > cur_time.tv_nsec) { + delay.tv_sec = cur_time.tv_sec - 1 - req_sec; + delay.tv_nsec = cur_time.tv_nsec + BILLION - req_nsec; + } else { + delay.tv_sec = cur_time.tv_sec - req_sec; + delay.tv_nsec = cur_time.tv_nsec - req_nsec; + } - _set_time(_time - 1); - __alarm_update_due_time_of_all_items_in_list(diff_time); + if (new_nsec + delay.tv_nsec >= BILLION) { + real_newtime = new_sec + delay.tv_sec + 2; + sleep_time.tv_nsec = BILLION - ((delay.tv_nsec + new_nsec) - BILLION); + } else { + real_newtime = new_sec + delay.tv_sec + 1; + sleep_time.tv_nsec = BILLION - (delay.tv_nsec + new_nsec); + } - ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d", alarm_context.c_due_time); - _clear_scheduled_alarm_list(); - _alarm_schedule(); - __rtc_set(); - _set_time(_time); + nanosleep(&sleep_time, NULL); // Wait until 0 nsec to match both OS time and RTC(sec) - vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time); + __set_time(real_newtime); // Change both OS time and RTC - g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); + diff_time = difftime(real_newtime, cur_time.tv_sec); + ALARM_MGR_EXCEPTION_PRINT("[TIMESTAMP]Current time(%d.%09d), New time(%d.%09d), Real Newtime(%d), diff_time(%f)", + cur_time.tv_sec, cur_time.tv_nsec, new_sec, new_nsec, real_newtime, diff_time); + ALARM_MGR_LOG_PRINT("Requested(%d.%09d) Delay(%d.%09d) Sleep(%09d)", req_sec, req_nsec, delay.tv_sec, delay.tv_nsec, sleep_time.tv_nsec); + __reschedule_alarms_with_newtime(cur_time.tv_sec, real_newtime, diff_time); + g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", ALARMMGR_RESULT_SUCCESS)); return true; } @@ -1878,9 +2417,11 @@ gboolean alarm_manager_alarm_set_timezone(AlarmManager *pObject, GDBusMethodInvo { int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; + struct stat statbuf; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; - struct stat statbuf; +#endif ALARM_MGR_EXCEPTION_PRINT("[TIMESTAMP]Set the timezone to %s.", tzpath_str); @@ -1919,16 +2460,29 @@ gboolean alarm_manager_alarm_set_timezone(AlarmManager *pObject, GDBusMethodInvo __rtc_set(); vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED, 0); + bundle *b = NULL; + b = bundle_create(); + bundle_add_str(b, EVT_KEY_TIME_CHANGED, EVT_VAL_TIME_CHANGED_TRUE); + eventsystem_send_system_event(SYS_EVENT_TIME_CHANGED, b); + bundle_free(b); + + b = NULL; + b = bundle_create(); + bundle_add_str(b, EVT_KEY_TIME_ZONE, tzpath_str); + eventsystem_send_system_event(SYS_EVENT_TIME_ZONE, b); + bundle_free(b); done: g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG if (return_code == ALARMMGR_RESULT_SUCCESS) { strncpy(log_tag, "SET TIMEZONE", strlen("SET TIMEZONE")); } else { strncpy(log_tag, "FAIL: SET TIMEZONE", strlen("FAIL: SET TIMEZONE")); } - sprintf(log_message, "Set the timezone to %s.", tzpath_str); + snprintf(log_message, sizeof(log_message), "Set the timezone to %s.", tzpath_str); __save_module_log(log_tag, log_message); +#endif return true; } @@ -1940,25 +2494,42 @@ gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInv int start_hour, int start_min, int start_sec, int end_year, int end_month, int end_day, int mode_day_of_week, - int mode_repeat, int alarm_type, - int reserved_info, - char *bundle_data, char *e_cookie, + unsigned int mode_interval, int mode_repeat, + int alarm_type, int reserved_info, + char *bundle_data, char *e_cookie, gpointer user_data) { alarm_info_t alarm_info; int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; int alarm_id = 0; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif bool ret = true; + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "w", false, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { return_code = retval; g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); - sprintf(log_message, "pid: %d, Smack denied (alarm-server::alarm, w)", pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "pid: %d, Smack denied (alarm-server::alarm, w)", pid); __save_module_log("FAIL: CREATE", log_message); +#endif return true; } @@ -1979,20 +2550,36 @@ gboolean alarm_manager_alarm_create_appsvc(AlarmManager *pObject, GDBusMethodInv alarm_info.alarm_type = alarm_type; alarm_info.reserved_info = reserved_info; - if (!__alarm_create_appsvc(&alarm_info, &alarm_id, pid, bundle_data, &return_code)) { + if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT)) { + alarm_info.alarm_type |= ALARM_TYPE_PERIOD; + alarm_info.mode.u_interval.interval = + __get_proper_interval(mode_interval, alarm_info.alarm_type); + } else if (mode_interval <= 0){ + alarm_info.mode.u_interval.interval = 0; + } + + ALARM_MGR_LOG_PRINT("u_interval.interval[%d]", alarm_info.mode.u_interval.interval); + + if (!__alarm_create_appsvc(&alarm_info, &alarm_id, mode_interval, pid, bundle_data, &return_code, zone)) { ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE")); +#endif ret = false; - } else { + } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + else { strncpy(log_tag, "CREATE", strlen("CREATE")); - ret = true; } +#endif g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); - sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", alarm_id, pid, start_year, start_month, start_day, start_hour, start_min, start_sec); __save_module_log(log_tag, log_message); +#endif return ret; } @@ -2012,16 +2599,33 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; int alarm_id = 0; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif bool ret = true; + char zone[MAX_ZONE_NAME_LEN] = {0, }; + + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "w", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { return_code = retval; g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); - sprintf(log_message, "pid: %d, Smack denied (alarm-server::alarm, w)", pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "pid: %d, Smack denied (alarm-server::alarm, w)", pid); __save_module_log("FAIL: CREATE", log_message); +#endif return true; } @@ -2043,24 +2647,42 @@ gboolean alarm_manager_alarm_create(AlarmManager *obj, GDBusMethodInvocation *in alarm_info.reserved_info = reserved_info; if (!__alarm_create(&alarm_info, &alarm_id, pid, 0, 0, 0, app_service_name,app_service_name_mod, - reserved_service_name, reserved_service_name_mod, &return_code)) { + reserved_service_name, reserved_service_name_mod, &return_code, zone)) { ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE")); +#endif ret = false; - } else { + } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + else { strncpy(log_tag, "CREATE", strlen("CREATE")); - ret = true; } +#endif g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); - sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", alarm_id, pid, start_year, start_month, start_day, start_hour, start_min, start_sec); __save_module_log(log_tag, log_message); +#endif return ret; } +time_t _get_periodic_alarm_standard_time(void) +{ + /* To avoid start time of all devices are same. */ + if (periodic_alarm_standard_time == 0) { + srand((unsigned int)time(NULL)); + periodic_alarm_standard_time = rand() % BILLION + 1; /* 1 ~ 1000000000 */ + } + + ALARM_MGR_LOG_PRINT("periodic_standard_time : [%d]", periodic_alarm_standard_time); + return periodic_alarm_standard_time; +} + gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvocation *invoc, char *app_service_name, char *app_service_name_mod, int interval, int is_ref, int method, char *e_cookie, gpointer user_data) @@ -2069,42 +2691,53 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; int alarm_id = 0; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif bool ret = true; - int pid; + int pid = -1; const char *name = g_dbus_method_invocation_get_sender(invoc); + char zone[MAX_ZONE_NAME_LEN] = {0, }; + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } if (is_ref) - retval = __check_privilege_by_cookie(e_cookie, - "alarm-server::alarm-ref-periodic", "w", true, pid); + retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm-ref-periodic", "w", true, pid); else - retval = __check_privilege_by_cookie(e_cookie, - "alarm-server::alarm-periodic", "w", true, pid); + retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm-periodic", "w", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { return_code = retval; - g_dbus_method_invocation_return_value(invoc, - g_variant_new("(ii)", alarm_id, return_code)); + g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG if (is_ref) - sprintf(log_message, - "pid: %d, Smack denied (alarm-server::alarm-ref-periodic, w)", pid); + snprintf(log_message, sizeof(log_message), "pid: %d, Smack denied (alarm-server::alarm-ref-periodic, w)", pid); else - sprintf(log_message, - "pid: %d, Smack denied (alarm-server::alarm-periodic, w)", pid); - + snprintf(log_message, sizeof(log_message), "pid: %d, Smack denied (alarm-server::alarm-periodic, w)", pid); __save_module_log("FAIL: CREATE", log_message); +#endif return true; } - alarm_info.start.year = 1900; - alarm_info.start.month = 1; - alarm_info.start.day = 0; - alarm_info.start.hour = 0; - alarm_info.start.min = 0; - alarm_info.start.sec = 0; + struct tm standard_tm; + time_t standard_time = _get_periodic_alarm_standard_time(); + localtime_r(&standard_time, &standard_tm); + + alarm_info.start.year = standard_tm.tm_year + 1900; + alarm_info.start.month = standard_tm.tm_mon + 1; + alarm_info.start.day = standard_tm.tm_mday; + alarm_info.start.hour = standard_tm.tm_hour; + alarm_info.start.min = standard_tm.tm_min; + alarm_info.start.sec = standard_tm.tm_sec; alarm_info.end.year = 0; alarm_info.end.month = 0; @@ -2124,29 +2757,33 @@ gboolean alarm_manager_alarm_create_periodic(AlarmManager *obj, GDBusMethodInvoc if (is_ref) alarm_info.mode.u_interval.interval = interval * 60; else - alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60); + alarm_info.mode.u_interval.interval = __get_proper_interval(interval * 60, alarm_info.alarm_type); } if (!__alarm_create(&alarm_info, &alarm_id, pid, method, interval * 60, is_ref, app_service_name, app_service_name_mod, - "null", "null", &return_code)) { + "null", "null", &return_code, zone)) { ALARM_MGR_EXCEPTION_PRINT("Unable to create alarm! return_code[%d]", return_code); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: CREATE", strlen("FAIL: CREATE")); +#endif ret = false; } else { +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "CREATE", strlen("CREATE")); +#endif ret = true; } g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", alarm_id, return_code)); - - sprintf(log_message, "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", alarm_id, pid, alarm_info.start.year, alarm_info.start.month, alarm_info.start.day, alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec); __save_module_log(log_tag, log_message); - +#endif return ret; } @@ -2156,33 +2793,55 @@ gboolean alarm_manager_alarm_delete(AlarmManager *obj, GDBusMethodInvocation *in { int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif bool ret = true; + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "w", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { return_code = retval; g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); - sprintf(log_message, "alarmID: %d, pid: %d, Smack denied (alarm-server::alarm, w)", alarm_id, pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d, Smack denied (alarm-server::alarm, w)", alarm_id, pid); __save_module_log("FAIL: DELETE", log_message); +#endif return true; + } - if (!__alarm_delete(pid, alarm_id, &return_code)) { + if (!__alarm_delete(pid, alarm_id, &return_code, zone)) { ALARM_MGR_EXCEPTION_PRINT("Unable to delete the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: DELETE", strlen("FAIL: DELETE")); +#endif ret = false; } else { ALARM_MGR_EXCEPTION_PRINT("alarm_id[%d] is removed.", alarm_id); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "DELETE", strlen("DELETE")); - ret = true; +#endif } g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); - sprintf(log_message, "alarmID: %d, pid: %d", alarm_id, pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, pid: %d", alarm_id, pid); __save_module_log(log_tag, log_message); +#endif return ret; } @@ -2197,22 +2856,41 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation bool is_deleted = false; int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif + char zone[MAX_ZONE_NAME_LEN] = {0, }; + bool ret = true; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "w", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { return_code = retval; g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); - sprintf(log_message, "pid: %d, Smack denied (alarm-server::alarm, w)", pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "pid: %d, Smack denied (alarm-server::alarm, w)", pid); __save_module_log("FAIL: DELETE ALL", log_message); +#endif return true; } - if (!__get_caller_unique_name(pid, app_name)) { + if (!__get_caller_unique_name(pid, app_name, zone)) { return_code = ERR_ALARM_SYSTEM_FAIL; g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); - sprintf(log_message, "pid: %d. Can not get the unique_name.", pid); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "pid: %d. Can not get the unique_name.", pid); __save_module_log("FAIL: DELETE ALL", log_message); +#endif return true; } @@ -2222,11 +2900,17 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation { bool is_found = false; entry = gs_iter->data; - char* tmp_appname = g_quark_to_string(entry->quark_app_unique_name); + + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) { + gs_iter = g_slist_next(gs_iter); + continue; + } + + const char* tmp_appname = g_quark_to_string(entry->quark_app_unique_name); SECURE_LOGD("Try to remove app_name[%s], alarm_id[%d]\n", tmp_appname, entry->alarm_id); if (tmp_appname && strncmp(app_name, tmp_appname, strlen(tmp_appname)) == 0) { - if (_remove_from_scheduled_alarm_list(pid, entry->alarm_id)) + if (_remove_from_scheduled_alarm_list(pid, entry->alarm_id, zone)) { is_deleted = true; } @@ -2234,7 +2918,7 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation alarm_info = &entry->alarm_info; if (!(alarm_info->alarm_type & ALARM_TYPE_VOLATILE)) { - if(!_delete_alarms(entry->alarm_id)) + if(!_delete_alarms(entry->alarm_id, zone)) { SECURE_LOGE("_delete_alarms() is failed. pid[%d], alarm_id[%d]", pid, entry->alarm_id); } @@ -2259,8 +2943,14 @@ gboolean alarm_manager_alarm_delete_all(AlarmManager *obj, GDBusMethodInvocation _alarm_schedule(); } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "pid: %d, unique_name: %s", pid, app_name); + __save_module_log("DELETE ALL", log_message); +#endif + __rtc_set(); g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); + return true; } @@ -2277,8 +2967,22 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i int return_code = ALARMMGR_RESULT_SUCCESS; alarm_info_t alarm_info; bool ret = true; +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG char log_tag[ALARMMGR_LOG_TAG_SIZE] = {0,}; char log_message[ALARMMGR_LOG_MESSAGE_SIZE] = {0,}; +#endif + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } alarm_info.start.year = start_year; alarm_info.start.month = start_month; @@ -2297,20 +3001,26 @@ gboolean alarm_manager_alarm_update(AlarmManager *pObj, GDBusMethodInvocation *i alarm_info.alarm_type = alarm_type; alarm_info.reserved_info = reserved_info; - if (!__alarm_update(pid, app_service_name, alarm_id, &alarm_info, &return_code)) { + if (!__alarm_update(pid, app_service_name, alarm_id, &alarm_info, &return_code, zone)) { ALARM_MGR_EXCEPTION_PRINT("Unable to update the alarm! alarm_id[%d], return_code[%d]", alarm_id, return_code); +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG strncpy(log_tag, "FAIL: UPDATE", strlen("FAIL: UPDATE")); +#endif ret = false; - } else { + } +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + else { strncpy(log_tag, "UPDATE", strlen("UPDATE")); - ret = true; } +#endif g_dbus_method_invocation_return_value(invoc, g_variant_new("(i)", return_code)); - sprintf(log_message, "alarmID: %d, appname: %s, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + snprintf(log_message, sizeof(log_message), "alarmID: %d, appname: %s, pid: %d, duetime: %d-%d-%d %02d:%02d:%02d", alarm_id, app_service_name, pid, start_year, start_month, start_day, start_hour, start_min, start_sec); __save_module_log(log_tag, log_message); +#endif return ret; } @@ -2324,6 +3034,20 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho int retval = 0; int num_of_ids = 0; int return_code = ALARMMGR_RESULT_SUCCESS; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "r", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { @@ -2332,7 +3056,7 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho return true; } - if (!__get_caller_unique_name(pid, app_name)) { + if (!__get_caller_unique_name(pid, app_name, zone)) { return_code = ERR_ALARM_SYSTEM_FAIL; g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code)); return true; @@ -2342,9 +3066,14 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; - const gchar *app_unique_name = g_quark_to_string(entry->quark_app_unique_name); + + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) + continue; + SECURE_LOGD("app_name=%s, quark_app_unique_name=%s", app_name, g_quark_to_string(entry->quark_app_unique_name)); - if (app_unique_name && strncmp(app_name, app_unique_name, strlen(app_name)) == 0) { + const gchar *quark_app_unique_name = g_quark_to_string(entry->quark_app_unique_name); + if (quark_app_unique_name && + strncmp(app_name, quark_app_unique_name, strlen(app_name)) == 0) { (num_of_ids)++; SECURE_LOGD("inc number of alarms of app (pid:%d, unique_name:%s) is %d.", pid, app_name, num_of_ids); } @@ -2352,7 +3081,8 @@ gboolean alarm_manager_alarm_get_number_of_ids(AlarmManager *pObject, GDBusMetho SECURE_LOGD("number of alarms of the process (pid:%d, unique_name:%s) is %d.", pid, app_name, num_of_ids); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", num_of_ids, return_code)); - return true; + + return ret; } gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodInvocation *invoc, int pid, @@ -2366,6 +3096,20 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI GVariantBuilder* builder = NULL; int num_of_ids = 0; int return_code = ALARMMGR_RESULT_SUCCESS; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } if (max_number_of_ids <= 0) { SECURE_LOGE("called for pid(%d), but max_number_of_ids(%d) is less than 0.", pid, max_number_of_ids); @@ -2373,7 +3117,7 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI return true; } - if (!__get_caller_unique_name(pid, app_name)) { + if (!__get_caller_unique_name(pid, app_name, zone)) { return_code = ERR_ALARM_SYSTEM_FAIL; g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", g_variant_new("ai", NULL), num_of_ids, return_code)); return true; @@ -2385,8 +3129,12 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; - const gchar *app_unique_name = g_quark_to_string(entry->quark_app_unique_name); - if (app_unique_name && strncmp(app_name, app_unique_name, strlen(app_name)) == 0) { + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) + continue; + + const gchar *quark_app_unique_name = g_quark_to_string(entry->quark_app_unique_name); + if (quark_app_unique_name && + strncmp(app_name, quark_app_unique_name, strlen(app_name)) == 0) { g_variant_builder_add (builder, "i", entry->alarm_id); index ++; SECURE_LOGE("called for alarmid(%d), but max_number_of_ids(%d) index %d.", entry->alarm_id, max_number_of_ids, index); @@ -2400,7 +3148,8 @@ gboolean alarm_manager_alarm_get_list_of_ids(AlarmManager *pObject, GDBusMethodI g_dbus_method_invocation_return_value(invoc, g_variant_new("(@aiii)", arr, num_of_ids, return_code)); g_variant_builder_unref(builder); - return true; + + return ret; } gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodInvocation *invoc , @@ -2413,6 +3162,20 @@ gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodI int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; gchar *b_data = NULL; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } SECURE_LOGD("called for pid(%d) and alarm_id(%d)\n", pid, alarm_id); @@ -2421,10 +3184,15 @@ gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodI return_code = retval; g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", b_data, return_code)); return true; + } for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; + + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) + continue; + if (entry->alarm_id == alarm_id) { found = true; b_data = g_strdup(g_quark_to_string(entry->quark_bundle)); @@ -2444,7 +3212,8 @@ gboolean alarm_manager_alarm_get_appsvc_info(AlarmManager *pObject, GDBusMethodI g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", b_data, return_code)); g_free(b_data); - return true; + + return ret; } gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocation *invoc, int pid, @@ -2457,6 +3226,20 @@ gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocati alarm_info_t *alarm_info = NULL; int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "r", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { @@ -2467,6 +3250,10 @@ gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocati for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; + + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) + continue; + if (entry->alarm_id == alarm_id) { alarm_info = &(entry->alarm_info); break; @@ -2484,7 +3271,7 @@ gboolean alarm_manager_alarm_get_info(AlarmManager *pObject, GDBusMethodInvocati alarm_info->end.day, alarm_info->mode.u_interval.day_of_week, alarm_info->mode.repeat, alarm_info->alarm_type, alarm_info->reserved_info, return_code)); } - return true; + return ret; } gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethodInvocation *invoc, int pid, @@ -2498,6 +3285,20 @@ gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethod int retval = 0; int return_code = ALARMMGR_RESULT_SUCCESS; time_t duetime = 0; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } retval = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "r", true, pid); if (retval != ALARMMGR_RESULT_SUCCESS) { @@ -2508,6 +3309,10 @@ gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethod for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; + + if (zone[0] != '\0' && strcmp(zone, g_quark_to_string(entry->zone)) != 0) + continue; + if (entry->alarm_id == alarm_id) { find_item = entry; break; @@ -2525,7 +3330,8 @@ gboolean alarm_manager_alarm_get_next_duetime(AlarmManager *pObject, GDBusMethod ALARM_MGR_LOG_PRINT("Next duetime : %s", ctime(&duetime)); g_dbus_method_invocation_return_value(invoc, g_variant_new("(ii)", duetime, return_code)); - return true; + + return ret; } gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvocation *invoc, int pid, char *e_cookie, gpointer user_data) @@ -2555,6 +3361,20 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo GSList *gs_iter = NULL; __alarm_info_t *entry = NULL; char *error_message = NULL; + bool ret = true; + + char zone[MAX_ZONE_NAME_LEN] = {0, }; + const char *name = g_dbus_method_invocation_get_sender(invoc); + + ALARM_MGR_LOG_PRINT("before getting actual pid[%d]", pid); + pid = __get_caller_pid(name); + ALARM_MGR_LOG_PRINT("after getting actual pid[%d]", pid); + + if (_get_zone_name(pid, zone, MAX_ZONE_NAME_LEN) != true) { + ALARM_MGR_EXCEPTION_PRINT("failed to get zone name with pid[%d]", pid); + //Disabled zone + memcpy(zone, "/", 1); + } return_code = __check_privilege_by_cookie(e_cookie, "alarm-server::alarm", "r", true, pid); if (return_code != ALARMMGR_RESULT_SUCCESS) { @@ -2565,7 +3385,7 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo // Open a DB time(¤t_time); localtime_r(¤t_time, ¤t_tm); - sprintf(db_path_tmp, "/tmp/alarmmgr_%d%d%d_%02d%02d%02d.db", + snprintf(db_path_tmp, sizeof(db_path_tmp), "/tmp/alarmmgr_%d%d%d_%02d%02d%02d.db", current_tm.tm_year + 1900, current_tm.tm_mon + 1, current_tm.tm_mday, current_tm.tm_hour, current_tm.tm_min, current_tm.tm_sec); db_path = strdup(db_path_tmp); @@ -2596,6 +3416,10 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo int index = 0; for (gs_iter = alarm_context.alarms; gs_iter != NULL; gs_iter = g_slist_next(gs_iter)) { entry = gs_iter->data; + + if (zone[0] != '\0' && strcmp(g_quark_to_string(entry->zone), zone)!= 0) + continue; + ++index; SECURE_LOGD("#%d alarm id[%d] app_name[%s] duetime[%d]", index, entry->alarm_id, g_quark_to_string(entry->quark_app_unique_name), entry->start); @@ -2634,6 +3458,7 @@ gboolean alarm_manager_alarm_get_all_info(AlarmManager *pObject, GDBusMethodInvo g_dbus_method_invocation_return_value(invoc, g_variant_new("(si)", db_path, return_code)); free(db_path); return true; + } static void __timer_glib_finalize(GSource *src) @@ -2704,12 +3529,9 @@ static void __initialize_timer() gpollfd = (GPollFD *) g_malloc(sizeof(GPollFD)); if (gpollfd == NULL) { - ALARM_MGR_EXCEPTION_PRINT("out of memory.\n"); - close(fd); - g_source_unref(src); + ALARM_MGR_EXCEPTION_PRINT("Out of memory\n"); exit(1); } - gpollfd->events = POLLIN; gpollfd->fd = fd; @@ -2746,24 +3568,17 @@ static void __initialize_scheduled_alarm_list() static bool __initialize_noti() { - // system state change noti - if (vconf_notify_key_changed - (VCONFKEY_SETAPPL_TIMEZONE_ID, __on_time_zone_changed, NULL) < 0) { - ALARM_MGR_LOG_PRINT( - "Failed to add callback for time zone changing event\n"); - } - + // VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL is set by OSP app-service. if (vconf_notify_key_changed (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) { - ALARM_MGR_LOG_PRINT( - "Failed to add callback for time external changing event\n"); + ALARM_MGR_LOG_PRINT("Failed to add callback for time external changing event."); } // If the caller or callee app is uninstalled, all registered alarms will be canceled. int event_type = PMINFO_CLIENT_STATUS_UNINSTALL; pkgmgrinfo_client* pc = pkgmgrinfo_client_new(PMINFO_LISTENING); pkgmgrinfo_client_set_status_type(pc, event_type); - pkgmgrinfo_client_listen_status(pc, __on_app_uninstalled, NULL); + pkgmgrinfo_client_listen_status_with_zone(pc, __on_app_uninstalled, NULL); return true; } @@ -2826,6 +3641,7 @@ static void on_bus_acquired(GDBusConnection *connection, const gchar *name, gpoi g_signal_connect(interface, "handle_alarm_set_timezone", G_CALLBACK(alarm_manager_alarm_set_timezone), NULL); g_signal_connect(interface, "handle_alarm_update", G_CALLBACK(alarm_manager_alarm_update), NULL); g_signal_connect(interface, "handle_alarm_get_all_info", G_CALLBACK(alarm_manager_alarm_get_all_info), NULL); + g_signal_connect(interface, "handle_alarm_set_time_with_propagation_delay", G_CALLBACK(alarm_manager_alarm_set_time_with_propagation_delay), NULL); guint subsc_id = g_dbus_connection_signal_subscribe(connection, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameOwnerChanged", "/org/freedesktop/DBus", NULL, G_DBUS_SIGNAL_FLAGS_NONE, @@ -2867,12 +3683,13 @@ static bool __initialize_dbus() return false; } + ALARM_MGR_LOG_PRINT("__initialize_dbus Exit"); return true; } #define ALARMMGR_DB_FILE "/opt/dbspace/.alarmmgr.db" -sqlite3 *alarmmgr_db; -#define QUERY_CREATE_TABLE_ALARMMGR "create table alarmmgr \ + +#define QUERY_CREATE_TABLE_ALARMMGR "create table if not exists alarmmgr \ (alarm_id integer primary key,\ start integer,\ end integer,\ @@ -2897,34 +3714,155 @@ sqlite3 *alarmmgr_db; dst_service_name_mod text \ )" +void vsm_iter_cb(vsm_zone_h zone, void *user_data) +{ + + char *error_message = NULL; + int ret; + char db_path[1024] = { '\0' }; + const char* zone_name = NULL; + sqlite3 *alarmmgr_zone_db = NULL; + + zone_name = vsm_get_zone_name(zone); + if (!zone_name) { + ALARM_MGR_EXCEPTION_PRINT("Failed to get zone name"); + return; + } + + ALARM_MGR_LOG_PRINT("Zone : %s\n", zone_name); + + _zone_alarm_db_list_t *alarm_db_list = NULL; + alarm_db_list = malloc(sizeof(_zone_alarm_db_list_t)); + if (alarm_db_list == NULL) { + ALARM_MGR_EXCEPTION_PRINT("malloc failed"); + return; + } + + alarm_db_list->zone = strdup(zone_name); + + snprintf(db_path, 1024, "%s/%s%s%s", ZONE_PREFIX_PATH, zone_name, ZONE_INFIX_PATH, ALARMMGR_DB_FILE); + if (access(db_path, F_OK) == 0) { + ALARM_MGR_LOG_PRINT("db[%s] exists", db_path); + + ret = db_util_open(db_path, &alarmmgr_zone_db, DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", db_path); + + if (alarm_db_list->zone) + free(alarm_db_list->zone); + if (alarm_db_list) + free(alarm_db_list); + + return; + } + + alarm_db_list->alarmmgr_db = alarmmgr_zone_db; + alarmmgr_db_list = g_slist_append(alarmmgr_db_list, alarm_db_list); + + ALARM_MGR_LOG_PRINT("alarmmgr_db_list length:[%d]\n", g_slist_length(alarmmgr_db_list)); + return; + } + + ret = db_util_open(db_path, &alarmmgr_zone_db, DB_UTIL_REGISTER_HOOK_METHOD); + if (ret != SQLITE_OK) { + ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", db_path); + free(alarm_db_list->zone); + free(alarm_db_list); + return; + } + + + if (SQLITE_OK != sqlite3_exec(alarmmgr_zone_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message)) { + ALARM_MGR_EXCEPTION_PRINT("Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message); + if (error_message != NULL) + free(error_message); + free(alarm_db_list->zone); + free(alarm_db_list); + return; + } + + alarm_db_list->alarmmgr_db = alarmmgr_zone_db; + alarmmgr_db_list = g_slist_append(alarmmgr_db_list, alarm_db_list); + + ALARM_MGR_LOG_PRINT("alarmmgr_db_list length:[%d]\n", g_slist_length(alarmmgr_db_list)); + +} + static bool __initialize_db() { char *error_message = NULL; int ret; + char db_path[1024] = { '\0' }; + + sqlite3 *alarmmgr_host_db = NULL; + vsm_zone_h zone; + vsm_context_h ctx = vsm_create_context(); + if (ctx == NULL) { + ALARM_MGR_EXCEPTION_PRINT("vsm_create_context failed"); + } else { + ret = vsm_iterate_zone(ctx, vsm_iter_cb, NULL); + if( ret != VSM_ERROR_NONE ) + { + ALARM_MGR_LOG_PRINT("vsm_iterate_zone failed\n"); + } + } + + _zone_alarm_db_list_t *alarm_db_list = NULL; + alarm_db_list = malloc(sizeof(_zone_alarm_db_list_t)); + if (alarm_db_list == NULL) { + ALARM_MGR_EXCEPTION_PRINT("malloc failed"); + return false; + } + + alarm_db_list->zone = strdup("/"); - if (access("/opt/dbspace/.alarmmgr.db", F_OK) == 0) { - ret = db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db, DB_UTIL_REGISTER_HOOK_METHOD); + snprintf(db_path, 1024, "%s", ALARMMGR_DB_FILE); + if (access(db_path, F_OK) == 0) { + ALARM_MGR_LOG_PRINT("db[%s] exists", db_path); + ret = db_util_open(db_path, &alarmmgr_host_db, DB_UTIL_REGISTER_HOOK_METHOD); if (ret != SQLITE_OK) { - ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", ALARMMGR_DB_FILE); + ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", db_path); + free(alarm_db_list->zone); + free(alarm_db_list); return false; } + alarm_db_list->alarmmgr_db = alarmmgr_host_db; + alarmmgr_db_list = g_slist_append(alarmmgr_db_list, alarm_db_list); + return true; } - ret = db_util_open(ALARMMGR_DB_FILE, &alarmmgr_db, DB_UTIL_REGISTER_HOOK_METHOD); - + ret = db_util_open(db_path, &alarmmgr_host_db, DB_UTIL_REGISTER_HOOK_METHOD); if (ret != SQLITE_OK) { - ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", ALARMMGR_DB_FILE); + ALARM_MGR_EXCEPTION_PRINT("====>>>> connect menu_db [%s] failed", db_path); + if (alarm_db_list->zone) + free(alarm_db_list->zone); + + if (alarm_db_list) + free(alarm_db_list); + return false; } - if (SQLITE_OK != sqlite3_exec(alarmmgr_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message)) { + if (SQLITE_OK != sqlite3_exec(alarmmgr_host_db, QUERY_CREATE_TABLE_ALARMMGR, NULL, NULL, &error_message)) { ALARM_MGR_EXCEPTION_PRINT("Don't execute query = %s, error message = %s", QUERY_CREATE_TABLE_ALARMMGR, error_message); + if (error_message != NULL) + free(error_message); + + if (alarm_db_list->zone) + free(alarm_db_list->zone); + + if (alarm_db_list) + free(alarm_db_list); + return false; } + alarm_db_list->alarmmgr_db = alarmmgr_host_db; + alarmmgr_db_list = g_slist_append(alarmmgr_db_list, alarm_db_list); + return true; } @@ -2939,15 +3877,19 @@ static void __initialize() "alarm-server cannot be runned.\n"); exit(1); } + +#ifdef _APPFW_FEATURE_ALARM_MANAGER_MODULE_LOG + __initialize_module_log(); // for module log +#endif + __initialize_scheduled_alarm_list(); __initialize_db(); __initialize_alarm_list(); __initialize_noti(); - __initialize_module_log(); // for module log - } + int main() { GMainLoop *mainloop = NULL; diff --git a/alarm-server.manifest b/alarm-server.manifest index f3ec7ed..a074365 100644 --- a/alarm-server.manifest +++ b/alarm-server.manifest @@ -8,10 +8,22 @@