2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
20 #include <sys/types.h>
28 #include <lazy_mount.h>
29 #include <systemd/sd-daemon.h>
39 #include "process_mgr.h"
43 #include "dbus_util.h"
45 #define APPID_SYS_LOCK "org.tizen.sys-lock"
49 static void _hide_home(void)
51 int seq = status_active_get()->starter_sequence;
54 vconf_set_int(VCONFKEY_STARTER_SEQUENCE, 0);
60 static void _show_home(void)
62 vconf_set_int(VCONFKEY_STARTER_SEQUENCE, 1);
67 static void _signal_handler(int signum, siginfo_t *info, void *unused)
69 _D("_signal_handler : Terminated...");
75 static int _power_off_cb(status_active_key_e key, void *data)
77 int val = status_active_get()->sysman_power_off_status;
79 if (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT
80 || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)
82 _D("_power_off_cb : Terminated...");
91 static void _language_changed_cb(keynode_t *node, void *data)
97 lang = vconf_keynode_get_str(node);
100 _D("language is changed : %s", lang);
102 elm_language_set(lang);
107 static int _set_i18n(const char *domain, const char *dir)
111 if (domain == NULL) {
116 char *lang = vconf_get_str(VCONFKEY_LANGSET);
117 r = setlocale(LC_ALL, lang);
119 _E("setlocale() error");
125 r = bindtextdomain(domain, dir);
127 _E("bindtextdomain() error");
130 r = textdomain(domain);
132 _E("textdomain() error");
135 if (vconf_notify_key_changed(VCONFKEY_LANGSET, _language_changed_cb, NULL) < 0) {
136 _E("Failed to register changed cb : %s", VCONFKEY_LANGSET);
144 static int _check_dead_signal(int pid, void *data)
146 #ifndef TIZEN_ARCH_ARM64
149 int indicator_pid = 0;
150 int quickpanel_pid = 0;
153 _D("Process %d is termianted", pid);
161 * If the architecture is not 64bit,
162 * starter try to re-launch these apps when the app is dead.
164 home_pid = home_mgr_get_home_pid();
165 volume_pid = home_mgr_get_volume_pid();
166 indicator_pid = home_mgr_get_indicator_pid();
167 quickpanel_pid = home_mgr_get_quickpanel_pid();
168 lock_pid = lock_mgr_get_lock_pid();
170 if (pid == home_pid) {
171 _D("Homescreen is dead");
172 home_mgr_relaunch_homescreen();
173 } else if (pid == volume_pid) {
174 _D("volume is dead");
175 home_mgr_relaunch_volume();
176 } else if (pid == indicator_pid) {
177 _D("indicator is dead");
178 home_mgr_relaunch_indicator();
179 } else if (pid == quickpanel_pid) {
180 _D("quickpanel is dead");
181 home_mgr_relaunch_quickpanel();
182 } else if (pid == lock_pid) {
183 _D("lockscreen is dead");
186 _D("Unknown process, ignore it");
189 _D("Process %d is termianted", pid);
202 static void _mount_and_launch_apps(void)
207 * Do mount user data partition
209 ret = do_mount_user();
211 _E("Failed to do mount [/opt] area");
216 * Wait user data partition mount
218 ret = wait_mount_user();
220 _E("Failed to wait mount [/opt] area");
224 /* Tells the service manager that service startup is finished */
225 sd_notify(0, "READY=1");
228 * After user data partition mount,
229 * launch lockscreen, homescreen, etc.
231 hw_key_create_window();
241 static void _sys_lock_status_changed_cb(void *data, DBusMessage *msg)
245 is_unlock = dbus_message_is_signal(msg, SYS_LOCK_INTERFACE_UNLOCK, SYS_LOCK_MEMBER_UNLOCK);
247 _D("sys-lock signal is received. unlock state(%d).", is_unlock);
250 _mount_and_launch_apps();
253 * Send DBus signal to terminate sys-lock
255 dbus_util_send_sys_lock_teminate_signal();
261 static void _init(struct appdata *ad)
263 struct sigaction act;
264 char err_buf[128] = { 0, };
265 int is_lazy_mount = 0;
268 memset(&act,0x00,sizeof(struct sigaction));
269 act.sa_sigaction = _signal_handler;
270 act.sa_flags = SA_SIGINFO;
272 ret = sigemptyset(&act.sa_mask);
274 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
275 _E("Failed to sigemptyset[%d / %s]", errno, err_buf);
278 ret = sigaddset(&act.sa_mask, SIGTERM);
280 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
281 _E("Failed to sigaddset[%d / %s]", errno, err_buf);
284 ret = sigaction(SIGTERM, &act, NULL);
286 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
287 _E("Failed to sigaction[%d / %s]", errno, err_buf);
291 _set_i18n(PACKAGE, LOCALEDIR);
294 status_active_register_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb, NULL);
298 is_lazy_mount = get_need_ui_for_lazy_mount();
299 _D("Lazy mount : %d", is_lazy_mount);
304 process_mgr_must_launch(APPID_SYS_LOCK, NULL, NULL, NULL, NULL);
307 * Register sys-lock status changed cb
309 dbus_util_receive_sys_lock_status(_sys_lock_status_changed_cb, NULL);
311 _mount_and_launch_apps();
314 aul_listen_app_dead_signal(_check_dead_signal, NULL);
319 static void _fini(struct appdata *ad)
321 hw_key_destroy_window();
328 status_active_unregister_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb);
331 if (vconf_ignore_key_changed(VCONFKEY_LANGSET, _language_changed_cb) < 0) {
332 _E("Failed to unregister changed cb : %s", VCONFKEY_LANGSET);
338 int main(int argc, char *argv[])
342 _D("starter is launched..!!");
344 elm_init(argc, argv);