#include "main.h"
#include "archives.h"
+/* We shouldn't need anymore than 10 conflictors */
+struct conflict conflictor[10];
+int cflict_index = 0;
+
int filesavespackage(struct fileinlist *file, struct pkginfo *pkgtobesaved,
struct pkginfo *pkgbeinginstalled) {
struct pkginfo *divpkg, *thirdpkg;
}
void check_conflict(struct dependency *dep, struct pkginfo *pkg,
- const char *pfilename, struct conflict **conflictorp) {
+ const char *pfilename) {
struct pkginfo *fixbyrm;
struct deppossi *pdep, flagdeppossi;
struct varbuf conflictwhy, removalwhy;
varbufinit(&conflictwhy);
varbufinit(&removalwhy);
- for ( ; *conflictorp && (*conflictorp)->next ; *conflictorp= (*conflictorp)->next );
-
fixbyrm= 0;
if (depisok(dep, &conflictwhy, &fixbyrm, 0)) {
varbuffree(&conflictwhy);
}
}
if (!pdep) {
+ /* if this gets triggered, it means a package has > 10 conflicts/replaces
+ * pairs, which is the package's fault
+ */
+ assert(cflict_index < 10);
/* This conflict is OK - we'll remove the conflictor. */
- if (*conflictorp) {
- (*conflictorp)->next= nfmalloc(sizeof(struct conflict));
- (*conflictorp)->next->cflict= fixbyrm;
- (*conflictorp)->next->next= 0;
- } else {
- *conflictorp= nfmalloc(sizeof(struct conflict));
- (*conflictorp)->next= 0;
- (*conflictorp)->cflict= fixbyrm;
- }
+ conflictor[cflict_index++].cflict= fixbyrm;
varbuffree(&conflictwhy); varbuffree(&removalwhy);
fprintf(stderr, _("dpkg: yes, will remove %s in favour of %s.\n"),
fixbyrm->name, pkg->name);
int c1, r, admindirlen, i, infodirlen, infodirbaseused, status;
struct pkgiterator *it;
struct pkginfo *pkg, *otherpkg, *divpkg;
- struct conflict *conflictor, *cflict;
char *cidir, *cidirrest, *p;
char *pfilenamebuf, conffilenamebuf[MAXCONFFILENAME];
const char *pfilename, *newinfofilename;
/* Check if anything is installed that we conflict with, or not installed
* that we need */
pkg->clientdata->istobe= itb_installnew;
- conflictor= 0;
+
for (dsearch= pkg->available.depends; dsearch; dsearch= dsearch->next) {
switch (dsearch->type) {
case dep_conflicts:
/* Look for things we conflict with. */
- check_conflict(dsearch, pkg, pfilename, &conflictor);
+ check_conflict(dsearch, pkg, pfilename);
break;
case dep_provides:
/* Look for things that conflict with what we provide. */
psearch;
psearch= psearch->nextrev) {
if (psearch->up->type != dep_conflicts) continue;
- check_conflict(psearch->up, pkg, pfilename, &conflictor);
+ check_conflict(psearch->up, pkg, pfilename);
}
}
break;
/* Look for things that conflict with us. */
for (psearch= pkg->installed.depended; psearch; psearch= psearch->nextrev) {
if (psearch->up->type != dep_conflicts) continue;
- check_conflict(psearch->up, pkg, pfilename, &conflictor);
+ check_conflict(psearch->up, pkg, pfilename);
}
ensure_allinstfiles_available();
* them if they seem to disappear completely.
*/
oldconffsetflags(pkg->installed.conffiles);
- for (cflict= conflictor ; cflict ; cflict= cflict->next) {
- oldconffsetflags(cflict->cflict->installed.conffiles);
+ for (i = 0 ; i < cflict_index ; i++) {
+ oldconffsetflags(conflictor[i].cflict->installed.conffiles);
}
oldversionstatus= pkg->status;
modstatdb_note(pkg);
}
- for (cflict= conflictor ; cflict ; cflict= cflict->next) {
- if (!(cflict->cflict->status == stat_halfconfigured ||
- cflict->cflict->status == stat_installed)) continue;
+ for (i = 0 ; i < cflict_index ; i++) {
+ if (!(conflictor[i].cflict->status == stat_halfconfigured ||
+ conflictor[i].cflict->status == stat_installed)) continue;
for (deconpil= deconfigure; deconpil; deconpil= deconpil->next) {
printf(_("De-configuring %s, so that we can remove %s ...\n"),
- deconpil->pkg->name, cflict->cflict->name);
+ deconpil->pkg->name, conflictor[i].cflict->name);
deconpil->pkg->status= stat_halfconfigured;
modstatdb_note(deconpil->pkg);
/* This means that we *either* go and run postinst abort-deconfigure,
*/
push_cleanup(cu_prermdeconfigure,~ehflag_normaltidy,
ok_prermdeconfigure,ehflag_normaltidy,
- 3,(void*)deconpil->pkg,(void*)cflict->cflict,(void*)pkg);
+ 3,(void*)deconpil->pkg,
+ (void*)conflictor[i].cflict,(void*)pkg);
maintainer_script_installed(deconpil->pkg, PRERMFILE, "pre-removal",
"deconfigure", "in-favour", pkg->name,
versiondescribe(&pkg->available.version,
vdew_nonambig),
- "removing", cflict->cflict->name,
- versiondescribe(&cflict->cflict->installed.version,
+ "removing", conflictor[i].cflict->name,
+ versiondescribe(&conflictor[i].cflict->installed.version,
vdew_nonambig),
(char*)0);
}
- cflict->cflict->status= stat_halfconfigured;
- modstatdb_note(cflict->cflict);
+ conflictor[i].cflict->status= stat_halfconfigured;
+ modstatdb_note(conflictor[i].cflict);
push_cleanup(cu_prerminfavour,~ehflag_normaltidy, 0,0,
- 2,(void*)cflict->cflict,(void*)pkg);
- maintainer_script_installed(cflict->cflict, PRERMFILE, "pre-removal",
+ 2,(void*)conflictor[i].cflict,(void*)pkg);
+ maintainer_script_installed(conflictor[i].cflict, PRERMFILE, "pre-removal",
"remove", "in-favour", pkg->name,
versiondescribe(&pkg->available.version,
vdew_nonambig),
(char*)0);
- cflict->cflict->status= stat_halfinstalled;
- modstatdb_note(cflict->cflict);
+ conflictor[i].cflict->status= stat_halfinstalled;
+ modstatdb_note(conflictor[i].cflict);
}
pkg->eflag |= eflagf_reinstreq;
if (otherpkg == pkg ||
otherpkg->status == stat_notinstalled ||
otherpkg->status == stat_configfiles ||
+ otherpkg->clientdata->istobe == itb_remove ||
!otherpkg->clientdata->files) continue;
- for (cflict= conflictor ; cflict && cflict->cflict != otherpkg ;
- cflict= cflict->next);
- if (cflict) continue;
debug(dbg_veryverbose, "process_archive checking disappearance %s",otherpkg->name);
assert(otherpkg->clientdata->istobe == itb_normal ||
otherpkg->clientdata->istobe == itb_deconfigure);
* as we have not yet updated the filename->packages mappings; however,
* the package->filenames mapping is
*/
- for (cflict= conflictor ; cflict ; cflict= cflict->next) {
+ for (i = 0 ; i < cflict_index ; i++) {
/* We need to have the most up-to-date info about which files are what ... */
ensure_allinstfiles_available();
- removal_bulk(cflict->cflict);
+ removal_bulk(conflictor[i].cflict);
}
if (cipaction->arg == act_install) add_to_queue(pkg);