Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f41496f1 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #7202950: After clearing data, clear data button is still enabled.

Count the lib symlink against the app's code size.  Also be sure to
look at the new separate lib path for apps, and tweak the size
counting to also count the size of directory entries.

Change-Id: I4b0fd5771f249faa05fd72f08062df885902cc97
parent 580ee8b0
Loading
Loading
Loading
Loading
+30 −8
Original line number Diff line number Diff line
@@ -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);
                dirsize = calculate_dir_size(subfd);
            }
            if(!strcmp(name,"lib")) {
                    codesize += size;
                codesize += dirsize + statsize;
            } else if(!strcmp(name,"cache")) {
                    cachesize += size;
                cachesize += dirsize + statsize;
            } else {
                    datasize += size;
                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) {
+3 −4
Original line number Diff line number Diff line
@@ -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);