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.
18 #include <vconf-keys.h>
20 #include <pkgmgr-info.h>
22 #include <sys/resource.h>
23 #include <sys/types.h>
27 #include "lockd-debug.h"
28 #include "lockd-process-mgr.h"
29 #include "starter-vconf.h"
31 #define LOCKD_DEFAULT_PKG_NAME "org.tizen.lockscreen"
32 #define LOCKD_DRAG_LOCKSCREEN "com.samsung.draglock"
33 #define LOCKD_PHONE_LOCK_PKG_NAME LOCKD_DEFAULT_PKG_NAME
34 #define RETRY_MAXCOUNT 30
35 #define RELAUNCH_INTERVAL 100*1000
37 #define LOCKD_VOICE_CALL_PKG_NAME "com.samsung.call"
38 #define LOCKD_VIDEO_CALL_PKG_NAME "com.samsung.vtmain"
40 #define NICE_VALUE_PWLOCK -5
41 #define NICE_VALUE_LOCKSCREEN -20
43 static char *default_lockscreen_pkg = NULL;
45 static bool _lockd_exist_package(char *pkgid)
48 pkgmgrinfo_appinfo_h handle = NULL;
50 ret = pkgmgrinfo_appinfo_get_appinfo(pkgid, &handle);
51 if (PMINFO_R_OK != ret || NULL == handle) {
52 LOCKD_SECURE_DBG("%s doesn't exist in this binary", pkgid);
56 pkgmgrinfo_appinfo_destroy_appinfo(handle);
61 void lockd_process_mgr_init(void)
63 default_lockscreen_pkg = vconf_get_str(VCONF_PRIVATE_LOCKSCREEN_DEFAULT_PKGNAME);
64 LOCKD_SECURE_DBG("default lock screen pkg name is %s", default_lockscreen_pkg);
65 if (default_lockscreen_pkg == NULL) {
66 default_lockscreen_pkg = LOCKD_DEFAULT_PKG_NAME;
68 if (!_lockd_exist_package(default_lockscreen_pkg)) {
69 LOCKD_SECURE_ERR("%s is not exist, default lock screen pkg name is set to %s", default_lockscreen_pkg, LOCKD_DRAG_LOCKSCREEN);
70 default_lockscreen_pkg = LOCKD_DRAG_LOCKSCREEN;
71 if (vconf_set_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, default_lockscreen_pkg) != 0) {
72 LOCKD_SECURE_ERR("vconf key [%s] set [%s] is failed", VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, default_lockscreen_pkg);
77 static char *_lockd_process_mgr_get_pkgname(int lock_type)
82 pkgname = vconf_get_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR);
83 LOCKD_SECURE_DBG("pkg name is %s", pkgname);
84 if (pkgname == NULL) {
85 pkgname = default_lockscreen_pkg;
86 } else if (_lockd_exist_package(pkgname) == FALSE) {
87 pkgname = default_lockscreen_pkg;
90 pkgname = default_lockscreen_pkg;
95 int lockd_process_mgr_restart_lock(int lock_type)
97 char *lock_app_path = NULL;
101 LOCKD_DBG("%s, %d", __func__, __LINE__);
102 lock_app_path = _lockd_process_mgr_get_pkgname(lock_type);
104 for (i=0; i<RETRY_MAXCOUNT; i++)
106 pid = aul_launch_app(lock_app_path, NULL);
107 LOCKD_DBG("aul_launch_app(%s), pid = %d", lock_app_path, pid);
108 if (pid == AUL_R_ETIMEOUT) {
109 LOCKD_DBG("Relaunch lock application [%d]times", i);
110 usleep(RELAUNCH_INTERVAL);
116 LOCKD_SECURE_DBG("Reset : aul_launch_app(%s, NULL), pid = %d", lock_app_path,
122 lockd_process_mgr_start_lock(void *data, int (*dead_cb) (int, void *),
125 char *lock_app_path = NULL;
129 LOCKD_DBG("%s, %d", __func__, __LINE__);
130 lock_app_path = _lockd_process_mgr_get_pkgname(lock_type);
132 for (i=0; i<RETRY_MAXCOUNT; i++)
134 pid = aul_launch_app(lock_app_path, NULL);
136 LOCKD_SECURE_DBG("aul_launch_app(%s), pid = %d", lock_app_path, pid);
138 if ((pid == AUL_R_ECOMM) || (pid == AUL_R_ETERMINATING)) {
139 LOCKD_DBG("Relaunch lock application [%d]times", i);
140 usleep(RELAUNCH_INTERVAL);
141 } else if (pid == AUL_R_ERROR) {
142 LOCKD_SECURE_ERR("launch[%s] is failed, launch default lock screen", lock_app_path);
143 pid = aul_launch_app(default_lockscreen_pkg, NULL);
144 if (pid == AUL_R_ERROR) {
145 LOCKD_SECURE_ERR("launch[%s] is failed, launch drag lock screen", default_lockscreen_pkg);
146 pid = aul_launch_app(LOCKD_DRAG_LOCKSCREEN, NULL);
148 if (vconf_set_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, LOCKD_DRAG_LOCKSCREEN) != 0) {
149 LOCKD_SECURE_ERR("vconf key [%s] set [%s] is failed", VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, LOCKD_DRAG_LOCKSCREEN);
160 LOCKD_ERR("Relaunch lock application failed..!!");
164 int lockd_process_mgr_start_normal_lock(void *data, int (*dead_cb) (int, void *))
169 for (i=0; i<RETRY_MAXCOUNT; i++)
171 pid = aul_launch_app(default_lockscreen_pkg, NULL);
173 LOCKD_SECURE_DBG("aul_launch_app(%s), pid = %d", default_lockscreen_pkg, pid);
175 if ((pid == AUL_R_ECOMM) || (pid == AUL_R_ETERMINATING)) {
176 LOCKD_DBG("Relaunch lock application [%d]times", i);
177 usleep(RELAUNCH_INTERVAL);
178 } else if (pid == AUL_R_ERROR) {
179 LOCKD_SECURE_DBG("launch[%s] is failed, launch default lock screen", default_lockscreen_pkg);
184 LOCKD_ERR("Relaunch lock application failed..!!");
188 static Eina_Bool _set_priority_lockscreen_process_cb(void *data)
191 char buf[1024] = { 0, };
193 prio = getpriority(PRIO_PROCESS, (pid_t)data);
194 if (prio == NICE_VALUE_LOCKSCREEN) {
195 LOCKD_DBG("%s (%d: %d)\n", "setpriority Success", (pid_t)data, prio);
196 return ECORE_CALLBACK_CANCEL;
199 if (setpriority(PRIO_PROCESS, (pid_t)data, NICE_VALUE_LOCKSCREEN) < 0 ) {
200 LOCKD_DBG("%s\n", strerror_r(errno, buf, sizeof(buf)));
201 return ECORE_CALLBACK_CANCEL;
204 return ECORE_CALLBACK_RENEW;
207 static Eina_Bool _set_priority_pwlock_process_cb(void *data)
210 char buf[104] = { 0, };
212 prio = getpriority(PRIO_PROCESS, (pid_t)data);
213 if (prio == NICE_VALUE_PWLOCK) {
214 LOCKD_DBG("%s (%d: %d)\n", "setpriority Success", (pid_t)data, prio);
215 return ECORE_CALLBACK_CANCEL;
218 if (setpriority(PRIO_PROCESS, (pid_t)data, NICE_VALUE_PWLOCK) < 0 ) {
219 LOCKD_DBG("%s\n", strerror_r(errno, buf, sizeof(buf)));
220 return ECORE_CALLBACK_CANCEL;
223 return ECORE_CALLBACK_RENEW;
226 int lockd_process_mgr_start_phone_lock(void)
232 LOCKD_DBG("%s, %d", __func__, __LINE__);
235 bundle_add(b, "lock_type", "phone_lock");
237 for (i=0; i<RETRY_MAXCOUNT; i++)
239 pid = aul_launch_app(LOCKD_PHONE_LOCK_PKG_NAME, b);
241 LOCKD_SECURE_DBG("aul_launch_app(%s), pid = %d", LOCKD_PHONE_LOCK_PKG_NAME, pid);
243 if ((pid == AUL_R_ECOMM) || (pid == AUL_R_ETERMINATING)) {
244 LOCKD_DBG("Relaunch lock application [%d]times", i);
245 usleep(RELAUNCH_INTERVAL);
260 int lockd_process_mgr_set_lockscreen_priority(int pid)
262 return !ecore_timer_add(1.0f, _set_priority_lockscreen_process_cb, (void *)pid);
265 int lockd_process_mgr_set_pwlock_priority(int pid)
267 return !ecore_timer_add(1.0f, _set_priority_pwlock_process_cb, (void *)pid);
271 int lockd_process_mgr_start_recovery_lock(void)
276 LOCKD_DBG("%s, %d", __func__, __LINE__);
279 bundle_add(b, "lock_type", "recovery_lock");
281 pid = aul_launch_app(LOCKD_PHONE_LOCK_PKG_NAME, b);
282 LOCKD_SECURE_DBG("aul_launch_app(%s, b), pid = %d", LOCKD_PHONE_LOCK_PKG_NAME,
290 int lockd_process_mgr_start_back_to_app_lock(void)
295 LOCKD_DBG("%s, %d", __func__, __LINE__);
298 bundle_add(b, "lock_type", "back_to_call");
300 pid = aul_launch_app(LOCKD_PHONE_LOCK_PKG_NAME, b);
301 LOCKD_SECURE_DBG("aul_launch_app(%s, b), pid = %d", LOCKD_PHONE_LOCK_PKG_NAME,
309 int lockd_process_mgr_start_ready_lock(void)
314 LOCKD_DBG("%s, %d", __func__, __LINE__);
317 bundle_add(b, "lock_op", "start_ready");
319 pid = aul_launch_app(LOCKD_PHONE_LOCK_PKG_NAME, b);
320 LOCKD_SECURE_DBG("aul_launch_app(%s, b), pid = %d", LOCKD_PHONE_LOCK_PKG_NAME,
329 lockd_process_mgr_terminate_lock_app(int lock_app_pid, int state)
332 ("lockd_process_mgr_terminate_lock_app, state:%d\n",
336 if (lock_app_pid != 0) {
337 LOCKD_DBG("Terminate Lock app(pid : %d)", lock_app_pid);
338 aul_terminate_pid(lock_app_pid);
343 void lockd_process_mgr_terminate_phone_lock(int phone_lock_pid)
345 LOCKD_DBG("Terminate Phone Lock(pid : %d)", phone_lock_pid);
346 aul_terminate_pid(phone_lock_pid);
349 void lockd_process_mgr_kill_lock_app(int lock_app_pid)
351 LOCKD_DBG ("lockd_process_mgr_kill_lock_app [pid:%d]..", lock_app_pid);
352 aul_kill_pid(lock_app_pid);
355 int lockd_process_mgr_check_lock(int pid)
358 LOCKD_DBG("%s, %d", __func__, __LINE__);
359 /* Check pid is invalid. */
360 if (aul_app_get_pkgname_bypid(pid, buf, sizeof(buf)) < 0) {
361 LOCKD_DBG("no such pkg by pid %d\n", pid);
363 LOCKD_SECURE_DBG("app pkgname = %s, pid = %d\n", buf, pid);
364 if (aul_app_is_running(buf) == TRUE) {
365 LOCKD_DBG("%s [pid = %d] is running\n", buf, pid);
368 LOCKD_SECURE_DBG("[pid = %d] is exist but %s is not running\n",
375 int lockd_process_mgr_check_call(int pid)
378 LOCKD_DBG("%s, %d", __func__, __LINE__);
380 /* Check pid is invalid. */
381 if (aul_app_get_pkgname_bypid(pid, buf, sizeof(buf)) < 0) {
382 LOCKD_DBG("no such pkg by pid %d", pid);
384 LOCKD_SECURE_DBG("app pkgname = %s, pid = %d", buf, pid);
385 if ((!strncmp(buf, LOCKD_VOICE_CALL_PKG_NAME, strlen(buf)))
386 || (!strncmp(buf, LOCKD_VIDEO_CALL_PKG_NAME, strlen(buf)))) {
393 int lockd_process_mgr_check_home(int pid)
396 char *pkgname = NULL;
398 LOCKD_DBG("%s, %d", __func__, __LINE__);
399 /* Check pid is invalid. */
400 if (aul_app_get_pkgname_bypid(pid, buf, sizeof(buf)) < 0) {
401 LOCKD_DBG("no such pkg by pid %d", pid);
403 LOCKD_SECURE_DBG("app pkgname = %s, pid = %d", buf, pid);
405 pkgname = vconf_get_str(VCONFKEY_SETAPPL_SELECTED_PACKAGE_NAME);
407 if ((pkgname != NULL) &&
408 (!strncmp(buf, pkgname, strlen(buf)))) {
409 LOCKD_SECURE_DBG("home pkgname = %s", pkgname);