4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
27 #include <pkgmgr-info.h>
28 #include <pkgmgrinfo_zone.h>
31 #include "menu_db_util.h"
32 #include "simple_util.h"
37 #define METADATA_LEGACY_LIFECYCLE "http://developer.samsung.com/tizen/metadata/legacylifecycle"
39 static const char *__appid = NULL;
40 static const char *__pkgid = NULL;
41 static int __aul_support_legacy_lifecycle = -1;
43 static int __get_pkgname_bypid(int pid, char *pkgname, int len);
45 SLPAPI int aul_app_get_pid(const char *appid)
52 ret = __app_send_raw(AUL_UTIL_PID, APP_GET_PID, (unsigned char *)appid, strlen(appid));
57 SLPAPI int aul_app_get_pid_cache(const char *appid)
64 ret = __app_send_raw(AUL_UTIL_PID, APP_GET_PID_CACHE, (unsigned char *)appid, strlen(appid));
69 SLPAPI int aul_app_get_last_caller_pid(int pid)
76 ret = __app_send_raw(AUL_UTIL_PID, APP_GET_LAST_CALLER_PID, (unsigned char *)&pid, sizeof(pid));
81 SLPAPI int aul_app_is_running(const char *appid)
88 ret = __app_send_raw(AUL_UTIL_PID, APP_IS_RUNNING, (unsigned char*)appid, strlen(appid));
96 SLPAPI int aul_app_get_running_app_info(aul_app_info_iter_fn iter_fn,
99 return aul_get_running_app_info_from_memory(iter_fn, user_param);
102 SLPAPI int aul_get_running_app_info_from_proc(aul_app_info_iter_fn iter_fn,
105 app_pkt_t *pkt = NULL;
106 char *saveptr1, *saveptr2;
111 memset(&info, 0, sizeof(info));
115 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_RUNNING_INFO, NULL, 0);
120 for( pkt_data = (char *)pkt->data; ; pkt_data = NULL) {
121 token = strtok_r(pkt_data, ";", &saveptr1);
124 info.pid = atoi(strtok_r(token, ":", &saveptr2));
125 info.appid = strtok_r(NULL, ":", &saveptr2);
126 info.app_path = strtok_r(NULL, ":", &saveptr2);
127 info.pkg_name = strdup(info.appid);
129 iter_fn(&info, user_param);
138 SLPAPI int aul_get_running_app_info_from_memory(aul_app_info_iter_fn iter_fn,
141 app_pkt_t *pkt = NULL;
142 char *saveptr1, *saveptr2;
147 memset(&info, 0, sizeof(info));
151 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_RUNNING_INFO_MEMORY, NULL, 0);
156 for( pkt_data = (char *)pkt->data; ; pkt_data = NULL) {
157 token = strtok_r(pkt_data, ";", &saveptr1);
160 info.pid = atoi(strtok_r(token, ":", &saveptr2));
161 info.appid = strtok_r(NULL, ":", &saveptr2);
162 info.app_path = strtok_r(NULL, ":", &saveptr2);
163 info.pkg_name = strdup(info.appid);
165 iter_fn(&info, user_param);
174 SLPAPI void aul_set_preinit_appid(const char *appid)
176 __appid = (char *)appid;
179 static const char* __aul_get_preinit_appid(void)
184 SLPAPI void aul_set_preinit_pkgid(const char *pkgid)
186 __pkgid = (char *)pkgid;
189 SLPAPI const char* aul_get_preinit_pkgid(void)
194 static int __get_pkgname_bypid(int pid, char *pkgname, int len)
197 app_info_from_db *menu_info;
199 cmdline = __proc_get_cmdline_bypid(pid);
203 if ((menu_info = _get_app_info_from_db_by_apppath(cmdline)) == NULL) {
207 snprintf(pkgname, len, "%s", _get_pkgname(menu_info));
210 _free_app_info_from_db(menu_info);
214 SLPAPI int aul_app_get_pkgname_bypid(int pid, char *pkgname, int len)
216 return aul_app_get_appid_bypid(pid, pkgname, len);
219 SLPAPI int aul_app_get_appid_bypid(int pid, char *appid, int len)
221 app_pkt_t *pkt = NULL;
224 char oldZone[64] = { 0, };
225 pkgmgrinfo_pkginfo_set_zone(_cur_zone, oldZone, 64);
227 if (_cur_zone == NULL) {
228 if (pid == getpid()) {
229 const char *preinit_appid = __aul_get_preinit_appid();
231 if (preinit_appid != NULL)
233 snprintf(appid, len > MAX_PACKAGE_STR_SIZE ? MAX_PACKAGE_STR_SIZE : len, "%s", preinit_appid);
234 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
239 if (pid == getpid() || getuid()==0 || geteuid()==0) {
240 if (__get_pkgname_bypid(pid, appid, len) == 0) {
241 SECURE_LOGD("appid for %d is %s", pid, appid);
242 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
245 /* support app launched by shell script*/
251 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
255 _D("second change pgid = %d, pid = %d", pgid, pid);
256 if (__get_pkgname_bypid(pgid, appid, len) == 0) {
257 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
261 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
267 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
271 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_GET_APPID_BYPID, (unsigned char *)&pid, sizeof(pid));
274 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
277 if(pkt->cmd == APP_GET_INFO_ERROR) {
279 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
283 snprintf(appid, len, "%s", pkt->data);
285 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
289 static int __get_pkgid_bypid(int pid, char *pkgid, int len)
292 app_info_from_db *menu_info;
294 if (pid == getpid()) {
295 const char *preinit_pkgid = aul_get_preinit_pkgid();
296 if (preinit_pkgid != NULL) {
297 snprintf(pkgid, len, "%s", preinit_pkgid);
302 cmdline = __proc_get_cmdline_bypid(pid);
306 if ((menu_info = _get_app_info_from_db_by_apppath(cmdline)) == NULL) {
310 snprintf(pkgid, len, "%s", _get_pkgid(menu_info));
313 _free_app_info_from_db(menu_info);
318 SLPAPI int aul_app_get_pkgid_bypid(int pid, char *pkgid, int len)
320 app_pkt_t *pkt = NULL;
322 char oldZone[64] = { 0, };
324 pkgmgrinfo_pkginfo_set_zone(_cur_zone, oldZone, 64);
325 if(pid == getpid() || getuid()==0 || geteuid()==0) {
326 if (__get_pkgid_bypid(pid, pkgid, len) == 0) {
327 SECURE_LOGD("pkgid for %d is %s", pid, pkgid);
328 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
331 /* support app launched by shell script*/
335 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
339 _D("second change pgid = %d, pid = %d", pgid, pid);
340 if (__get_pkgid_bypid(pgid, pkgid, len) == 0) {
341 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
345 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
350 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
354 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_GET_PKGID_BYPID, (unsigned char *)&pid, sizeof(pid));
357 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
360 if(pkt->cmd == APP_GET_INFO_ERROR) {
362 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
365 snprintf(pkgid, len, "%s", pkt->data);
367 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
372 SLPAPI int aul_app_get_cmdline_bypid(int pid, char *cmdline, int len)
374 app_pkt_t *pkt = NULL;
379 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_GET_CMDLINE, (unsigned char *)&pid, sizeof(pid));
383 if(pkt->cmd == APP_GET_INFO_ERROR) {
388 snprintf(cmdline, len, "%s", pkt->data);
389 _D("cmdline : %s", cmdline);
394 SLPAPI int aul_get_support_legacy_lifecycle(void)
396 char oldZone[64] = { 0, };
398 pkgmgrinfo_pkginfo_set_zone(_cur_zone, oldZone, 64);
399 if (__aul_support_legacy_lifecycle != -1) {
400 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
401 return __aul_support_legacy_lifecycle;
405 pkgmgrinfo_appinfo_h handle = NULL;
406 char *metadata_value = NULL;
409 char appid[128] = {0,};
411 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
412 if (ret != AUL_R_OK) {
413 _E("Failed to get appid");
417 __appid = strdup(appid);
420 ret = pkgmgrinfo_appinfo_get_appinfo(__appid, &handle);
421 if (ret != PMINFO_R_OK) {
422 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
426 ret = pkgmgrinfo_appinfo_get_metadata_value(handle, METADATA_LEGACY_LIFECYCLE, &metadata_value);
427 if (ret != PMINFO_R_OK) {
428 __aul_support_legacy_lifecycle = 0;
430 __aul_support_legacy_lifecycle = 1;
433 pkgmgrinfo_appinfo_destroy_appinfo(handle);
434 pkgmgrinfo_pkginfo_set_zone(oldZone, NULL, 0);
435 return __aul_support_legacy_lifecycle;
438 SLPAPI char *aul_get_group_info(void)
440 app_pkt_t *pkt = NULL;
444 pkt = __app_send_cmd_with_result(AUL_UTIL_PID, APP_GET_GROUP_INFO, NULL, 0);
446 len = strlen((const char *)pkt->data);
447 result = (char *)malloc(sizeof(char) * (len +1));
448 if (result == NULL) {
449 _E("Failed to allocate memory");
453 strncpy(result, (const char *)pkt->data, len);