|
|
@@ -3,6 +3,7 @@
|
|
|
* depcon.c - dependency and conflict checking
|
|
|
*
|
|
|
* Copyright © 1995 Ian Jackson <ian@chiark.greenend.org.uk>
|
|
|
+ * Copyright © 2009 Canonical Ltd.
|
|
|
*
|
|
|
* This is free software; you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
@@ -23,6 +24,7 @@
|
|
|
|
|
|
#include <dpkg/dpkg.h>
|
|
|
#include <dpkg/dpkg-db.h>
|
|
|
+#include <dpkg/arch.h>
|
|
|
|
|
|
bool
|
|
|
versionsatisfied(struct pkgbin *it, struct deppossi *against)
|
|
|
@@ -30,3 +32,44 @@ versionsatisfied(struct pkgbin *it, struct deppossi *against)
|
|
|
return versionsatisfied3(&it->version, &against->version,
|
|
|
against->verrel);
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Check if the architecture qualifier in the dependency is satisfied.
|
|
|
+ *
|
|
|
+ * The rules are supposed to be:
|
|
|
+ * - unqualified Depends/Pre-Depends/Recommends/Suggests are only
|
|
|
+ * satisfied by a package of a different architecture if the target
|
|
|
+ * package is Multi-Arch: foreign.
|
|
|
+ * - Depends/Pre-Depends/Recommends/Suggests on pkg:any are satisfied by
|
|
|
+ * a package of a different architecture if the target package is
|
|
|
+ * Multi-Arch: allowed.
|
|
|
+ * - all other Depends/Pre-Depends/Recommends/Suggests are only
|
|
|
+ * satisfied by packages of the same architecture.
|
|
|
+ * - Architecture: all packages are treated the same as packages of the
|
|
|
+ * native architecture.
|
|
|
+ * - Conflicts/Replaces/Breaks are assumed to apply to packages of any arch.
|
|
|
+ */
|
|
|
+bool
|
|
|
+archsatisfied(struct pkgbin *it, struct deppossi *against)
|
|
|
+{
|
|
|
+ const struct dpkg_arch *dep_arch, *pkg_arch;
|
|
|
+
|
|
|
+ if (it->multiarch == multiarch_foreign)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ dep_arch = against->arch;
|
|
|
+ if (dep_arch->type == arch_wildcard &&
|
|
|
+ (it->multiarch == multiarch_allowed ||
|
|
|
+ against->up->type == dep_conflicts ||
|
|
|
+ against->up->type == dep_replaces ||
|
|
|
+ against->up->type == dep_breaks))
|
|
|
+ return true;
|
|
|
+
|
|
|
+ pkg_arch = it->arch;
|
|
|
+ if (dep_arch->type == arch_none || dep_arch->type == arch_all)
|
|
|
+ dep_arch = dpkg_arch_get_native();
|
|
|
+ if (pkg_arch->type == arch_none || pkg_arch->type == arch_all)
|
|
|
+ pkg_arch = dpkg_arch_get_native();
|
|
|
+
|
|
|
+ return (dep_arch == pkg_arch);
|
|
|
+}
|