static bool diversion_is_shared(struct pkgset *set, struct fsys_namenode *namenode) { const char *archname; struct pkginfo *pkg; struct dpkg_arch *arch; struct fsys_node_pkgs_iter *iter; bool shared = false; if (set == NULL) return false; archname = getenv("DPKG_MAINTSCRIPT_ARCH"); arch = dpkg_arch_find(archname); if (arch->type == DPKG_ARCH_NONE || arch->type == DPKG_ARCH_EMPTY) return false; for (pkg = &set->pkg; pkg; pkg = pkg->arch_next) ensure_packagefiles_available(pkg); iter = fsys_node_pkgs_iter_new(namenode); while ((pkg = fsys_node_pkgs_iter_next(iter))) { if (pkg->set == set && pkg->installed.arch != arch) { shared = true; break; } } fsys_node_pkgs_iter_free(iter); return shared; }
static bool diversion_is_essential(struct fsys_namenode *namenode) { struct pkginfo *pkg; struct pkg_hash_iter *pkg_iter; struct fsys_node_pkgs_iter *iter; bool essential = false; pkg_iter = pkg_hash_iter_new(); while ((pkg = pkg_hash_iter_next_pkg(pkg_iter))) { if (pkg->installed.essential) ensure_packagefiles_available(pkg); } pkg_hash_iter_free(pkg_iter); iter = fsys_node_pkgs_iter_new(namenode); while ((pkg = fsys_node_pkgs_iter_next(iter))) { if (pkg->installed.essential) { essential = true; break; } } fsys_node_pkgs_iter_free(iter); return essential; }
static void verify_package(struct pkginfo *pkg) { struct fsys_namenode_list *file; struct varbuf filename = VARBUF_INIT; ensure_packagefiles_available(pkg); parse_filehash(pkg, &pkg->installed); pkg_conffiles_mark_old(pkg); for (file = pkg->files; file; file = file->next) { struct verify_checks checks; struct fsys_namenode *fnn; char hash[MD5HASHLEN + 1]; int failures = 0; fnn = namenodetouse(file->namenode, pkg, &pkg->installed); if (strcmp(fnn->newhash, EMPTYHASHFLAG) == 0) { if (fnn->oldhash == NULL) continue; else fnn->newhash = fnn->oldhash; } varbuf_reset(&filename); varbuf_add_str(&filename, instdir); varbuf_add_str(&filename, fnn->name); varbuf_end_str(&filename); memset(&checks, 0, sizeof(checks)); md5hash(pkg, hash, filename.buf); if (strcmp(hash, fnn->newhash) != 0) { checks.md5sum = VERIFY_FAIL; failures++; } if (failures) verify_output(fnn, &checks); } varbuf_destroy(&filename); }
void ensure_allinstfiles_available(void) { struct pkg_array array; struct pkginfo *pkg; struct progress progress; int i; if (allpackagesdone) return; if (saidread<2) { int max = pkg_db_count_pkg(); saidread=1; progress_init(&progress, _("(Reading database ... "), max); } pkg_array_init_from_db(&array); pkg_files_optimize_load(&array); for (i = 0; i < array.n_pkgs; i++) { pkg = array.pkgs[i]; ensure_packagefiles_available(pkg); if (saidread == 1) progress_step(&progress); } pkg_array_destroy(&array); allpackagesdone = true; if (saidread==1) { progress_done(&progress); printf(P_("%d file or directory currently installed.)\n", "%d files and directories currently installed.)\n", nfiles), nfiles); saidread=2; } }
static bool diversion_is_owned_by_self(struct pkgset *set, struct fsys_namenode *namenode) { struct pkginfo *pkg; struct fsys_node_pkgs_iter *iter; bool owned = false; if (set == NULL) return false; for (pkg = &set->pkg; pkg; pkg = pkg->arch_next) ensure_packagefiles_available(pkg); iter = fsys_node_pkgs_iter_new(namenode); while ((pkg = fsys_node_pkgs_iter_next(iter))) { if (pkg->set == set) { owned = true; break; } } fsys_node_pkgs_iter_free(iter); return owned; }
static void verify_package(struct pkginfo *pkg) { struct fileinlist *file; ensure_packagefiles_available(pkg); parse_filehash(pkg, &pkg->installed); pkg_conffiles_mark_old(pkg); for (file = pkg->clientdata->files; file; file = file->next) { struct verify_checks checks; struct filenamenode *fnn; char hash[MD5HASHLEN + 1]; int failures = 0; fnn = namenodetouse(file->namenode, pkg, &pkg->installed); if (strcmp(fnn->newhash, EMPTYHASHFLAG) == 0) { if (fnn->oldhash == NULL) continue; else fnn->newhash = fnn->oldhash; } memset(&checks, 0, sizeof(checks)); md5hash(pkg, hash, fnn->name); if (strcmp(hash, fnn->newhash) != 0) { checks.md5sum = VERIFY_FAIL; failures++; } if (failures) verify_output(fnn, &checks); } }