#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/inotify.h>
#include <sys/stat.h>
-#include <sys/ioctl.h>
#include <dirent.h>
#include <sys/types.h>
#include <fcntl.h>
/* For multi-user support */
#include <tzplatform_config.h>
-/* For notification popups */
-#include <notification.h>
-
#include "pkgmgr_installer.h"
#include "comm_pkg_mgr_server.h"
#include "pkgmgr-server.h"
#define NO_MATCHING_FILE 11
static int backend_flag = 0; /* 0 means that backend process is not running */
-static int drawing_popup = 0; /* 0 means that pkgmgr-server has no popup now */
typedef struct {
char **env;
} user_ctx;
-/* For pkgs with no desktop file, inotify callback wont be called.
-* To handle that case ail_db_update is initialized as 1
-* This flag will be used to ensure that pkgmgr server does not exit
-* before the db is updated. */
-int ail_db_update = 1;
-
/*
8 bit value to represent maximum 8 backends.
Each bit position corresponds to a queue slot which
PMSVC_SVC_APP
}pkgmgr_svc_app_component;
-struct appdata {
- pm_dbus_msg *item;
- OPERATION_TYPE op_type;
-};
-
static int __check_backend_status_for_exit();
static int __check_queue_status_for_exit();
static int __check_backend_mode();
static int __is_backend_mode_quiet(int position);
static void __set_backend_mode(int position);
static void __unset_backend_mode(int position);
-static void response_cb1(void *data, void *event_info);
-static void response_cb2(void *data, void *event_info);
-static int create_popup(struct appdata *ad);
static void sighandler(int signo);
static int __get_position_from_pkg_type(char *pkgtype);
static int __is_efl_tpk_app(char *pkgpath);
return ret;
}
-static
-void response_cb1(void *data, void *event_info)
-{
- struct appdata *ad = (struct appdata *)data;
- int p = 0;
- int ret = 0;
- DBG("start of response_cb()\n");
-
- /* YES */
- DBG("Uninstalling... [%s]\n", ad->item->pkgid);
-
- if (strlen(ad->item->pkgid) == 0) {
- DBG("package_name is empty\n");
- }
-
- if (strlen(ad->item->pkg_type) == 0) {
- DBG("Fail : Uninstalling... [%s]\n",
- ad->item->pkgid);
- free(ad->item);
- drawing_popup = 0;
-
- return;
- }
-
- DBG("pkg_type = [%s]\n", ad->item->pkg_type);
-
- ret = _pm_queue_push(ad->item);
- p = __get_position_from_pkg_type(ad->item->pkg_type);
- __unset_backend_mode(p);
-
- /* Free resource */
- free(ad->item);
- /***************/
- if (ret)
- ERR("failed to push queue item");
-
- DBG("end of response_cb()\n");
-
- drawing_popup = 0;
-
- return;
-}
-
-static
-void response_cb2(void *data, void *event_info)
-{
- int p = 0;
- struct appdata *ad = (struct appdata *)data;
-
- DBG("start of response_cb()\n");
-
- /* NO */
- pkgmgr_installer *pi;
- gboolean ret_parse;
- gint argcp;
- gchar **argvp;
- GError *gerr = NULL;
-
- pi = pkgmgr_installer_new();
- if (!pi) {
- DBG("Failure in creating the pkgmgr_installer object");
- return;
- }
-
- ret_parse = g_shell_parse_argv(ad->item->args,
- &argcp, &argvp, &gerr);
- if (FALSE == ret_parse) {
- DBG("Failed to split args: %s", ad->item->args);
- DBG("messsage: %s", gerr->message);
- pkgmgr_installer_free(pi);
- return;
- }
-
- pkgmgr_installer_receive_request(pi, argcp, argvp);
-
- pkgmgr_installer_send_signal(pi, ad->item->pkg_type,
- ad->item->pkgid, "end",
- "cancel");
-
- pkgmgr_installer_free(pi);
- p = __get_position_from_pkg_type(ad->item->pkg_type);
- __set_backend_mode(p);
-
- /* Free resource */
- free(ad->item);
- /***************/
- /* queue_job should be called for every request that is pushed
- into queue. In "NO" case, request is not pushed so no need of
- calling queue_job*/
-
- DBG("end of response_cb()\n");
-
- drawing_popup = 0;
-
- return;
-}
-
#if 0
static char *__get_exe_path(const char *pkgid)
{
}
#endif
-static
-int create_popup(struct appdata *ad)
-{
- DBG("start of create_popup()\n");
-
- drawing_popup = 1;
-
- char sentence[MAX_PKG_ARGS_LEN] = { '\0' };
- char *pkgid = NULL;
- char app_name[MAX_PKG_NAME_LEN] = { '\0' };
-
- notification_h noti = NULL;
- notification_error_e err = NOTIFICATION_ERROR_NONE;
-
- noti = notification_create(NOTIFICATION_TYPE_NOTI);
- if (!noti) {
- DBG("Failed to create a popup notification\n");
- drawing_popup = 0;
- return -1;
- }
-
- /* Sentence of popup */
- int ret;
-
- pkgid = strrchr(ad->item->pkgid, '/') == NULL ?
- ad->item->pkgid : strrchr(ad->item->pkgid, '/') + 1;
-
- if (ad->op_type == OPERATION_INSTALL) {
- snprintf(sentence, sizeof(sentence) - 1, "Install?");
- } else if (ad->op_type == OPERATION_UNINSTALL) {
- char *label = NULL;
- pkgmgrinfo_pkginfo_h handle;
- ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, ad->item->uid, &handle);
-
- if (ret < 0){
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
- ret = pkgmgrinfo_pkginfo_get_label(handle, &label);
- if (ret < 0){
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
-
- snprintf(app_name, sizeof(app_name) - 1, label);
- ret = pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
- if (ret < 0){
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
-
- pkgid = app_name;
-
- snprintf(sentence, sizeof(sentence) - 1, "Uninstall?");
- } else if (ad->op_type == OPERATION_REINSTALL) {
- snprintf(sentence, sizeof(sentence) - 1, "Reinstall?");
- } else
- snprintf(sentence, sizeof(sentence) - 1, "Invalid request");
-
- /***********************************/
-
- err = notification_set_text(noti,
- NOTIFICATION_TEXT_TYPE_TITLE, pkgid,
- NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
- if (err != NOTIFICATION_ERROR_NONE) {
- DBG("Failed to set popup notification title\n");
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
-
- err = notification_set_text(noti,
- NOTIFICATION_TEXT_TYPE_CONTENT, sentence,
- NULL, NOTIFICATION_VARIABLE_TYPE_NONE);
- if (err != NOTIFICATION_ERROR_NONE) {
- DBG("Failed to set popup notification sentence\n");
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
-
- /* Details of popup (timeout, buttons...) */
- bundle *b = NULL;
-
- b = bundle_create();
- if (!b) {
- DBG("Failed to set popup notification details\n");
- drawing_popup = 0;
- notification_delete(noti);
- return -1;
- }
-
- /* TRANSLATION DOES NOT WORK ; TO FIX ?
- char *button1_text = dgettext("sys_string", "IDS_COM_SK_YES");
- char *button2_text = dgettext("sys_string", "IDS_COM_SK_NO");
- */
- char *timeout_text = "10";
- char *button1_text = "Yes";
- char *button2_text = "No";
- char *buttons_text = malloc(strlen(button1_text) +
- strlen(button2_text) + 2);
- strcpy(buttons_text, button1_text);
- strcat(buttons_text, ",");
- strcat(buttons_text, button2_text);
-
- bundle_add (b, "timeout", timeout_text);
- bundle_add (b, "noresize", "1");
- bundle_add (b, "buttons", buttons_text);
-
- free(buttons_text);
-
- err = notification_set_execute_option (noti,
- NOTIFICATION_EXECUTE_TYPE_RESPONDING,
- NULL, NULL, b);
- if (err != NOTIFICATION_ERROR_NONE) {
- DBG("Failed to set popup notification as interactive\n");
- drawing_popup = 0;
- bundle_free(b);
- notification_delete(noti);
- return -1;
- }
-
- /* Show the popup */
- err = notification_insert (noti, NULL);
- if (err != NOTIFICATION_ERROR_NONE) {
- DBG("Failed to set popup notification sentence\n");
- drawing_popup = 0;
- bundle_free(b);
- notification_delete(noti);
- return -1;
- }
-
- /* Catch user response */
- int button;
-
- err = notification_wait_response (noti, atoi(timeout_text), &button, NULL);
- if (err != NOTIFICATION_ERROR_NONE) {
- DBG("Failed to wait for user response, defaulting to 'no'\n");
- button = 2;
- }
-
- if (button == 1) {
- response_cb1(ad, NULL);
- } else if (button == 2) {
- response_cb2(ad, NULL);
- }
-
- bundle_free(b);
- notification_delete(noti);
-
- DBG("end of create_popup()\n");
- return 0;
-}
-
static void send_fail_signal(char *pname, char *ptype, char *args)
{
DBG("send_fail_signal start\n");
DBG(">> in callback >> Got request: [%s] [%d] [%s] [%s] [%s] [%s] [%s] [%s]",
req_id, req_type, pkg_type, pkgid, args, client, session, user);
- struct appdata *ad = (struct appdata *)cb_data;
-
pm_dbus_msg *item = calloc(1, sizeof(pm_dbus_msg));
memset(item, 0x00, sizeof(pm_dbus_msg));
}
g_idle_add(queue_job, NULL);
- DBG("req_type=(%d) drawing_popup=(%d) backend_flag=(%d)\n", req_type,
- drawing_popup, backend_flag);
-
- char *quiet = NULL;
+ DBG("req_type=(%d) backend_flag=(%d)\n", req_type, backend_flag);
if (__check_privilege_by_cynara(client, session, user, item->req_type)) {
*ret = PKGMGR_R_EPRIV;
switch (item->req_type) {
case COMM_REQ_TO_INSTALLER:
- /* -q option should be located at the end of command !! */
- if (((quiet = strstr(args, " -q")) &&
- (quiet[strlen(quiet)] == '\0')) ||
- ((quiet = strstr(args, " '-q'")) &&
- (quiet[strlen(quiet)] == '\0'))) {
- /* quiet mode */
- if (_pm_queue_push(item)) {
- ERR("failed to push queue item");
- *ret = COMM_RET_ERROR;
- goto err;
- }
- p = __get_position_from_pkg_type(item->pkg_type);
- __set_backend_mode(p);
- /* Free resource */
- free(item);
- *ret = COMM_RET_OK;
- } else {
- /* non quiet mode */
- p = __get_position_from_pkg_type(item->pkg_type);
- if (drawing_popup == 0 &&
- !__is_backend_busy(p) &&
- __check_backend_mode()) {
- /* if there is no popup */
- ad->item = item;
-
- if (strstr(args, " -i ")
- || strstr(args, " '-i' "))
- ad->op_type = OPERATION_INSTALL;
- else if (strstr(args, " -d ")
- || strstr(args, " '-d' ")) {
- ad->op_type = OPERATION_UNINSTALL;
- } else if (strstr(args, " -r ")
- || strstr(args, " '-r' "))
- ad->op_type = OPERATION_REINSTALL;
- else
- ad->op_type = OPERATION_MAX;
-
- if (create_popup(ad)) {
- *ret = COMM_RET_ERROR;
- DBG("create popup failed\n");
- goto err;
- } else {
- *ret = COMM_RET_OK;
- }
- } else {
- DBG("info drawing_popup:%d, __is_backend_busy(p):%d, __check_backend_mode():%d\n",
- drawing_popup, __is_backend_busy(p), __check_backend_mode());
- /* if popup is already being drawn */
- *ret = COMM_RET_ERROR;
- goto err;
- }
+ /* quiet mode */
+ if (_pm_queue_push(item)) {
+ ERR("failed to push queue item");
+ *ret = COMM_RET_ERROR;
+ goto err;
}
+ p = __get_position_from_pkg_type(item->pkg_type);
+ __set_backend_mode(p);
+ /* Free resource */
+ free(item);
+ *ret = COMM_RET_OK;
break;
case COMM_REQ_TO_ACTIVATOR:
/* In case of activate, there is no popup */
*ret = COMM_RET_OK;
break;
case COMM_REQ_CANCEL:
- ad->item = item;
- _pm_queue_delete(ad->item);
+ _pm_queue_delete(item);
p = __get_position_from_pkg_type(item->pkg_type);
__unset_backend_mode(p);
free(item);
{
DBG("exit_server Start\n");
if (__check_backend_status_for_exit() &&
- __check_queue_status_for_exit() &&
- drawing_popup == 0) {
- if (!getenv("PMS_STANDALONE") && ail_db_update) {
+ __check_queue_status_for_exit()) {
+ if (!getenv("PMS_STANDALONE")) {
g_main_loop_quit(mainloop);
return FALSE;
}
return -1;
}
- struct appdata ad;
-
DBG("Main loop is created.");
PkgMgrObject *pkg_mgr;
pkg_mgr = g_object_new(PKG_MGR_TYPE_OBJECT, NULL);
- pkg_mgr_set_request_callback(pkg_mgr, req_cb, &ad);
+ pkg_mgr_set_request_callback(pkg_mgr, req_cb, NULL);
DBG("pkg_mgr object is created, and request callback is registered.");
g_main_loop_run(mainloop);
-
DBG("Quit main loop.");
_pm_queue_final();
__fini_backend_info();
char pkgid[PKG_NAME_STRING_LEN_MAX];
char des_path[PKG_NAME_STRING_LEN_MAX];
char label[PKG_NAME_STRING_LEN_MAX];
- int quiet;
int global;
int type;
int result;
printf("-n, --package-name provide package name\n");
printf("-t, --package-type provide package type\n");
printf("-T, --move-type provide move type [0 : move to internal /1: move to external]\n");
- printf("-q, --quiet quiet mode operation\n");
printf("-G, --global Global Mode [Warning user should be privilegied to use this mode] \n");
printf("-h, --help . print this help\n\n");
- printf("Usage: pkgcmd [options] (--quiet)\n");
- printf("pkgcmd -i -t <pkg type> (-d <descriptor path>) -p <pkg path> (-G) (-q)\n");
- printf("pkgcmd -u -n <pkgid> (-G) (-q)\n");
+ printf("Usage: pkgcmd [options]\n");
+ printf("pkgcmd -i -t <pkg type> (-d <descriptor path>) -p <pkg path> (-G)\n");
+ printf("pkgcmd -u -n <pkgid> (-G)\n");
printf("pkgcmd -r -t <pkg type> -n <pkgid> (-G) \n");
printf("pkgcmd -l (-t <pkg type>) \n");
- printf("pkgcmd -s -t <pkg type> -p <pkg path> (-q)\n");
- printf("pkgcmd -s -t <pkg type> -n <pkg name> (-q)\n");
- printf("pkgcmd -m -t <pkg type> -T <move type> -n <pkg name> (-q)\n\n");
+ printf("pkgcmd -s -t <pkg type> -p <pkg path>\n");
+ printf("pkgcmd -s -t <pkg type> -n <pkg name>\n");
+ printf("pkgcmd -m -t <pkg type> -T <move type> -n <pkg name>\n\n");
printf("pkgcmd -g -T <getsize type> -n <pkgid> \n");
printf("pkgcmd -C -n <pkgid> \n");
printf("pkgcmd -k -n <pkgid> \n");
static int __process_request(uid_t uid)
{
int ret = -1;
- int mode = PM_DEFAULT;
pkgmgr_client *pc = NULL;
char buf[1024] = {'\0'};
int pid = -1;
data.result = PKGCMD_ERR_FATAL_ERROR;
break;
}
- if (data.quiet == 0)
- mode = PM_DEFAULT;
- else
- mode = PM_QUIET;
if (data.des_path[0] == '\0')
{
ret =
pkgmgr_client_usr_install(pc, data.pkg_type, NULL,
- data.pkg_path, NULL, mode,
+ data.pkg_path, NULL, PM_QUIET,
__return_cb, pc, uid);
}else{
ret =
pkgmgr_client_usr_install(pc, data.pkg_type,
data.des_path, data.pkg_path,
- NULL, mode, __return_cb, pc, uid);
+ NULL, PM_QUIET, __return_cb, pc, uid);
}
if (ret < 0){
data.result = PKGCMD_ERR_FATAL_ERROR;
break;
}
- if (data.quiet == 0)
- mode = PM_DEFAULT;
- else
- mode = PM_QUIET;
-
//if global
ret = __is_app_installed(data.pkgid, uid);
if (ret == -1) {
ret =
pkgmgr_client_usr_uninstall(pc, data.pkg_type, data.pkgid,
- mode, __return_cb, NULL,uid);
+ PM_QUIET, __return_cb, NULL,uid);
if (ret < 0){
data.result = PKGCMD_ERR_FATAL_ERROR;
if (access(data.pkg_path, F_OK) != 0)
break;
}
- mode = PM_QUIET;
- ret = pkgmgr_client_usr_reinstall(pc, data.pkg_type, data.pkgid, NULL, mode, __return_cb, pc, uid);
+ ret = pkgmgr_client_usr_reinstall(pc, data.pkg_type, data.pkgid, NULL, PM_QUIET, __return_cb, pc, uid);
if (ret < 0){
data.result = PKGCMD_ERR_FATAL_ERROR;
if (access(data.pkg_path, F_OK) != 0)
ret = -1;
break;
}
- if (data.quiet == 0)
- mode = PM_DEFAULT;
- else
- mode = PM_QUIET;
ret = __is_app_installed(data.pkgid, uid);
if (ret == -1) {
printf("package is not installed\n");
break;
}
ret = pkgmgr_client_usr_clear_user_data(pc, data.pkg_type,
- data.pkgid, mode, uid);
+ data.pkgid, PM_QUIET, uid);
if (ret < 0)
break;
ret = data.result;
ret = -1;
break;
}
- mode = PM_QUIET;
ret = __is_app_installed(data.pkgid, uid);
if (ret == -1) {
printf("package is not installed\n");
break;
}
- if (data.quiet == 0)
- ret = pkgmgr_client_usr_move(pc, data.pkg_type, data.pkgid, data.type, mode, uid);
- else
- ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc, NULL, data.pkgid, uid, NULL, NULL, NULL);
+ ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc, NULL, data.pkgid, uid, NULL, NULL, NULL);
printf("pkg[%s] move result = %d\n", data.pkgid, ret);
memset(data.pkgid, '\0', PKG_NAME_STRING_LEN_MAX);
memset(data.pkg_type, '\0', PKG_TYPE_STRING_LEN_MAX);
memset(data.label, '\0', PKG_TYPE_STRING_LEN_MAX);
- data.quiet = 0;
data.global = 0; //By default pkg_cmd will manage for the current user
data.result = 0;
data.type = -1;
data.request = HELP_REQ;
break;
- case 'q': /* quiet mode */
- data.quiet = 1;
+ case 'q': /* quiet mode is removed */
break;
/* Otherwise */