Branch data Line data Source code
1 : : /* 2 : : * libdpkg - Debian packaging suite library routines 3 : : * depcon.c - dependency and conflict checking 4 : : * 5 : : * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk> 6 : : * Copyright © 2008-2014 Guillem Jover <guillem@debian.org> 7 : : * Copyright © 2009 Canonical Ltd. 8 : : * 9 : : * This is free software; you can redistribute it and/or modify 10 : : * it under the terms of the GNU General Public License as published by 11 : : * the Free Software Foundation; either version 2 of the License, or 12 : : * (at your option) any later version. 13 : : * 14 : : * This is distributed in the hope that it will be useful, 15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 : : * GNU General Public License for more details. 18 : : * 19 : : * You should have received a copy of the GNU General Public License 20 : : * along with this program. If not, see <https://www.gnu.org/licenses/>. 21 : : */ 22 : : 23 : : #include <config.h> 24 : : #include <compat.h> 25 : : 26 : : #include <dpkg/dpkg.h> 27 : : #include <dpkg/dpkg-db.h> 28 : : #include <dpkg/arch.h> 29 : : 30 : : bool 31 : 0 : versionsatisfied(struct pkgbin *it, struct deppossi *against) 32 : : { 33 : 0 : return dpkg_version_relate(&it->version, 34 : : against->verrel, 35 : 0 : &against->version); 36 : : } 37 : : 38 : : /** 39 : : * Check if the architecture qualifier in the dependency is satisfied. 40 : : * 41 : : * The rules are supposed to be: 42 : : * - unqualified Depends/Pre-Depends/Recommends/Suggests are only 43 : : * satisfied by a package of a different architecture if the target 44 : : * package is Multi-Arch: foreign. 45 : : * - Depends/Pre-Depends/Recommends/Suggests on pkg:any are satisfied by 46 : : * a package of a different architecture if the target package is 47 : : * Multi-Arch: allowed. 48 : : * - all other Depends/Pre-Depends/Recommends/Suggests are only 49 : : * satisfied by packages of the same architecture. 50 : : * - Architecture: all packages are treated the same as packages of the 51 : : * native architecture. 52 : : * - Conflicts/Replaces/Breaks are assumed to apply to packages of any arch. 53 : : */ 54 : : bool 55 : 0 : deparchsatisfied(struct pkgbin *it, const struct dpkg_arch *it_arch, 56 : : struct deppossi *against) 57 : : { 58 : : const struct dpkg_arch *dep_arch, *pkg_arch; 59 : : 60 [ # # ]: 0 : if (against->arch_is_implicit && 61 [ # # ]: 0 : it->multiarch == PKG_MULTIARCH_FOREIGN) 62 : 0 : return true; 63 : : 64 : 0 : dep_arch = against->arch; 65 [ # # ]: 0 : if (dep_arch->type == DPKG_ARCH_WILDCARD && 66 [ # # ]: 0 : (it->multiarch == PKG_MULTIARCH_ALLOWED || 67 [ # # ]: 0 : against->up->type == dep_conflicts || 68 [ # # ]: 0 : against->up->type == dep_replaces || 69 [ # # ]: 0 : against->up->type == dep_breaks)) 70 : 0 : return true; 71 : : 72 : 0 : pkg_arch = it_arch; 73 [ # # # # ]: 0 : if (dep_arch->type == DPKG_ARCH_NONE || dep_arch->type == DPKG_ARCH_ALL) 74 : 0 : dep_arch = dpkg_arch_get(DPKG_ARCH_NATIVE); 75 [ # # # # ]: 0 : if (pkg_arch->type == DPKG_ARCH_NONE || pkg_arch->type == DPKG_ARCH_ALL) 76 : 0 : pkg_arch = dpkg_arch_get(DPKG_ARCH_NATIVE); 77 : : 78 : 0 : return (dep_arch == pkg_arch); 79 : : } 80 : : 81 : : bool 82 : 0 : archsatisfied(struct pkgbin *it, struct deppossi *against) 83 : : { 84 : 0 : return deparchsatisfied(it, it->arch, against); 85 : : } 86 : : 87 : : /** 88 : : * Check if the dependency is satisfied by a virtual package. 89 : : * 90 : : * For versioned depends, we only check providers with #DPKG_RELATION_EQ. It 91 : : * does not make sense to check ones without a version since we have nothing 92 : : * to verify against. Also, it is way too complex to allow anything but an 93 : : * equal in a provided version. A few examples below to deter you from trying: 94 : : * 95 : : * - pkg1 depends on virt (>= 0.6), pkg2 provides virt (<= 1.0). 96 : : * Should pass (easy enough). 97 : : * 98 : : * - pkg1 depends on virt (>= 0.7) and (<= 1.1), pkg2 provides virt (>= 1.2). 99 : : * Should fail (little harder). 100 : : * 101 : : * - pkg1 depends on virt (>= 0.4), pkg2 provides virt (<= 1.0) and (>= 0.5), 102 : : * IOW, inclusive of only those versions. This would require backchecking 103 : : * the other provided versions in the possi, which would make things sickly 104 : : * complex and overly time consuming. Should fail (very hard to implement). 105 : : * 106 : : * This could be handled by switching to a SAT solver, but that would imply 107 : : * lots of work for very little gain. Packages can easily get around most of 108 : : * these by providing multiple #DPKG_RELATION_EQ versions. 109 : : */ 110 : : bool 111 : 0 : pkg_virtual_deppossi_satisfied(struct deppossi *dependee, 112 : : struct deppossi *provider) 113 : : { 114 [ # # ]: 0 : if (provider->verrel != DPKG_RELATION_NONE && 115 [ # # ]: 0 : provider->verrel != DPKG_RELATION_EQ) 116 : 0 : return false; 117 : : 118 [ # # ]: 0 : if (provider->verrel == DPKG_RELATION_NONE && 119 [ # # ]: 0 : dependee->verrel != DPKG_RELATION_NONE) 120 : 0 : return false; 121 : : 122 : 0 : return dpkg_version_relate(&provider->version, 123 : : dependee->verrel, 124 : 0 : &dependee->version); 125 : : }