/* figure out what dirs we want to process for cleaning and display results. */ static int qpkg_clean(char *dirp) { int i, count; size_t disp_units = 0; uint64_t num_all_bytes; struct dirent **dnames; set *vdb; if (chdir(dirp) != 0) return 1; if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0) return 1; vdb = get_vdb_atoms(portroot, portvdb, 1); if (eclean) { size_t n; const char *overlay; array_for_each(overlays, n, overlay) cache_foreach_pkg(portroot, overlay, qpkg_cb, vdb, NULL); } num_all_bytes = qpkg_clean_dir(dirp, vdb); for (i = 0; i < count; i++) { char buf[_Q_PATH_MAX * 2]; snprintf(buf, sizeof(buf), "%s/%s", dirp, dnames[i]->d_name); num_all_bytes += qpkg_clean_dir(buf, vdb); } scandir_free(dnames, count); free_set(vdb); disp_units = KILOBYTE; if ((num_all_bytes / KILOBYTE) > 1000) disp_units = MEGABYTE; qprintf(" %s*%s Total space that would be freed in packages " "directory: %s%s %c%s\n", GREEN, NORM, RED, make_human_readable_str(num_all_bytes, 1, disp_units), disp_units == MEGABYTE ? 'M' : 'K', NORM); return 0; }
/* figure out what dirs we want to process for cleaning and display results. */ int qpkg_clean(char *dirp) { FILE *fp; int i, count; size_t disp_units = 0; uint64_t num_all_bytes; struct dirent **dnames; queue *vdb; vdb = get_vdb_atoms(1); if (chdir(dirp) != 0) { free_sets(vdb); return 1; } if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0) { free_sets(vdb); return 1; } if (eclean) { if ((fp = fopen(initialize_ebuild_flat(), "r")) != NULL) { size_t buflen; char *buf; buf = NULL; while (getline(&buf, &buflen, fp) != -1) { char *name, *p; if ((p = strrchr(buf, '.')) == NULL) continue; *p = 0; if ((p = strrchr(buf, '/')) == NULL) continue; *p = 0; name = p + 1; if ((p = strrchr(buf, '/')) == NULL) continue; *p = 0; /* these strcat() are safe. the name is extracted from buf already. */ strcat(buf, "/"); strcat(buf, name); /* num_all_bytes will be off when pretend and eclean are enabled together */ /* vdb = del_set(buf, vdb, &i); */ vdb = add_set(buf, vdb); } free(buf); fclose(fp); } } num_all_bytes = qpkg_clean_dir(dirp, vdb); for (i = 0; i < count; i++) { char buf[_Q_PATH_MAX]; snprintf(buf, sizeof(buf), "%s/%s", dirp, dnames[i]->d_name); num_all_bytes += qpkg_clean_dir(buf, vdb); } scandir_free(dnames, count); free_sets(vdb); disp_units = KILOBYTE; if ((num_all_bytes / KILOBYTE) > 1000) disp_units = MEGABYTE; qprintf(" %s*%s Total space that would be freed in packages directory: %s%s %c%s\n", GREEN, NORM, RED, make_human_readable_str(num_all_bytes, 1, disp_units), disp_units == MEGABYTE ? 'M' : 'K', NORM); return 0; }