Remove "updatecmds" feature.
This feature is very old and hasn't been used in many releases. In
addition, it was never taught about multi-user layouts, and it would
be incredibly hard to maintain in the new FBE world where CE keys
may not appear until several reboots after an OTA.
Bug: 26854442
Change-Id: Ibd8660e2a727469cd5ae41dab5e1014a9cfb6748
diff --git a/cmds/installd/commands.cpp b/cmds/installd/commands.cpp
index f25060c..cfe5a62 100644
--- a/cmds/installd/commands.cpp
+++ b/cmds/installd/commands.cpp
@@ -1255,245 +1255,6 @@
}
}
-int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
- int dstuid, int dstgid, struct stat* statbuf)
-{
- DIR *d;
- struct dirent *de;
- int res;
-
- int srcend = strlen(srcpath);
- int dstend = strlen(dstpath);
-
- if (lstat(srcpath, statbuf) < 0) {
- ALOGW("Unable to stat %s: %s\n", srcpath, strerror(errno));
- return 1;
- }
-
- if ((statbuf->st_mode&S_IFDIR) == 0) {
- mkinnerdirs(dstpath, dstbasepos, S_IRWXU|S_IRWXG|S_IXOTH,
- dstuid, dstgid, statbuf);
- ALOGV("Renaming %s to %s (uid %d)\n", srcpath, dstpath, dstuid);
- if (rename(srcpath, dstpath) >= 0) {
- if (chown(dstpath, dstuid, dstgid) < 0) {
- ALOGE("cannot chown %s: %s\n", dstpath, strerror(errno));
- unlink(dstpath);
- return 1;
- }
- } else {
- ALOGW("Unable to rename %s to %s: %s\n",
- srcpath, dstpath, strerror(errno));
- return 1;
- }
- return 0;
- }
-
- d = opendir(srcpath);
- if (d == NULL) {
- ALOGW("Unable to opendir %s: %s\n", srcpath, strerror(errno));
- return 1;
- }
-
- res = 0;
-
- while ((de = readdir(d))) {
- const char *name = de->d_name;
- /* always skip "." and ".." */
- if (name[0] == '.') {
- if (name[1] == 0) continue;
- if ((name[1] == '.') && (name[2] == 0)) continue;
- }
-
- if ((srcend+strlen(name)) >= (PKG_PATH_MAX-2)) {
- ALOGW("Source path too long; skipping: %s/%s\n", srcpath, name);
- continue;
- }
-
- if ((dstend+strlen(name)) >= (PKG_PATH_MAX-2)) {
- ALOGW("Destination path too long; skipping: %s/%s\n", dstpath, name);
- continue;
- }
-
- srcpath[srcend] = dstpath[dstend] = '/';
- strcpy(srcpath+srcend+1, name);
- strcpy(dstpath+dstend+1, name);
-
- if (movefileordir(srcpath, dstpath, dstbasepos, dstuid, dstgid, statbuf) != 0) {
- res = 1;
- }
-
- // Note: we will be leaving empty directories behind in srcpath,
- // but that is okay, the package manager will be erasing all of the
- // data associated with .apks that disappear.
-
- srcpath[srcend] = dstpath[dstend] = 0;
- }
-
- closedir(d);
- return res;
-}
-
-int movefiles()
-{
- DIR *d;
- int dfd, subfd;
- struct dirent *de;
- struct stat s;
- char buf[PKG_PATH_MAX+1];
- int bufp, bufe, bufi, readlen;
-
- char srcpkg[PKG_NAME_MAX];
- char dstpkg[PKG_NAME_MAX];
- char srcpath[PKG_PATH_MAX];
- char dstpath[PKG_PATH_MAX];
- int dstuid=-1, dstgid=-1;
- int hasspace;
-
- d = opendir(UPDATE_COMMANDS_DIR_PREFIX);
- if (d == NULL) {
- goto done;
- }
- dfd = dirfd(d);
-
- /* Iterate through all files in the directory, executing the
- * file movements requested there-in.
- */
- while ((de = readdir(d))) {
- const char *name = de->d_name;
-
- if (de->d_type == DT_DIR) {
- continue;
- } else {
- subfd = openat(dfd, name, O_RDONLY);
- if (subfd < 0) {
- ALOGW("Unable to open update commands at %s%s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name);
- continue;
- }
-
- bufp = 0;
- bufe = 0;
- buf[PKG_PATH_MAX] = 0;
- srcpkg[0] = dstpkg[0] = 0;
- while (1) {
- bufi = bufp;
- while (bufi < bufe && buf[bufi] != '\n') {
- bufi++;
- }
- if (bufi < bufe) {
- buf[bufi] = 0;
- ALOGV("Processing line: %s\n", buf+bufp);
- hasspace = 0;
- while (bufp < bufi && isspace(buf[bufp])) {
- hasspace = 1;
- bufp++;
- }
- if (buf[bufp] == '#' || bufp == bufi) {
- // skip comments and empty lines.
- } else if (hasspace) {
- if (dstpkg[0] == 0) {
- ALOGW("Path before package line in %s%s: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
- } else if (srcpkg[0] == 0) {
- // Skip -- source package no longer exists.
- } else {
- ALOGV("Move file: %s (from %s to %s)\n", buf+bufp, srcpkg, dstpkg);
- if (!create_move_path(srcpath, srcpkg, buf+bufp, 0) &&
- !create_move_path(dstpath, dstpkg, buf+bufp, 0)) {
- movefileordir(srcpath, dstpath,
- strlen(dstpath)-strlen(buf+bufp),
- dstuid, dstgid, &s);
- }
- }
- } else {
- char* div = strchr(buf+bufp, ':');
- if (div == NULL) {
- ALOGW("Bad package spec in %s%s; no ':' sep: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
- } else {
- *div = 0;
- div++;
- if (strlen(buf+bufp) < PKG_NAME_MAX) {
- strcpy(dstpkg, buf+bufp);
- } else {
- srcpkg[0] = dstpkg[0] = 0;
- ALOGW("Package name too long in %s%s: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, buf+bufp);
- }
- if (strlen(div) < PKG_NAME_MAX) {
- strcpy(srcpkg, div);
- } else {
- srcpkg[0] = dstpkg[0] = 0;
- ALOGW("Package name too long in %s%s: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, div);
- }
- if (srcpkg[0] != 0) {
- if (!create_pkg_path(srcpath, srcpkg, PKG_DIR_POSTFIX, 0)) {
- if (lstat(srcpath, &s) < 0) {
- // Package no longer exists -- skip.
- srcpkg[0] = 0;
- }
- } else {
- srcpkg[0] = 0;
- ALOGW("Can't create path %s in %s%s\n",
- div, UPDATE_COMMANDS_DIR_PREFIX, name);
- }
- if (srcpkg[0] != 0) {
- if (!create_pkg_path(dstpath, dstpkg, PKG_DIR_POSTFIX, 0)) {
- if (lstat(dstpath, &s) == 0) {
- dstuid = s.st_uid;
- dstgid = s.st_gid;
- } else {
- // Destination package doesn't
- // exist... due to original-package,
- // this is normal, so don't be
- // noisy about it.
- srcpkg[0] = 0;
- }
- } else {
- srcpkg[0] = 0;
- ALOGW("Can't create path %s in %s%s\n",
- div, UPDATE_COMMANDS_DIR_PREFIX, name);
- }
- }
- ALOGV("Transfering from %s to %s: uid=%d\n",
- srcpkg, dstpkg, dstuid);
- }
- }
- }
- bufp = bufi+1;
- } else {
- if (bufp == 0) {
- if (bufp < bufe) {
- ALOGW("Line too long in %s%s, skipping: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, buf);
- }
- } else if (bufp < bufe) {
- memcpy(buf, buf+bufp, bufe-bufp);
- bufe -= bufp;
- bufp = 0;
- }
- readlen = read(subfd, buf+bufe, PKG_PATH_MAX-bufe);
- if (readlen < 0) {
- ALOGW("Failure reading update commands in %s%s: %s\n",
- UPDATE_COMMANDS_DIR_PREFIX, name, strerror(errno));
- break;
- } else if (readlen == 0) {
- break;
- }
- bufe += readlen;
- buf[bufe] = 0;
- ALOGV("Read buf: %s\n", buf);
- }
- }
- close(subfd);
- }
- }
- closedir(d);
-done:
- return 0;
-}
-
int linklib(const char* uuid, const char* pkgname, const char* asecLibDir, int userId)
{
struct stat s, libStat;
diff --git a/cmds/installd/commands.h b/cmds/installd/commands.h
index 6dfc42b..53a789f 100644
--- a/cmds/installd/commands.h
+++ b/cmds/installd/commands.h
@@ -51,7 +51,6 @@
int dexopt_needed, const char* oat_dir, int dexopt_flags,
const char* volume_uuid, bool use_profiles);
int mark_boot_complete(const char *instruction_set);
-int movefiles();
int linklib(const char* uuid, const char* pkgname, const char* asecLibDir, int userId);
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
int create_oat_dir(const char* oat_dir, const char *instruction_set);
diff --git a/cmds/installd/installd.cpp b/cmds/installd/installd.cpp
index 09f2c26..02e9601 100644
--- a/cmds/installd/installd.cpp
+++ b/cmds/installd/installd.cpp
@@ -274,11 +274,6 @@
return delete_user(parse_null(arg[0]), atoi(arg[1])); /* uuid, userid */
}
-static int do_movefiles(char **arg ATTRIBUTE_UNUSED, char reply[REPLY_MAX] ATTRIBUTE_UNUSED)
-{
- return movefiles();
-}
-
static int do_linklib(char **arg, char reply[REPLY_MAX] ATTRIBUTE_UNUSED)
{
return linklib(parse_null(arg[0]), arg[1], arg[2], atoi(arg[3]));
@@ -327,7 +322,6 @@
{ "markbootcomplete", 1, do_mark_boot_complete },
{ "rmdex", 2, do_rm_dex },
{ "freecache", 2, do_free_cache },
- { "movefiles", 0, do_movefiles },
{ "linklib", 4, do_linklib },
{ "mkuserconfig", 1, do_mk_user_config },
{ "rmuser", 2, do_rm_user },
diff --git a/cmds/installd/installd_constants.h b/cmds/installd/installd_constants.h
index f128c26..18f998d 100644
--- a/cmds/installd/installd_constants.h
+++ b/cmds/installd/installd_constants.h
@@ -49,8 +49,6 @@
#define DALVIK_CACHE "dalvik-cache"
constexpr const char* DALVIK_CACHE_POSTFIX = "/classes.dex";
-constexpr const char* UPDATE_COMMANDS_DIR_PREFIX = "/system/etc/updatecmds/";
-
constexpr const char* IDMAP_PREFIX = "/data/resource-cache/";
constexpr const char* IDMAP_SUFFIX = "@idmap";