Prechádzať zdrojové kódy

libdpkg: Add new archsatisfied() function

The function archsatisfied(pkgbin, deppossi) returns true if pkgbin is a
valid solution to deppossi when considering the architecture requirement
set by the dependency and the announced multiarch type for pkgbin. It
returns false otherwise.

Signed-off-by: Guillem Jover <guillem@debian.org>
Steve Langasek 15 rokov pred
rodič
commit
5631564609
2 zmenil súbory, kde vykonal 44 pridanie a 0 odobranie
  1. 43 0
      lib/dpkg/depcon.c
  2. 1 0
      lib/dpkg/dpkg-db.h

+ 43 - 0
lib/dpkg/depcon.c

@@ -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);
+}

+ 1 - 0
lib/dpkg/dpkg-db.h

@@ -355,6 +355,7 @@ bool epochsdiffer(const struct versionrevision *a,
 /*** from depcon.c ***/
 
 bool versionsatisfied(struct pkgbin *it, struct deppossi *against);
+bool archsatisfied(struct pkgbin *it, struct deppossi *against);
 
 /*** from nfmalloc.c ***/
 void *nfmalloc(size_t);