Allow multiple original-package tags.

Also fix some issues with moving files from update commands.
This commit is contained in:
Dianne Hackborn
2010-03-03 16:19:01 -08:00
parent 6be0fc100e
commit c1552397be
3 changed files with 59 additions and 40 deletions

View File

@@ -674,14 +674,19 @@ int create_move_path(char path[PKG_PATH_MAX],
return 0;
}
void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid)
void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid,
struct stat* statbuf)
{
while (path[basepos] != 0) {
if (path[basepos] == '/') {
path[basepos] = 0;
LOGI("Making directory: %s\n", path);
if (mkdir(path, mode) == 0) {
chown(path, uid, gid);
if (lstat(path, statbuf) < 0) {
LOGI("Making directory: %s\n", path);
if (mkdir(path, mode) == 0) {
chown(path, uid, gid);
} else {
LOGW("Unable to make directory %s: %s\n", path, strerror(errno));
}
}
path[basepos] = '/';
basepos++;
@@ -690,8 +695,8 @@ void mkinnerdirs(char* path, int basepos, mode_t mode, int uid, int gid)
}
}
int movefileordir(char* srcpath, char* dstpath, int dstuid, int dstgid,
struct stat* statbuf)
int movefileordir(char* srcpath, char* dstpath, int dstbasepos,
int dstuid, int dstgid, struct stat* statbuf)
{
DIR *d;
struct dirent *de;
@@ -706,8 +711,9 @@ int movefileordir(char* srcpath, char* dstpath, int dstuid, int dstgid,
}
if ((statbuf->st_mode&S_IFDIR) == 0) {
mkinnerdirs(dstpath, dstbasepos, S_IRWXU|S_IRWXG|S_IXOTH,
dstuid, dstgid, statbuf);
LOGI("Renaming %s to %s (uid %d)\n", srcpath, dstpath, dstuid);
mkinnerdirs(dstpath, dstend-1, S_IRWXU|S_IRWXG|S_IXOTH, dstuid, dstgid);
if (rename(srcpath, dstpath) >= 0) {
if (chown(dstpath, dstuid, dstgid) < 0) {
LOGE("cannot chown %s: %s\n", dstpath, strerror(errno));
@@ -752,7 +758,7 @@ int movefileordir(char* srcpath, char* dstpath, int dstuid, int dstgid,
strcpy(srcpath+srcend+1, name);
strcpy(dstpath+dstend+1, name);
if (movefileordir(srcpath, dstpath, dstuid, dstgid, statbuf) != 0) {
if (movefileordir(srcpath, dstpath, dstbasepos, dstuid, dstgid, statbuf) != 0) {
res = 1;
}
@@ -834,7 +840,9 @@ int movefiles()
LOGV("Move file: %s (from %s to %s)\n", buf+bufp, srcpkg, dstpkg);
if (!create_move_path(srcpath, PKG_DIR_PREFIX, srcpkg, buf+bufp) &&
!create_move_path(dstpath, PKG_DIR_PREFIX, dstpkg, buf+bufp)) {
movefileordir(srcpath, dstpath, dstuid, dstgid, &s);
movefileordir(srcpath, dstpath,
strlen(dstpath)-strlen(buf+bufp),
dstuid, dstgid, &s);
}
}
} else {

View File

@@ -967,8 +967,11 @@ public class PackageParser {
String orig =sa.getNonResourceString(
com.android.internal.R.styleable.AndroidManifestOriginalPackage_name);
if (!pkg.packageName.equals(orig)) {
pkg.mOriginalPackage = orig;
pkg.mRealPackage = pkg.packageName;
if (pkg.mOriginalPackages == null) {
pkg.mOriginalPackages = new ArrayList<String>();
pkg.mRealPackage = pkg.packageName;
}
pkg.mOriginalPackages.add(orig);
}
sa.recycle();
@@ -2579,7 +2582,7 @@ public class PackageParser {
public ArrayList<String> usesOptionalLibraries = null;
public String[] usesLibraryFiles = null;
public String mOriginalPackage = null;
public ArrayList<String> mOriginalPackages = null;
public String mRealPackage = null;
public ArrayList<String> mAdoptPermissions = null;

View File

@@ -2372,10 +2372,10 @@ class PackageManagerService extends IPackageManager.Stub {
synchronized (mPackages) {
// Look to see if we already know about this package.
String oldName = mSettings.mRenamedPackages.get(pkg.packageName);
if (oldName != null && oldName.equals(pkg.mOriginalPackage)) {
if (pkg.mOriginalPackages != null && pkg.mOriginalPackages.contains(oldName)) {
// This package has been renamed to its original name. Let's
// use that.
ps = mSettings.peekPackageLP(pkg.mOriginalPackage);
ps = mSettings.peekPackageLP(oldName);
}
// If there was no original package, see one for the real package name.
if (ps == null) {
@@ -2645,7 +2645,7 @@ class PackageManagerService extends IPackageManager.Stub {
if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
// Only system apps can use these features.
pkg.mOriginalPackage = null;
pkg.mOriginalPackages = null;
pkg.mRealPackage = null;
pkg.mAdoptPermissions = null;
}
@@ -2727,22 +2727,22 @@ class PackageManagerService extends IPackageManager.Stub {
}
if (false) {
if (pkg.mOriginalPackage != null) {
if (pkg.mOriginalPackages != null) {
Log.w(TAG, "WAITING FOR DEBUGGER");
Debug.waitForDebugger();
Log.i(TAG, "Package " + pkg.packageName + " from original package"
+ pkg.mOriginalPackage);
Log.i(TAG, "Package " + pkg.packageName + " from original packages"
+ pkg.mOriginalPackages);
}
}
// Check if we are renaming from an original package name.
PackageSetting origPackage = null;
String realName = null;
if (pkg.mOriginalPackage != null) {
if (pkg.mOriginalPackages != null) {
// This package may need to be renamed to a previously
// installed name. Let's check on that...
String renamed = mSettings.mRenamedPackages.get(pkg.mRealPackage);
if (pkg.mOriginalPackage.equals(renamed)) {
if (pkg.mOriginalPackages.contains(renamed)) {
// This package had originally been installed as the
// original name, and we have already taken care of
// transitioning to the new one. Just update the new
@@ -2755,25 +2755,32 @@ class PackageManagerService extends IPackageManager.Stub {
pkg.setPackageName(renamed);
}
} else if ((origPackage
= mSettings.peekPackageLP(pkg.mOriginalPackage)) != null) {
// We do have the package already installed under its
// original name... should we use it?
if (!verifyPackageUpdate(origPackage, pkg)) {
// New package is not compatible with original.
origPackage = null;
} else if (origPackage.sharedUser != null) {
// Make sure uid is compatible between packages.
if (!origPackage.sharedUser.name.equals(pkg.mSharedUserId)) {
Log.w(TAG, "Unable to migrate data from " + origPackage.name
+ " to " + pkg.packageName + ": old uid "
+ origPackage.sharedUser.name
+ " differs from " + pkg.mSharedUserId);
origPackage = null;
} else {
for (int i=pkg.mOriginalPackages.size()-1; i>=0; i--) {
if ((origPackage=mSettings.peekPackageLP(
pkg.mOriginalPackages.get(i))) != null) {
// We do have the package already installed under its
// original name... should we use it?
if (!verifyPackageUpdate(origPackage, pkg)) {
// New package is not compatible with original.
origPackage = null;
continue;
} else if (origPackage.sharedUser != null) {
// Make sure uid is compatible between packages.
if (!origPackage.sharedUser.name.equals(pkg.mSharedUserId)) {
Log.w(TAG, "Unable to migrate data from " + origPackage.name
+ " to " + pkg.packageName + ": old uid "
+ origPackage.sharedUser.name
+ " differs from " + pkg.mSharedUserId);
origPackage = null;
continue;
}
} else {
if (DEBUG_UPGRADE) Log.v(TAG, "Renaming new package "
+ pkg.packageName + " to old name " + origPackage.name);
}
break;
}
} else {
if (DEBUG_UPGRADE) Log.v(TAG, "Renaming new package "
+ pkg.packageName + " to old name " + origPackage.name);
}
}
}
@@ -5479,13 +5486,14 @@ class PackageManagerService extends IPackageManager.Stub {
// Check if installing already existing package
if ((pFlags&PackageManager.INSTALL_REPLACE_EXISTING) != 0) {
String oldName = mSettings.mRenamedPackages.get(pkgName);
if (oldName != null && oldName.equals(pkg.mOriginalPackage)
if (pkg.mOriginalPackages != null
&& pkg.mOriginalPackages.contains(oldName)
&& mPackages.containsKey(oldName)) {
// This package is derived from an original package,
// and this device has been updating from that original
// name. We must continue using the original name, so
// rename the new package here.
pkg.setPackageName(pkg.mOriginalPackage);
pkg.setPackageName(oldName);
pkgName = pkg.packageName;
replace = true;
} else if (mPackages.containsKey(pkgName)) {