diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-09-28 15:52:25 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-09-28 15:52:26 -0700 |
commit | 1d3527354396d3aa48b494fb409d680cce32dc8b (patch) | |
tree | 6934b6b63276fdf0f30ad0c2cbec7ad08732a890 | |
parent | 925a659d824089d2977b44a6740f793ae65f809a (diff) | |
parent | f41496f1791d983bf8bbbdf95f72528e59284b39 (diff) | |
download | frameworks_base-1d3527354396d3aa48b494fb409d680cce32dc8b.zip frameworks_base-1d3527354396d3aa48b494fb409d680cce32dc8b.tar.gz frameworks_base-1d3527354396d3aa48b494fb409d680cce32dc8b.tar.bz2 |
Merge "Fix issue #7202950: After clearing data, clear data button is still enabled." into jb-mr1-dev
-rw-r--r-- | cmds/installd/commands.c | 38 | ||||
-rw-r--r-- | libs/diskusage/dirsize.c | 7 |
2 files changed, 33 insertions, 12 deletions
diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c index a9945b7..396771f 100644 --- a/cmds/installd/commands.c +++ b/cmds/installd/commands.c @@ -447,6 +447,16 @@ int get_size(const char *pkgname, int persona, const char *apkpath, } } + /* add in size of any libraries */ + if (!create_pkg_path_in_dir(path, &android_app_lib_dir, pkgname, PKG_DIR_POSTFIX)) { + d = opendir(path); + if (d != NULL) { + dfd = dirfd(d); + codesize += calculate_dir_size(dfd); + closedir(d); + } + } + /* compute asec size if it is given */ if (asecpath != NULL && asecpath[0] != '!') { @@ -474,21 +484,33 @@ int get_size(const char *pkgname, int persona, const char *apkpath, if (de->d_type == DT_DIR) { int subfd; + int64_t statsize = 0; + int64_t dirsize = 0; /* always skip "." and ".." */ if (name[0] == '.') { if (name[1] == 0) continue; if ((name[1] == '.') && (name[2] == 0)) continue; } + if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { + statsize = stat_size(&s); + } subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); if (subfd >= 0) { - int64_t size = calculate_dir_size(subfd); - if (!strcmp(name,"lib")) { - codesize += size; - } else if(!strcmp(name,"cache")) { - cachesize += size; - } else { - datasize += size; - } + dirsize = calculate_dir_size(subfd); + } + if(!strcmp(name,"lib")) { + codesize += dirsize + statsize; + } else if(!strcmp(name,"cache")) { + cachesize += dirsize + statsize; + } else { + datasize += dirsize + statsize; + } + } else if (de->d_type == DT_LNK && !strcmp(name,"lib")) { + // This is the symbolic link to the application's library + // code. We'll count this as code instead of data, since + // it is not something that the app creates. + if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { + codesize += stat_size(&s); } } else { if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { diff --git a/libs/diskusage/dirsize.c b/libs/diskusage/dirsize.c index 45e7b2a..6703783 100644 --- a/libs/diskusage/dirsize.c +++ b/libs/diskusage/dirsize.c @@ -49,6 +49,9 @@ int64_t calculate_dir_size(int dfd) while ((de = readdir(d))) { const char *name = de->d_name; + if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { + size += stat_size(&s); + } if (de->d_type == DT_DIR) { int subfd; @@ -64,10 +67,6 @@ int64_t calculate_dir_size(int dfd) if (subfd >= 0) { size += calculate_dir_size(subfd); } - } else { - if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) == 0) { - size += stat_size(&s); - } } } closedir(d); |