summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-09-28 15:52:25 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-09-28 15:52:26 -0700
commit1d3527354396d3aa48b494fb409d680cce32dc8b (patch)
tree6934b6b63276fdf0f30ad0c2cbec7ad08732a890
parent925a659d824089d2977b44a6740f793ae65f809a (diff)
parentf41496f1791d983bf8bbbdf95f72528e59284b39 (diff)
downloadframeworks_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.c38
-rw-r--r--libs/diskusage/dirsize.c7
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);