static int assert_version_support(const char *const *argv, struct versionrevision *version, const char *feature_name) { struct pkginfo *pkg; enum modstatdb_rw msdb_status; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); msdb_status = modstatdb_open(msdbrw_readonly); pkg_infodb_init(msdb_status); pkg = pkg_db_find_pkg("dpkg", NULL); switch (pkg->status) { case stat_installed: case stat_triggerspending: return 0; case stat_unpacked: case stat_halfconfigured: case stat_halfinstalled: case stat_triggersawaited: if (versionsatisfied3(&pkg->configversion, version, dvr_laterequal)) return 0; printf(_("Version of dpkg with working %s support not yet configured.\n" " Please use 'dpkg --configure dpkg', and then try again.\n"), feature_name); return 1; default: printf(_("dpkg not recorded as installed, cannot check for %s support!\n"), feature_name); return 1; } }
static struct pkginfo * pkg_spec_get_pkg(struct pkg_spec *ps) { if (ps->arch->type == DPKG_ARCH_NONE) return pkg_db_find_singleton(ps->name); else return pkg_db_find_pkg(ps->name, ps->arch); }
/** * Parse an RFC-822 style file. * * donep may be NULL. * If donep is not NULL only one package's information is expected. */ int parsedb(const char *filename, enum parsedbflags flags, struct pkginfo **donep) { struct pkgset tmp_set; struct pkginfo *new_pkg, *db_pkg; struct pkgbin *new_pkgbin, *db_pkgbin; struct pkg_parse_object pkg_obj; int fieldencountered[array_count(fieldinfos)]; int pdone; struct parsedb_state ps; struct field_state fs; memset(&fs, 0, sizeof(fs)); fs.fieldencountered = fieldencountered; parse_open(&ps, filename, flags); new_pkg = &tmp_set.pkg; if (flags & pdb_recordavailable) new_pkgbin = &new_pkg->available; else new_pkgbin = &new_pkg->installed; ps.pkg = new_pkg; ps.pkgbin = new_pkgbin; pkg_obj.pkg = new_pkg; pkg_obj.pkgbin = new_pkgbin; pdone= 0; /* Loop per package. */ for (;;) { memset(fieldencountered, 0, sizeof(fieldencountered)); pkgset_blank(&tmp_set); if (!parse_stanza(&ps, &fs, pkg_parse_field, &pkg_obj)) break; if (pdone && donep) parse_error(&ps, _("several package info entries found, only one allowed")); pkg_parse_verify(&ps, new_pkg, new_pkgbin); db_pkg = pkg_db_find_pkg(new_pkg->set->name, new_pkgbin->arch); if (flags & pdb_recordavailable) db_pkgbin = &db_pkg->available; else db_pkgbin = &db_pkg->installed; if ((flags & pdb_ignoreolder) && versioncompare(&new_pkgbin->version, &db_pkgbin->version) < 0) continue; pkg_parse_copy(&ps, db_pkg, db_pkgbin, new_pkg, new_pkgbin); if (donep) *donep = db_pkg; pdone++; if (parse_EOF(&ps)) break; } parse_close(&ps); varbuf_destroy(&fs.value); if (donep && !pdone) ohshit(_("no package information in `%.255s'"),filename); return pdone; }