static void pkg_disappear(struct pkginfo *pkg, struct pkginfo *infavour) { printf(_("(Noting disappearance of %s, which has been completely replaced.)\n"), pkg_name(pkg, pnaw_nonambig)); log_action("disappear", pkg, &pkg->installed); debug(dbg_general, "pkg_disappear disappearing %s", pkg_name(pkg, pnaw_nonambig)); trig_activate_packageprocessing(pkg); maintainer_script_installed(pkg, POSTRMFILE, "post-removal script (for disappearance)", "disappear", infavour->set->name, versiondescribe(&infavour->available.version, vdew_nonambig), NULL); /* OK, now we delete all the stuff in the ‘info’ directory .. */ debug(dbg_general, "pkg_disappear cleaning info directory"); pkg_infodb_foreach(pkg, &pkg->installed, pkg_infodb_remove_file); dir_sync_path(pkgadmindir()); pkg_set_status(pkg, stat_notinstalled); pkg_set_want(pkg, want_unknown); pkg_reset_eflags(pkg); blankversion(&pkg->configversion); pkgbin_blank(&pkg->installed); pkg->clientdata->fileslistvalid = false; modstatdb_note(pkg); }
void pkg_blank(struct pkginfo *pkg) { pkg->set = NULL; pkg->arch_next = NULL; pkg_set_status(pkg, stat_notinstalled); pkg_reset_eflags(pkg); pkg_set_want(pkg, want_unknown); pkg->priority = pri_unknown; pkg->otherpriority = NULL; pkg->section = NULL; blankversion(&pkg->configversion); pkg->files = NULL; pkg->clientdata = NULL; pkg->trigaw.head = NULL; pkg->trigaw.tail = NULL; pkg->othertrigaw_head = NULL; pkg->trigpend_head = NULL; pkgbin_blank(&pkg->installed); pkgbin_blank(&pkg->available); /* The architectures are reset here (instead of in pkgbin_blank), * because they are part of the package specification, and needed * for selections. */ pkg->installed.arch = dpkg_arch_get(arch_none); pkg->available.arch = dpkg_arch_get(arch_none); }
int clearselections(const char *const *argv) { enum modstatdb_rw msdbflags; struct pkgiterator *it; struct pkginfo *pkg; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); if (f_noact) msdbflags = msdbrw_readonly; else msdbflags = msdbrw_write; modstatdb_open(msdbflags); pkg_infodb_upgrade(); it = pkg_db_iter_new(); while ((pkg = pkg_db_iter_next_pkg(it))) { if (!pkg->installed.essential) pkg_set_want(pkg, PKG_WANT_DEINSTALL); } pkg_db_iter_free(it); modstatdb_shutdown(); return 0; }
int clearselections(const char *const *argv) { struct pkgiterator *it; struct pkginfo *pkg; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); modstatdb_open(msdbrw_write); it = pkg_db_iter_new(); while ((pkg = pkg_db_iter_next_pkg(it))) { if (!pkg->installed.essential) pkg_set_want(pkg, want_deinstall); } pkg_db_iter_free(it); modstatdb_shutdown(); return 0; }
int setselections(const char *const *argv) { const struct namevalue *nv; struct pkginfo *pkg; const char *e; int c, lno; struct varbuf namevb = VARBUF_INIT; struct varbuf selvb = VARBUF_INIT; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); modstatdb_open(msdbrw_write | msdbrw_available_readonly); lno= 1; for (;;) { do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && isspace(c)); if (c == EOF) break; if (c == '#') { do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && c != '\n'); continue; } varbuf_reset(&namevb); while (!isspace(c)) { varbuf_add_char(&namevb, c); c= getchar(); if (c == EOF) ohshit(_("unexpected eof in package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line in package name at line %d"),lno); } varbuf_end_str(&namevb); while (c != EOF && isspace(c)) { c= getchar(); if (c == EOF) ohshit(_("unexpected eof after package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line after package name at line %d"),lno); } varbuf_reset(&selvb); while (c != EOF && !isspace(c)) { varbuf_add_char(&selvb, c); c= getchar(); } varbuf_end_str(&selvb); while (c != EOF && c != '\n') { c= getchar(); if (!isspace(c)) ohshit(_("unexpected data after package and selection at line %d"),lno); } e = pkg_name_is_illegal(namevb.buf); if (e) ohshit(_("illegal package name at line %d: %.250s"),lno,e); nv = namevalue_find_by_name(wantinfos, selvb.buf); if (nv == NULL) ohshit(_("unknown wanted status at line %d: %.250s"), lno, selvb.buf); pkg = pkg_db_find(namevb.buf); pkg_set_want(pkg, nv->value); if (c == EOF) break; lno++; } if (ferror(stdin)) ohshite(_("read error on standard input")); modstatdb_shutdown(); varbuf_destroy(&namevb); varbuf_destroy(&selvb); return 0; }
int setselections(const char *const *argv) { enum modstatdb_rw msdbflags; const struct namevalue *nv; struct pkginfo *pkg; int c, lno; struct varbuf namevb = VARBUF_INIT; struct varbuf selvb = VARBUF_INIT; bool db_possibly_outdated = false; if (*argv) badusage(_("--%s takes no arguments"), cipaction->olong); msdbflags = msdbrw_available_readonly; if (f_noact) msdbflags |= msdbrw_readonly; else msdbflags |= msdbrw_write; modstatdb_open(msdbflags); pkg_infodb_upgrade(); lno= 1; for (;;) { struct dpkg_error err; do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && isspace(c)); if (c == EOF) break; if (c == '#') { do { c= getchar(); if (c == '\n') lno++; } while (c != EOF && c != '\n'); continue; } varbuf_reset(&namevb); while (!isspace(c)) { varbuf_add_char(&namevb, c); c= getchar(); if (c == EOF) ohshit(_("unexpected eof in package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line in package name at line %d"),lno); } varbuf_end_str(&namevb); while (c != EOF && isspace(c)) { c= getchar(); if (c == EOF) ohshit(_("unexpected eof after package name at line %d"),lno); if (c == '\n') ohshit(_("unexpected end of line after package name at line %d"),lno); } varbuf_reset(&selvb); while (c != EOF && !isspace(c)) { varbuf_add_char(&selvb, c); c= getchar(); } varbuf_end_str(&selvb); while (c != EOF && c != '\n') { c= getchar(); if (!isspace(c)) ohshit(_("unexpected data after package and selection at line %d"),lno); } pkg = pkg_spec_parse_pkg(namevb.buf, &err); if (pkg == NULL) ohshit(_("illegal package name at line %d: %.250s"), lno, err.str); if (!pkg_is_informative(pkg, &pkg->installed) && !pkg_is_informative(pkg, &pkg->available)) { db_possibly_outdated = true; warning(_("package not in database at line %d: %.250s"), lno, namevb.buf); continue; } nv = namevalue_find_by_name(wantinfos, selvb.buf); if (nv == NULL) ohshit(_("unknown wanted status at line %d: %.250s"), lno, selvb.buf); pkg_set_want(pkg, nv->value); if (c == EOF) break; lno++; } if (ferror(stdin)) ohshite(_("read error on standard input")); modstatdb_shutdown(); varbuf_destroy(&namevb); varbuf_destroy(&selvb); if (db_possibly_outdated) warning(_("found unknown packages; this might mean the available database\n" "is outdated, and needs to be updated through a frontend method")); return 0; }
/** * Verify and fixup the package structure being constructed. */ static void pkg_parse_verify(struct parsedb_state *ps, struct pkginfo *pkg, struct pkgbin *pkgbin) { struct dependency *dep; struct deppossi *dop; parse_must_have_field(ps, pkg->set->name, "package name"); /* XXX: We need to check for status != stat_halfinstalled as while * unpacking an unselected package, it will not have yet all data in * place. But we cannot check for > stat_halfinstalled as stat_configfiles * always should have those fields. */ if ((ps->flags & pdb_recordavailable) || (pkg->status != stat_notinstalled && pkg->status != stat_halfinstalled)) { parse_ensure_have_field(ps, &pkgbin->description, "description"); parse_ensure_have_field(ps, &pkgbin->maintainer, "maintainer"); parse_must_have_field(ps, pkgbin->version.version, "version"); } /* XXX: Versions before dpkg 1.10.19 did not preserve the Architecture * field in the status file. So there's still live systems with packages * in stat_configfiles, ignore those too for now. */ if ((ps->flags & pdb_recordavailable) || pkg->status > stat_halfinstalled) { /* We always want usable architecture information (as long as the package * is in such a state that it make sense), so that it can be used safely * on string comparisons and the like. */ if (pkgbin->arch->type == arch_none) parse_warn(ps, _("missing %s"), "architecture"); else if (pkgbin->arch->type == arch_empty) parse_warn(ps, _("empty value for %s"), "architecture"); } if (pkgbin->arch->type == arch_empty) pkgbin->arch = dpkg_arch_get(arch_none); if (pkgbin->arch->type == arch_all && pkgbin->multiarch == multiarch_same) parse_error(ps, _("package has field '%s' but is architecture all"), "Multi-Arch: same"); /* Initialize deps to be arch-specific unless stated otherwise. */ for (dep = pkgbin->depends; dep; dep = dep->next) for (dop = dep->list; dop; dop = dop->next) if (!dop->arch) dop->arch = pkgbin->arch; /* Check the Config-Version information: * If there is a Config-Version it is definitely to be used, but * there shouldn't be one if the package is ‘installed’ (in which case * the Version and/or Revision will be copied) or if the package is * ‘not-installed’ (in which case there is no Config-Version). */ if (!(ps->flags & pdb_recordavailable)) { if (pkg->configversion.version) { if (pkg->status == stat_installed || pkg->status == stat_notinstalled) parse_error(ps, _("Configured-Version for package with inappropriate Status")); } else { if (pkg->status == stat_installed) pkg->configversion = pkgbin->version; } } if (pkg->trigaw.head && (pkg->status <= stat_configfiles || pkg->status >= stat_triggerspending)) parse_error(ps, _("package has status %s but triggers are awaited"), statusinfos[pkg->status].name); else if (pkg->status == stat_triggersawaited && !pkg->trigaw.head) parse_error(ps, _("package has status triggers-awaited but no triggers awaited")); if (pkg->trigpend_head && !(pkg->status == stat_triggerspending || pkg->status == stat_triggersawaited)) parse_error(ps, _("package has status %s but triggers are pending"), statusinfos[pkg->status].name); else if (pkg->status == stat_triggerspending && !pkg->trigpend_head) parse_error(ps, _("package has status triggers-pending but no triggers " "pending")); /* FIXME: There was a bug that could make a not-installed package have * conffiles, so we check for them here and remove them (rather than * calling it an error, which will do at some point). */ if (!(ps->flags & pdb_recordavailable) && pkg->status == stat_notinstalled && pkgbin->conffiles) { parse_warn(ps, _("Package which in state not-installed has conffiles, " "forgetting them")); pkgbin->conffiles = NULL; } /* XXX: Mark not-installed leftover packages for automatic removal on * next database dump. This code can be removed after dpkg 1.16.x, when * there's guarantee that no leftover is found on the status file on * major distributions. */ if (!(ps->flags & pdb_recordavailable) && pkg->status == stat_notinstalled && pkg->eflag == eflag_ok && (pkg->want == want_purge || pkg->want == want_deinstall || pkg->want == want_hold)) { pkg_set_want(pkg, want_unknown); } }