From 3a3783a744d5ef27a30f182ec9bcbffe5be30b6a Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 8 Jul 2016 23:09:00 +0900 Subject: [PATCH] improve app2sd stability - do not handle as failure in case source dir does not exists. (some application has no 'lib') - sync() after pre/post called. - bugfix kill all running apps when sdcard is removed. Change-Id: Ied0578a840f4216ff461150532fea22854b4753d Signed-off-by: jongmyeongko --- plugin/app2sd/src/app2sd_interface.c | 1 + plugin/app2sd/src/app2sd_internals.c | 5 ++-- plugin/app2sd/src/app2sd_internals_registry.c | 2 +- plugin/app2sd/src/app2sd_internals_utils.c | 33 +++++++++++++++++++++++++-- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/plugin/app2sd/src/app2sd_interface.c b/plugin/app2sd/src/app2sd_interface.c index 2991b8b..1e3c217 100644 --- a/plugin/app2sd/src/app2sd_interface.c +++ b/plugin/app2sd/src/app2sd_interface.c @@ -848,6 +848,7 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid, } } + sync(); return APP2EXT_SUCCESS; } diff --git a/plugin/app2sd/src/app2sd_internals.c b/plugin/app2sd/src/app2sd_internals.c index 9b336cc..b0d8c93 100644 --- a/plugin/app2sd/src/app2sd_internals.c +++ b/plugin/app2sd/src/app2sd_internals.c @@ -1089,7 +1089,6 @@ int _app2sd_move_app_to_external(const char *pkgid, GList *dir_list, uid_t uid) goto ERR; } - sync(); return APP2EXT_SUCCESS; ERR: @@ -1291,14 +1290,14 @@ int _app2sd_move_app_to_internal(const char *pkgid, GList *dir_list, uid_t uid) ret = unlink(temp_dir_path); if (ret) { if (errno == ENOENT) { - _E("directory (%s) does not exist", + _W("directory (%s) does not exist", temp_dir_path); } else { _E("unable to remove the symbolic link file (%s)," \ " it is already unlinked", temp_dir_path); + goto ERR; } - goto ERR; } /* Copy content to destination */ diff --git a/plugin/app2sd/src/app2sd_internals_registry.c b/plugin/app2sd/src/app2sd_internals_registry.c index c235889..b94dd9f 100644 --- a/plugin/app2sd/src/app2sd_internals_registry.c +++ b/plugin/app2sd/src/app2sd_internals_registry.c @@ -265,7 +265,7 @@ int _app2sd_get_foreach_info_from_db(app2sd_info_cb cb_func) ret = cb_func(pkgid, (uid_t)uid); if (ret) { _E("app2sd info callback error"); - break; + /* continue */ } } diff --git a/plugin/app2sd/src/app2sd_internals_utils.c b/plugin/app2sd/src/app2sd_internals_utils.c index dbc6025..f0cd8f2 100644 --- a/plugin/app2sd/src/app2sd_internals_utils.c +++ b/plugin/app2sd/src/app2sd_internals_utils.c @@ -161,7 +161,7 @@ void _app2sd_delete_symlink(const char *dirname) _E("force unlink [%s]", abs_filename); if (unlink(abs_filename)) { if (errno == ENOENT) - _E("Unable to access file %s", abs_filename); + _W("Unable to access file %s", abs_filename); else _E("Unable to delete %s", abs_filename); } @@ -185,10 +185,39 @@ void _app2sd_delete_symlink(const char *dirname) int _app2sd_copy_dir(const char *src, const char *dest) { int ret = APP2EXT_SUCCESS; + DIR *dir = NULL; const char *argv_bin[] = { "/bin/cp", "-raf", src, dest, NULL }; + + /* check existence before copy */ + dir = opendir(src); + if (dir) { + closedir(dir); + } else { + if (errno == ENOENT) { + _W("src(%s) not exist, skip!", src); + return ret; + } else { + _E("failed to open src(%s) dir, errno(%d)", errno); + return APP2EXT_ERROR_MOVE; + } + } + + dir = opendir(dest); + if (dir) { + closedir(dir); + } else { + if (errno == ENOENT) { + _E("dest(%s) not exist, failed!", dest); + return APP2EXT_ERROR_MOVE; + } else { + _E("failed to open dest(%s) dir, errno(%d)", errno); + return APP2EXT_ERROR_MOVE; + } + } + ret = _xsystem(argv_bin); if (ret) { - _E("copy fail"); + _E("failed to copy dir, errno(%d)", errno); return APP2EXT_ERROR_MOVE; } return ret; -- 2.7.4