diff options
author | 2015-11-09 13:10:36 -0800 | |
---|---|---|
committer | 2015-11-11 09:49:40 -0800 | |
commit | 63ec2d64196144b2d15d2baffedccfa011d6494f (patch) | |
tree | 70fe5630745c6f10d32b5254bb3da252cfd570f5 /cmds/installd/commands.cpp | |
parent | 43ec13d13a695166a55c85fc3baeb30b2d5beac0 (diff) |
Create device-encrypted directories for apps.
When device has FBE, create device-encrypted storage location when
installing apps.
Also remove "renamepkg" unused command.
Bug: 22358539
Change-Id: Ic56eeecdc64bdaa7429b93426727a243a4e45f47
Diffstat (limited to 'cmds/installd/commands.cpp')
-rw-r--r-- | cmds/installd/commands.cpp | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp index 46d72fd0fc..b48fbc1818 100644 --- a/cmds/installd/commands.cpp +++ b/cmds/installd/commands.cpp @@ -43,36 +43,40 @@ dir_rec_array_t android_system_dirs; static const char* kCpPath = "/system/bin/cp"; -int install(const char *uuid, const char *pkgname, uid_t uid, gid_t gid, const char *seinfo) -{ +int install(const char *uuid, const char *pkgname, uid_t uid, gid_t gid, const char *seinfo) { if ((uid < AID_SYSTEM) || (gid < AID_SYSTEM)) { ALOGE("invalid uid/gid: %d %d\n", uid, gid); return -1; } - std::string _pkgdir(create_data_user_package_path(uuid, 0, pkgname)); - const char* pkgdir = _pkgdir.c_str(); + std::string ce_package_path(create_data_user_package_path(uuid, 0, pkgname)); + std::string de_package_path(create_data_user_de_package_path(uuid, 0, pkgname)); - if (mkdir(pkgdir, 0751) < 0) { - ALOGE("cannot create dir '%s': %s\n", pkgdir, strerror(errno)); + const char* c_ce_package_path = ce_package_path.c_str(); + const char* c_de_package_path = de_package_path.c_str(); + + if (fs_prepare_dir(c_ce_package_path, 0751, uid, gid) == -1) { + PLOG(ERROR) << "Failed to prepare " << ce_package_path; + unlink(c_ce_package_path); return -1; } - if (chmod(pkgdir, 0751) < 0) { - ALOGE("cannot chmod dir '%s': %s\n", pkgdir, strerror(errno)); - unlink(pkgdir); + if (selinux_android_setfilecon(c_ce_package_path, pkgname, seinfo, uid) < 0) { + PLOG(ERROR) << "Failed to setfilecon " << ce_package_path; + unlink(c_ce_package_path); return -1; } - if (selinux_android_setfilecon(pkgdir, pkgname, seinfo, uid) < 0) { - ALOGE("cannot setfilecon dir '%s': %s\n", pkgdir, strerror(errno)); - unlink(pkgdir); - return -errno; - } - - if (chown(pkgdir, uid, gid) < 0) { - ALOGE("cannot chown dir '%s': %s\n", pkgdir, strerror(errno)); - unlink(pkgdir); - return -1; + if (property_get_bool("vold.has_fbe", false)) { + if (fs_prepare_dir(c_de_package_path, 0751, uid, gid) == -1) { + PLOG(ERROR) << "Failed to prepare " << de_package_path; + unlink(c_de_package_path); + return -1; + } + if (selinux_android_setfilecon(c_de_package_path, pkgname, seinfo, uid) < 0) { + PLOG(ERROR) << "Failed to setfilecon " << de_package_path; + unlink(c_de_package_path); + return -1; + } } return 0; @@ -89,23 +93,6 @@ int uninstall(const char *uuid, const char *pkgname, userid_t userid) return delete_dir_contents(pkgdir, 1, NULL); } -int renamepkg(const char *oldpkgname, const char *newpkgname) -{ - char oldpkgdir[PKG_PATH_MAX]; - char newpkgdir[PKG_PATH_MAX]; - - if (create_pkg_path(oldpkgdir, oldpkgname, PKG_DIR_POSTFIX, 0)) - return -1; - if (create_pkg_path(newpkgdir, newpkgname, PKG_DIR_POSTFIX, 0)) - return -1; - - if (rename(oldpkgdir, newpkgdir) < 0) { - ALOGE("cannot rename dir '%s' to '%s': %s\n", oldpkgdir, newpkgdir, strerror(errno)); - return -errno; - } - return 0; -} - int fix_uid(const char *uuid, const char *pkgname, uid_t uid, gid_t gid) { struct stat s; |