From ce028ae0de4099decc09a343d43150bcfc7889b1 Mon Sep 17 00:00:00 2001 From: Kim Kibum Date: Sun, 29 Apr 2012 16:59:40 +0900 Subject: [PATCH] upload tizen1.0 source --- CMakeLists.txt | 2 +- debian/changelog | 14 +-- debian/control | 2 +- include/app_sock.h | 11 +- include/aul.h | 16 +-- include/aul_util.h | 42 +++++++ include/launch.h | 7 ++ include/menu_db_util.h | 35 +----- launchpad_run | 8 -- launchpad_src/launchpad.c | 83 +++++++++----- launchpad_src/sigchild.h | 10 +- packaging/aul.spec | 27 +++-- src/app_sock.c | 58 +++++++++- src/launch.c | 22 +++- src/launch_with_result.c | 5 +- src/pkginfo.c | 89 ++++----------- src/service.c | 1 + test/CMakeLists.txt | 7 +- test/ac_daemon.c | 273 +++++++++++++++++++++++++++++++++++++++++++++- test/app_test.c | 2 + test/aul_test.c | 5 +- test/launch_app.c | 8 +- 22 files changed, 537 insertions(+), 190 deletions(-) create mode 100755 include/aul_util.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 66e30f0..103bbaf 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ MESSAGE("Build type: ${CMAKE_BUILD_TYPE}") # Set required packages INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED dlog ecore x11 libprivilege-control app-checker) +pkg_check_modules(pkgs REQUIRED dlog ecore x11 libprivilege-control app-checker rua glib-2.0) pkg_check_modules(libpkgs REQUIRED dlog bundle dbus-glib-1 ail xdgmime app-checker) FIND_LIBRARY(LIB_DL dl) diff --git a/debian/changelog b/debian/changelog index cb67e43..1e6ffcf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,15 +1,7 @@ -aul-1 (0.0.154-4) unstable; urgency=low - - * Updated Code - * Git: pkgs/a/aul-1 - * Tag: aul-1_0.0.154-4 - - -- Sewook Park Sat, 25 Feb 2012 17:41:50 +0900 - -aul-1 (0.0.154-3) unstable; urgency=low +aul-1 (0.0.169) unstable; urgency=low * Initial release * Git: pkgs/a/aul-1 - * Tag: aul-1_0.0.154-3 + * Tag: aul-1_0.0.169 - -- Jaeho Lee Wed, 07 Dec 2011 14:05:55 +0900 + -- Jaeho Lee Tue, 20 Mar 2012 14:36:05 +0900 diff --git a/debian/control b/debian/control index 78a8785..9828e28 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: aul-1 Section: devel Priority: extra Maintainer: Jayoun Lee , Sewook Park , Jaeho Lee , Yoonkyong Lee , Youmin Ha , Kunhoon Baik -Build-Depends: debhelper (>= 5), libdbus-glib-1-dev, libsqlite3-dev, libx11-dev, libecore-dev, libbundle-dev, libail-0-dev, dlog-dev, libxdgmime-dev, libprivilege-control-dev, sqlite3, libapp-checker-dev, libapp-checker-server-dev +Build-Depends: debhelper (>= 5), libdbus-glib-1-dev, libsqlite3-dev, libx11-dev, libecore-dev, libbundle-dev, libail-0-dev, dlog-dev, libxdgmime-dev, libprivilege-control-dev, sqlite3, libapp-checker-dev, libapp-checker-server-dev, librua-dev Standards-Version: 0.1.0 Package: libaul-1 diff --git a/include/app_sock.h b/include/app_sock.h index c69cd53..64f8a90 100755 --- a/include/app_sock.h +++ b/include/app_sock.h @@ -20,8 +20,8 @@ */ -#ifndef __APP_PKT_T_ -#define __APP_PKT_T_ +#ifndef __APP_PKT_H_ +#define __APP_PKT_H_ #include #define __USE_GNU @@ -36,7 +36,11 @@ enum app_cmd { APP_RESULT, APP_START_RES, APP_CANCEL, - APP_KILL_BY_PID + APP_KILL_BY_PID, + ADD_HISTORY, + RUNNING_INFO, + RUNNING_INFO_RESULT, + IS_RUNNING }; #define AUL_SOCK_PREFIX "/tmp/alaunch" @@ -54,6 +58,7 @@ int __create_server_sock(int pid); int __create_client_sock(int pid); int __app_send_raw(int pid, int cmd, unsigned char *kb_data, int datalen); app_pkt_t *__app_recv_raw(int fd, int *clifd, struct ucred *cr); +app_pkt_t *__app_send_cmd_with_result(int pid, int cmd); #endif diff --git a/include/aul.h b/include/aul.h index c1b7ecd..3113c9b 100755 --- a/include/aul.h +++ b/include/aul.h @@ -776,7 +776,7 @@ int aul_app_get_pkgname_bypid(int pid, char *pkgname, int len); * None * */ -int aul_open_file(const char* filename); +int aul_open_file(const char* filename) __attribute__((deprecated)); /** * @par Description: @@ -825,7 +825,7 @@ int aul_open_file(const char* filename); * @remark * None */ -int aul_open_file_with_mimetype(const char *filename, const char *mimetype); +int aul_open_file_with_mimetype(const char *filename, const char *mimetype) __attribute__((deprecated)); /** * @par Description: @@ -871,7 +871,7 @@ int aul_open_file_with_mimetype(const char *filename, const char *mimetype); * None * */ -int aul_open_content(const char* content); +int aul_open_content(const char* content) __attribute__((deprecated)); /** * @par Description: @@ -910,7 +910,7 @@ int aul_open_content(const char* content); * None * */ -int aul_get_defapp_from_mime(const char *mimetype, char *defapp, int len); +int aul_get_defapp_from_mime(const char *mimetype, char *defapp, int len) __attribute__((deprecated)); /** * @par Description: @@ -947,7 +947,7 @@ int aul_get_defapp_from_mime(const char *mimetype, char *defapp, int len); * @remark * None */ -int aul_set_defapp_with_mime(const char *mimetype, const char *defapp); +int aul_set_defapp_with_mime(const char *mimetype, const char *defapp) __attribute__((deprecated)); /** * @par Description: @@ -1250,7 +1250,7 @@ typedef void (*aul_service_res_fn)(bundle *b, int reserved, void *user_data); * To see kinds of default service provided by platform, see "aul_service.h" header file * */ -int aul_open_service(const char *svcname, bundle *b, aul_service_res_fn cbfunc, void *data); +int aul_open_service(const char *svcname, bundle *b, aul_service_res_fn cbfunc, void *data) __attribute__((deprecated)); /** * @par Description: @@ -1383,7 +1383,7 @@ int aul_send_service_result(bundle *b); * None * */ -int aul_set_defapp_for_service(const char *svcname, const char *defapp); +int aul_set_defapp_for_service(const char *svcname, const char *defapp) __attribute__((deprecated)); /** * @par Description: @@ -1423,7 +1423,7 @@ int aul_set_defapp_for_service(const char *svcname, const char *defapp); * None * */ -int aul_get_defapp_for_service(const char *svcname, char *defapp, int len); +int aul_get_defapp_for_service(const char *svcname, char *defapp, int len) __attribute__((deprecated)); /** @} */ diff --git a/include/aul_util.h b/include/aul_util.h new file mode 100755 index 0000000..91e2416 --- /dev/null +++ b/include/aul_util.h @@ -0,0 +1,42 @@ +/* + * aul + * + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , Jaeho Lee + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + + +#ifndef __AUL_UTIL_H_ +#define __AUL_UTIL_H_ + +#define AUL_UTIL_PID -2 + +#define MAX_PACKAGE_STR_SIZE 512 +#define MAX_PACKAGE_APP_PATH_SIZE 512 +#define MAX_RUNNING_APP_INFO 512 + +struct history_data { + char pkg_name[MAX_PACKAGE_STR_SIZE]; + char app_path[MAX_PACKAGE_APP_PATH_SIZE]; + int len; + unsigned char data[1]; +}; + +#endif + + + diff --git a/include/launch.h b/include/launch.h index b52e3ca..3a46f39 100755 --- a/include/launch.h +++ b/include/launch.h @@ -34,4 +34,11 @@ int app_start(bundle *kb); int app_send_cmd(int pid, int cmd, bundle *kb); int app_request_to_launchpad(int cmd, const char *pkgname, bundle *kb); +int _app_start_res_prepare(bundle *kb); +int app_result(int cmd, bundle *kb, int launched_pid); +int aul_send_result(bundle *kb, int is_cancel); +int aul_launch_app_with_result(const char *pkgname, bundle *kb, + void (*cbfunc) (bundle *, int, void *), + void *data); + #endif diff --git a/include/menu_db_util.h b/include/menu_db_util.h index 8b6a814..39141f8 100755 --- a/include/menu_db_util.h +++ b/include/menu_db_util.h @@ -47,9 +47,6 @@ typedef struct { char *app_path; /* exec */ char *original_app_path; /* exec */ char *app_type; /* x_slp_packagetype */ - int width; /* x_slp_baselayoutwidth */ - int height; /* x_slp_baselayoutheight */ - int vertical; /* x_slp_ishorizontalscale */ int multiple; /* x_slp_multiple */ int task_manage; /* x_slp_taskmanage */ char *pkg_type; @@ -106,24 +103,6 @@ static inline char *_get_app_app_type(app_info_from_db *menu_info) return menu_info->app_type; } -static inline int _get_app_width(app_info_from_db *menu_info) -{ - return menu_info->width; -} - -static inline int _get_app_height(app_info_from_db *menu_info) -{ - return menu_info->height; -} - -static inline int _is_app_scalable_with_height(app_info_from_db *menu_info) -{ - if (menu_info->vertical) - return 0; - else - return 1; -} - static inline int _is_app_multi_inst(app_info_from_db *menu_info) { if (menu_info->multiple) @@ -186,15 +165,11 @@ static inline app_info_from_db *_get_app_info_from_db_by_pkgname( if (menu_info->app_path != NULL) menu_info->original_app_path = strdup(menu_info->app_path); - ret = ail_appinfo_get_int(handle, AIL_PROP_X_SLP_BASELAYOUTWIDTH_INT, &menu_info->width); - - ret = ail_appinfo_get_int(handle, AIL_PROP_X_SLP_BASELAYOUTHEIGHT_INT, &menu_info->height); - - ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_ISHORIZONTALSCALE_BOOL, &menu_info->vertical); - - ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_MULTIPLE_BOOL, &menu_info->multiple); - - ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, &menu_info->task_manage); + ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_MULTIPLE_BOOL, + (bool *)&menu_info->multiple); + + ret = ail_appinfo_get_bool(handle, AIL_PROP_X_SLP_TASKMANAGE_BOOL, + (bool *)&menu_info->task_manage); ret = ail_appinfo_get_str(handle, AIL_PROP_TYPE_STR, &str); if (str) { diff --git a/launchpad_run b/launchpad_run index c5ccbf5..40c8172 100755 --- a/launchpad_run +++ b/launchpad_run @@ -2,13 +2,5 @@ mkdir /tmp/alaunch chmod 1777 /tmp/alaunch -j=0 -while [ ! -f /opt/etc/.profile_ready ]; -do - let j++ - echo -ne "Waiting profile_ready $j\r" - sleep 0.1 -done - /usr/bin/launchpad_preloading_preinitializing_daemon " " & /usr/bin/ac_daemon & diff --git a/launchpad_src/launchpad.c b/launchpad_src/launchpad.c index 48aab9f..c614d76 100755 --- a/launchpad_src/launchpad.c +++ b/launchpad_src/launchpad.c @@ -49,6 +49,7 @@ #include "preload.h" #include "perf.h" #include "sigchild.h" +#include "aul_util.h" #include "heap_dbg.h" @@ -57,7 +58,7 @@ #include "gl.h" #include - +#include #define _static_ static inline #define POLLFD_MAX 1 @@ -71,24 +72,21 @@ #define PATH_DA_SO "/home/developer/sdk_tools/da/da_probe.so" -static double root_width; -static double root_height; static char *launchpad_cmdline; static int initialized = 0; - _static_ void __set_oom(); _static_ void __set_env(app_info_from_db * menu_info, bundle * kb); _static_ int __prepare_exec(const char *pkg_name, const char *app_path, app_info_from_db * menu_info, bundle * kb); _static_ int __fake_launch_app(int cmd, int pid, bundle * kb); -static void __fill_argv(const char *key, const char *value, void *data); _static_ char **__create_argc_argv(bundle * kb, int *margc); _static_ int __normal_fork_exec(int argc, char **argv); _static_ void __real_launch(const char *app_path, bundle * kb); -_static_ int __add_history(int caller, int callee, const char *pkgname); +_static_ void __add_history(int caller, int callee, const char *pkgname, + bundle *b, const char *app_path); static inline int __parser(const char *arg, char *out, int out_size); _static_ void __modify_bundle(bundle * kb, int caller_pid, app_info_from_db * menu_info, int cmd); @@ -106,6 +104,7 @@ _static_ void __launchpad_main_loop(int main_fd); _static_ int __launchpad_pre_init(int argc, char **argv); _static_ int __launchpad_post_init(); +extern ail_error_e ail_db_close(void); @@ -167,13 +166,13 @@ _static_ void __set_env(app_info_from_db * menu_info, bundle * kb) if(str_array != NULL) { for (i = 0; i < len; i++) { _D("index : [%d]", i); - __set_sdk_env(menu_info, str_array[i]); + __set_sdk_env(menu_info, (char *)str_array[i]); } } } else { str = bundle_get_val(kb, AUL_K_SDK); if(str != NULL) { - __set_sdk_env(menu_info, str); + __set_sdk_env(menu_info, (char *)str); } } } @@ -194,7 +193,7 @@ _static_ int __prepare_exec(const char *pkg_name, __set_oom(); /* SET SMACK LABEL */ - __set_smack(app_path); + __set_smack((char *)app_path); /* SET DAC*/ if (__set_dac(pkg_name) < 0) { @@ -237,18 +236,6 @@ _static_ int __fake_launch_app(int cmd, int pid, bundle * kb) return ret; } -static int __g_argv_pos = 0; -static void __fill_argv(const char *key, const char *value, void *data) -{ - char **argv; - argv = (char **)data; - - argv[__g_argv_pos] = (char *)key; - argv[__g_argv_pos + 1] = (char *)value; - - __g_argv_pos += 2; -} - _static_ char **__create_argc_argv(bundle * kb, int *margc) { char **argv; @@ -298,16 +285,46 @@ _static_ void __real_launch(const char *app_path, bundle * kb) __normal_fork_exec(app_argc, app_argv); } -_static_ int __add_history(int caller, int callee, const char *pkgname) +_static_ void __add_history(int caller, int callee, const char *pkgname, + bundle *b, const char *app_path) { - /* TODO - make real history */ + struct history_data *hd; + bundle_raw *kb_data; + int len; + _D("***** HISTORY *****\n"); _D("%d ==> %d(%s) \n", caller, callee, pkgname); _D("*******************\n"); - return 0; + if (b) { + bundle_encode(b, (bundle_raw **)&kb_data, &len); + hd = (struct history_data *)malloc(sizeof(char) * (len+1029)); + + strncpy(hd->pkg_name, pkgname, MAX_PACKAGE_STR_SIZE-1); + strncpy(hd->app_path, app_path, MAX_PACKAGE_APP_PATH_SIZE-1); + hd->len = len; + memcpy(hd->data, kb_data, len); + + __app_send_raw(AUL_UTIL_PID, ADD_HISTORY, (unsigned char *)hd, + hd->len+1029); + free(kb_data); + free(hd); + } else { + hd = (struct history_data *)malloc(sizeof(char) * 1029); + + strncpy(hd->pkg_name, pkgname, MAX_PACKAGE_STR_SIZE-1); + strncpy(hd->app_path, app_path, MAX_PACKAGE_APP_PATH_SIZE-1); + hd->len = 0; + + __app_send_raw(AUL_UTIL_PID, ADD_HISTORY, (unsigned char *)hd, + 1029); + free(hd); + } + + return; } + /* * Parsing original app path to retrieve default bundle * @@ -696,8 +713,8 @@ _static_ void __launchpad_main_loop(int main_fd) app_pkt_t *pkt = NULL; app_info_from_db *menu_info = NULL; - const char *pkg_name; - const char *app_path; + const char *pkg_name = NULL; + const char *app_path = NULL; int pid = -1; int clifd = -1; struct ucred cr; @@ -804,15 +821,23 @@ _static_ void __launchpad_main_loop(int main_fd) } end: - if (pid > 0) - __add_history(cr.pid, pid, pkg_name); - __send_result_to_caller(clifd, pid); if (pid > 0) { int ret; ret = ac_check_launch_privilege(pkg_name, menu_info->pkg_type, pid); _D("ac_check_launch_privilege : %d", ret); + switch (pkt->cmd) { + case APP_RESUME: + __add_history(cr.pid, pid, pkg_name, NULL, app_path); + break; + case APP_START: + case APP_START_RES: + __add_history(cr.pid, pid, pkg_name, kb, app_path); + break; + default: + _D("no launch case"); + } } if (menu_info != NULL) diff --git a/launchpad_src/sigchild.h b/launchpad_src/sigchild.h index de7a059..b3b539f 100755 --- a/launchpad_src/sigchild.h +++ b/launchpad_src/sigchild.h @@ -82,7 +82,7 @@ static inline int __send_app_dead_signal(int dead_pid) return 0; } -static void *__sigchild_thread(void *data) +static int __sigchild_action(void *data) { pid_t dead_pid; char buf[MAX_LOCAL_BUFSZ]; @@ -98,7 +98,6 @@ static void *__sigchild_thread(void *data) __socket_garbage_collector(); end: - pthread_exit(0); return 0; } @@ -115,12 +114,7 @@ static void __launchpad_sig_child(int signo, siginfo_t *info, void *data) while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0) { if (child_pid == child_pgid) killpg(child_pgid, SIGKILL); - if (pthread_create(&thid, NULL, - __sigchild_thread, (void *)child_pid) != 0) { - printf("Failed to create thread\n"); - return; - } - pthread_detach(thid); + __sigchild_action((void *)child_pid); } return; diff --git a/packaging/aul.spec b/packaging/aul.spec index 8cad851..ee9e87e 100644 --- a/packaging/aul.spec +++ b/packaging/aul.spec @@ -1,9 +1,9 @@ Name: aul Summary: App utility library -Version: 0.0.154 -Release: 1 +Version: 0.0.169 +Release: 2 Group: System/Libraries -License: Apache-2.0 +License: Apache License, Version 2.0 Source0: %{name}-%{version}.tar.gz Requires(post): /sbin/ldconfig @@ -20,6 +20,7 @@ BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(ail) BuildRequires: pkgconfig(xdgmime) BuildRequires: pkgconfig(libprivilege-control) +BuildRequires: pkgconfig(rua) %description @@ -53,8 +54,8 @@ chmod +x %{buildroot}/usr/bin/aul_service_test.sh %post -/sbin/ldconfig +/sbin/ldconfig mkdir -p /etc/rc.d/rc3.d mkdir -p /etc/rc.d/rc4.d ln -sf /etc/init.d/launchpad_run /etc/rc.d/rc3.d/S35launchpad_run @@ -62,26 +63,32 @@ ln -sf /etc/init.d/launchpad_run /etc/rc.d/rc4.d/S80launchpad_run mkdir -p /opt/dbspace sqlite3 /opt/dbspace/.mida.db < /opt/share/mida_db.sql +rm -rf /opt/share/mida_db.sql -chown root:5000 /opt/dbspace/.mida.db -chown root:5000 /opt/dbspace/.mida.db-journal +chown 0:0 /usr/lib/libaul.so.0.1.0 +chown 0:5000 /opt/dbspace/.mida.db +chown 0:5000 /opt/dbspace/.mida.db-journal + +chmod 644 /usr/lib/libaul.so.0.1.0 chmod 664 /opt/dbspace/.mida.db chmod 664 /opt/dbspace/.mida.db-journal -rm -f /opt/share/mida_db.sql - %postun -p /sbin/ldconfig %files /usr/lib/*.so.* /etc/init.d/launchpad_run -%config(noreplace,missingok) /opt/share/mida_db.sql -/usr/bin/* +/usr/bin/aul_service.sh +/usr/bin/aul_service_test.sh +/opt/share/mida_db.sql +/usr/bin/aul_mime.sh +/usr/bin/aul_test /usr/bin/launch_app /opt/share/miregex/* /opt/share/service/* /opt/share/preload_list.txt /usr/bin/launchpad_preloading_preinitializing_daemon +/usr/bin/ac_daemon %files devel /usr/include/aul/*.h diff --git a/src/app_sock.c b/src/app_sock.c index b469c46..4a8011e 100755 --- a/src/app_sock.c +++ b/src/app_sock.c @@ -39,7 +39,13 @@ static int __connect_client_sock(int sockfd, const struct sockaddr *saptr, sockl static inline void __set_sock_option(int fd, int cli) { int size; - struct timeval tv = { 1, 200 * 1000 }; /* 1.2 sec */ +#ifdef __i386__ + struct timeval tv = { 5, 200 * 1000 }; /* 5.2 sec */ + _D("time out : 5.2 sec"); +#else + struct timeval tv = { 1, 200 * 1000 }; /* 1.2 sec */ + _D("time out : 1.2 sec"); +#endif size = AUL_SOCK_MAXBUFF; setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)); @@ -351,3 +357,53 @@ app_pkt_t *__app_recv_raw(int fd, int *clifd, struct ucred *cr) return pkt; } +app_pkt_t *__app_send_cmd_with_result(int pid, int cmd) +{ + int fd; + int len; + app_pkt_t *pkt = NULL; + + fd = __create_client_sock(pid); + if (fd < 0) + return NULL; + + pkt = (app_pkt_t *) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if (NULL == pkt) { + _E("Malloc Failed!"); + return NULL; + } + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + pkt->cmd = cmd; + pkt->len = 0; + + if ((len = send(fd, pkt, 8, 0)) != 8) { + _E("sendto() failed - %d", len); + if (errno == EPIPE) { + _E("pid:%d, fd:%d\n", pid, fd); + } + close(fd); + + free(pkt); + return NULL; + } + + len = recv(fd, pkt, AUL_SOCK_MAXBUFF, 0); + if (len == -1) { + if (errno == EAGAIN) { + _E("recv timeout \n"); + free(pkt); + return NULL; + } else { + _E("recv error\n"); + free(pkt); + return NULL; + } + } else + _D("recv result = %d", len); + close(fd); + + return pkt; +} + + diff --git a/src/launch.c b/src/launch.c index 13d6014..e82bb5e 100755 --- a/src/launch.c +++ b/src/launch.c @@ -34,8 +34,10 @@ #include "app_sock.h" #include "perf.h" #include "simple_util.h" +#include "launch.h" static int aul_initialized = 0; +static int aul_fd; static int (*_aul_handler) (aul_type type, bundle *kb, void *data) = NULL; static void *_aul_data; @@ -357,23 +359,33 @@ int aul_register_init_callback( int aul_initialize() { - int fd; - if (aul_initialized) { _E("aul already initialized"); return AUL_R_ECANCELED; } - fd = __create_server_sock(getpid()); - if (fd < 0) { + aul_fd = __create_server_sock(getpid()); + if (aul_fd < 0) { _E("aul_init create sock failed"); return AUL_R_ECOMM; } aul_initialized = 1; - return fd; + return aul_fd; +} + +SLPAPI void aul_finalize() +{ + int ret; + + if (aul_initialized) { + ret = close(aul_fd); + } + + return; } + SLPAPI int aul_launch_app(const char *pkgname, bundle *kb) { int ret; diff --git a/src/launch_with_result.c b/src/launch_with_result.c index ab331e3..db9b83a 100755 --- a/src/launch_with_result.c +++ b/src/launch_with_result.c @@ -135,7 +135,8 @@ static int __call_app_result_callback(bundle *kb, int is_cancel, return -1; /* In case of aul_forward_app, update the callback data */ - if( is_cancel == 1 && (fwdpid_str = bundle_get_val(kb, AUL_K_FWD_CALLEE_PID)) ) + if(is_cancel == 1 && + (fwdpid_str = (char *)bundle_get_val(kb, AUL_K_FWD_CALLEE_PID))) { app_resultcb_info_t newinfo; newinfo.launched_pid = atoi(fwdpid_str); @@ -281,7 +282,7 @@ SLPAPI int aul_forward_app(const char* pkgname, bundle *kb) if(pkgname == NULL || kb == NULL) return AUL_R_EINVAL; - caller = bundle_get_val(kb, AUL_K_CALLER_PID); + caller = (char *)bundle_get_val(kb, AUL_K_CALLER_PID); if(caller == NULL) { _E("original msg doest not have caller pid"); return AUL_R_EINVAL; diff --git a/src/pkginfo.c b/src/pkginfo.c index d9b828a..0e5b9d8 100755 --- a/src/pkginfo.c +++ b/src/pkginfo.c @@ -28,98 +28,57 @@ #include "aul_api.h" #include "menu_db_util.h" #include "simple_util.h" +#include "app_sock.h" +#include "aul_util.h" typedef struct _internal_param_t { aul_app_info_iter_fn enum_fn; void *user_param; } internal_param_t; -static int __get_pkginfo(const char *dname, const char *cmdline, void *priv); static int __get_pkgname_bypid(int pid, char *pkgname, int len); - SLPAPI int aul_app_is_running(const char *pkgname) { - char *apppath = NULL; - ail_appinfo_h handle; - ail_error_e ail_ret; - int ret = 0; - int i = 0; if (pkgname == NULL) return 0; - ail_ret = ail_package_get_appinfo(pkgname, &handle); - if (ail_ret != AIL_ERROR_OK) { - _E("ail_package_get_appinfo with %s failed", pkgname); - return ret; - } + ret = __app_send_raw(AUL_UTIL_PID, IS_RUNNING, (unsigned char*)pkgname, strlen(pkgname)); - ail_ret = ail_appinfo_get_str(handle, AIL_PROP_EXEC_STR, &apppath); - if (ail_ret != AIL_ERROR_OK) { - _E("ail_appinfo_get_str failed"); - goto out; - } - - if (apppath == NULL) - goto out; - - /*truncate apppath if it includes default bundles */ - while (apppath[i] != 0) { - if (apppath[i] == ' ' || apppath[i] == '\t') { - apppath[i]='\0'; - break; - } - i++; - } - - if (__proc_iter_cmdline(NULL, apppath) > 0) - ret = 1; - else - ret = 0; - - out: - if (ail_package_destroy_appinfo(handle) != AIL_ERROR_OK) - _E("ail_destroy_rs failed"); return ret; } -static int __get_pkginfo(const char *dname, const char *cmdline, void *priv) -{ - internal_param_t *p; - app_info_from_db *menu_info; - aul_app_info info; - - p = (internal_param_t *) priv; - if ((menu_info = _get_app_info_from_db_by_apppath(cmdline)) == NULL) - goto out; - else { - info.pid = atoi(dname); - info.pkg_name = _get_pkgname(menu_info); - info.app_path = _get_app_path(menu_info); - _D("get pkginfo - %d %s", info.pid, info.app_path); - p->enum_fn(&info, p->user_param); - } - - out: - if (menu_info != NULL) - _free_app_info_from_db(menu_info); - return 0; -} - SLPAPI int aul_app_get_running_app_info(aul_app_info_iter_fn enum_fn, void *user_param) { - internal_param_t param; + app_pkt_t *pkt = NULL; + char *saveptr1, *saveptr2; + char *token; + char *pkt_data; + aul_app_info info; if (enum_fn == NULL) return AUL_R_EINVAL; - param.enum_fn = enum_fn; - param.user_param = user_param; + pkt = __app_send_cmd_with_result(AUL_UTIL_PID, RUNNING_INFO); + + if (pkt == NULL) + return AUL_R_ERROR; + + for( pkt_data = (char *)pkt->data; ; pkt_data = NULL) { + token = strtok_r(pkt_data, ";", &saveptr1); + if (token == NULL) + break; + info.pid = atoi(strtok_r(token, ":", &saveptr2)); + info.pkg_name = strtok_r(NULL, ":", &saveptr2); + info.app_path = strtok_r(NULL, ":", &saveptr2); + + enum_fn(&info, user_param); + } - __proc_iter_cmdline(__get_pkginfo, ¶m); + free(pkt); return AUL_R_OK; } diff --git a/src/service.c b/src/service.c index ebf28a0..b128508 100755 --- a/src/service.c +++ b/src/service.c @@ -34,6 +34,7 @@ #include "mida.h" #include "menu_db_util.h" #include "simple_util.h" +#include "launch.h" static int __get_defapp_from_desktop(const char *svcname, char *defapp, int len); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fe249f4..757c149 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,4 +1,5 @@ # Test executables + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${TEST_CFLAGS}") add_executable(aul_test @@ -25,8 +26,10 @@ set_target_properties(test_app PROPERTIES COMPILE_FLAGS "-fpie") target_link_libraries(test_app "-pie" aul ${pkgs_LDFLAGS} ) add_executable(ac_daemon - ac_daemon.c) -target_link_libraries(ac_daemon app-checker-server glib-2.0 ${pkgs_LDFLAGS}) + ac_daemon.c + ../src/app_sock.c + ../src/simple_util.c) +target_link_libraries(ac_daemon app-checker-server rua glib-2.0 bundle ail ${pkgs_LDFLAGS}) INSTALL(TARGETS ac_daemon DESTINATION bin) diff --git a/test/ac_daemon.c b/test/ac_daemon.c index 62a5625..37ff8ac 100755 --- a/test/ac_daemon.c +++ b/test/ac_daemon.c @@ -21,8 +21,277 @@ #include #include - +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "simple_util.h" +#include "app_sock.h" +#include "aul_util.h" +#include "menu_db_util.h" + +static gboolean __add_history_handler(gpointer user_data) +{ + struct rua_rec rec; + int ret; + app_pkt_t *pkt = (app_pkt_t *)user_data; + struct history_data *hd = (struct history_data *)pkt->data; + + memset(&rec, 0, sizeof(rec)); + + rec.pkg_name = hd->pkg_name; + rec.app_path = hd->app_path; + + if(hd->len > 0) { + rec.arg = (char *)hd->data; + } + + _D("add rua history %s %s", rec.pkg_name, rec.app_path); + + ret = rua_add_history(&rec); + if (ret == -1) + _D("rua add history error"); + + free(pkt); + return false; +} + +int __send_result_to_client(int fd, int res) +{ + if (send(fd, &res, sizeof(int), MSG_NOSIGNAL) < 0) { + if (errno == EPIPE) + _E("send failed due to EPIPE.\n"); + _E("send fail to client"); + } + close(fd); + return 0; +} + +static int __get_pkginfo(const char *dname, const char *cmdline, void *priv) +{ + app_info_from_db *menu_info; + char *r_info; + + r_info = (char *)priv; + + if ((menu_info = _get_app_info_from_db_by_apppath(cmdline)) == NULL) + goto out; + else { + strncat(r_info, dname, 8); + strncat(r_info, ":", 1); + strncat(r_info, _get_pkgname(menu_info), MAX_PACKAGE_STR_SIZE); + strncat(r_info, ":", 1); + strncat(r_info, _get_app_path(menu_info), MAX_PACKAGE_APP_PATH_SIZE); + strncat(r_info, ";", 1); + } + + out: + if (menu_info != NULL) + _free_app_info_from_db(menu_info); + return 0; +} + +int __send_running_appinfo(int fd) +{ + app_pkt_t *pkt = NULL; + int len; + + pkt = (app_pkt_t *) malloc(sizeof(char) * AUL_SOCK_MAXBUFF); + if(!pkt) { + _E("malloc fail"); + return 0; + } + + memset(pkt, 0, AUL_SOCK_MAXBUFF); + + __proc_iter_cmdline(__get_pkginfo, pkt->data); + + pkt->cmd = RUNNING_INFO_RESULT; + pkt->len = strlen((char *)pkt->data) + 1; + + if ((len = send(fd, pkt, pkt->len + 8, 0)) != pkt->len + 8) { + if (errno == EPIPE) + _E("send failed due to EPIPE.\n"); + _E("send fail to client"); + } + + if(pkt) + free(pkt); + + close(fd); + return 0; +} + +int __app_is_running(const char *pkgname) +{ + char *apppath = NULL; + ail_appinfo_h handle; + ail_error_e ail_ret; + + int ret = 0; + int i = 0; + + if (pkgname == NULL) + return 0; + + ail_ret = ail_package_get_appinfo(pkgname, &handle); + if (ail_ret != AIL_ERROR_OK) { + _E("ail_package_get_appinfo with %s failed", pkgname); + return ret; + } + + ail_ret = ail_appinfo_get_str(handle, AIL_PROP_EXEC_STR, &apppath); + if (ail_ret != AIL_ERROR_OK) { + _E("ail_appinfo_get_str failed"); + goto out; + } + + if (apppath == NULL) + goto out; + + /*truncate apppath if it includes default bundles */ + while (apppath[i] != 0) { + if (apppath[i] == ' ' || apppath[i] == '\t') { + apppath[i]='\0'; + break; + } + i++; + } + + if (__proc_iter_cmdline(NULL, apppath) > 0) + ret = 1; + else + ret = 0; + + out: + if (ail_package_destroy_appinfo(handle) != AIL_ERROR_OK) + _E("ail_destroy_rs failed"); + return ret; +} + + +static gboolean __util_handler(gpointer data) +{ + GPollFD *gpollfd = (GPollFD *) data; + int fd = gpollfd->fd; + app_pkt_t *pkt; + int clifd; + struct ucred cr; + struct history_data *hd; + int ret = -1; + char pkgname[MAX_PACKAGE_STR_SIZE]; + + if ((pkt = __app_recv_raw(fd, &clifd, &cr)) == NULL) { + _E("recv error"); + return FALSE; + } + + switch (pkt->cmd) { + case ADD_HISTORY: + hd = (struct history_data *)pkt->data; + _D("cmd : %d, pkgname : %s, app_path : %s", pkt->cmd, hd->pkg_name, hd->app_path); + __send_result_to_client(clifd, 0); + g_timeout_add(1000, __add_history_handler, pkt); + break; + case RUNNING_INFO: + __send_running_appinfo(clifd); + free(pkt); + break; + case IS_RUNNING: + strncpy(pkgname, (const char*)pkt->data, MAX_PACKAGE_STR_SIZE-1); + ret = __app_is_running(pkgname); + __send_result_to_client(clifd, ret); + free(pkt); + break; + default: + _E("no support packet"); + } + + return TRUE; +} + +static gboolean __au_glib_check(GSource *src) +{ + GSList *fd_list; + GPollFD *tmp; + + fd_list = src->poll_fds; + do { + tmp = (GPollFD *) fd_list->data; + if ((tmp->revents & (POLLIN | POLLPRI))) + return TRUE; + fd_list = fd_list->next; + } while (fd_list); + + return FALSE; +} + +static gboolean __au_glib_dispatch(GSource *src, GSourceFunc callback, + gpointer data) +{ + callback(data); + return TRUE; +} + +static gboolean __au_glib_prepare(GSource *src, gint *timeout) +{ + return FALSE; +} + +static GSourceFuncs funcs = { + .prepare = __au_glib_prepare, + .check = __au_glib_check, + .dispatch = __au_glib_dispatch, + .finalize = NULL +}; + + +int __initialize() +{ + int fd; + int r; + GPollFD *gpollfd; + GSource *src; + + r = rua_init(); + + if (r == -1) { + _D("[APP %d] rua init error"); + return AC_R_ERROR; + } + + fd = __create_server_sock(AUL_UTIL_PID); + + src = g_source_new(&funcs, sizeof(GSource)); + + gpollfd = (GPollFD *) g_malloc(sizeof(GPollFD)); + gpollfd->events = POLLIN; + gpollfd->fd = fd; + + g_source_add_poll(src, gpollfd); + g_source_set_callback(src, (GSourceFunc) __util_handler, + (gpointer) gpollfd, NULL); + g_source_set_priority(src, G_PRIORITY_DEFAULT); + + r = g_source_attach(src, NULL); + if (r == 0) + { + /* TODO: error handle*/ + return AC_R_ERROR; + } + + return AC_R_OK; +} int main() { @@ -34,6 +303,8 @@ int main() ret = ac_server_initailize(); + ret = __initialize(); + g_main_loop_run(mainloop); return 0; diff --git a/test/app_test.c b/test/app_test.c index 9833824..eefc146 100755 --- a/test/app_test.c +++ b/test/app_test.c @@ -28,6 +28,8 @@ #include +extern int aul_listen_app_dead_signal(int (*func) (int, void *), void *data); + void do_create() { /* call real create callback*/ diff --git a/test/aul_test.c b/test/aul_test.c index 96c6a0b..a7eaa77 100755 --- a/test/aul_test.c +++ b/test/aul_test.c @@ -19,6 +19,7 @@ * */ + #include #include #include @@ -337,8 +338,6 @@ static void print_menu_db_info(const app_info_from_db *info) printf("\t==========================\n"); printf("\t pkg_name: %s\n", info->pkg_name); printf("\t app_path: %s\n", info->app_path); - printf("\t w: %d\n", info->width); - printf("\t h: %d\n", info->height); printf("\t is_minst: %d\n", 0); printf("\t==========================\n"); } @@ -539,7 +538,7 @@ static test_func_t test_func[] = { "[usage] all "}, {"is_run", is_run_test,"aul_is_running test", - "[usage] is_run_test "}, + "[usage] is_run "}, {"getallpkg", get_allpkg_test, "aul_app_get_running_app_info test", "[usage] getallpkg all"}, {"getpkgpid", get_pkgpid_test, "aul_app_get_pkgname_bypid test", diff --git a/test/launch_app.c b/test/launch_app.c index 20c62c7..59eac96 100755 --- a/test/launch_app.c +++ b/test/launch_app.c @@ -48,14 +48,18 @@ static bundle *create_internal_bundle(int start) int j = 1; strncpy(arg, gargv[i + 1], 1024); val_array[0] = strtok(arg,","); - while(val_array[j] = strtok(NULL,",")) + while(1) { + val_array[j] = strtok(NULL,","); + if(val_array[j] == NULL) + break; j++; } if(j==1) bundle_add(kb, gargv[i], gargv[i + 1]); else if(j>1) - bundle_add_str_array(kb, gargv[i], val_array, j); + bundle_add_str_array(kb, gargv[i], + (const char**)val_array, j); } } -- 2.7.4