static void rmdir_p(struct pkgdb *db, struct pkg *pkg, char *dir, const char *prefix_r) { char *tmp; int64_t cnt; char fullpath[MAXPATHLEN]; if (unlinkat(pkg->rootfd, dir, AT_REMOVEDIR) == -1 && errno != ENOTEMPTY && errno != EBUSY) { pkg_emit_errno("unlinkat", dir); } tmp = strrchr(dir, '/'); if (tmp == dir) return; tmp[0] = '\0'; tmp = strrchr(dir, '/'); tmp[1] = '\0'; snprintf(fullpath, sizeof(fullpath), "/%s", dir); if (pkgdb_is_dir_used(db, dir, &cnt) != EPKG_OK) return; if (cnt > 1) return; if (strcmp(prefix_r, dir) == 0) return; rmdir_p(db, pkg, dir, prefix_r); }
int pkg_delete_dirs(struct pkgdb *db, struct pkg *pkg, int force) { struct pkg_dir *dir = NULL; int64_t nbpackage; while (pkg_dirs(pkg, &dir) == EPKG_OK) { nbpackage = 0; if (pkgdb_is_dir_used(db, pkg_dir_path(dir), &nbpackage) != EPKG_OK) return (EPKG_FATAL); if (nbpackage > 1) continue; if (pkg_dir_try(dir)) { if (rmdir(pkg_dir_path(dir)) == -1 && errno != ENOTEMPTY && force != 1) pkg_emit_errno("rmdir", pkg_dir_path(dir)); } else { if (rmdir(pkg_dir_path(dir)) == -1 && force != 1) pkg_emit_errno("rmdir", pkg_dir_path(dir)); } } return (EPKG_OK); }