<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>rpm: lib/depends.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> <link href="tabs.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.7 --> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li id="current"><a href="files.html"><span>Files</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> </ul></div> <div class="tabs"> <ul> <li><a href="files.html"><span>File List</span></a></li> <li><a href="globals.html"><span>Globals</span></a></li> </ul></div> <h1>lib/depends.c</h1><a href="depends_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <a name="l00005"></a>00005 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span> <a name="l00006"></a>00006 <a name="l00007"></a>00007 <span class="preprocessor">#include <<a class="code" href="rpmcli_8h.html">rpmcli.h</a>></span> <span class="comment">/* XXX rpmcliPackagesTotal */</span> <a name="l00008"></a>00008 <a name="l00009"></a>00009 <span class="preprocessor">#include <<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>></span> <span class="comment">/* XXX rpmExpand("%{_dependency_whiteout}" */</span> <a name="l00010"></a>00010 <a name="l00011"></a>00011 <span class="preprocessor">#include "<a class="code" href="rpmdb_8h.html">rpmdb.h</a>"</span> <span class="comment">/* XXX response cache needs dbiOpen et al. */</span> <a name="l00012"></a>00012 <a name="l00013"></a>00013 <span class="preprocessor">#include "<a class="code" href="rpmds_8h.html">rpmds.h</a>"</span> <a name="l00014"></a>00014 <span class="preprocessor">#include "<a class="code" href="rpmfi_8h.html">rpmfi.h</a>"</span> <a name="l00015"></a>00015 <a name="l00016"></a><a class="code" href="depends_8c.html#8b9ec4a59b7fb926b37e29f380b24412">00016</a> <span class="preprocessor">#define _RPMTE_INTERNAL</span> <a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="rpmte_8h.html">rpmte.h</a>"</span> <a name="l00018"></a>00018 <a name="l00019"></a><a class="code" href="depends_8c.html#30f880cec629d8da451b1ba5e0f194cb">00019</a> <span class="preprocessor">#define _RPMTS_INTERNAL</span> <a name="l00020"></a>00020 <span class="preprocessor"></span><span class="preprocessor">#include "<a class="code" href="rpmts_8h.html">rpmts.h</a>"</span> <a name="l00021"></a>00021 <a name="l00022"></a>00022 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span> <a name="l00023"></a>00023 <a name="l00024"></a>00024 <span class="comment">/*@access tsortInfo @*/</span> <a name="l00025"></a>00025 <span class="comment">/*@access rpmts @*/</span> <a name="l00026"></a>00026 <a name="l00027"></a>00027 <span class="comment">/*@access dbiIndex @*/</span> <span class="comment">/* XXX for dbi->dbi_txnid */</span> <a name="l00028"></a>00028 <a name="l00029"></a>00029 <span class="comment">/*@access alKey @*/</span> <span class="comment">/* XXX for reordering and RPMAL_NOMATCH assign */</span> <a name="l00030"></a>00030 <a name="l00033"></a><a class="code" href="depends_8c.html#12b92f190cd5f990ade0d12e8d7b16db">00033</a> <span class="keyword">typedef</span> <span class="comment">/*@abstract@*/</span> <span class="keyword">struct </span><a class="code" href="structorderListIndex__s.html">orderListIndex_s</a> * <a class="code" href="structorderListIndex__s.html">orderListIndex</a>; <a name="l00034"></a>00034 <span class="comment">/*@access orderListIndex@*/</span> <a name="l00035"></a>00035 <a name="l00038"></a><a class="code" href="structorderListIndex__s.html">00038</a> <span class="keyword">struct </span><a class="code" href="structorderListIndex__s.html">orderListIndex_s</a> { <a name="l00039"></a>00039 <span class="comment">/*@dependent@*/</span> <a name="l00040"></a><a class="code" href="structorderListIndex__s.html#1a89062a74114ef2916c53fa20372d65">00040</a> <a class="code" href="rpmlib_8h.html#fa3db181e6f99551db84f5b20db9fdc3">alKey</a> <a class="code" href="structorderListIndex__s.html#1a89062a74114ef2916c53fa20372d65">pkgKey</a>; <a name="l00041"></a><a class="code" href="structorderListIndex__s.html#d8468c119c48cf56b10acc573a95f5dd">00041</a> <span class="keywordtype">int</span> <a class="code" href="structorderListIndex__s.html#d8468c119c48cf56b10acc573a95f5dd">orIndex</a>; <a name="l00042"></a>00042 }; <a name="l00043"></a>00043 <a name="l00044"></a>00044 <span class="comment">/*@unchecked@*/</span> <a name="l00045"></a><a class="code" href="verify_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">00045</a> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a> = 1; <a name="l00046"></a>00046 <a name="l00047"></a>00047 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span> <a name="l00048"></a><a class="code" href="rpmlib_8h.html#56adfa93648b6f884ece3d756837238e">00048</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="depends_8c.html#56adfa93648b6f884ece3d756837238e">rpmNAME</a> = <a class="code" href="config_8h.html#ca8570fb706c81df371b7f9bc454ae03">PACKAGE</a>; <a name="l00049"></a>00049 <a name="l00050"></a>00050 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span> <a name="l00051"></a><a class="code" href="rpmlib_8h.html#e103981016031ce0b1e8fd243cacccd9">00051</a> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="depends_8c.html#e103981016031ce0b1e8fd243cacccd9">rpmEVR</a> = <a class="code" href="config_8h.html#1c6d5de492ac61ad29aec7aa9a436bbf">VERSION</a>; <a name="l00052"></a>00052 <a name="l00053"></a>00053 <span class="comment">/*@unchecked@*/</span> <a name="l00054"></a><a class="code" href="rpmlib_8h.html#dc87e62498e841f87cb0ec73a4d9a320">00054</a> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#dc87e62498e841f87cb0ec73a4d9a320">rpmFLAGS</a> = <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a356de61e4a13c4ee1e60ef828dc1720aa">RPMSENSE_EQUAL</a>; <a name="l00055"></a>00055 <a name="l00062"></a><a class="code" href="depends_8c.html#4da51c423237a55054e8b506034a79b1">00062</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#4da51c423237a55054e8b506034a79b1">intcmp</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * a, <span class="keyword">const</span> <span class="keywordtype">void</span> * b) <a name="l00063"></a>00063 <span class="comment">/*@requires maxRead(a) == 0 /\ maxRead(b) == 0 @*/</span> <a name="l00064"></a>00064 { <a name="l00065"></a>00065 <span class="keyword">const</span> <span class="keywordtype">int</span> * aptr = a; <a name="l00066"></a>00066 <span class="keyword">const</span> <span class="keywordtype">int</span> * bptr = b; <a name="l00067"></a>00067 <span class="keywordtype">int</span> rc = (*aptr - *bptr); <a name="l00068"></a>00068 <span class="keywordflow">return</span> rc; <a name="l00069"></a>00069 } <a name="l00070"></a>00070 <a name="l00079"></a><a class="code" href="depends_8c.html#973d8556307193f9d2f5befe9941146c">00079</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#973d8556307193f9d2f5befe9941146c">removePackage</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a class="code" href="structheaderToken__s.html">Header</a> h, <span class="keywordtype">int</span> dboffset, <a name="l00080"></a>00080 <span class="comment">/*@exposed@*/</span> <span class="comment">/*@dependent@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpmlib_8h.html#fa3db181e6f99551db84f5b20db9fdc3">alKey</a> depends) <a name="l00081"></a>00081 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/</span> <a name="l00082"></a>00082 <span class="comment">/*@modifies ts, h, rpmGlobalMacroContext, fileSystem, internalState @*/</span> <a name="l00083"></a>00083 { <a name="l00084"></a>00084 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p; <a name="l00085"></a>00085 <a name="l00086"></a>00086 <span class="comment">/* Filter out duplicate erasures. */</span> <a name="l00087"></a>00087 <span class="keywordflow">if</span> (ts->numRemovedPackages > 0 && ts->removedPackages != NULL) { <a name="l00088"></a>00088 <span class="comment">/*@-boundswrite@*/</span> <a name="l00089"></a>00089 <span class="keywordflow">if</span> (bsearch(&dboffset, ts->removedPackages, ts->numRemovedPackages, <a name="l00090"></a>00090 <span class="keyword">sizeof</span>(*ts->removedPackages), <a class="code" href="depends_8c.html#4da51c423237a55054e8b506034a79b1">intcmp</a>) != NULL) <a name="l00091"></a>00091 <span class="keywordflow">return</span> 0; <a name="l00092"></a>00092 <span class="comment">/*@=boundswrite@*/</span> <a name="l00093"></a>00093 } <a name="l00094"></a>00094 <a name="l00095"></a>00095 <span class="keywordflow">if</span> (ts->numRemovedPackages == ts->allocedRemovedPackages) { <a name="l00096"></a>00096 ts->allocedRemovedPackages += ts->delta; <a name="l00097"></a>00097 ts->removedPackages = <a class="code" href="system_8h.html#93a8ec6e8a6eef0f62b7e5b50d0bf9e4">xrealloc</a>(ts->removedPackages, <a name="l00098"></a>00098 <span class="keyword">sizeof</span>(ts->removedPackages) * ts->allocedRemovedPackages); <a name="l00099"></a>00099 } <a name="l00100"></a>00100 <a name="l00101"></a>00101 <span class="keywordflow">if</span> (ts->removedPackages != NULL) { <span class="comment">/* XXX can't happen. */</span> <a name="l00102"></a>00102 <span class="comment">/*@-boundswrite@*/</span> <a name="l00103"></a>00103 ts->removedPackages[ts->numRemovedPackages] = dboffset; <a name="l00104"></a>00104 ts->numRemovedPackages++; <a name="l00105"></a>00105 <span class="comment">/*@=boundswrite@*/</span> <a name="l00106"></a>00106 <span class="keywordflow">if</span> (ts->numRemovedPackages > 1) <a name="l00107"></a>00107 qsort(ts->removedPackages, ts->numRemovedPackages, <a name="l00108"></a>00108 <span class="keyword">sizeof</span>(*ts->removedPackages), <a class="code" href="depends_8c.html#4da51c423237a55054e8b506034a79b1">intcmp</a>); <a name="l00109"></a>00109 } <a name="l00110"></a>00110 <a name="l00111"></a>00111 <span class="keywordflow">if</span> (ts->orderCount >= ts->orderAlloced) { <a name="l00112"></a>00112 ts->orderAlloced += (ts->orderCount - ts->orderAlloced) + ts->delta; <a name="l00113"></a>00113 <span class="comment">/*@-type +voidabstract @*/</span> <a name="l00114"></a>00114 ts->order = <a class="code" href="system_8h.html#93a8ec6e8a6eef0f62b7e5b50d0bf9e4">xrealloc</a>(ts->order, <span class="keyword">sizeof</span>(*ts->order) * ts->orderAlloced); <a name="l00115"></a>00115 <span class="comment">/*@=type =voidabstract @*/</span> <a name="l00116"></a>00116 } <a name="l00117"></a>00117 <a name="l00118"></a>00118 p = <a class="code" href="rpmte_8c.html#a705c307e9b23d9f4e67bc7c11b64d65">rpmteNew</a>(ts, h, <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>, NULL, NULL, dboffset, depends); <a name="l00119"></a>00119 <span class="comment">/*@-boundswrite@*/</span> <a name="l00120"></a>00120 ts->order[ts->orderCount] = p; <a name="l00121"></a>00121 ts->orderCount++; <a name="l00122"></a>00122 <span class="comment">/*@=boundswrite@*/</span> <a name="l00123"></a>00123 <a name="l00124"></a>00124 <span class="keywordflow">return</span> 0; <a name="l00125"></a>00125 } <a name="l00126"></a>00126 <a name="l00127"></a><a class="code" href="group__rpmts.html#g14f855b79d0aff83c084e254e2442006">00127</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmts.html#g14f855b79d0aff83c084e254e2442006">rpmtsAddInstallElement</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a class="code" href="structheaderToken__s.html">Header</a> h, <a name="l00128"></a>00128 <a class="code" href="rpmmessages_8h.html#e51d034b9e250fe42b0e420f254aa54f">fnpyKey</a> key, <span class="keywordtype">int</span> upgrade, <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * relocs) <a name="l00129"></a>00129 { <a name="l00130"></a>00130 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> tscolor = <a class="code" href="rpmts_8c.html#b638b622295dd5eb80052b26c0364b56">rpmtsColor</a>(ts); <a name="l00131"></a>00131 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> dscolor; <a name="l00132"></a>00132 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> hcolor; <a name="l00133"></a>00133 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; <a name="l00134"></a>00134 <a class="code" href="structheaderToken__s.html">Header</a> oh; <a name="l00135"></a>00135 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> ohcolor; <a name="l00136"></a>00136 <span class="keywordtype">int</span> isSource; <a name="l00137"></a>00137 <span class="keywordtype">int</span> duplicate = 0; <a name="l00138"></a>00138 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> pi = NULL; <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p; <a name="l00139"></a>00139 <a class="code" href="rpmlib_8h.html#3597d5fe0ce8483347e69b67712661f8">HGE_t</a> hge = (<a class="code" href="rpmlib_8h.html#3597d5fe0ce8483347e69b67712661f8">HGE_t</a>)<a class="code" href="group__header.html#gd560995b7a9431b2eacb4caa22796840">headerGetEntryMinMemory</a>; <a name="l00140"></a>00140 <span class="keyword">const</span> <span class="keywordtype">char</span> * arch; <a name="l00141"></a>00141 <span class="keyword">const</span> <span class="keywordtype">char</span> * os; <a name="l00142"></a>00142 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> oldChk, newChk; <a name="l00143"></a>00143 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> obsoletes; <a name="l00144"></a>00144 <a class="code" href="rpmlib_8h.html#fa3db181e6f99551db84f5b20db9fdc3">alKey</a> pkgKey; <span class="comment">/* addedPackages key */</span> <a name="l00145"></a>00145 <span class="keywordtype">int</span> xx; <a name="l00146"></a>00146 <span class="keywordtype">int</span> ec = 0; <a name="l00147"></a>00147 <span class="keywordtype">int</span> rc; <a name="l00148"></a>00148 <span class="keywordtype">int</span> oc; <a name="l00149"></a>00149 <a name="l00150"></a>00150 <span class="comment">/*</span> <a name="l00151"></a>00151 <span class="comment"> * Check for previously added versions with the same name and arch/os.</span> <a name="l00152"></a>00152 <span class="comment"> * FIXME: only catches previously added, older packages.</span> <a name="l00153"></a>00153 <span class="comment"> */</span> <a name="l00154"></a>00154 arch = NULL; <a name="l00155"></a>00155 xx = hge(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b99068a2c9123489dfc26242674d29ed6">RPMTAG_ARCH</a>, NULL, (<span class="keywordtype">void</span> **)&arch, NULL); <a name="l00156"></a>00156 os = NULL; <a name="l00157"></a>00157 xx = hge(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b48da8250ed9e9d2af23eaf6025e5c664">RPMTAG_OS</a>, NULL, (<span class="keywordtype">void</span> **)&os, NULL); <a name="l00158"></a>00158 hcolor = <a class="code" href="rpmts_8c.html#c15257561d31019deabf814ba75da6dc">hGetColor</a>(h); <a name="l00159"></a>00159 pkgKey = <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>; <a name="l00160"></a>00160 <a name="l00161"></a>00161 <span class="comment">/* Check for supported payload format if it's a package */</span> <a name="l00162"></a>00162 <span class="keywordflow">if</span> (key && <a class="code" href="package_8c.html#b1eb7d04798d892e03ec01a8e281ba79">headerCheckPayloadFormat</a>(h) != <a class="code" href="rpmlib_8h.html#a30b10f32f3a5e820ec05d099993e801b6a502fb02cfd2c16380fa6ac52902d4">RPMRC_OK</a>) { <a name="l00163"></a>00163 ec = 1; <a name="l00164"></a>00164 <span class="keywordflow">goto</span> exit; <a name="l00165"></a>00165 } <a name="l00166"></a>00166 <a name="l00167"></a>00167 <span class="comment">/* XXX Always add source headers. */</span> <a name="l00168"></a>00168 isSource = <a class="code" href="group__header.html#g0f25e23afbd3fb4799d579080fbb0942">headerIsEntry</a>(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507bc1e19b757399d5ac0b3ac8ffcbeb76aa">RPMTAG_SOURCEPACKAGE</a>); <a name="l00169"></a>00169 <span class="keywordflow">if</span> (isSource) { <a name="l00170"></a>00170 oc = ts->orderCount; <a name="l00171"></a>00171 <span class="keywordflow">goto</span> addheader; <a name="l00172"></a>00172 } <a name="l00173"></a>00173 <a name="l00174"></a>00174 oldChk = <a class="code" href="rpmds_8c.html#2d52d7e8658dc1d6db182e148381534d">rpmdsThis</a>(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>, (<a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a34c2a1220db41f29e290ad886445dde34">RPMSENSE_LESS</a>)); <a name="l00175"></a>00175 newChk = <a class="code" href="rpmds_8c.html#2d52d7e8658dc1d6db182e148381534d">rpmdsThis</a>(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>, (<a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a356de61e4a13c4ee1e60ef828dc1720aa">RPMSENSE_EQUAL</a>|<a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a31ad14f14d5f219dfe3b78b4418ba7dc1">RPMSENSE_GREATER</a>)); <a name="l00176"></a>00176 <span class="comment">/* XXX can't use rpmtsiNext() filter or oc will have wrong value. */</span> <a name="l00177"></a>00177 <span class="keywordflow">for</span> (pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts), oc = 0; (p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, 0)) != NULL; oc++) { <a name="l00178"></a>00178 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> <span class="keyword">this</span>; <a name="l00179"></a>00179 <a name="l00180"></a>00180 <span class="comment">/* XXX Only added packages need be checked for dupes. */</span> <a name="l00181"></a>00181 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(p) == <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>) <a name="l00182"></a>00182 <span class="keywordflow">continue</span>; <a name="l00183"></a>00183 <a name="l00184"></a>00184 <span class="comment">/* XXX Never check source headers. */</span> <a name="l00185"></a>00185 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#d0dc746da583380f15de1cec4307e9ce">rpmteIsSource</a>(p)) <a name="l00186"></a>00186 <span class="keywordflow">continue</span>; <a name="l00187"></a>00187 <a name="l00188"></a>00188 <span class="keywordflow">if</span> (tscolor) { <a name="l00189"></a>00189 <span class="keyword">const</span> <span class="keywordtype">char</span> * parch; <a name="l00190"></a>00190 <span class="keyword">const</span> <span class="keywordtype">char</span> * pos; <a name="l00191"></a>00191 <a name="l00192"></a>00192 <span class="keywordflow">if</span> (arch == NULL || (parch = <a class="code" href="rpmte_8c.html#c1fbdc937f7a661e77bce7cab54878c1">rpmteA</a>(p)) == NULL) <a name="l00193"></a>00193 <span class="keywordflow">continue</span>; <a name="l00194"></a>00194 <span class="keywordflow">if</span> (os == NULL || (pos = <a class="code" href="rpmte_8c.html#8775559fb9e18e792fc6014e8e079865">rpmteO</a>(p)) == NULL) <a name="l00195"></a>00195 <span class="keywordflow">continue</span>; <a name="l00196"></a>00196 <span class="keywordflow">if</span> (strcmp(arch, parch) || strcmp(os, pos)) <a name="l00197"></a>00197 <span class="keywordflow">continue</span>; <a name="l00198"></a>00198 } <a name="l00199"></a>00199 <a name="l00200"></a>00200 <span class="comment">/* OK, binary rpm's with same arch and os. Check NEVR. */</span> <a name="l00201"></a>00201 <span class="keywordflow">if</span> ((<span class="keyword">this</span> = <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b5a4bfcac106d028f0908b8991e2c5b87">RPMTAG_NAME</a>)) == NULL) <a name="l00202"></a>00202 <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l00203"></a>00203 <a name="l00204"></a>00204 <span class="comment">/* </span> <a name="l00205"></a>00205 <span class="comment"> * On upgrade, if newer NEVR was previously added, </span> <a name="l00206"></a>00206 <span class="comment"> * then skip adding older. </span> <a name="l00207"></a>00207 <span class="comment"> */</span> <a name="l00208"></a>00208 rc = <a class="code" href="rpmds_8c.html#39fb42c30584aadfffb12e2f564f2ac7">rpmdsCompare</a>(newChk, <span class="keyword">this</span>); <a name="l00209"></a>00209 <span class="keywordflow">if</span> (upgrade && rc != 0) { <a name="l00210"></a>00210 <span class="keyword">const</span> <span class="keywordtype">char</span> * pkgNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(<span class="keyword">this</span>); <a name="l00211"></a>00211 <span class="keyword">const</span> <span class="keywordtype">char</span> * addNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(oldChk); <a name="l00212"></a>00212 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#16d38257a060a06fe95122f8fa5bf4e8">rpmIsVerbose</a>()) <a name="l00213"></a>00213 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#dd380de8b2f203516cc1ab9475e31da5">RPMMESS_WARNING</a>, <a name="l00214"></a>00214 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"package %s was already added, skipping %s\n"</span>), <a name="l00215"></a>00215 (pkgNEVR ? pkgNEVR + 2 : <span class="stringliteral">"?pkgNEVR?"</span>), <a name="l00216"></a>00216 (addNEVR ? addNEVR + 2 : <span class="stringliteral">"?addNEVR?"</span>)); <a name="l00217"></a>00217 ec = 0; <a name="l00218"></a>00218 <span class="keywordflow">goto</span> exit; <a name="l00219"></a>00219 } <a name="l00220"></a>00220 <a name="l00221"></a>00221 <span class="comment">/*</span> <a name="l00222"></a>00222 <span class="comment"> * On upgrade, if older NEVR was previously added, </span> <a name="l00223"></a>00223 <span class="comment"> * then replace old with new. </span> <a name="l00224"></a>00224 <span class="comment"> */</span> <a name="l00225"></a>00225 rc = <a class="code" href="rpmds_8c.html#39fb42c30584aadfffb12e2f564f2ac7">rpmdsCompare</a>(oldChk, <span class="keyword">this</span>); <a name="l00226"></a>00226 <span class="keywordflow">if</span> (upgrade && rc != 0) { <a name="l00227"></a>00227 <span class="keyword">const</span> <span class="keywordtype">char</span> * pkgNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(<span class="keyword">this</span>); <a name="l00228"></a>00228 <span class="keyword">const</span> <span class="keywordtype">char</span> * addNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(newChk); <a name="l00229"></a>00229 <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#16d38257a060a06fe95122f8fa5bf4e8">rpmIsVerbose</a>()) <a name="l00230"></a>00230 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#dd380de8b2f203516cc1ab9475e31da5">RPMMESS_WARNING</a>, <a name="l00231"></a>00231 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"package %s was already added, replacing with %s\n"</span>), <a name="l00232"></a>00232 (pkgNEVR ? pkgNEVR + 2 : <span class="stringliteral">"?pkgNEVR?"</span>), <a name="l00233"></a>00233 (addNEVR ? addNEVR + 2 : <span class="stringliteral">"?addNEVR?"</span>)); <a name="l00234"></a>00234 duplicate = 1; <a name="l00235"></a>00235 pkgKey = <a class="code" href="rpmte_8c.html#e1b66df8f25853bf9ab60d6f272aac95">rpmteAddedKey</a>(p); <a name="l00236"></a>00236 <span class="keywordflow">break</span>; <a name="l00237"></a>00237 } <a name="l00238"></a>00238 } <a name="l00239"></a>00239 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l00240"></a>00240 oldChk = <a class="code" href="rpmds_8c.html#81e41176cb032311da92de634bff8183">rpmdsFree</a>(oldChk); <a name="l00241"></a>00241 newChk = <a class="code" href="rpmds_8c.html#81e41176cb032311da92de634bff8183">rpmdsFree</a>(newChk); <a name="l00242"></a>00242 <a name="l00243"></a>00243 <span class="comment">/* If newer NEVR was already added, exit now. */</span> <a name="l00244"></a>00244 <span class="keywordflow">if</span> (ec) <a name="l00245"></a>00245 <span class="keywordflow">goto</span> exit; <a name="l00246"></a>00246 <a name="l00247"></a>00247 addheader: <a name="l00248"></a>00248 <span class="keywordflow">if</span> (oc >= ts->orderAlloced) { <a name="l00249"></a>00249 ts->orderAlloced += (oc - ts->orderAlloced) + ts->delta; <a name="l00250"></a>00250 <span class="comment">/*@-type +voidabstract @*/</span> <a name="l00251"></a>00251 ts->order = <a class="code" href="system_8h.html#93a8ec6e8a6eef0f62b7e5b50d0bf9e4">xrealloc</a>(ts->order, ts->orderAlloced * <span class="keyword">sizeof</span>(*ts->order)); <a name="l00252"></a>00252 <span class="comment">/*@=type =voidabstract @*/</span> <a name="l00253"></a>00253 } <a name="l00254"></a>00254 <a name="l00255"></a>00255 p = <a class="code" href="rpmte_8c.html#a705c307e9b23d9f4e67bc7c11b64d65">rpmteNew</a>(ts, h, <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>, key, relocs, -1, pkgKey); <a name="l00256"></a>00256 <a name="l00257"></a>00257 <span class="keywordflow">if</span> (duplicate && oc < ts->orderCount) { <a name="l00258"></a>00258 <span class="comment">/*@-type -unqualifiedtrans@*/</span> <a name="l00259"></a>00259 <span class="comment">/*@-boundswrite@*/</span> <a name="l00260"></a>00260 ts->order[oc] = <a class="code" href="rpmte_8c.html#811bf4f0099b3d587035b1cf27e11f3b">rpmteFree</a>(ts->order[oc]); <a name="l00261"></a>00261 <span class="comment">/*@=boundswrite@*/</span> <a name="l00262"></a>00262 <span class="comment">/*@=type =unqualifiedtrans@*/</span> <a name="l00263"></a>00263 } <a name="l00264"></a>00264 <a name="l00265"></a>00265 <span class="comment">/*@-boundswrite@*/</span> <a name="l00266"></a>00266 ts->order[oc] = p; <a name="l00267"></a>00267 <span class="comment">/*@=boundswrite@*/</span> <a name="l00268"></a>00268 <span class="keywordflow">if</span> (!duplicate) { <a name="l00269"></a>00269 ts->orderCount++; <a name="l00270"></a>00270 <a class="code" href="rpmcli_8h.html#3990ed781e20a0e677d874d8e8778d39">rpmcliPackagesTotal</a>++; <a name="l00271"></a>00271 } <a name="l00272"></a>00272 <a name="l00273"></a>00273 pkgKey = <a class="code" href="rpmal_8c.html#86e683a86d9d6461198b830c462e3b93">rpmalAdd</a>(&ts->addedPackages, pkgKey, <a class="code" href="rpmte_8c.html#e02ecd953a2a4e4b862b3dc9d3b4a5ec">rpmteKey</a>(p), <a name="l00274"></a>00274 <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b843a73db82df579ed12eab79ef480318">RPMTAG_PROVIDENAME</a>), <a name="l00275"></a>00275 <a class="code" href="rpmte_8c.html#eb0a190d0df41422fcd047ba84368341">rpmteFI</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507bea94338039b3e67d9ece3f8c8875c7fc">RPMTAG_BASENAMES</a>), tscolor); <a name="l00276"></a>00276 <span class="keywordflow">if</span> (pkgKey == <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>) { <a name="l00277"></a>00277 <span class="comment">/*@-boundswrite@*/</span> <a name="l00278"></a>00278 ts->order[oc] = <a class="code" href="rpmte_8c.html#811bf4f0099b3d587035b1cf27e11f3b">rpmteFree</a>(ts->order[oc]); <a name="l00279"></a>00279 <span class="comment">/*@=boundswrite@*/</span> <a name="l00280"></a>00280 ec = 1; <a name="l00281"></a>00281 <span class="keywordflow">goto</span> exit; <a name="l00282"></a>00282 } <a name="l00283"></a>00283 (void) <a class="code" href="rpmte_8c.html#a9887e9443f8c3352b88813a8114fc3e">rpmteSetAddedKey</a>(p, pkgKey); <a name="l00284"></a>00284 <a name="l00285"></a>00285 <span class="keywordflow">if</span> (!duplicate) { <a name="l00286"></a>00286 ts->numAddedPackages++; <a name="l00287"></a>00287 } <a name="l00288"></a>00288 <a name="l00289"></a>00289 <span class="comment">/* XXX rpmgi hack: Save header in transaction element if requested. */</span> <a name="l00290"></a>00290 <span class="keywordflow">if</span> (upgrade & 0x2) <a name="l00291"></a>00291 (void) <a class="code" href="rpmte_8c.html#fba2b99ab45599b8b4975d214b55ce62">rpmteSetHeader</a>(p, h); <a name="l00292"></a>00292 <a name="l00293"></a>00293 <span class="comment">/* If not upgrading, then we're done. */</span> <a name="l00294"></a>00294 <span class="keywordflow">if</span> (!(upgrade & 0x1)) <a name="l00295"></a>00295 <span class="keywordflow">goto</span> exit; <a name="l00296"></a>00296 <a name="l00297"></a>00297 <span class="comment">/* XXX binary rpms always have RPMTAG_SOURCERPM, source rpms do not */</span> <a name="l00298"></a>00298 <span class="keywordflow">if</span> (isSource) <a name="l00299"></a>00299 <span class="keywordflow">goto</span> exit; <a name="l00300"></a>00300 <a name="l00301"></a>00301 <span class="comment">/* Do lazy (readonly?) open of rpm database. */</span> <a name="l00302"></a>00302 <span class="keywordflow">if</span> (<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts) == NULL && ts->dbmode != -1) { <a name="l00303"></a>00303 <span class="keywordflow">if</span> ((ec = <a class="code" href="group__rpmts.html#g91749a850b2cffae16007437b7768570">rpmtsOpenDB</a>(ts, ts->dbmode)) != 0) <a name="l00304"></a>00304 <span class="keywordflow">goto</span> exit; <a name="l00305"></a>00305 } <a name="l00306"></a>00306 <a name="l00307"></a>00307 <span class="comment">/* On upgrade, erase older packages of same color (if any). */</span> <a name="l00308"></a>00308 <a name="l00309"></a>00309 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b5a4bfcac106d028f0908b8991e2c5b87">RPMTAG_NAME</a>, <a class="code" href="rpmte_8c.html#16f587927a8643fc2bf4a0407688f366">rpmteN</a>(p), 0); <a name="l00310"></a>00310 <span class="keywordflow">while</span>((oh = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00311"></a>00311 <a name="l00312"></a>00312 <span class="comment">/* Ignore colored packages not in our rainbow. */</span> <a name="l00313"></a>00313 ohcolor = <a class="code" href="rpmts_8c.html#c15257561d31019deabf814ba75da6dc">hGetColor</a>(oh); <a name="l00314"></a>00314 <span class="keywordflow">if</span> (tscolor && hcolor && ohcolor && !(hcolor & ohcolor)) <a name="l00315"></a>00315 <span class="keywordflow">continue</span>; <a name="l00316"></a>00316 <a name="l00317"></a>00317 <span class="comment">/* Skip packages that contain identical NEVR. */</span> <a name="l00318"></a>00318 <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#850ba9d15266e2d82cd092b8d6117f50">rpmVersionCompare</a>(h, oh) == 0) <a name="l00319"></a>00319 <span class="keywordflow">continue</span>; <a name="l00320"></a>00320 <a name="l00321"></a>00321 xx = <a class="code" href="depends_8c.html#973d8556307193f9d2f5befe9941146c">removePackage</a>(ts, oh, <a class="code" href="group__rpmdb.html#g4fefb65ede996aa0edcc80286ca640d1">rpmdbGetIteratorOffset</a>(mi), pkgKey); <a name="l00322"></a>00322 } <a name="l00323"></a>00323 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00324"></a>00324 <a name="l00325"></a>00325 obsoletes = <a class="code" href="rpmds_8h.html#d400b35ac829d6333372ef2e796d1586">rpmdsLink</a>(<a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b1ec0e66258373ba4cd407b1735412395">RPMTAG_OBSOLETENAME</a>), <span class="stringliteral">"Obsoletes"</span>); <a name="l00326"></a>00326 obsoletes = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(obsoletes); <a name="l00327"></a>00327 <span class="keywordflow">if</span> (obsoletes != NULL) <a name="l00328"></a>00328 <span class="keywordflow">while</span> (<a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(obsoletes) >= 0) { <a name="l00329"></a>00329 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l00330"></a>00330 <a name="l00331"></a>00331 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(obsoletes)) == NULL) <a name="l00332"></a>00332 <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l00333"></a>00333 <a name="l00334"></a>00334 <span class="comment">/* Ignore colored obsoletes not in our rainbow. */</span> <a name="l00335"></a>00335 <span class="preprocessor">#if 0</span> <a name="l00336"></a>00336 <span class="preprocessor"></span> dscolor = <a class="code" href="rpmds_8c.html#1a59b0acfb8e035471da848c0723b1e0">rpmdsColor</a>(obsoletes); <a name="l00337"></a>00337 <span class="preprocessor">#else</span> <a name="l00338"></a>00338 <span class="preprocessor"></span> dscolor = hcolor; <a name="l00339"></a>00339 <span class="preprocessor">#endif</span> <a name="l00340"></a>00340 <span class="preprocessor"></span> <span class="comment">/* XXX obsoletes are never colored, so this is for future devel. */</span> <a name="l00341"></a>00341 <span class="keywordflow">if</span> (tscolor && dscolor && !(tscolor & dscolor)) <a name="l00342"></a>00342 <span class="keywordflow">continue</span>; <a name="l00343"></a>00343 <a name="l00344"></a>00344 <span class="comment">/* XXX avoid self-obsoleting packages. */</span> <a name="l00345"></a>00345 <span class="keywordflow">if</span> (!strcmp(<a class="code" href="rpmte_8c.html#16f587927a8643fc2bf4a0407688f366">rpmteN</a>(p), Name)) <a name="l00346"></a>00346 <span class="keywordflow">continue</span>; <a name="l00347"></a>00347 <a name="l00348"></a>00348 <span class="keywordflow">if</span> (Name[0] == <span class="charliteral">'/'</span>) <a name="l00349"></a>00349 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507bea94338039b3e67d9ece3f8c8875c7fc">RPMTAG_BASENAMES</a>, Name, 0); <a name="l00350"></a>00350 <span class="keywordflow">else</span> <a name="l00351"></a>00351 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b5a4bfcac106d028f0908b8991e2c5b87">RPMTAG_NAME</a>, Name, 0); <a name="l00352"></a>00352 <a name="l00353"></a>00353 xx = <a class="code" href="group__rpmdb.html#gf3dbe5ef1b760500851695954956fdfe">rpmdbPruneIterator</a>(mi, <a name="l00354"></a>00354 ts->removedPackages, ts->numRemovedPackages, 1); <a name="l00355"></a>00355 <a name="l00356"></a>00356 <span class="keywordflow">while</span>((oh = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00357"></a>00357 <span class="comment">/* Ignore colored packages not in our rainbow. */</span> <a name="l00358"></a>00358 ohcolor = <a class="code" href="rpmts_8c.html#c15257561d31019deabf814ba75da6dc">hGetColor</a>(oh); <a name="l00359"></a>00359 <span class="comment">/* XXX provides *are* colored, effectively limiting Obsoletes:</span> <a name="l00360"></a>00360 <span class="comment"> to matching only colored Provides: based on pkg coloring. */</span> <a name="l00361"></a>00361 <span class="keywordflow">if</span> (tscolor && hcolor && ohcolor && !(hcolor & ohcolor)) <a name="l00362"></a>00362 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l00363"></a>00363 <a name="l00364"></a>00364 <span class="comment">/*</span> <a name="l00365"></a>00365 <span class="comment"> * Rpm prior to 3.0.3 does not have versioned obsoletes.</span> <a name="l00366"></a>00366 <span class="comment"> * If no obsoletes version info is available, match all names.</span> <a name="l00367"></a>00367 <span class="comment"> */</span> <a name="l00368"></a>00368 <span class="keywordflow">if</span> (<a class="code" href="rpmds_8c.html#0701b3d335a046f7b054a2cc82c17a8c">rpmdsEVR</a>(obsoletes) == NULL <a name="l00369"></a>00369 || <a class="code" href="rpmds_8c.html#ca6decba06eb1219b1f4ec4ef3f24376">rpmdsAnyMatchesDep</a>(oh, obsoletes, <a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>)) { <a name="l00370"></a>00370 <span class="keyword">const</span> <span class="keywordtype">char</span> * ohNEVRA = <a class="code" href="rpmts_8c.html#f672b83f06fdf1be82490a186c8bcf14">hGetNEVRA</a>(oh, NULL); <a name="l00371"></a>00371 <span class="preprocessor">#ifdef DYING </span><span class="comment">/* XXX see http://bugzilla.redhat.com #134497 */</span> <a name="l00372"></a>00372 <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#850ba9d15266e2d82cd092b8d6117f50">rpmVersionCompare</a>(h, oh)) <a name="l00373"></a>00373 <span class="preprocessor">#endif</span> <a name="l00374"></a>00374 <span class="preprocessor"></span> xx = <a class="code" href="depends_8c.html#973d8556307193f9d2f5befe9941146c">removePackage</a>(ts, oh, <a class="code" href="group__rpmdb.html#g4fefb65ede996aa0edcc80286ca640d1">rpmdbGetIteratorOffset</a>(mi), pkgKey); <a name="l00375"></a>00375 <span class="comment">/*@-nullptrarith@*/</span> <a name="l00376"></a>00376 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">" Obsoletes: %s\t\terases %s\n"</span>), <a name="l00377"></a>00377 <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(obsoletes)+2, ohNEVRA); <a name="l00378"></a>00378 <span class="comment">/*@=nullptrarith@*/</span> <a name="l00379"></a>00379 ohNEVRA = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(ohNEVRA); <a name="l00380"></a>00380 } <a name="l00381"></a>00381 } <a name="l00382"></a>00382 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00383"></a>00383 } <a name="l00384"></a>00384 obsoletes = <a class="code" href="rpmds_8c.html#81e41176cb032311da92de634bff8183">rpmdsFree</a>(obsoletes); <a name="l00385"></a>00385 <a name="l00386"></a>00386 ec = 0; <a name="l00387"></a>00387 <a name="l00388"></a>00388 exit: <a name="l00389"></a>00389 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l00390"></a>00390 <span class="keywordflow">return</span> ec; <a name="l00391"></a>00391 } <a name="l00392"></a>00392 <a name="l00393"></a><a class="code" href="group__rpmts.html#g6f379ed9d0d1b8073b2d380c6af681e8">00393</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmts.html#g6f379ed9d0d1b8073b2d380c6af681e8">rpmtsAddEraseElement</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a class="code" href="structheaderToken__s.html">Header</a> h, <span class="keywordtype">int</span> dboffset) <a name="l00394"></a>00394 { <a name="l00395"></a>00395 <span class="keywordflow">return</span> <a class="code" href="depends_8c.html#973d8556307193f9d2f5befe9941146c">removePackage</a>(ts, h, dboffset, <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>); <a name="l00396"></a>00396 } <a name="l00397"></a>00397 <a name="l00405"></a><a class="code" href="depends_8c.html#3133f413325a35730f231fb5f72806ed">00405</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#3133f413325a35730f231fb5f72806ed">unsatisfiedDepend</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> dep, <span class="keywordtype">int</span> adding) <a name="l00406"></a>00406 <span class="comment">/*@globals _cacheDependsRC, rpmGlobalMacroContext, h_errno,</span> <a name="l00407"></a>00407 <span class="comment"> fileSystem, internalState @*/</span> <a name="l00408"></a>00408 <span class="comment">/*@modifies ts, _cacheDependsRC, rpmGlobalMacroContext,</span> <a name="l00409"></a>00409 <span class="comment"> fileSystem, internalState @*/</span> <a name="l00410"></a>00410 { <a name="l00411"></a>00411 DBT * key = <a class="code" href="system_8h.html#eb1df3e83fb069eaa2eb66ace3a0ea52">alloca</a>(<span class="keyword">sizeof</span>(*key)); <a name="l00412"></a>00412 DBT * data = <a class="code" href="system_8h.html#eb1df3e83fb069eaa2eb66ace3a0ea52">alloca</a>(<span class="keyword">sizeof</span>(*data)); <a name="l00413"></a>00413 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; <a name="l00414"></a>00414 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l00415"></a>00415 <a class="code" href="structheaderToken__s.html">Header</a> h; <a name="l00416"></a>00416 <span class="keywordtype">int</span> _cacheThisRC = 1; <a name="l00417"></a>00417 <span class="keywordtype">int</span> rc; <a name="l00418"></a>00418 <span class="keywordtype">int</span> xx; <a name="l00419"></a>00419 <span class="keywordtype">int</span> retrying = 0; <a name="l00420"></a>00420 <a name="l00421"></a>00421 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(dep)) == NULL) <a name="l00422"></a>00422 <span class="keywordflow">return</span> 0; <span class="comment">/* XXX can't happen */</span> <a name="l00423"></a>00423 <a name="l00424"></a>00424 <span class="comment">/*</span> <a name="l00425"></a>00425 <span class="comment"> * Check if dbiOpen/dbiPut failed (e.g. permissions), we can't cache.</span> <a name="l00426"></a>00426 <span class="comment"> */</span> <a name="l00427"></a>00427 <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a>) { <a name="l00428"></a>00428 <a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi; <a name="l00429"></a>00429 dbi = <a class="code" href="group__dbi.html#g4dd756d922e8573a0ffef0ef0da66b58">dbiOpen</a>(<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts), <a class="code" href="rpmlib_8h.html#1d47f066b552dfad14808c4226fa4b47">RPMDBI_DEPENDS</a>, 0); <a name="l00430"></a>00430 <span class="keywordflow">if</span> (dbi == NULL) <a name="l00431"></a>00431 <a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a> = 0; <a name="l00432"></a>00432 <span class="keywordflow">else</span> { <a name="l00433"></a>00433 <span class="keyword">const</span> <span class="keywordtype">char</span> * DNEVR; <a name="l00434"></a>00434 <a name="l00435"></a>00435 rc = -1; <a name="l00436"></a>00436 <span class="comment">/*@-branchstate@*/</span> <a name="l00437"></a>00437 <span class="keywordflow">if</span> ((DNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(dep)) != NULL) { <a name="l00438"></a>00438 DBC * dbcursor = NULL; <a name="l00439"></a>00439 <span class="keywordtype">void</span> * datap = NULL; <a name="l00440"></a>00440 size_t datalen = 0; <a name="l00441"></a>00441 size_t DNEVRlen = strlen(DNEVR); <a name="l00442"></a>00442 <a name="l00443"></a>00443 xx = <a class="code" href="group__dbi.html#g4dbff9b3f44c223ee2b5c0ed9779e9ba">dbiCopen</a>(dbi, dbi-><a class="code" href="struct__dbiIndex.html#aa100b73e2bb2c0a4a92e3dc53da443a">dbi_txnid</a>, &dbcursor, 0); <a name="l00444"></a>00444 <a name="l00445"></a>00445 memset(key, 0, <span class="keyword">sizeof</span>(*key)); <a name="l00446"></a>00446 <span class="comment">/*@i@*/</span> key->data = (<span class="keywordtype">void</span> *) DNEVR; <a name="l00447"></a>00447 key->size = DNEVRlen; <a name="l00448"></a>00448 memset(data, 0, <span class="keyword">sizeof</span>(*data)); <a name="l00449"></a>00449 data->data = datap; <a name="l00450"></a>00450 data->size = datalen; <a name="l00451"></a>00451 <span class="comment">/*@-nullstate@*/</span> <span class="comment">/* FIX: data->data may be NULL */</span> <a name="l00452"></a>00452 xx = <a class="code" href="group__dbi.html#g55b0af119b154e5930358ec710acb225">dbiGet</a>(dbi, dbcursor, key, data, DB_SET); <a name="l00453"></a>00453 <span class="comment">/*@=nullstate@*/</span> <a name="l00454"></a>00454 DNEVR = key->data; <a name="l00455"></a>00455 DNEVRlen = key->size; <a name="l00456"></a>00456 datap = data->data; <a name="l00457"></a>00457 datalen = data->size; <a name="l00458"></a>00458 <a name="l00459"></a>00459 <span class="comment">/*@-boundswrite@*/</span> <a name="l00460"></a>00460 <span class="keywordflow">if</span> (xx == 0 && datap && datalen == 4) <a name="l00461"></a>00461 memcpy(&rc, datap, datalen); <a name="l00462"></a>00462 <span class="comment">/*@=boundswrite@*/</span> <a name="l00463"></a>00463 xx = <a class="code" href="group__dbi.html#gd5cddc3565e00c0d45e4b4c605af6b57">dbiCclose</a>(dbi, dbcursor, 0); <a name="l00464"></a>00464 } <a name="l00465"></a>00465 <span class="comment">/*@=branchstate@*/</span> <a name="l00466"></a>00466 <a name="l00467"></a>00467 <span class="keywordflow">if</span> (rc >= 0) { <a name="l00468"></a>00468 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(cached)"</span>), rc); <a name="l00469"></a>00469 <span class="keywordflow">return</span> rc; <a name="l00470"></a>00470 } <a name="l00471"></a>00471 } <a name="l00472"></a>00472 } <a name="l00473"></a>00473 <a name="l00474"></a>00474 retry: <a name="l00475"></a>00475 rc = 0; <span class="comment">/* assume dependency is satisfied */</span> <a name="l00476"></a>00476 <a name="l00477"></a>00477 <span class="preprocessor">#if defined(DYING) || defined(__LCLINT__)</span> <a name="l00478"></a>00478 <span class="preprocessor"></span> { <span class="keyword">static</span> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> noProvidesString[] = <span class="stringliteral">"nada"</span>; <a name="l00479"></a>00479 <span class="keyword">static</span> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * rcProvidesString = noProvidesString; <a name="l00480"></a>00480 <a class="code" href="header_8h.html#e5c5e6fe946fcce0d2156db86ffffa8a">int_32</a> Flags = <a class="code" href="rpmds_8c.html#cd3d85fc2c8ce656c818603f444c5ab6">rpmdsFlags</a>(dep); <a name="l00481"></a>00481 <span class="keyword">const</span> <span class="keywordtype">char</span> * start; <a name="l00482"></a>00482 <span class="keywordtype">int</span> i; <a name="l00483"></a>00483 <a name="l00484"></a>00484 <span class="keywordflow">if</span> (rcProvidesString == noProvidesString) <a name="l00485"></a>00485 rcProvidesString = <a class="code" href="group__rpmrc.html#g961f37987d5ca72c5e00d662d3de48d3">rpmGetVar</a>(<a class="code" href="rpmlib_8h.html#c1a0016123d6bb22a1230221dedf181b">RPMVAR_PROVIDES</a>); <a name="l00486"></a>00486 <a name="l00487"></a>00487 <span class="keywordflow">if</span> (rcProvidesString != NULL && !(Flags & <a class="code" href="rpmlib_8h.html#bd2743bc81bad951c4a654cc3740fd71">RPMSENSE_SENSEMASK</a>)) { <a name="l00488"></a>00488 <a name="l00489"></a>00489 i = strlen(Name); <a name="l00490"></a>00490 <span class="comment">/*@-observertrans -mayaliasunique@*/</span> <a name="l00491"></a>00491 <span class="keywordflow">while</span> ((start = strstr(rcProvidesString, Name))) { <a name="l00492"></a>00492 <span class="comment">/*@=observertrans =mayaliasunique@*/</span> <a name="l00493"></a>00493 <span class="comment">/*@-boundsread@*/</span> <a name="l00494"></a>00494 <span class="keywordflow">if</span> (<a class="code" href="stringbuf_8c.html#a481190ded02056b6b5710dad2d913a4">xisspace</a>(start[i]) || start[i] == <span class="charliteral">'\0'</span> || start[i] == <span class="charliteral">','</span>) { <a name="l00495"></a>00495 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(rpmrc provides)"</span>), rc); <a name="l00496"></a>00496 <span class="keywordflow">goto</span> exit; <a name="l00497"></a>00497 } <a name="l00498"></a>00498 <span class="comment">/*@=boundsread@*/</span> <a name="l00499"></a>00499 rcProvidesString = start + 1; <a name="l00500"></a>00500 } <a name="l00501"></a>00501 } <a name="l00502"></a>00502 } <a name="l00503"></a>00503 <span class="preprocessor">#endif</span> <a name="l00504"></a>00504 <span class="preprocessor"></span> <a name="l00505"></a>00505 <span class="comment">/*</span> <a name="l00506"></a>00506 <span class="comment"> * New features in rpm packaging implicitly add versioned dependencies</span> <a name="l00507"></a>00507 <span class="comment"> * on rpmlib provides. The dependencies look like "rpmlib(YaddaYadda)".</span> <a name="l00508"></a>00508 <span class="comment"> * Check those dependencies now.</span> <a name="l00509"></a>00509 <span class="comment"> */</span> <a name="l00510"></a>00510 <span class="keywordflow">if</span> (!strncmp(Name, <span class="stringliteral">"rpmlib("</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"rpmlib("</span>)-1)) { <a name="l00511"></a>00511 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#19330edf301d4f0375fb89e1461e4e3f">rpmCheckRpmlibProvides</a>(dep)) { <a name="l00512"></a>00512 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(rpmlib provides)"</span>), rc); <a name="l00513"></a>00513 <span class="keywordflow">goto</span> exit; <a name="l00514"></a>00514 } <a name="l00515"></a>00515 <span class="keywordflow">goto</span> unsatisfied; <a name="l00516"></a>00516 } <a name="l00517"></a>00517 <a name="l00518"></a>00518 <span class="comment">/* Search added packages for the dependency. */</span> <a name="l00519"></a>00519 <span class="keywordflow">if</span> (<a class="code" href="rpmal_8c.html#d858d5f6ebd1ed2842a5163fbd9dc865">rpmalSatisfiesDepend</a>(ts->addedPackages, dep, NULL) != NULL) { <a name="l00520"></a>00520 <span class="comment">/*</span> <a name="l00521"></a>00521 <span class="comment"> * XXX Ick, context sensitive answers from dependency cache.</span> <a name="l00522"></a>00522 <span class="comment"> * XXX Always resolve added dependencies within context to disambiguate.</span> <a name="l00523"></a>00523 <span class="comment"> */</span> <a name="l00524"></a>00524 <span class="keywordflow">if</span> (<a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>) <a name="l00525"></a>00525 _cacheThisRC = 0; <a name="l00526"></a>00526 <span class="keywordflow">goto</span> exit; <a name="l00527"></a>00527 } <a name="l00528"></a>00528 <a name="l00529"></a>00529 <span class="comment">/* XXX only the installer does not have the database open here. */</span> <a name="l00530"></a>00530 <span class="keywordflow">if</span> (<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts) != NULL) { <a name="l00531"></a>00531 <span class="comment">/*@-boundsread@*/</span> <a name="l00532"></a>00532 <span class="keywordflow">if</span> (Name[0] == <span class="charliteral">'/'</span>) { <a name="l00533"></a>00533 <span class="comment">/* depFlags better be 0! */</span> <a name="l00534"></a>00534 <a name="l00535"></a>00535 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507bea94338039b3e67d9ece3f8c8875c7fc">RPMTAG_BASENAMES</a>, Name, 0); <a name="l00536"></a>00536 <a name="l00537"></a>00537 (void) <a class="code" href="group__rpmdb.html#gf3dbe5ef1b760500851695954956fdfe">rpmdbPruneIterator</a>(mi, <a name="l00538"></a>00538 ts->removedPackages, ts->numRemovedPackages, 1); <a name="l00539"></a>00539 <a name="l00540"></a>00540 <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00541"></a>00541 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(db files)"</span>), rc); <a name="l00542"></a>00542 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00543"></a>00543 <span class="keywordflow">goto</span> exit; <a name="l00544"></a>00544 } <a name="l00545"></a>00545 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00546"></a>00546 } <a name="l00547"></a>00547 <span class="comment">/*@=boundsread@*/</span> <a name="l00548"></a>00548 <a name="l00549"></a>00549 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b843a73db82df579ed12eab79ef480318">RPMTAG_PROVIDENAME</a>, Name, 0); <a name="l00550"></a>00550 (void) <a class="code" href="group__rpmdb.html#gf3dbe5ef1b760500851695954956fdfe">rpmdbPruneIterator</a>(mi, <a name="l00551"></a>00551 ts->removedPackages, ts->numRemovedPackages, 1); <a name="l00552"></a>00552 <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00553"></a>00553 <span class="keywordflow">if</span> (<a class="code" href="rpmds_8c.html#ca6decba06eb1219b1f4ec4ef3f24376">rpmdsAnyMatchesDep</a>(h, dep, <a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>)) { <a name="l00554"></a>00554 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(db provides)"</span>), rc); <a name="l00555"></a>00555 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00556"></a>00556 <span class="keywordflow">goto</span> exit; <a name="l00557"></a>00557 } <a name="l00558"></a>00558 } <a name="l00559"></a>00559 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00560"></a>00560 <a name="l00561"></a>00561 <span class="preprocessor">#if defined(DYING) || defined(__LCLINT__)</span> <a name="l00562"></a>00562 <span class="preprocessor"></span> mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b5a4bfcac106d028f0908b8991e2c5b87">RPMTAG_NAME</a>, Name, 0); <a name="l00563"></a>00563 (void) <a class="code" href="group__rpmdb.html#gf3dbe5ef1b760500851695954956fdfe">rpmdbPruneIterator</a>(mi, <a name="l00564"></a>00564 ts->removedPackages, ts->numRemovedPackages, 1); <a name="l00565"></a>00565 <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00566"></a>00566 <span class="keywordflow">if</span> (<a class="code" href="rpmds_8c.html#ca6decba06eb1219b1f4ec4ef3f24376">rpmdsAnyMatchesDep</a>(h, dep, <a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>)) { <a name="l00567"></a>00567 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"(db package)"</span>), rc); <a name="l00568"></a>00568 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00569"></a>00569 <span class="keywordflow">goto</span> exit; <a name="l00570"></a>00570 } <a name="l00571"></a>00571 } <a name="l00572"></a>00572 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00573"></a>00573 <span class="preprocessor">#endif</span> <a name="l00574"></a>00574 <span class="preprocessor"></span> <a name="l00575"></a>00575 } <a name="l00576"></a>00576 <a name="l00577"></a>00577 <span class="comment">/*</span> <a name="l00578"></a>00578 <span class="comment"> * Search for an unsatisfied dependency.</span> <a name="l00579"></a>00579 <span class="comment"> */</span> <a name="l00580"></a>00580 <span class="comment">/*@-boundsread@*/</span> <a name="l00581"></a>00581 <span class="keywordflow">if</span> (adding && !retrying && !(<a class="code" href="group__rpmts.html#g22eec4db17655dd92ce5715312d153c3">rpmtsFlags</a>(ts) & <a class="code" href="rpmlib_8h.html#ca72ece8019aa198fc445bd206caa3f4078094b6d248a710c34f2cc60d1a81d7">RPMTRANS_FLAG_NOSUGGEST</a>)) { <a name="l00582"></a>00582 <span class="keywordflow">if</span> (ts->solve != NULL) { <a name="l00583"></a>00583 xx = (*ts->solve) (ts, dep, ts->solveData); <a name="l00584"></a>00584 <span class="keywordflow">if</span> (xx == 0) <a name="l00585"></a>00585 <span class="keywordflow">goto</span> exit; <a name="l00586"></a>00586 <span class="keywordflow">if</span> (xx == -1) { <a name="l00587"></a>00587 retrying = 1; <a name="l00588"></a>00588 <a class="code" href="rpmal_8c.html#315ba2a12d2ec3bb5279cf227a1ce775">rpmalMakeIndex</a>(ts->addedPackages); <a name="l00589"></a>00589 <span class="keywordflow">goto</span> retry; <a name="l00590"></a>00590 } <a name="l00591"></a>00591 } <a name="l00592"></a>00592 } <a name="l00593"></a>00593 <span class="comment">/*@=boundsread@*/</span> <a name="l00594"></a>00594 <a name="l00595"></a>00595 unsatisfied: <a name="l00596"></a>00596 rc = 1; <span class="comment">/* dependency is unsatisfied */</span> <a name="l00597"></a>00597 <a class="code" href="rpmds_8c.html#164b7099a91324f3990dea64584fb2de">rpmdsNotify</a>(dep, NULL, rc); <a name="l00598"></a>00598 <a name="l00599"></a>00599 exit: <a name="l00600"></a>00600 <span class="comment">/*</span> <a name="l00601"></a>00601 <span class="comment"> * If dbiOpen/dbiPut fails (e.g. permissions), we can't cache.</span> <a name="l00602"></a>00602 <span class="comment"> */</span> <a name="l00603"></a>00603 <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a> && _cacheThisRC) { <a name="l00604"></a>00604 <a class="code" href="struct__dbiIndex.html">dbiIndex</a> dbi; <a name="l00605"></a>00605 dbi = <a class="code" href="group__dbi.html#g4dd756d922e8573a0ffef0ef0da66b58">dbiOpen</a>(<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts), <a class="code" href="rpmlib_8h.html#1d47f066b552dfad14808c4226fa4b47">RPMDBI_DEPENDS</a>, 0); <a name="l00606"></a>00606 <span class="keywordflow">if</span> (dbi == NULL) { <a name="l00607"></a>00607 <a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a> = 0; <a name="l00608"></a>00608 } <span class="keywordflow">else</span> { <a name="l00609"></a>00609 <span class="keyword">const</span> <span class="keywordtype">char</span> * DNEVR; <a name="l00610"></a>00610 xx = 0; <a name="l00611"></a>00611 <span class="comment">/*@-branchstate@*/</span> <a name="l00612"></a>00612 <span class="keywordflow">if</span> ((DNEVR = <a class="code" href="rpmds_8c.html#c62d698d661a60f47455f85762dafdc3">rpmdsDNEVR</a>(dep)) != NULL) { <a name="l00613"></a>00613 DBC * dbcursor = NULL; <a name="l00614"></a>00614 size_t DNEVRlen = strlen(DNEVR); <a name="l00615"></a>00615 <a name="l00616"></a>00616 xx = <a class="code" href="group__dbi.html#g4dbff9b3f44c223ee2b5c0ed9779e9ba">dbiCopen</a>(dbi, dbi-><a class="code" href="struct__dbiIndex.html#aa100b73e2bb2c0a4a92e3dc53da443a">dbi_txnid</a>, &dbcursor, DB_WRITECURSOR); <a name="l00617"></a>00617 <a name="l00618"></a>00618 memset(key, 0, <span class="keyword">sizeof</span>(*key)); <a name="l00619"></a>00619 <span class="comment">/*@i@*/</span> key->data = (<span class="keywordtype">void</span> *) DNEVR; <a name="l00620"></a>00620 key->size = DNEVRlen; <a name="l00621"></a>00621 memset(data, 0, <span class="keyword">sizeof</span>(*data)); <a name="l00622"></a>00622 data->data = &rc; <a name="l00623"></a>00623 data->size = <span class="keyword">sizeof</span>(rc); <a name="l00624"></a>00624 <a name="l00625"></a>00625 <span class="comment">/*@-compmempass@*/</span> <a name="l00626"></a>00626 xx = <a class="code" href="group__dbi.html#g45ed1c15426c14fef946635385b0b93e">dbiPut</a>(dbi, dbcursor, key, data, 0); <a name="l00627"></a>00627 <span class="comment">/*@=compmempass@*/</span> <a name="l00628"></a>00628 xx = <a class="code" href="group__dbi.html#gd5cddc3565e00c0d45e4b4c605af6b57">dbiCclose</a>(dbi, dbcursor, DB_WRITECURSOR); <a name="l00629"></a>00629 } <a name="l00630"></a>00630 <span class="comment">/*@=branchstate@*/</span> <a name="l00631"></a>00631 <span class="keywordflow">if</span> (xx) <a name="l00632"></a>00632 <a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a> = 0; <a name="l00633"></a>00633 } <a name="l00634"></a>00634 } <a name="l00635"></a>00635 <span class="keywordflow">return</span> rc; <a name="l00636"></a>00636 } <a name="l00637"></a>00637 <a name="l00649"></a><a class="code" href="depends_8c.html#d16b069950c242158ae7b76a990ff5e8">00649</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#d16b069950c242158ae7b76a990ff5e8">checkPackageDeps</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <span class="keyword">const</span> <span class="keywordtype">char</span> * pkgNEVRA, <a name="l00650"></a>00650 <span class="comment">/*@null@*/</span> <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> requires, <span class="comment">/*@null@*/</span> <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> conflicts, <a name="l00651"></a>00651 <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * depName, <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> tscolor, <span class="keywordtype">int</span> adding) <a name="l00652"></a>00652 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno,</span> <a name="l00653"></a>00653 <span class="comment"> fileSystem, internalState @*/</span> <a name="l00654"></a>00654 <span class="comment">/*@modifies ts, requires, conflicts, rpmGlobalMacroContext,</span> <a name="l00655"></a>00655 <span class="comment"> fileSystem, internalState */</span> <a name="l00656"></a>00656 { <a name="l00657"></a>00657 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> dscolor; <a name="l00658"></a>00658 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l00659"></a>00659 <span class="keywordtype">int</span> rc; <a name="l00660"></a>00660 <span class="keywordtype">int</span> ourrc = 0; <a name="l00661"></a>00661 <a name="l00662"></a>00662 requires = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(requires); <a name="l00663"></a>00663 <span class="keywordflow">if</span> (requires != NULL) <a name="l00664"></a>00664 <span class="keywordflow">while</span> (!ourrc && <a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(requires) >= 0) { <a name="l00665"></a>00665 <a name="l00666"></a>00666 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(requires)) == NULL) <a name="l00667"></a>00667 <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l00668"></a>00668 <a name="l00669"></a>00669 <span class="comment">/* Filter out requires that came along for the ride. */</span> <a name="l00670"></a>00670 <span class="keywordflow">if</span> (depName != NULL && strcmp(depName, Name)) <a name="l00671"></a>00671 <span class="keywordflow">continue</span>; <a name="l00672"></a>00672 <a name="l00673"></a>00673 <span class="comment">/* Ignore colored requires not in our rainbow. */</span> <a name="l00674"></a>00674 dscolor = <a class="code" href="rpmds_8c.html#1a59b0acfb8e035471da848c0723b1e0">rpmdsColor</a>(requires); <a name="l00675"></a>00675 <span class="keywordflow">if</span> (tscolor && dscolor && !(tscolor & dscolor)) <a name="l00676"></a>00676 <span class="keywordflow">continue</span>; <a name="l00677"></a>00677 <a name="l00678"></a>00678 rc = <a class="code" href="depends_8c.html#3133f413325a35730f231fb5f72806ed">unsatisfiedDepend</a>(ts, requires, adding); <a name="l00679"></a>00679 <a name="l00680"></a>00680 <span class="keywordflow">switch</span> (rc) { <a name="l00681"></a>00681 <span class="keywordflow">case</span> 0: <span class="comment">/* requirements are satisfied. */</span> <a name="l00682"></a>00682 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00683"></a>00683 <span class="keywordflow">case</span> 1: <span class="comment">/* requirements are not satisfied. */</span> <a name="l00684"></a>00684 { <a class="code" href="rpmmessages_8h.html#e51d034b9e250fe42b0e420f254aa54f">fnpyKey</a> * suggestedKeys = NULL; <a name="l00685"></a>00685 <a name="l00686"></a>00686 <span class="comment">/*@-branchstate@*/</span> <a name="l00687"></a>00687 <span class="keywordflow">if</span> (ts->availablePackages != NULL) { <a name="l00688"></a>00688 suggestedKeys = <a class="code" href="rpmal_8c.html#aa2a50dfc9e6f54f0c61da51590242e6">rpmalAllSatisfiesDepend</a>(ts->availablePackages, <a name="l00689"></a>00689 requires, NULL); <a name="l00690"></a>00690 } <a name="l00691"></a>00691 <span class="comment">/*@=branchstate@*/</span> <a name="l00692"></a>00692 <a name="l00693"></a>00693 <a class="code" href="rpmds_8c.html#2b644e9aa8e3d0b55e8a10b4ccc269b1">rpmdsProblem</a>(ts->probs, pkgNEVRA, requires, suggestedKeys, adding); <a name="l00694"></a>00694 <a name="l00695"></a>00695 } <a name="l00696"></a>00696 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00697"></a>00697 <span class="keywordflow">case</span> 2: <span class="comment">/* something went wrong! */</span> <a name="l00698"></a>00698 <span class="keywordflow">default</span>: <a name="l00699"></a>00699 ourrc = 1; <a name="l00700"></a>00700 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00701"></a>00701 } <a name="l00702"></a>00702 } <a name="l00703"></a>00703 <a name="l00704"></a>00704 conflicts = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(conflicts); <a name="l00705"></a>00705 <span class="keywordflow">if</span> (conflicts != NULL) <a name="l00706"></a>00706 <span class="keywordflow">while</span> (!ourrc && <a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(conflicts) >= 0) { <a name="l00707"></a>00707 <a name="l00708"></a>00708 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(conflicts)) == NULL) <a name="l00709"></a>00709 <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l00710"></a>00710 <a name="l00711"></a>00711 <span class="comment">/* Filter out conflicts that came along for the ride. */</span> <a name="l00712"></a>00712 <span class="keywordflow">if</span> (depName != NULL && strcmp(depName, Name)) <a name="l00713"></a>00713 <span class="keywordflow">continue</span>; <a name="l00714"></a>00714 <a name="l00715"></a>00715 <span class="comment">/* Ignore colored conflicts not in our rainbow. */</span> <a name="l00716"></a>00716 dscolor = <a class="code" href="rpmds_8c.html#1a59b0acfb8e035471da848c0723b1e0">rpmdsColor</a>(conflicts); <a name="l00717"></a>00717 <span class="keywordflow">if</span> (tscolor && dscolor && !(tscolor & dscolor)) <a name="l00718"></a>00718 <span class="keywordflow">continue</span>; <a name="l00719"></a>00719 <a name="l00720"></a>00720 rc = <a class="code" href="depends_8c.html#3133f413325a35730f231fb5f72806ed">unsatisfiedDepend</a>(ts, conflicts, adding); <a name="l00721"></a>00721 <a name="l00722"></a>00722 <span class="comment">/* 1 == unsatisfied, 0 == satsisfied */</span> <a name="l00723"></a>00723 <span class="keywordflow">switch</span> (rc) { <a name="l00724"></a>00724 <span class="keywordflow">case</span> 0: <span class="comment">/* conflicts exist. */</span> <a name="l00725"></a>00725 <a class="code" href="rpmds_8c.html#2b644e9aa8e3d0b55e8a10b4ccc269b1">rpmdsProblem</a>(ts->probs, pkgNEVRA, conflicts, NULL, adding); <a name="l00726"></a>00726 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00727"></a>00727 <span class="keywordflow">case</span> 1: <span class="comment">/* conflicts don't exist. */</span> <a name="l00728"></a>00728 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00729"></a>00729 <span class="keywordflow">case</span> 2: <span class="comment">/* something went wrong! */</span> <a name="l00730"></a>00730 <span class="keywordflow">default</span>: <a name="l00731"></a>00731 ourrc = 1; <a name="l00732"></a>00732 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l00733"></a>00733 } <a name="l00734"></a>00734 } <a name="l00735"></a>00735 <a name="l00736"></a>00736 <span class="keywordflow">return</span> ourrc; <a name="l00737"></a>00737 } <a name="l00738"></a>00738 <a name="l00749"></a><a class="code" href="depends_8c.html#0cbcea2d8a116b1c12e54f0e49f6187b">00749</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#0cbcea2d8a116b1c12e54f0e49f6187b">checkPackageSet</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <span class="keyword">const</span> <span class="keywordtype">char</span> * dep, <a name="l00750"></a>00750 <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi, <span class="keywordtype">int</span> adding) <a name="l00751"></a>00751 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/</span> <a name="l00752"></a>00752 <span class="comment">/*@modifies ts, mi, rpmGlobalMacroContext, fileSystem, internalState @*/</span> <a name="l00753"></a>00753 { <a name="l00754"></a>00754 <span class="keywordtype">int</span> scareMem = 1; <a name="l00755"></a>00755 <a class="code" href="structheaderToken__s.html">Header</a> h; <a name="l00756"></a>00756 <span class="keywordtype">int</span> ec = 0; <a name="l00757"></a>00757 <a name="l00758"></a>00758 (void) <a class="code" href="group__rpmdb.html#gf3dbe5ef1b760500851695954956fdfe">rpmdbPruneIterator</a>(mi, <a name="l00759"></a>00759 ts->removedPackages, ts->numRemovedPackages, 1); <a name="l00760"></a>00760 <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#ga20413aa4018cf32e700decc7dba83f3">rpmdbNextIterator</a>(mi)) != NULL) { <a name="l00761"></a>00761 <span class="keyword">const</span> <span class="keywordtype">char</span> * pkgNEVRA; <a name="l00762"></a>00762 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> requires, conflicts; <a name="l00763"></a>00763 <span class="keywordtype">int</span> rc; <a name="l00764"></a>00764 <a name="l00765"></a>00765 pkgNEVRA = <a class="code" href="rpmts_8c.html#f672b83f06fdf1be82490a186c8bcf14">hGetNEVRA</a>(h, NULL); <a name="l00766"></a>00766 requires = <a class="code" href="rpmds_8c.html#01b8da9bcbce25c3021bf5c0608e7c02">rpmdsNew</a>(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>, scareMem); <a name="l00767"></a>00767 (void) <a class="code" href="rpmds_8c.html#fa65c538d606aaa75070ca03555d7ed4">rpmdsSetNoPromote</a>(requires, <a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>); <a name="l00768"></a>00768 conflicts = <a class="code" href="rpmds_8c.html#01b8da9bcbce25c3021bf5c0608e7c02">rpmdsNew</a>(h, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b15ea96c2b33c9c73b9ee3e2157e54273">RPMTAG_CONFLICTNAME</a>, scareMem); <a name="l00769"></a>00769 (void) <a class="code" href="rpmds_8c.html#fa65c538d606aaa75070ca03555d7ed4">rpmdsSetNoPromote</a>(conflicts, <a class="code" href="poptALL_8c.html#d3b78c2f0ff0af8c3f5b1b49f6918deb">_rpmds_nopromote</a>); <a name="l00770"></a>00770 rc = <a class="code" href="depends_8c.html#d16b069950c242158ae7b76a990ff5e8">checkPackageDeps</a>(ts, pkgNEVRA, requires, conflicts, dep, 0, adding); <a name="l00771"></a>00771 conflicts = <a class="code" href="rpmds_8c.html#81e41176cb032311da92de634bff8183">rpmdsFree</a>(conflicts); <a name="l00772"></a>00772 requires = <a class="code" href="rpmds_8c.html#81e41176cb032311da92de634bff8183">rpmdsFree</a>(requires); <a name="l00773"></a>00773 pkgNEVRA = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(pkgNEVRA); <a name="l00774"></a>00774 <a name="l00775"></a>00775 <span class="keywordflow">if</span> (rc) { <a name="l00776"></a>00776 ec = 1; <a name="l00777"></a>00777 <span class="keywordflow">break</span>; <a name="l00778"></a>00778 } <a name="l00779"></a>00779 } <a name="l00780"></a>00780 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l00781"></a>00781 <a name="l00782"></a>00782 <span class="keywordflow">return</span> ec; <a name="l00783"></a>00783 } <a name="l00784"></a>00784 <a name="l00791"></a><a class="code" href="depends_8c.html#db33c427142b52c5b951943441e442a3">00791</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#db33c427142b52c5b951943441e442a3">checkDependentPackages</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <span class="keyword">const</span> <span class="keywordtype">char</span> * dep) <a name="l00792"></a>00792 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/</span> <a name="l00793"></a>00793 <span class="comment">/*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/</span> <a name="l00794"></a>00794 { <a name="l00795"></a>00795 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; <a name="l00796"></a>00796 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>, dep, 0); <a name="l00797"></a>00797 <span class="keywordflow">return</span> <a class="code" href="depends_8c.html#0cbcea2d8a116b1c12e54f0e49f6187b">checkPackageSet</a>(ts, dep, mi, 0); <a name="l00798"></a>00798 } <a name="l00799"></a>00799 <a name="l00806"></a><a class="code" href="depends_8c.html#c98bbd5673192b69fd03a0361d9a0d7d">00806</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#c98bbd5673192b69fd03a0361d9a0d7d">checkDependentConflicts</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <span class="keyword">const</span> <span class="keywordtype">char</span> * dep) <a name="l00807"></a>00807 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/</span> <a name="l00808"></a>00808 <span class="comment">/*@modifies ts, rpmGlobalMacroContext, fileSystem, internalState @*/</span> <a name="l00809"></a>00809 { <a name="l00810"></a>00810 <span class="keywordtype">int</span> rc = 0; <a name="l00811"></a>00811 <a name="l00812"></a>00812 <span class="keywordflow">if</span> (<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts) != NULL) { <span class="comment">/* XXX is this necessary? */</span> <a name="l00813"></a>00813 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; <a name="l00814"></a>00814 mi = <a class="code" href="group__rpmts.html#g16ebec8beff205af120f86b2b6c7e25d">rpmtsInitIterator</a>(ts, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b15ea96c2b33c9c73b9ee3e2157e54273">RPMTAG_CONFLICTNAME</a>, dep, 0); <a name="l00815"></a>00815 rc = <a class="code" href="depends_8c.html#0cbcea2d8a116b1c12e54f0e49f6187b">checkPackageSet</a>(ts, dep, mi, 1); <a name="l00816"></a>00816 } <a name="l00817"></a>00817 <a name="l00818"></a>00818 <span class="keywordflow">return</span> rc; <a name="l00819"></a>00819 } <a name="l00820"></a>00820 <a name="l00821"></a><a class="code" href="structbadDeps__s.html">00821</a> <span class="keyword">struct </span><a class="code" href="structbadDeps__s.html">badDeps_s</a> { <a name="l00822"></a>00822 <span class="comment">/*@observer@*/</span> <span class="comment">/*@owned@*/</span> <span class="comment">/*@null@*/</span> <a name="l00823"></a><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">00823</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>; <a name="l00824"></a>00824 <span class="comment">/*@observer@*/</span> <span class="comment">/*@dependent@*/</span> <span class="comment">/*@null@*/</span> <a name="l00825"></a><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">00825</a> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>; <a name="l00826"></a>00826 }; <a name="l00827"></a>00827 <a name="l00828"></a>00828 <span class="preprocessor">#ifdef REFERENCE</span> <a name="l00829"></a>00829 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structbadDeps__s.html">badDeps_s</a> { <a name="l00830"></a>00830 <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>; <a name="l00831"></a>00831 <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>; <a name="l00832"></a>00832 } <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>[] = { <a name="l00833"></a>00833 { NULL, NULL } <a name="l00834"></a>00834 }; <a name="l00835"></a>00835 <span class="preprocessor">#else</span> <a name="l00836"></a>00836 <span class="preprocessor"></span><span class="comment">/*@unchecked@*/</span> <a name="l00837"></a><a class="code" href="depends_8c.html#79584c3ab8f7901b48f3691d344c9724">00837</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#79584c3ab8f7901b48f3691d344c9724">badDepsInitialized</a> = 0; <a name="l00838"></a>00838 <a name="l00839"></a>00839 <span class="comment">/*@unchecked@*/</span> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a name="l00840"></a><a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">00840</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structbadDeps__s.html">badDeps_s</a> * <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a> = NULL; <a name="l00841"></a>00841 <span class="preprocessor">#endif</span> <a name="l00842"></a>00842 <span class="preprocessor"></span> <a name="l00845"></a>00845 <span class="comment">/*@-modobserver -observertrans @*/</span> <a name="l00846"></a><a class="code" href="depends_8c.html#d754fe632bb6cf4cbba61aa7ed29eb85">00846</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="depends_8c.html#d754fe632bb6cf4cbba61aa7ed29eb85">freeBadDeps</a>(<span class="keywordtype">void</span>) <a name="l00847"></a>00847 <span class="comment">/*@globals badDeps, badDepsInitialized @*/</span> <a name="l00848"></a>00848 <span class="comment">/*@modifies badDeps, badDepsInitialized @*/</span> <a name="l00849"></a>00849 { <a name="l00850"></a>00850 <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>) { <a name="l00851"></a>00851 <span class="keyword">struct </span><a class="code" href="structbadDeps__s.html">badDeps_s</a> * bdp; <a name="l00852"></a>00852 <span class="keywordflow">for</span> (bdp = <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>; bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a> != NULL && bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> != NULL; bdp++) <a name="l00853"></a>00853 bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a> = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>); <a name="l00854"></a>00854 <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a> = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(<a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>); <a name="l00855"></a>00855 } <a name="l00856"></a>00856 <a class="code" href="depends_8c.html#79584c3ab8f7901b48f3691d344c9724">badDepsInitialized</a> = 0; <a name="l00857"></a>00857 } <a name="l00858"></a>00858 <span class="comment">/*@=modobserver =observertrans @*/</span> <a name="l00859"></a>00859 <a name="l00868"></a>00868 <span class="comment">/*@-boundsread@*/</span> <a name="l00869"></a><a class="code" href="depends_8c.html#693232a4b14c91c973c828b0ef01b193">00869</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#693232a4b14c91c973c828b0ef01b193">ignoreDep</a>(<span class="keyword">const</span> <a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <span class="keyword">const</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p, <span class="keyword">const</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q) <a name="l00870"></a>00870 <span class="comment">/*@globals badDeps, badDepsInitialized,</span> <a name="l00871"></a>00871 <span class="comment"> rpmGlobalMacroContext, h_errno @*/</span> <a name="l00872"></a>00872 <span class="comment">/*@modifies badDeps, badDepsInitialized,</span> <a name="l00873"></a>00873 <span class="comment"> rpmGlobalMacroContext @*/</span> <a name="l00874"></a>00874 { <a name="l00875"></a>00875 <span class="keyword">struct </span><a class="code" href="structbadDeps__s.html">badDeps_s</a> * bdp; <a name="l00876"></a>00876 <a name="l00877"></a>00877 <span class="keywordflow">if</span> (!<a class="code" href="depends_8c.html#79584c3ab8f7901b48f3691d344c9724">badDepsInitialized</a>) { <a name="l00878"></a>00878 <span class="keywordtype">char</span> * s = <a class="code" href="macro_8c.html#5d9a83318fc250d1fad8096c811754d4">rpmExpand</a>(<span class="stringliteral">"%{?_dependency_whiteout}"</span>, NULL); <a name="l00879"></a>00879 <span class="keyword">const</span> <span class="keywordtype">char</span> ** av = NULL; <a name="l00880"></a>00880 <span class="keywordtype">int</span> anaconda = <a class="code" href="group__rpmts.html#g22eec4db17655dd92ce5715312d153c3">rpmtsFlags</a>(ts) & <a class="code" href="rpmlib_8h.html#ca72ece8019aa198fc445bd206caa3f487662f96706581224d4bd523f8f2fc60">RPMTRANS_FLAG_ANACONDA</a>; <a name="l00881"></a>00881 <span class="keywordtype">int</span> msglvl = (anaconda || (<a class="code" href="group__rpmts.html#g22eec4db17655dd92ce5715312d153c3">rpmtsFlags</a>(ts) & <a class="code" href="rpmlib_8h.html#ca72ece8019aa198fc445bd206caa3f4b0d6b1b60d9464f8d51c8a0b3cb80ae7">RPMTRANS_FLAG_DEPLOOPS</a>)) <a name="l00882"></a>00882 ? <a class="code" href="rpmmessages_8h.html#dd380de8b2f203516cc1ab9475e31da5">RPMMESS_WARNING</a> : <a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>; <a name="l00883"></a>00883 <span class="keywordtype">int</span> ac = 0; <a name="l00884"></a>00884 <span class="keywordtype">int</span> i; <a name="l00885"></a>00885 <a name="l00886"></a>00886 <span class="keywordflow">if</span> (s != NULL && *s != <span class="charliteral">'\0'</span> <a name="l00887"></a>00887 && !(i = <a class="code" href="group__popt.html#gabb6e8c769648273171f3f3ec9c0e471">poptParseArgvString</a>(s, &ac, (<span class="keyword">const</span> <span class="keywordtype">char</span> ***)&av)) <a name="l00888"></a>00888 && ac > 0 && av != NULL) <a name="l00889"></a>00889 { <a name="l00890"></a>00890 bdp = <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a> = <a class="code" href="system_8h.html#cf4d2a0b6c4f9229a0f4687202abed54">xcalloc</a>(ac+1, <span class="keyword">sizeof</span>(*<a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>)); <a name="l00891"></a>00891 <span class="keywordflow">for</span> (i = 0; i < ac; i++, bdp++) { <a name="l00892"></a>00892 <span class="keywordtype">char</span> * <a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>, * <a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>; <a name="l00893"></a>00893 <a name="l00894"></a>00894 <span class="keywordflow">if</span> (av[i] == NULL) <a name="l00895"></a>00895 <span class="keywordflow">break</span>; <a name="l00896"></a>00896 pname = <a class="code" href="system_8h.html#d6142d091f00b2d4543ce7a43e5d0eba">xstrdup</a>(av[i]); <a name="l00897"></a>00897 <span class="keywordflow">if</span> ((<a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> = strchr(pname, <span class="charliteral">'>'</span>)) != NULL) <a name="l00898"></a>00898 *<a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>++ = <span class="charliteral">'\0'</span>; <a name="l00899"></a>00899 bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a> = pname; <a name="l00900"></a>00900 <span class="comment">/*@-usereleased@*/</span> <a name="l00901"></a>00901 bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> = <a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>; <a name="l00902"></a>00902 <span class="comment">/*@=usereleased@*/</span> <a name="l00903"></a>00903 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(msglvl, <a name="l00904"></a>00904 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"ignore package name relation(s) [%d]\t%s -> %s\n"</span>), <a name="l00905"></a>00905 i, bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>, (bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> ? bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> : <span class="stringliteral">"???"</span>)); <a name="l00906"></a>00906 } <a name="l00907"></a>00907 bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a> = NULL; <a name="l00908"></a>00908 bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> = NULL; <a name="l00909"></a>00909 } <a name="l00910"></a>00910 av = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(av); <a name="l00911"></a>00911 s = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(s); <a name="l00912"></a>00912 <a class="code" href="depends_8c.html#79584c3ab8f7901b48f3691d344c9724">badDepsInitialized</a>++; <a name="l00913"></a>00913 } <a name="l00914"></a>00914 <a name="l00915"></a>00915 <span class="comment">/*@-compdef@*/</span> <a name="l00916"></a>00916 <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a> != NULL) <a name="l00917"></a>00917 <span class="keywordflow">for</span> (bdp = <a class="code" href="depends_8c.html#8be448c45f7159f7983e1a66eb73b73f">badDeps</a>; bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a> != NULL && bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a> != NULL; bdp++) { <a name="l00918"></a>00918 <span class="keywordflow">if</span> (!strcmp(<a class="code" href="rpmte_8c.html#16f587927a8643fc2bf4a0407688f366">rpmteN</a>(p), bdp-><a class="code" href="structbadDeps__s.html#0c1d8c24e2a3d6873db39b5f6a29e116">pname</a>) && !strcmp(<a class="code" href="rpmte_8c.html#16f587927a8643fc2bf4a0407688f366">rpmteN</a>(q), bdp-><a class="code" href="structbadDeps__s.html#2dfaff3c23a6991c6734a3ec6dea03df">qname</a>)) <a name="l00919"></a>00919 <span class="keywordflow">return</span> 1; <a name="l00920"></a>00920 } <a name="l00921"></a>00921 <span class="keywordflow">return</span> 0; <a name="l00922"></a>00922 <span class="comment">/*@=compdef@*/</span> <a name="l00923"></a>00923 } <a name="l00924"></a>00924 <span class="comment">/*@=boundsread@*/</span> <a name="l00925"></a>00925 <a name="l00931"></a><a class="code" href="depends_8c.html#ee659917f0c3846a095dda9a94c2e864">00931</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="depends_8c.html#ee659917f0c3846a095dda9a94c2e864">markLoop</a>(<span class="comment">/*@special@*/</span> <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi, <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q) <a name="l00932"></a>00932 <span class="comment">/*@globals internalState @*/</span> <a name="l00933"></a>00933 <span class="comment">/*@uses tsi @*/</span> <a name="l00934"></a>00934 <span class="comment">/*@modifies internalState @*/</span> <a name="l00935"></a>00935 { <a name="l00936"></a>00936 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p; <a name="l00937"></a>00937 <a name="l00938"></a>00938 <span class="comment">/*@-branchstate@*/</span> <span class="comment">/* FIX: q is kept */</span> <a name="l00939"></a>00939 <span class="keywordflow">while</span> (tsi != NULL && (p = tsi->tsi_suc) != NULL) { <a name="l00940"></a>00940 tsi = tsi->tsi_next; <a name="l00941"></a>00941 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_chain != NULL) <a name="l00942"></a>00942 <span class="keywordflow">continue</span>; <a name="l00943"></a>00943 <span class="comment">/*@-assignexpose -temptrans@*/</span> <a name="l00944"></a>00944 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_chain = q; <a name="l00945"></a>00945 <span class="comment">/*@=assignexpose =temptrans@*/</span> <a name="l00946"></a>00946 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_next != NULL) <a name="l00947"></a>00947 <a class="code" href="depends_8c.html#ee659917f0c3846a095dda9a94c2e864">markLoop</a>(<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_next, p); <a name="l00948"></a>00948 } <a name="l00949"></a>00949 <span class="comment">/*@=branchstate@*/</span> <a name="l00950"></a>00950 } <a name="l00951"></a>00951 <a name="l00952"></a><a class="code" href="depends_8c.html#99090ab2aa53773926454d28e0b6503b">00952</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> <a class="code" href="depends_8c.html#99090ab2aa53773926454d28e0b6503b">identifyDepend</a>(<a class="code" href="header_8h.html#e5c5e6fe946fcce0d2156db86ffffa8a">int_32</a> f) <a name="l00953"></a>00953 <span class="comment">/*@*/</span> <a name="l00954"></a>00954 { <a name="l00955"></a>00955 f = <a class="code" href="rpmlib_8h.html#66c800ca19a408b1822f64a7d655f823">_notpre</a>(f); <a name="l00956"></a>00956 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a3795403630c46ca6eeb35e8f9939225c7">RPMSENSE_SCRIPT_PRE</a>) <a name="l00957"></a>00957 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(pre):"</span>; <a name="l00958"></a>00958 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a3b684e21a36243ec66614582b11f1d259">RPMSENSE_SCRIPT_POST</a>) <a name="l00959"></a>00959 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(post):"</span>; <a name="l00960"></a>00960 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a38ad8ddd953a7c667ebcda9f37dbf0e7d">RPMSENSE_SCRIPT_PREUN</a>) <a name="l00961"></a>00961 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(preun):"</span>; <a name="l00962"></a>00962 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a331f735a1b7ce3c531ae7b4eb40325650">RPMSENSE_SCRIPT_POSTUN</a>) <a name="l00963"></a>00963 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(postun):"</span>; <a name="l00964"></a>00964 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a3805861c90b8de7244041a1f31e1f0b53">RPMSENSE_SCRIPT_VERIFY</a>) <a name="l00965"></a>00965 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(verify):"</span>; <a name="l00966"></a>00966 <span class="keywordflow">if</span> (f & <a class="code" href="rpmlib_8h.html#e48bd9834f11ab42752bb6f0f54ae8a35a47d7a16fcea3806ee778e555dc069f">RPMSENSE_FIND_REQUIRES</a>) <a name="l00967"></a>00967 <span class="keywordflow">return</span> <span class="stringliteral">"Requires(auto):"</span>; <a name="l00968"></a>00968 <span class="keywordflow">return</span> <span class="stringliteral">"Requires:"</span>; <a name="l00969"></a>00969 } <a name="l00970"></a>00970 <a name="l00984"></a>00984 <span class="comment">/*@-boundswrite@*/</span> <a name="l00985"></a>00985 <span class="comment">/*@-mustmod@*/</span> <span class="comment">/* FIX: hack modifies, but -type disables */</span> <a name="l00986"></a>00986 <span class="keyword">static</span> <span class="comment">/*@owned@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a name="l00987"></a><a class="code" href="depends_8c.html#890412de9827afbaa9a08d2f4662c6a1">00987</a> <a class="code" href="depends_8c.html#890412de9827afbaa9a08d2f4662c6a1">zapRelation</a>(<a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q, <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p, <a name="l00988"></a>00988 <span class="comment">/*@null@*/</span> <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> requires, <a name="l00989"></a>00989 <span class="keywordtype">int</span> zap, <span class="comment">/*@in@*/</span> <span class="comment">/*@out@*/</span> <span class="keywordtype">int</span> * nzaps, <span class="keywordtype">int</span> msglvl) <a name="l00990"></a>00990 <span class="comment">/*@modifies q, p, requires, *nzaps @*/</span> <a name="l00991"></a>00991 { <a name="l00992"></a>00992 <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi_prev; <a name="l00993"></a>00993 <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi; <a name="l00994"></a>00994 <span class="keyword">const</span> <span class="keywordtype">char</span> *dp = NULL; <a name="l00995"></a>00995 <a name="l00996"></a>00996 <span class="keywordflow">for</span> (tsi_prev = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q), tsi = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next; <a name="l00997"></a>00997 tsi != NULL; <a name="l00998"></a>00998 <span class="comment">/* XXX Note: the loop traverses "not found", break on "found". */</span> <a name="l00999"></a>00999 <span class="comment">/*@-nullderef@*/</span> <a name="l01000"></a>01000 tsi_prev = tsi, tsi = tsi->tsi_next) <a name="l01001"></a>01001 <span class="comment">/*@=nullderef@*/</span> <a name="l01002"></a>01002 { <a name="l01003"></a>01003 <a class="code" href="header_8h.html#e5c5e6fe946fcce0d2156db86ffffa8a">int_32</a> Flags; <a name="l01004"></a>01004 <a name="l01005"></a>01005 <span class="comment">/*@-abstractcompare@*/</span> <a name="l01006"></a>01006 <span class="keywordflow">if</span> (tsi->tsi_suc != p) <a name="l01007"></a>01007 <span class="keywordflow">continue</span>; <a name="l01008"></a>01008 <span class="comment">/*@=abstractcompare@*/</span> <a name="l01009"></a>01009 <a name="l01010"></a>01010 if (requires == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l01011"></a>01011 <a name="l01012"></a>01012 (void) <a class="code" href="rpmds_8c.html#87dbcace20008dd5d943397d6386d91c">rpmdsSetIx</a>(requires, tsi->tsi_reqx); <a name="l01013"></a>01013 <a name="l01014"></a>01014 Flags = <a class="code" href="rpmds_8c.html#cd3d85fc2c8ce656c818603f444c5ab6">rpmdsFlags</a>(requires); <a name="l01015"></a>01015 <a name="l01016"></a>01016 dp = <a class="code" href="rpmds_8c.html#c5c2ad76fb814fbddd4f2258902ffefa">rpmdsNewDNEVR</a>( <a class="code" href="depends_8c.html#99090ab2aa53773926454d28e0b6503b">identifyDepend</a>(Flags), requires); <a name="l01017"></a>01017 <a name="l01018"></a>01018 <span class="comment">/*</span> <a name="l01019"></a>01019 <span class="comment"> * Attempt to unravel a dependency loop by eliminating Requires's.</span> <a name="l01020"></a>01020 <span class="comment"> */</span> <a name="l01021"></a>01021 <span class="comment">/*@-branchstate@*/</span> <a name="l01022"></a>01022 <span class="keywordflow">if</span> (zap && !(<a class="code" href="rpmlib_8h.html#a98118726c372298b1a5ea381ddc0681">isErasePreReq</a>(Flags) || <a class="code" href="rpmlib_8h.html#bc00afdaa20adc10a5d35bba8f72b76a">isInstallPreReq</a>(Flags))) { <a name="l01023"></a>01023 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(msglvl, <a name="l01024"></a>01024 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"removing %s \"%s\" from tsort relations.\n"</span>), <a name="l01025"></a>01025 (<a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(p) ? <a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(p) : <span class="stringliteral">"???"</span>), dp); <a name="l01026"></a>01026 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_count--; <a name="l01027"></a>01027 <span class="keywordflow">if</span> (tsi_prev) tsi_prev->tsi_next = tsi->tsi_next; <a name="l01028"></a>01028 tsi->tsi_next = NULL; <a name="l01029"></a>01029 tsi->tsi_suc = NULL; <a name="l01030"></a>01030 tsi = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(tsi); <a name="l01031"></a>01031 <span class="keywordflow">if</span> (nzaps) <a name="l01032"></a>01032 (*nzaps)++; <a name="l01033"></a>01033 <span class="keywordflow">if</span> (zap) <a name="l01034"></a>01034 zap--; <a name="l01035"></a>01035 } <a name="l01036"></a>01036 <span class="comment">/*@=branchstate@*/</span> <a name="l01037"></a>01037 <span class="comment">/* XXX Note: the loop traverses "not found", get out now! */</span> <a name="l01038"></a>01038 <span class="keywordflow">break</span>; <a name="l01039"></a>01039 } <a name="l01040"></a>01040 <span class="keywordflow">return</span> dp; <a name="l01041"></a>01041 } <a name="l01042"></a>01042 <span class="comment">/*@=mustmod@*/</span> <a name="l01043"></a>01043 <span class="comment">/*@=boundswrite@*/</span> <a name="l01044"></a>01044 <a name="l01045"></a>01045 <span class="comment">/* Find the transaction element associated with key. */</span> <a name="l01046"></a><a class="code" href="depends_8c.html#0876aaf7db4cfa0d8bd7f19750420295">01046</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> <a class="code" href="depends_8c.html#0876aaf7db4cfa0d8bd7f19750420295">findElem</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a class="code" href="rpmmessages_8h.html#e51d034b9e250fe42b0e420f254aa54f">fnpyKey</a> key, <span class="keywordtype">int</span> *index) <a name="l01047"></a>01047 { <a name="l01048"></a>01048 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> qi; <a name="l01049"></a>01049 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q, elem = NULL; <a name="l01050"></a>01050 <span class="keywordtype">int</span> i; <a name="l01051"></a>01051 <a name="l01052"></a>01052 <span class="keywordflow">for</span> (qi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts), i = 0; (q = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(qi, 0)) != NULL; i++) { <a name="l01053"></a>01053 <span class="comment">/* XXX Only added packages need be checked for matches. */</span> <a name="l01054"></a>01054 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(q) == <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>) <a name="l01055"></a>01055 <span class="keywordflow">continue</span>; <a name="l01056"></a>01056 <a name="l01057"></a>01057 <span class="keywordflow">if</span> (key == <a class="code" href="rpmte_8c.html#e02ecd953a2a4e4b862b3dc9d3b4a5ec">rpmteKey</a>(q)) { <a name="l01058"></a>01058 elem = q; <a name="l01059"></a>01059 *index = i; <a name="l01060"></a>01060 <span class="keywordflow">break</span>; <a name="l01061"></a>01061 } <a name="l01062"></a>01062 } <a name="l01063"></a>01063 qi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(qi); <a name="l01064"></a>01064 <span class="keywordflow">return</span> elem; <a name="l01065"></a>01065 } <a name="l01066"></a>01066 <a name="l01075"></a>01075 <span class="comment">/*@-mustmod@*/</span> <a name="l01076"></a><a class="code" href="depends_8c.html#1e9793f329bc82b860dc80ebed159a78">01076</a> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#1e9793f329bc82b860dc80ebed159a78">addRelation</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts, <a name="l01077"></a>01077 <span class="comment">/*@dependent@*/</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p, <a name="l01078"></a>01078 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * selected, <a name="l01079"></a>01079 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> requires) <a name="l01080"></a>01080 <span class="comment">/*@globals rpmGlobalMacroContext, h_errno, fileSystem, internalState @*/</span> <a name="l01081"></a>01081 <span class="comment">/*@modifies ts, p, *selected, rpmGlobalMacroContext,</span> <a name="l01082"></a>01082 <span class="comment"> fileSystem, internalState @*/</span> <a name="l01083"></a>01083 { <a name="l01084"></a>01084 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q = NULL; <a name="l01085"></a>01085 <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi; <a name="l01086"></a>01086 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l01087"></a>01087 <a class="code" href="rpmmessages_8h.html#e51d034b9e250fe42b0e420f254aa54f">fnpyKey</a> *key, *keys = NULL; <a name="l01088"></a>01088 <span class="keywordtype">int</span> i = 0; <a name="l01089"></a>01089 <a name="l01090"></a>01090 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(requires)) == NULL) <a name="l01091"></a>01091 <span class="keywordflow">return</span> 0; <a name="l01092"></a>01092 <a name="l01093"></a>01093 <span class="comment">/* Avoid rpmlib feature dependencies. */</span> <a name="l01094"></a>01094 <span class="keywordflow">if</span> (!strncmp(Name, <span class="stringliteral">"rpmlib("</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"rpmlib("</span>)-1)) <a name="l01095"></a>01095 <span class="keywordflow">return</span> 0; <a name="l01096"></a>01096 <a name="l01097"></a>01097 <span class="comment">/* Avoid package config dependencies. */</span> <a name="l01098"></a>01098 <span class="keywordflow">if</span> (!strncmp(Name, <span class="stringliteral">"config("</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"config("</span>)-1)) <a name="l01099"></a>01099 <span class="keywordflow">return</span> 0; <a name="l01100"></a>01100 <a name="l01101"></a>01101 keys = <a class="code" href="rpmal_8c.html#aa2a50dfc9e6f54f0c61da51590242e6">rpmalAllSatisfiesDepend</a>(ts->addedPackages, requires, NULL); <a name="l01102"></a>01102 <a name="l01103"></a>01103 <span class="comment">/* Ordering depends only on added package relations. */</span> <a name="l01104"></a>01104 <span class="keywordflow">if</span> (keys) { <a name="l01105"></a>01105 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> best = NULL; <a name="l01106"></a>01106 <a name="l01107"></a>01107 <span class="comment">/*</span> <a name="l01108"></a>01108 <span class="comment"> * On colored transactions, try to find the best provider for</span> <a name="l01109"></a>01109 <span class="comment"> * a dependency based on color. Just picking up whatever comes first</span> <a name="l01110"></a>01110 <span class="comment"> * can create bogus relations between packages, causing unresolvable</span> <a name="l01111"></a>01111 <span class="comment"> * dependency loops and messing up ordering badly.</span> <a name="l01112"></a>01112 <span class="comment"> */</span> <a name="l01113"></a>01113 <span class="keywordflow">if</span> (<a class="code" href="rpmts_8c.html#b638b622295dd5eb80052b26c0364b56">rpmtsColor</a>(ts)) { <a name="l01114"></a>01114 <span class="keywordtype">int</span> dscolor = <a class="code" href="rpmds_8c.html#1a59b0acfb8e035471da848c0723b1e0">rpmdsColor</a>(requires); <a name="l01115"></a>01115 <span class="keywordtype">int</span> prefcolor = <a class="code" href="rpmts_8c.html#5ff09470a81eee1275a2341766bdb988">rpmtsPrefColor</a>(ts); <a name="l01116"></a>01116 <span class="keywordflow">for</span> (key = keys; key && *key; key ++) { <a name="l01117"></a>01117 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> z = <a class="code" href="depends_8c.html#0876aaf7db4cfa0d8bd7f19750420295">findElem</a>(ts, *key, &i); <a name="l01118"></a>01118 <span class="keywordtype">int</span> tecolor = <a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(z); <a name="l01119"></a>01119 <span class="keywordflow">if</span> (dscolor) { <a name="l01120"></a>01120 <span class="keywordflow">if</span> (dscolor == tecolor) best = z; <a name="l01121"></a>01121 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (prefcolor) { <a name="l01122"></a>01122 <span class="keywordflow">if</span> (prefcolor == tecolor) best = z; <a name="l01123"></a>01123 }; <a name="l01124"></a>01124 <span class="keywordflow">if</span> (best) <span class="keywordflow">break</span>; <a name="l01125"></a>01125 } <a name="l01126"></a>01126 } <a name="l01127"></a>01127 <span class="comment">/* If not decided by now, just pick first match */</span> <a name="l01128"></a>01128 q = best ? best : <a class="code" href="depends_8c.html#0876aaf7db4cfa0d8bd7f19750420295">findElem</a>(ts, keys[0], &i); <a name="l01129"></a>01129 <a name="l01130"></a>01130 free(keys); <a name="l01131"></a>01131 } <a name="l01132"></a>01132 <a name="l01133"></a>01133 <span class="keywordflow">if</span> (q == NULL) <a name="l01134"></a>01134 <span class="keywordflow">return</span> 0; <a name="l01135"></a>01135 <a name="l01136"></a>01136 <span class="comment">/* Avoid certain dependency relations. */</span> <a name="l01137"></a>01137 <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#693232a4b14c91c973c828b0ef01b193">ignoreDep</a>(ts, p, q)) <a name="l01138"></a>01138 <span class="keywordflow">return</span> 0; <a name="l01139"></a>01139 <a name="l01140"></a>01140 <span class="comment">/* Avoid redundant relations. */</span> <a name="l01141"></a>01141 <span class="comment">/* XXX TODO: add control bit. */</span> <a name="l01142"></a>01142 <span class="comment">/*@-boundsread@*/</span> <a name="l01143"></a>01143 <span class="keywordflow">if</span> (selected[i] != 0) <a name="l01144"></a>01144 <span class="keywordflow">return</span> 0; <a name="l01145"></a>01145 <span class="comment">/*@=boundsread@*/</span> <a name="l01146"></a>01146 <span class="comment">/*@-boundswrite@*/</span> <a name="l01147"></a>01147 selected[i] = 1; <a name="l01148"></a>01148 <span class="comment">/*@=boundswrite@*/</span> <a name="l01149"></a>01149 <a name="l01150"></a>01150 <span class="comment">/* T3. Record next "q <- p" relation (i.e. "p" requires "q"). */</span> <a name="l01151"></a>01151 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_count++; <span class="comment">/* bump p predecessor count */</span> <a name="l01152"></a>01152 <a name="l01153"></a>01153 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(p) <= <a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(q)) <span class="comment">/* Save max. depth in dependency tree */</span> <a name="l01154"></a>01154 (void) <a class="code" href="rpmte_8c.html#cf351331f5f032ccaf34b08545b6db9f">rpmteSetDepth</a>(p, (<a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(q) + 1)); <a name="l01155"></a>01155 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(p) > ts->maxDepth) <a name="l01156"></a>01156 ts->maxDepth = <a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(p); <a name="l01157"></a>01157 <a name="l01158"></a>01158 tsi = <a class="code" href="system_8h.html#cf4d2a0b6c4f9229a0f4687202abed54">xcalloc</a>(1, <span class="keyword">sizeof</span>(*tsi)); <a name="l01159"></a>01159 tsi->tsi_suc = p; <a name="l01160"></a>01160 <a name="l01161"></a>01161 tsi->tsi_reqx = <a class="code" href="rpmds_8c.html#13796ca95ec6c12cba9fea09140dae8f">rpmdsIx</a>(requires); <a name="l01162"></a>01162 <a name="l01163"></a>01163 tsi->tsi_next = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next; <a name="l01164"></a>01164 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next = tsi; <a name="l01165"></a>01165 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_qcnt++; <span class="comment">/* bump q successor count */</span> <a name="l01166"></a>01166 <span class="keywordflow">return</span> 0; <a name="l01167"></a>01167 } <a name="l01168"></a>01168 <span class="comment">/*@=mustmod@*/</span> <a name="l01169"></a>01169 <a name="l01176"></a><a class="code" href="depends_8c.html#3064aebcc16abdc8f922c653b6d2804d">01176</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="depends_8c.html#3064aebcc16abdc8f922c653b6d2804d">orderListIndexCmp</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * one, <span class="keyword">const</span> <span class="keywordtype">void</span> * two) <span class="comment">/*@*/</span> <a name="l01177"></a>01177 { <a name="l01178"></a>01178 <span class="comment">/*@-castexpose@*/</span> <a name="l01179"></a>01179 <span class="keywordtype">long</span> a = (long) ((<span class="keyword">const</span> <a class="code" href="depends_8c.html#12b92f190cd5f990ade0d12e8d7b16db">orderListIndex</a>)one)->pkgKey; <a name="l01180"></a>01180 <span class="keywordtype">long</span> b = (long) ((<span class="keyword">const</span> <a class="code" href="depends_8c.html#12b92f190cd5f990ade0d12e8d7b16db">orderListIndex</a>)two)->pkgKey; <a name="l01181"></a>01181 <span class="comment">/*@=castexpose@*/</span> <a name="l01182"></a>01182 <span class="keywordflow">return</span> (a - b); <a name="l01183"></a>01183 } <a name="l01184"></a>01184 <a name="l01191"></a>01191 <span class="comment">/*@-boundswrite@*/</span> <a name="l01192"></a>01192 <span class="comment">/*@-mustmod@*/</span> <a name="l01193"></a><a class="code" href="depends_8c.html#817c1268b3dc6200f53efb10512ad9fb">01193</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="depends_8c.html#817c1268b3dc6200f53efb10512ad9fb">addQ</a>(<span class="comment">/*@dependent@*/</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p, <a name="l01194"></a>01194 <span class="comment">/*@in@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> * qp, <a name="l01195"></a>01195 <span class="comment">/*@in@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> * rp, <a name="l01196"></a>01196 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> prefcolor) <a name="l01197"></a>01197 <span class="comment">/*@modifies p, *qp, *rp @*/</span> <a name="l01198"></a>01198 { <a name="l01199"></a>01199 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q, qprev; <a name="l01200"></a>01200 <a name="l01201"></a>01201 <span class="comment">/* Mark the package as queued. */</span> <a name="l01202"></a>01202 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_reqx = 1; <a name="l01203"></a>01203 <a name="l01204"></a>01204 <span class="keywordflow">if</span> ((*rp) == NULL) { <span class="comment">/* 1st element */</span> <a name="l01205"></a>01205 <span class="comment">/*@-dependenttrans@*/</span> <span class="comment">/* FIX: double indirection */</span> <a name="l01206"></a>01206 (*rp) = (*qp) = p; <a name="l01207"></a>01207 <span class="comment">/*@=dependenttrans@*/</span> <a name="l01208"></a>01208 <span class="keywordflow">return</span>; <a name="l01209"></a>01209 } <a name="l01210"></a>01210 <a name="l01211"></a>01211 <span class="comment">/* Find location in queue using metric tsi_qcnt. */</span> <a name="l01212"></a>01212 <span class="keywordflow">for</span> (qprev = NULL, q = (*qp); <a name="l01213"></a>01213 q != NULL; <a name="l01214"></a>01214 qprev = q, q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_suc) <a name="l01215"></a>01215 { <a name="l01216"></a>01216 <span class="comment">/* XXX Insure preferred color first. */</span> <a name="l01217"></a>01217 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(p) != prefcolor && <a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(p) != <a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(q)) <a name="l01218"></a>01218 <span class="keywordflow">continue</span>; <a name="l01219"></a>01219 <a name="l01220"></a>01220 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_qcnt <= <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_qcnt) <a name="l01221"></a>01221 <span class="keywordflow">break</span>; <a name="l01222"></a>01222 } <a name="l01223"></a>01223 <a name="l01224"></a>01224 <span class="keywordflow">if</span> (qprev == NULL) { <span class="comment">/* insert at beginning of list */</span> <a name="l01225"></a>01225 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_suc = q; <a name="l01226"></a>01226 <span class="comment">/*@-dependenttrans@*/</span> <a name="l01227"></a>01227 (*qp) = p; <span class="comment">/* new head */</span> <a name="l01228"></a>01228 <span class="comment">/*@=dependenttrans@*/</span> <a name="l01229"></a>01229 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (q == NULL) { <span class="comment">/* insert at end of list */</span> <a name="l01230"></a>01230 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(qprev)->tsi_suc = p; <a name="l01231"></a>01231 <span class="comment">/*@-dependenttrans@*/</span> <a name="l01232"></a>01232 (*rp) = p; <span class="comment">/* new tail */</span> <a name="l01233"></a>01233 <span class="comment">/*@=dependenttrans@*/</span> <a name="l01234"></a>01234 } <span class="keywordflow">else</span> { <span class="comment">/* insert between qprev and q */</span> <a name="l01235"></a>01235 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_suc = q; <a name="l01236"></a>01236 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(qprev)->tsi_suc = p; <a name="l01237"></a>01237 } <a name="l01238"></a>01238 } <a name="l01239"></a>01239 <span class="comment">/*@=mustmod@*/</span> <a name="l01240"></a>01240 <span class="comment">/*@=boundswrite@*/</span> <a name="l01241"></a>01241 <a name="l01242"></a>01242 <span class="comment">/*@-bounds@*/</span> <a name="l01243"></a><a class="code" href="group__rpmts.html#gc1689f2882788245b3741dee4c0ae120">01243</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmts.html#gc1689f2882788245b3741dee4c0ae120">rpmtsOrder</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts) <a name="l01244"></a>01244 { <a name="l01245"></a>01245 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> requires; <a name="l01246"></a>01246 <a class="code" href="header_8h.html#e5c5e6fe946fcce0d2156db86ffffa8a">int_32</a> Flags; <a name="l01247"></a>01247 <span class="keywordtype">int</span> anaconda = <a class="code" href="group__rpmts.html#g22eec4db17655dd92ce5715312d153c3">rpmtsFlags</a>(ts) & <a class="code" href="rpmlib_8h.html#ca72ece8019aa198fc445bd206caa3f487662f96706581224d4bd523f8f2fc60">RPMTRANS_FLAG_ANACONDA</a>; <a name="l01248"></a>01248 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> prefcolor = <a class="code" href="rpmts_8c.html#5ff09470a81eee1275a2341766bdb988">rpmtsPrefColor</a>(ts); <a name="l01249"></a>01249 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> pi; <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p; <a name="l01250"></a>01250 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> qi; <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> q; <a name="l01251"></a>01251 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> ri; <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> r; <a name="l01252"></a>01252 <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi; <a name="l01253"></a>01253 <a class="code" href="rpmte_8h.html#c3d46664b34e4fa12fca67c369ef6a4f">tsortInfo</a> tsi_next; <a name="l01254"></a>01254 <a class="code" href="rpmlib_8h.html#fa3db181e6f99551db84f5b20db9fdc3">alKey</a> * ordering; <a name="l01255"></a>01255 <span class="keywordtype">int</span> orderingCount = 0; <a name="l01256"></a>01256 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * selected = <a class="code" href="system_8h.html#eb1df3e83fb069eaa2eb66ace3a0ea52">alloca</a>(<span class="keyword">sizeof</span>(*selected) * (ts->orderCount + 1)); <a name="l01257"></a>01257 <span class="keywordtype">int</span> loopcheck; <a name="l01258"></a>01258 <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> * newOrder; <a name="l01259"></a>01259 <span class="keywordtype">int</span> newOrderCount = 0; <a name="l01260"></a>01260 <a class="code" href="depends_8c.html#12b92f190cd5f990ade0d12e8d7b16db">orderListIndex</a> orderList; <a name="l01261"></a>01261 <span class="keywordtype">int</span> numOrderList; <a name="l01262"></a>01262 <span class="keywordtype">int</span> npeer = 128; <span class="comment">/* XXX more than deep enough for now. */</span> <a name="l01263"></a>01263 <span class="keywordtype">int</span> * peer = memset(<a class="code" href="system_8h.html#eb1df3e83fb069eaa2eb66ace3a0ea52">alloca</a>(npeer*<span class="keyword">sizeof</span>(*peer)), 0, (npeer*<span class="keyword">sizeof</span>(*peer))); <a name="l01264"></a>01264 <span class="keywordtype">int</span> nrescans = 0; <a name="l01265"></a>01265 <span class="keywordtype">int</span> _printed = 0; <a name="l01266"></a>01266 <span class="keywordtype">char</span> deptypechar; <a name="l01267"></a>01267 size_t tsbytes; <a name="l01268"></a>01268 <span class="keywordtype">int</span> oType = 0; <a name="l01269"></a>01269 <span class="keywordtype">int</span> treex; <a name="l01270"></a>01270 <span class="keywordtype">int</span> depth; <a name="l01271"></a>01271 <span class="keywordtype">int</span> breadth; <a name="l01272"></a>01272 <span class="keywordtype">int</span> qlen; <a name="l01273"></a>01273 <span class="keywordtype">int</span> i, j; <a name="l01274"></a>01274 <a name="l01275"></a>01275 <span class="comment">/*</span> <a name="l01276"></a>01276 <span class="comment"> * XXX FIXME: this gets needlesly called twice on normal usage patterns,</span> <a name="l01277"></a>01277 <span class="comment"> * should track the need for generating the index somewhere</span> <a name="l01278"></a>01278 <span class="comment"> */</span> <a name="l01279"></a>01279 <a class="code" href="rpmal_8c.html#315ba2a12d2ec3bb5279cf227a1ce775">rpmalMakeIndex</a>(ts->addedPackages); <a name="l01280"></a>01280 <a name="l01281"></a>01281 (void) <a class="code" href="group__rpmio.html#g7f69caae88f9572093fc8b0adf8ecf65">rpmswEnter</a>(<a class="code" href="rpmts_8c.html#c532195f0c1164659306125a44de2246">rpmtsOp</a>(ts, <a class="code" href="rpmts_8h.html#91b5b6bbde8250526b406de6b91735e8e2b521ca0e6ba2527c3cdca5d149cbce">RPMTS_OP_ORDER</a>), 0); <a name="l01282"></a>01282 <a name="l01283"></a>01283 <span class="comment">/* T1. Initialize. */</span> <a name="l01284"></a>01284 <span class="keywordflow">if</span> (oType == 0) <a name="l01285"></a>01285 numOrderList = ts->orderCount; <a name="l01286"></a>01286 <span class="keywordflow">else</span> { <a name="l01287"></a>01287 numOrderList = 0; <a name="l01288"></a>01288 <span class="keywordflow">if</span> (oType & <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>) <a name="l01289"></a>01289 numOrderList += ts->numAddedPackages; <a name="l01290"></a>01290 <span class="keywordflow">if</span> (oType & <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>) <a name="l01291"></a>01291 numOrderList += ts->numRemovedPackages; <a name="l01292"></a>01292 } <a name="l01293"></a>01293 ordering = <a class="code" href="system_8h.html#eb1df3e83fb069eaa2eb66ace3a0ea52">alloca</a>(<span class="keyword">sizeof</span>(*ordering) * (numOrderList + 1)); <a name="l01294"></a>01294 loopcheck = numOrderList; <a name="l01295"></a>01295 tsbytes = 0; <a name="l01296"></a>01296 <a name="l01297"></a>01297 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01298"></a>01298 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) <a name="l01299"></a>01299 <a class="code" href="rpmte_8c.html#f882a5e175bd37c8e36b72c0a29f19b3">rpmteNewTSI</a>(p); <a name="l01300"></a>01300 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01301"></a>01301 <a name="l01302"></a>01302 <span class="comment">/* Record all relations. */</span> <a name="l01303"></a>01303 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"========== recording tsort relations\n"</span>)); <a name="l01304"></a>01304 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01305"></a>01305 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) { <a name="l01306"></a>01306 <a name="l01307"></a>01307 <span class="keywordflow">if</span> ((requires = <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>)) == NULL) <a name="l01308"></a>01308 <span class="keywordflow">continue</span>; <a name="l01309"></a>01309 <a name="l01310"></a>01310 memset(selected, 0, <span class="keyword">sizeof</span>(*selected) * ts->orderCount); <a name="l01311"></a>01311 <a name="l01312"></a>01312 <span class="comment">/* Avoid narcisstic relations. */</span> <a name="l01313"></a>01313 selected[<a class="code" href="rpmte_8c.html#01005a31022703e274590f1bcc63cb62">rpmtsiOc</a>(pi)] = 1; <a name="l01314"></a>01314 <a name="l01315"></a>01315 <span class="comment">/* T2. Next "q <- p" relation. */</span> <a name="l01316"></a>01316 <a name="l01317"></a>01317 <span class="comment">/* First, do pre-requisites. */</span> <a name="l01318"></a>01318 requires = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(requires); <a name="l01319"></a>01319 <span class="keywordflow">if</span> (requires != NULL) <a name="l01320"></a>01320 <span class="keywordflow">while</span> (<a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(requires) >= 0) { <a name="l01321"></a>01321 <a name="l01322"></a>01322 Flags = <a class="code" href="rpmds_8c.html#cd3d85fc2c8ce656c818603f444c5ab6">rpmdsFlags</a>(requires); <a name="l01323"></a>01323 <a name="l01324"></a>01324 <span class="keywordflow">switch</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(p)) { <a name="l01325"></a>01325 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>: <a name="l01326"></a>01326 <span class="comment">/* Skip if not %preun/%postun requires or legacy prereq. */</span> <a name="l01327"></a>01327 <span class="keywordflow">if</span> (!( <a class="code" href="rpmlib_8h.html#a98118726c372298b1a5ea381ddc0681">isErasePreReq</a>(Flags) || <a class="code" href="rpmlib_8h.html#aacedfdb12006e66c20459c3f8f5b9b2">isLegacyPreReq</a>(Flags) ) ) <a name="l01328"></a>01328 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01329"></a>01329 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01330"></a>01330 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>: <a name="l01331"></a>01331 <span class="comment">/* Skip if not %pre/%post requires or legacy prereq. */</span> <a name="l01332"></a>01332 <span class="keywordflow">if</span> (!( <a class="code" href="rpmlib_8h.html#bc00afdaa20adc10a5d35bba8f72b76a">isInstallPreReq</a>(Flags) || <a class="code" href="rpmlib_8h.html#aacedfdb12006e66c20459c3f8f5b9b2">isLegacyPreReq</a>(Flags) ) ) <a name="l01333"></a>01333 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01334"></a>01334 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01335"></a>01335 } <a name="l01336"></a>01336 <a name="l01337"></a>01337 <span class="comment">/* T3. Record next "q <- p" relation (i.e. "p" requires "q"). */</span> <a name="l01338"></a>01338 (void) <a class="code" href="depends_8c.html#1e9793f329bc82b860dc80ebed159a78">addRelation</a>(ts, p, selected, requires); <a name="l01339"></a>01339 <a name="l01340"></a>01340 } <a name="l01341"></a>01341 <a name="l01342"></a>01342 <span class="comment">/* Then do co-requisites. */</span> <a name="l01343"></a>01343 requires = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(requires); <a name="l01344"></a>01344 <span class="keywordflow">if</span> (requires != NULL) <a name="l01345"></a>01345 <span class="keywordflow">while</span> (<a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(requires) >= 0) { <a name="l01346"></a>01346 <a name="l01347"></a>01347 Flags = <a class="code" href="rpmds_8c.html#cd3d85fc2c8ce656c818603f444c5ab6">rpmdsFlags</a>(requires); <a name="l01348"></a>01348 <a name="l01349"></a>01349 <span class="keywordflow">switch</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(p)) { <a name="l01350"></a>01350 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>: <a name="l01351"></a>01351 <span class="comment">/* Skip if %preun/%postun requires or legacy prereq. */</span> <a name="l01352"></a>01352 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#bc00afdaa20adc10a5d35bba8f72b76a">isInstallPreReq</a>(Flags) <a name="l01353"></a>01353 || ( <a class="code" href="rpmlib_8h.html#a98118726c372298b1a5ea381ddc0681">isErasePreReq</a>(Flags) || <a class="code" href="rpmlib_8h.html#aacedfdb12006e66c20459c3f8f5b9b2">isLegacyPreReq</a>(Flags) ) ) <a name="l01354"></a>01354 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01355"></a>01355 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01356"></a>01356 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>: <a name="l01357"></a>01357 <span class="comment">/* Skip if %pre/%post requires or legacy prereq. */</span> <a name="l01358"></a>01358 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a98118726c372298b1a5ea381ddc0681">isErasePreReq</a>(Flags) <a name="l01359"></a>01359 || ( <a class="code" href="rpmlib_8h.html#bc00afdaa20adc10a5d35bba8f72b76a">isInstallPreReq</a>(Flags) || <a class="code" href="rpmlib_8h.html#aacedfdb12006e66c20459c3f8f5b9b2">isLegacyPreReq</a>(Flags) ) ) <a name="l01360"></a>01360 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01361"></a>01361 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01362"></a>01362 } <a name="l01363"></a>01363 <a name="l01364"></a>01364 <span class="comment">/* T3. Record next "q <- p" relation (i.e. "p" requires "q"). */</span> <a name="l01365"></a>01365 (void) <a class="code" href="depends_8c.html#1e9793f329bc82b860dc80ebed159a78">addRelation</a>(ts, p, selected, requires); <a name="l01366"></a>01366 <a name="l01367"></a>01367 } <a name="l01368"></a>01368 } <a name="l01369"></a>01369 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01370"></a>01370 <a name="l01371"></a>01371 <span class="comment">/* Save predecessor count and mark tree roots. */</span> <a name="l01372"></a>01372 treex = 0; <a name="l01373"></a>01373 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01374"></a>01374 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) { <a name="l01375"></a>01375 <span class="keywordtype">int</span> npreds; <a name="l01376"></a>01376 <a name="l01377"></a>01377 npreds = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_count; <a name="l01378"></a>01378 <a name="l01379"></a>01379 (void) <a class="code" href="rpmte_8c.html#58ffc871186604a364464de20cb0006d">rpmteSetNpreds</a>(p, npreds); <a name="l01380"></a>01380 (void) <a class="code" href="rpmte_8c.html#cf351331f5f032ccaf34b08545b6db9f">rpmteSetDepth</a>(p, 1); <a name="l01381"></a>01381 <a name="l01382"></a>01382 <span class="keywordflow">if</span> (npreds == 0) <a name="l01383"></a>01383 (void) <a class="code" href="rpmte_8c.html#be509eb98c8a7b51c3a13621de9d90c3">rpmteSetTree</a>(p, treex++); <a name="l01384"></a>01384 <span class="keywordflow">else</span> <a name="l01385"></a>01385 (<span class="keywordtype">void</span>) <a class="code" href="rpmte_8c.html#be509eb98c8a7b51c3a13621de9d90c3">rpmteSetTree</a>(p, -1); <a name="l01386"></a>01386 <span class="preprocessor">#ifdef UNNECESSARY</span> <a name="l01387"></a>01387 <span class="preprocessor"></span> (void) <a class="code" href="rpmte_8c.html#19f77d044284c5b080628025b5eeb496">rpmteSetParent</a>(p, NULL); <a name="l01388"></a>01388 <span class="preprocessor">#endif</span> <a name="l01389"></a>01389 <span class="preprocessor"></span> <a name="l01390"></a>01390 } <a name="l01391"></a>01391 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01392"></a>01392 ts->ntrees = treex; <a name="l01393"></a>01393 <a name="l01394"></a>01394 <span class="comment">/* T4. Scan for zeroes. */</span> <a name="l01395"></a>01395 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"========== tsorting packages (order, #predecessors, #succesors, tree, depth, breadth)\n"</span>)); <a name="l01396"></a>01396 <a name="l01397"></a>01397 rescan: <a name="l01398"></a>01398 <span class="keywordflow">if</span> (pi != NULL) pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01399"></a>01399 q = r = NULL; <a name="l01400"></a>01400 qlen = 0; <a name="l01401"></a>01401 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01402"></a>01402 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) { <a name="l01403"></a>01403 <a name="l01404"></a>01404 <span class="comment">/* Prefer packages in chainsaw or anaconda presentation order. */</span> <a name="l01405"></a>01405 <span class="keywordflow">if</span> (anaconda) <a name="l01406"></a>01406 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_qcnt = (ts->orderCount - <a class="code" href="rpmte_8c.html#01005a31022703e274590f1bcc63cb62">rpmtsiOc</a>(pi)); <a name="l01407"></a>01407 <a name="l01408"></a>01408 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_count != 0) <a name="l01409"></a>01409 <span class="keywordflow">continue</span>; <a name="l01410"></a>01410 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_suc = NULL; <a name="l01411"></a>01411 <a class="code" href="depends_8c.html#817c1268b3dc6200f53efb10512ad9fb">addQ</a>(p, &q, &r, prefcolor); <a name="l01412"></a>01412 qlen++; <a name="l01413"></a>01413 } <a name="l01414"></a>01414 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01415"></a>01415 <a name="l01416"></a>01416 <span class="comment">/* T5. Output front of queue (T7. Remove from queue.) */</span> <a name="l01417"></a>01417 <span class="keywordflow">for</span> (; q != NULL; q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_suc) { <a name="l01418"></a>01418 <a name="l01419"></a>01419 <span class="comment">/* Mark the package as unqueued. */</span> <a name="l01420"></a>01420 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_reqx = 0; <a name="l01421"></a>01421 <a name="l01422"></a>01422 <span class="keywordflow">if</span> (oType != 0) <a name="l01423"></a>01423 <span class="keywordflow">switch</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(q)) { <a name="l01424"></a>01424 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>: <a name="l01425"></a>01425 <span class="keywordflow">if</span> (!(oType & <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>)) <a name="l01426"></a>01426 <span class="keywordflow">continue</span>; <a name="l01427"></a>01427 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01428"></a>01428 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>: <a name="l01429"></a>01429 <span class="keywordflow">if</span> (!(oType & <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>)) <a name="l01430"></a>01430 <span class="keywordflow">continue</span>; <a name="l01431"></a>01431 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01432"></a>01432 <span class="keywordflow">default</span>: <a name="l01433"></a>01433 <span class="keywordflow">continue</span>; <a name="l01434"></a>01434 <span class="comment">/*@notreached@*/</span> <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01435"></a>01435 } <a name="l01436"></a>01436 deptypechar = (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(q) == <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a> ? <span class="charliteral">'-'</span> : <span class="charliteral">'+'</span>); <a name="l01437"></a>01437 <a name="l01438"></a>01438 treex = <a class="code" href="rpmte_8c.html#12c6e1c0592db3d13f215e4853d13c6a">rpmteTree</a>(q); <a name="l01439"></a>01439 depth = <a class="code" href="rpmte_8c.html#80ed06b47551345cfc7b91de8ef74f68">rpmteDepth</a>(q); <a name="l01440"></a>01440 breadth = ((depth < npeer) ? peer[depth]++ : 0); <a name="l01441"></a>01441 (void) <a class="code" href="rpmte_8c.html#1118d5564ca762c47dd47f95768c072c">rpmteSetBreadth</a>(q, breadth); <a name="l01442"></a>01442 <a name="l01443"></a>01443 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <span class="stringliteral">"%5d%5d%5d%5d%5d%5d %*s%c%s\n"</span>, <a name="l01444"></a>01444 orderingCount, <a class="code" href="rpmte_8c.html#3751c8c03e9b106e32ebba4ed145a04f">rpmteNpreds</a>(q), <a name="l01445"></a>01445 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_qcnt, <a name="l01446"></a>01446 treex, depth, breadth, <a name="l01447"></a>01447 (2 * depth), <span class="stringliteral">""</span>, <a name="l01448"></a>01448 deptypechar, <a name="l01449"></a>01449 (<a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(q) ? <a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(q) : <span class="stringliteral">"???"</span>)); <a name="l01450"></a>01450 <a name="l01451"></a>01451 (void) <a class="code" href="rpmte_8c.html#75151b2af40721c15d5feb0503e8e05a">rpmteSetDegree</a>(q, 0); <a name="l01452"></a>01452 tsbytes += <a class="code" href="rpmte_8c.html#fdd135bc90b3b63b2fac09dba45e659c">rpmtePkgFileSize</a>(q); <a name="l01453"></a>01453 <a name="l01454"></a>01454 <span class="keywordflow">switch</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(q)) { <a name="l01455"></a>01455 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>: <a name="l01456"></a>01456 ordering[orderingCount] = <a class="code" href="rpmte_8c.html#e1b66df8f25853bf9ab60d6f272aac95">rpmteAddedKey</a>(q); <a name="l01457"></a>01457 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01458"></a>01458 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>: <a name="l01459"></a>01459 ordering[orderingCount] = <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>; <a name="l01460"></a>01460 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01461"></a>01461 } <a name="l01462"></a>01462 orderingCount++; <a name="l01463"></a>01463 qlen--; <a name="l01464"></a>01464 loopcheck--; <a name="l01465"></a>01465 <a name="l01466"></a>01466 <span class="comment">/* T6. Erase relations. */</span> <a name="l01467"></a>01467 tsi_next = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next; <a name="l01468"></a>01468 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next = NULL; <a name="l01469"></a>01469 <span class="keywordflow">while</span> ((tsi = tsi_next) != NULL) { <a name="l01470"></a>01470 tsi_next = tsi->tsi_next; <a name="l01471"></a>01471 tsi->tsi_next = NULL; <a name="l01472"></a>01472 p = tsi->tsi_suc; <a name="l01473"></a>01473 <span class="keywordflow">if</span> (p && (--<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_count) <= 0) { <a name="l01474"></a>01474 <a name="l01475"></a>01475 (void) <a class="code" href="rpmte_8c.html#be509eb98c8a7b51c3a13621de9d90c3">rpmteSetTree</a>(p, treex); <a name="l01476"></a>01476 (void) <a class="code" href="rpmte_8c.html#cf351331f5f032ccaf34b08545b6db9f">rpmteSetDepth</a>(p, depth+1); <a name="l01477"></a>01477 (void) <a class="code" href="rpmte_8c.html#19f77d044284c5b080628025b5eeb496">rpmteSetParent</a>(p, q); <a name="l01478"></a>01478 (void) <a class="code" href="rpmte_8c.html#75151b2af40721c15d5feb0503e8e05a">rpmteSetDegree</a>(q, <a class="code" href="rpmte_8c.html#167c20df44b2f71c0c58142aece6d56a">rpmteDegree</a>(q)+1); <a name="l01479"></a>01479 <a name="l01480"></a>01480 <span class="comment">/* XXX TODO: add control bit. */</span> <a name="l01481"></a>01481 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_suc = NULL; <a name="l01482"></a>01482 <a class="code" href="depends_8c.html#817c1268b3dc6200f53efb10512ad9fb">addQ</a>(p, &<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_suc, &r, prefcolor); <a name="l01483"></a>01483 qlen++; <a name="l01484"></a>01484 } <a name="l01485"></a>01485 tsi = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(tsi); <a name="l01486"></a>01486 } <a name="l01487"></a>01487 <span class="keywordflow">if</span> (!_printed && loopcheck == qlen && <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_suc != NULL) { <a name="l01488"></a>01488 _printed++; <a name="l01489"></a>01489 (void) <a class="code" href="group__rpmts.html#g079629930e563a19f00ba563c9d2cd87">rpmtsUnorderedSuccessors</a>(ts, orderingCount); <a name="l01490"></a>01490 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <a name="l01491"></a>01491 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"========== successors only (%d bytes)\n"</span>), (<span class="keywordtype">int</span>)tsbytes); <a name="l01492"></a>01492 <a name="l01493"></a>01493 <span class="comment">/* Relink the queue in presentation order. */</span> <a name="l01494"></a>01494 tsi = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q); <a name="l01495"></a>01495 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01496"></a>01496 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) { <a name="l01497"></a>01497 <span class="comment">/* Is this element in the queue? */</span> <a name="l01498"></a>01498 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_reqx == 0) <a name="l01499"></a>01499 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01500"></a>01500 tsi->tsi_suc = p; <a name="l01501"></a>01501 tsi = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p); <a name="l01502"></a>01502 } <a name="l01503"></a>01503 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01504"></a>01504 tsi->tsi_suc = NULL; <a name="l01505"></a>01505 } <a name="l01506"></a>01506 } <a name="l01507"></a>01507 <a name="l01508"></a>01508 <span class="comment">/* T8. End of process. Check for loops. */</span> <a name="l01509"></a>01509 <span class="keywordflow">if</span> (loopcheck != 0) { <a name="l01510"></a>01510 <span class="keywordtype">int</span> nzaps; <a name="l01511"></a>01511 <a name="l01512"></a>01512 <span class="comment">/* T9. Initialize predecessor chain. */</span> <a name="l01513"></a>01513 nzaps = 0; <a name="l01514"></a>01514 qi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01515"></a>01515 <span class="keywordflow">while</span> ((q = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(qi, oType)) != NULL) { <a name="l01516"></a>01516 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_chain = NULL; <a name="l01517"></a>01517 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_reqx = 0; <a name="l01518"></a>01518 <span class="comment">/* Mark packages already sorted. */</span> <a name="l01519"></a>01519 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_count == 0) <a name="l01520"></a>01520 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_count = -1; <a name="l01521"></a>01521 } <a name="l01522"></a>01522 qi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(qi); <a name="l01523"></a>01523 <a name="l01524"></a>01524 <span class="comment">/* T10. Mark all packages with their predecessors. */</span> <a name="l01525"></a>01525 qi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01526"></a>01526 <span class="keywordflow">while</span> ((q = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(qi, oType)) != NULL) { <a name="l01527"></a>01527 <span class="keywordflow">if</span> ((tsi = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next) == NULL) <a name="l01528"></a>01528 <span class="keywordflow">continue</span>; <a name="l01529"></a>01529 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next = NULL; <a name="l01530"></a>01530 <a class="code" href="depends_8c.html#ee659917f0c3846a095dda9a94c2e864">markLoop</a>(tsi, q); <a name="l01531"></a>01531 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_next = tsi; <a name="l01532"></a>01532 } <a name="l01533"></a>01533 qi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(qi); <a name="l01534"></a>01534 <a name="l01535"></a>01535 <span class="comment">/* T11. Print all dependency loops. */</span> <a name="l01536"></a>01536 ri = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01537"></a>01537 <span class="keywordflow">while</span> ((r = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(ri, oType)) != NULL) <a name="l01538"></a>01538 { <a name="l01539"></a>01539 <span class="keywordtype">int</span> printed; <a name="l01540"></a>01540 <a name="l01541"></a>01541 printed = 0; <a name="l01542"></a>01542 <a name="l01543"></a>01543 <span class="comment">/* T12. Mark predecessor chain, looking for start of loop. */</span> <a name="l01544"></a>01544 <span class="keywordflow">for</span> (q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(r)->tsi_chain; q != NULL; <a name="l01545"></a>01545 q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_chain) <a name="l01546"></a>01546 { <a name="l01547"></a>01547 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_reqx) <a name="l01548"></a>01548 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01549"></a>01549 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_reqx = 1; <a name="l01550"></a>01550 } <a name="l01551"></a>01551 <a name="l01552"></a>01552 <span class="comment">/* T13. Print predecessor chain from start of loop. */</span> <a name="l01553"></a>01553 <span class="keywordflow">while</span> ((p = q) != NULL && (q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_chain) != NULL) { <a name="l01554"></a>01554 <span class="keyword">const</span> <span class="keywordtype">char</span> * dp; <a name="l01555"></a>01555 <span class="keywordtype">char</span> buf[4096]; <a name="l01556"></a>01556 <span class="keywordtype">int</span> msglvl = (anaconda || (<a class="code" href="group__rpmts.html#g22eec4db17655dd92ce5715312d153c3">rpmtsFlags</a>(ts) & <a class="code" href="rpmlib_8h.html#ca72ece8019aa198fc445bd206caa3f4b0d6b1b60d9464f8d51c8a0b3cb80ae7">RPMTRANS_FLAG_DEPLOOPS</a>)) <a name="l01557"></a>01557 ? <a class="code" href="rpmmessages_8h.html#dd380de8b2f203516cc1ab9475e31da5">RPMMESS_WARNING</a> : <a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>; <a name="l01558"></a>01558 ; <a name="l01559"></a>01559 <a name="l01560"></a>01560 <span class="comment">/* Unchain predecessor loop. */</span> <a name="l01561"></a>01561 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_chain = NULL; <a name="l01562"></a>01562 <a name="l01563"></a>01563 <span class="keywordflow">if</span> (!printed) { <a name="l01564"></a>01564 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(msglvl, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"LOOP:\n"</span>)); <a name="l01565"></a>01565 printed = 1; <a name="l01566"></a>01566 } <a name="l01567"></a>01567 <a name="l01568"></a>01568 <span class="comment">/* Find (and destroy if co-requisite) "q <- p" relation. */</span> <a name="l01569"></a>01569 requires = <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>); <a name="l01570"></a>01570 requires = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(requires); <a name="l01571"></a>01571 <span class="keywordflow">if</span> (requires == NULL) <a name="l01572"></a>01572 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l01573"></a>01573 dp = <a class="code" href="depends_8c.html#890412de9827afbaa9a08d2f4662c6a1">zapRelation</a>(q, p, requires, 1, &nzaps, msglvl); <a name="l01574"></a>01574 <a name="l01575"></a>01575 <span class="comment">/* Print next member of loop. */</span> <a name="l01576"></a>01576 buf[0] = <span class="charliteral">'\0'</span>; <a name="l01577"></a>01577 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(p) != NULL) <a name="l01578"></a>01578 (void) <a class="code" href="system_8h.html#890dbcd7c456828c1b6ff714e405fcc1">stpcpy</a>(buf, <a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(p)); <a name="l01579"></a>01579 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(msglvl, <span class="stringliteral">" %-40s %s\n"</span>, buf, <a name="l01580"></a>01580 (dp ? dp : <span class="stringliteral">"not found!?!"</span>)); <a name="l01581"></a>01581 <a name="l01582"></a>01582 dp = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(dp); <a name="l01583"></a>01583 } <a name="l01584"></a>01584 <a name="l01585"></a>01585 <span class="comment">/* Walk (and erase) linear part of predecessor chain as well. */</span> <a name="l01586"></a>01586 <span class="keywordflow">for</span> (p = r, q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(r)->tsi_chain; q != NULL; <a name="l01587"></a>01587 p = q, q = <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(q)->tsi_chain) <a name="l01588"></a>01588 { <a name="l01589"></a>01589 <span class="comment">/* Unchain linear part of predecessor loop. */</span> <a name="l01590"></a>01590 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_chain = NULL; <a name="l01591"></a>01591 <a class="code" href="rpmte_8c.html#8064f4f7a7f2bb98037cc890e7bd5237">rpmteTSI</a>(p)->tsi_reqx = 0; <a name="l01592"></a>01592 } <a name="l01593"></a>01593 } <a name="l01594"></a>01594 ri = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(ri); <a name="l01595"></a>01595 <a name="l01596"></a>01596 <span class="comment">/* If a relation was eliminated, then continue sorting. */</span> <a name="l01597"></a>01597 <span class="comment">/* XXX TODO: add control bit. */</span> <a name="l01598"></a>01598 <span class="keywordflow">if</span> (nzaps > 0) { <a name="l01599"></a>01599 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <a name="l01600"></a>01600 <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"========== continuing tsort ... (rescan %d)\n"</span>), <a name="l01601"></a>01601 ++nrescans); <a name="l01602"></a>01602 <span class="keywordflow">goto</span> rescan; <a name="l01603"></a>01603 } <a name="l01604"></a>01604 <a name="l01605"></a>01605 <span class="comment">/* Return no. of packages that could not be ordered. */</span> <a name="l01606"></a>01606 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3dd6b2c230b199259e7fff7929b5286f">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#8a97de23397d8af6821824c0234d8c3c">_</a>(<span class="stringliteral">"rpmtsOrder failed, %d elements remain\n"</span>), <a name="l01607"></a>01607 loopcheck); <a name="l01608"></a>01608 <span class="keywordflow">return</span> loopcheck; <a name="l01609"></a>01609 } <a name="l01610"></a>01610 <a name="l01611"></a>01611 <span class="comment">/* Clean up tsort remnants (if any). */</span> <a name="l01612"></a>01612 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01613"></a>01613 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, 0)) != NULL) <a name="l01614"></a>01614 <a class="code" href="rpmte_8c.html#289d6b9538f6b37a4df031554e8847c8">rpmteFreeTSI</a>(p); <a name="l01615"></a>01615 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01616"></a>01616 <a name="l01617"></a>01617 <span class="comment">/*</span> <a name="l01618"></a>01618 <span class="comment"> * The order ends up as installed packages followed by removed packages,</span> <a name="l01619"></a>01619 <span class="comment"> * with removes for upgrades immediately following the installation of</span> <a name="l01620"></a>01620 <span class="comment"> * the new package. This would be easier if we could sort the</span> <a name="l01621"></a>01621 <span class="comment"> * addedPackages array, but we store indexes into it in various places.</span> <a name="l01622"></a>01622 <span class="comment"> */</span> <a name="l01623"></a>01623 orderList = <a class="code" href="system_8h.html#cf4d2a0b6c4f9229a0f4687202abed54">xcalloc</a>(numOrderList, <span class="keyword">sizeof</span>(*orderList)); <a name="l01624"></a>01624 j = 0; <a name="l01625"></a>01625 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01626"></a>01626 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, oType)) != NULL) { <a name="l01627"></a>01627 <span class="comment">/* Prepare added package ordering permutation. */</span> <a name="l01628"></a>01628 <span class="keywordflow">switch</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(p)) { <a name="l01629"></a>01629 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>: <a name="l01630"></a>01630 orderList[j].pkgKey = <a class="code" href="rpmte_8c.html#e1b66df8f25853bf9ab60d6f272aac95">rpmteAddedKey</a>(p); <a name="l01631"></a>01631 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01632"></a>01632 <span class="keywordflow">case</span> <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>: <a name="l01633"></a>01633 orderList[j].pkgKey = <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>; <a name="l01634"></a>01634 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01635"></a>01635 } <a name="l01636"></a>01636 orderList[j].orIndex = <a class="code" href="rpmte_8c.html#01005a31022703e274590f1bcc63cb62">rpmtsiOc</a>(pi); <a name="l01637"></a>01637 j++; <a name="l01638"></a>01638 } <a name="l01639"></a>01639 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01640"></a>01640 <a name="l01641"></a>01641 qsort(orderList, numOrderList, <span class="keyword">sizeof</span>(*orderList), <a class="code" href="depends_8c.html#3064aebcc16abdc8f922c653b6d2804d">orderListIndexCmp</a>); <a name="l01642"></a>01642 <a name="l01643"></a>01643 <span class="comment">/*@-type@*/</span> <a name="l01644"></a>01644 newOrder = <a class="code" href="system_8h.html#cf4d2a0b6c4f9229a0f4687202abed54">xcalloc</a>(ts->orderCount, <span class="keyword">sizeof</span>(*newOrder)); <a name="l01645"></a>01645 <span class="comment">/*@=type@*/</span> <a name="l01646"></a>01646 <span class="comment">/*@-branchstate@*/</span> <a name="l01647"></a>01647 <span class="keywordflow">for</span> (i = 0, newOrderCount = 0; i < orderingCount; i++) <a name="l01648"></a>01648 { <a name="l01649"></a>01649 <span class="keyword">struct</span> <a class="code" href="structorderListIndex__s.html">orderListIndex_s</a> key; <a name="l01650"></a>01650 <a class="code" href="depends_8c.html#12b92f190cd5f990ade0d12e8d7b16db">orderListIndex</a> needle; <a name="l01651"></a>01651 <a name="l01652"></a>01652 key.<a class="code" href="structorderListIndex__s.html#1a89062a74114ef2916c53fa20372d65">pkgKey</a> = ordering[i]; <a name="l01653"></a>01653 needle = bsearch(&key, orderList, numOrderList, <a name="l01654"></a>01654 <span class="keyword">sizeof</span>(key), <a class="code" href="depends_8c.html#3064aebcc16abdc8f922c653b6d2804d">orderListIndexCmp</a>); <a name="l01655"></a>01655 <span class="comment">/* bsearch should never, ever fail */</span> <a name="l01656"></a>01656 <span class="keywordflow">if</span> (needle == NULL) <a name="l01657"></a>01657 <span class="keywordflow">continue</span>; <a name="l01658"></a>01658 <a name="l01659"></a>01659 j = needle-><a class="code" href="structorderListIndex__s.html#d8468c119c48cf56b10acc573a95f5dd">orIndex</a>; <a name="l01660"></a>01660 <span class="keywordflow">if</span> ((q = ts->order[j]) == NULL || needle-><a class="code" href="structorderListIndex__s.html#1a89062a74114ef2916c53fa20372d65">pkgKey</a> == <a class="code" href="rpmlib_8h.html#1f812f80a02e4526a62810144bd1d42d">RPMAL_NOMATCH</a>) <a name="l01661"></a>01661 <span class="keywordflow">continue</span>; <a name="l01662"></a>01662 <a name="l01663"></a>01663 newOrder[newOrderCount++] = q; <a name="l01664"></a>01664 ts->order[j] = NULL; <a name="l01665"></a>01665 <span class="keywordflow">if</span> (anaconda) <a name="l01666"></a>01666 <span class="keywordflow">for</span> (j = needle-><a class="code" href="structorderListIndex__s.html#d8468c119c48cf56b10acc573a95f5dd">orIndex</a> + 1; j < ts->orderCount; j++) { <a name="l01667"></a>01667 <span class="keywordflow">if</span> ((q = ts->order[j]) == NULL) <a name="l01668"></a>01668 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01669"></a>01669 <span class="keywordflow">if</span> (<a class="code" href="rpmte_8c.html#3e60aa541a83c82b027cad431cb03983">rpmteType</a>(q) == <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a> <a name="l01670"></a>01670 && <a class="code" href="rpmte_8c.html#e364fa01f67d1555defa49310dbae739">rpmteDependsOnKey</a>(q) == needle-><a class="code" href="structorderListIndex__s.html#1a89062a74114ef2916c53fa20372d65">pkgKey</a>) <a name="l01671"></a>01671 { <a name="l01672"></a>01672 newOrder[newOrderCount++] = q; <a name="l01673"></a>01673 ts->order[j] = NULL; <a name="l01674"></a>01674 } <span class="keywordflow">else</span> <a name="l01675"></a>01675 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01676"></a>01676 } <a name="l01677"></a>01677 } <a name="l01678"></a>01678 <span class="comment">/*@=branchstate@*/</span> <a name="l01679"></a>01679 <a name="l01680"></a>01680 <span class="keywordflow">for</span> (j = 0; j < ts->orderCount; j++) { <a name="l01681"></a>01681 <span class="keywordflow">if</span> ((p = ts->order[j]) == NULL) <a name="l01682"></a>01682 <span class="keywordflow">continue</span>; <a name="l01683"></a>01683 newOrder[newOrderCount++] = p; <a name="l01684"></a>01684 ts->order[j] = NULL; <a name="l01685"></a>01685 } <a name="l01686"></a>01686 assert(newOrderCount == ts->orderCount); <a name="l01687"></a>01687 <a name="l01688"></a>01688 <span class="comment">/*@+voidabstract@*/</span> <a name="l01689"></a>01689 ts->order = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(ts->order); <a name="l01690"></a>01690 <span class="comment">/*@=voidabstract@*/</span> <a name="l01691"></a>01691 ts->order = newOrder; <a name="l01692"></a>01692 ts->orderAlloced = ts->orderCount; <a name="l01693"></a>01693 orderList = <a class="code" href="rpmlib_8h.html#2574a8c557fe9a6754ff3b3656943f23">_free</a>(orderList); <a name="l01694"></a>01694 <a name="l01695"></a>01695 <span class="preprocessor">#ifdef DYING </span><span class="comment">/* XXX now done at the CLI level just before rpmtsRun(). */</span> <a name="l01696"></a>01696 <a class="code" href="group__rpmts.html#gd3104a1a8c915cde09f2101a16f78133">rpmtsClean</a>(ts); <a name="l01697"></a>01697 <span class="preprocessor">#endif</span> <a name="l01698"></a>01698 <span class="preprocessor"></span> <a class="code" href="depends_8c.html#d754fe632bb6cf4cbba61aa7ed29eb85">freeBadDeps</a>(); <a name="l01699"></a>01699 <a name="l01700"></a>01700 (void) <a class="code" href="group__rpmio.html#g59c7d4152875cee4e893b5a27ce6b02a">rpmswExit</a>(<a class="code" href="rpmts_8c.html#c532195f0c1164659306125a44de2246">rpmtsOp</a>(ts, <a class="code" href="rpmts_8h.html#91b5b6bbde8250526b406de6b91735e8e2b521ca0e6ba2527c3cdca5d149cbce">RPMTS_OP_ORDER</a>), 0); <a name="l01701"></a>01701 <a name="l01702"></a>01702 <span class="keywordflow">return</span> 0; <a name="l01703"></a>01703 } <a name="l01704"></a>01704 <span class="comment">/*@=bounds@*/</span> <a name="l01705"></a>01705 <a name="l01706"></a><a class="code" href="group__rpmts.html#geb564de4ae14b941c0eb37156c77e7df">01706</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmts.html#geb564de4ae14b941c0eb37156c77e7df">rpmtsCheck</a>(<a class="code" href="rpmlib_8h.html#1a512138316a227059ca128597dbd464">rpmts</a> ts) <a name="l01707"></a>01707 { <a name="l01708"></a>01708 <a class="code" href="header_8h.html#64e458b61bddf0b87a3701578aa7a428">uint_32</a> tscolor = <a class="code" href="rpmts_8c.html#b638b622295dd5eb80052b26c0364b56">rpmtsColor</a>(ts); <a name="l01709"></a>01709 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi = NULL; <a name="l01710"></a>01710 <a class="code" href="rpmte_8h.html#3bb46145257513fe50bfe9d19f3f2b83">rpmtsi</a> pi = NULL; <a class="code" href="rpmlib_8h.html#257d5c7d60e6ce00722ef73041b2c514">rpmte</a> p; <a name="l01711"></a>01711 <span class="keywordtype">int</span> closeatexit = 0; <a name="l01712"></a>01712 <span class="keywordtype">int</span> xx; <a name="l01713"></a>01713 <span class="keywordtype">int</span> rc; <a name="l01714"></a>01714 <a name="l01715"></a>01715 (void) <a class="code" href="group__rpmio.html#g7f69caae88f9572093fc8b0adf8ecf65">rpmswEnter</a>(<a class="code" href="rpmts_8c.html#c532195f0c1164659306125a44de2246">rpmtsOp</a>(ts, <a class="code" href="rpmts_8h.html#91b5b6bbde8250526b406de6b91735e85356fe639387efd7b53a4057c378ae49">RPMTS_OP_CHECK</a>), 0); <a name="l01716"></a>01716 <a name="l01717"></a>01717 <span class="comment">/* Do lazy, readonly, open of rpm database. */</span> <a name="l01718"></a>01718 <span class="keywordflow">if</span> (<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts) == NULL && ts->dbmode != -1) { <a name="l01719"></a>01719 <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmts.html#g91749a850b2cffae16007437b7768570">rpmtsOpenDB</a>(ts, ts->dbmode)) != 0) <a name="l01720"></a>01720 <span class="keywordflow">goto</span> exit; <a name="l01721"></a>01721 closeatexit = 1; <a name="l01722"></a>01722 } <a name="l01723"></a>01723 <a name="l01724"></a>01724 ts->probs = <a class="code" href="rpmps_8c.html#3a181ab1707f03e032005f3ac442c813">rpmpsFree</a>(ts->probs); <a name="l01725"></a>01725 ts->probs = <a class="code" href="rpmps_8c.html#577b2d3d3120fc95b1a80594e39fe3fa">rpmpsCreate</a>(); <a name="l01726"></a>01726 <a name="l01727"></a>01727 <a class="code" href="rpmal_8c.html#315ba2a12d2ec3bb5279cf227a1ce775">rpmalMakeIndex</a>(ts->addedPackages); <a name="l01728"></a>01728 <a name="l01729"></a>01729 <span class="comment">/*</span> <a name="l01730"></a>01730 <span class="comment"> * Look at all of the added packages and make sure their dependencies</span> <a name="l01731"></a>01731 <span class="comment"> * are satisfied.</span> <a name="l01732"></a>01732 <span class="comment"> */</span> <a name="l01733"></a>01733 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01734"></a>01734 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e505895d3834be137fb27a37fbb35c4d7d7823">TR_ADDED</a>)) != NULL) { <a name="l01735"></a>01735 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> provides; <a name="l01736"></a>01736 <a name="l01737"></a>01737 <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* FIX: rpmts{A,O} can return null. */</span> <a name="l01738"></a>01738 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <span class="stringliteral">"========== +++ %s %s/%s 0x%x\n"</span>, <a name="l01739"></a>01739 <a class="code" href="rpmte_8c.html#53178d155e0da8f9a111d19bf4cdd279">rpmteNEVR</a>(p), <a class="code" href="rpmte_8c.html#c1fbdc937f7a661e77bce7cab54878c1">rpmteA</a>(p), <a class="code" href="rpmte_8c.html#8775559fb9e18e792fc6014e8e079865">rpmteO</a>(p), <a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(p)); <a name="l01740"></a>01740 <span class="comment">/*@=nullpass@*/</span> <a name="l01741"></a>01741 rc = <a class="code" href="depends_8c.html#d16b069950c242158ae7b76a990ff5e8">checkPackageDeps</a>(ts, <a class="code" href="rpmte_8c.html#fd943f83f2f34d85090a65a460f34e3d">rpmteNEVRA</a>(p), <a name="l01742"></a>01742 <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b95466e6949826b1a95ad79a39bb3a014">RPMTAG_REQUIRENAME</a>), <a name="l01743"></a>01743 <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b15ea96c2b33c9c73b9ee3e2157e54273">RPMTAG_CONFLICTNAME</a>), <a name="l01744"></a>01744 NULL, <a name="l01745"></a>01745 tscolor, 1); <a name="l01746"></a>01746 <span class="keywordflow">if</span> (rc) <a name="l01747"></a>01747 <span class="keywordflow">goto</span> exit; <a name="l01748"></a>01748 <a name="l01749"></a>01749 rc = 0; <a name="l01750"></a>01750 provides = <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b843a73db82df579ed12eab79ef480318">RPMTAG_PROVIDENAME</a>); <a name="l01751"></a>01751 provides = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(provides); <a name="l01752"></a>01752 <span class="keywordflow">if</span> (provides != NULL) <a name="l01753"></a>01753 <span class="keywordflow">while</span> (<a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(provides) >= 0) { <a name="l01754"></a>01754 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l01755"></a>01755 <a name="l01756"></a>01756 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(provides)) == NULL) <a name="l01757"></a>01757 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l01758"></a>01758 <a name="l01759"></a>01759 <span class="comment">/* Adding: check provides key against conflicts matches. */</span> <a name="l01760"></a>01760 <span class="keywordflow">if</span> (!<a class="code" href="depends_8c.html#c98bbd5673192b69fd03a0361d9a0d7d">checkDependentConflicts</a>(ts, Name)) <a name="l01761"></a>01761 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01762"></a>01762 rc = 1; <a name="l01763"></a>01763 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01764"></a>01764 } <a name="l01765"></a>01765 <span class="keywordflow">if</span> (rc) <a name="l01766"></a>01766 <span class="keywordflow">goto</span> exit; <a name="l01767"></a>01767 } <a name="l01768"></a>01768 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01769"></a>01769 <a name="l01770"></a>01770 <span class="comment">/*</span> <a name="l01771"></a>01771 <span class="comment"> * Look at the removed packages and make sure they aren't critical.</span> <a name="l01772"></a>01772 <span class="comment"> */</span> <a name="l01773"></a>01773 pi = <a class="code" href="rpmte_8h.html#42e36b99a16377b54c0ae7998ce6c66c">rpmtsiInit</a>(ts); <a name="l01774"></a>01774 <span class="keywordflow">while</span> ((p = <a class="code" href="rpmte_8c.html#0e64a9643c2cf9c2a7ccb9de5af128cb">rpmtsiNext</a>(pi, <a class="code" href="group__rpmte.html#ggbaf1a00ee80e3bfa2d3f9a83b8e50589af969c1fa71419e740b4b3445039bf7e">TR_REMOVED</a>)) != NULL) { <a name="l01775"></a>01775 <a class="code" href="rpmlib_8h.html#8ee68aea070136e6b8c844995ff0c5a8">rpmds</a> provides; <a name="l01776"></a>01776 <a class="code" href="rpmlib_8h.html#145b1d5b839052f7f79903bc29f8090a">rpmfi</a> fi; <a name="l01777"></a>01777 <a name="l01778"></a>01778 <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* FIX: rpmts{A,O} can return null. */</span> <a name="l01779"></a>01779 <a class="code" href="rpmmessages_8h.html#19d1274092486c2d1397c86f23283e32">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#3f97e894ffb886d576fbf4cec2f41298">RPMMESS_DEBUG</a>, <span class="stringliteral">"========== --- %s %s/%s 0x%x\n"</span>, <a name="l01780"></a>01780 <a class="code" href="rpmte_8c.html#53178d155e0da8f9a111d19bf4cdd279">rpmteNEVR</a>(p), <a class="code" href="rpmte_8c.html#c1fbdc937f7a661e77bce7cab54878c1">rpmteA</a>(p), <a class="code" href="rpmte_8c.html#8775559fb9e18e792fc6014e8e079865">rpmteO</a>(p), <a class="code" href="rpmte_8c.html#5c348e10527cba439861dd7c0f7f9b40">rpmteColor</a>(p)); <a name="l01781"></a>01781 <span class="comment">/*@=nullpass@*/</span> <a name="l01782"></a>01782 <a name="l01783"></a>01783 <span class="preprocessor">#if defined(DYING) || defined(__LCLINT__)</span> <a name="l01784"></a>01784 <span class="preprocessor"></span> <span class="comment">/* XXX all packages now have Provides: name = version-release */</span> <a name="l01785"></a>01785 <span class="comment">/* Erasing: check name against requiredby matches. */</span> <a name="l01786"></a>01786 rc = <a class="code" href="depends_8c.html#db33c427142b52c5b951943441e442a3">checkDependentPackages</a>(ts, <a class="code" href="rpmte_8c.html#16f587927a8643fc2bf4a0407688f366">rpmteN</a>(p)); <a name="l01787"></a>01787 <span class="keywordflow">if</span> (rc) <a name="l01788"></a>01788 <span class="keywordflow">goto</span> exit; <a name="l01789"></a>01789 <span class="preprocessor">#endif</span> <a name="l01790"></a>01790 <span class="preprocessor"></span> <a name="l01791"></a>01791 rc = 0; <a name="l01792"></a>01792 provides = <a class="code" href="rpmte_8c.html#692c1140979b85990d5bca2dfd42f5a9">rpmteDS</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507b843a73db82df579ed12eab79ef480318">RPMTAG_PROVIDENAME</a>); <a name="l01793"></a>01793 provides = <a class="code" href="rpmds_8c.html#c510049aca4890a06fc7b1e53c8caf5c">rpmdsInit</a>(provides); <a name="l01794"></a>01794 <span class="keywordflow">if</span> (provides != NULL) <a name="l01795"></a>01795 <span class="keywordflow">while</span> (<a class="code" href="rpmds_8c.html#d30ef432a3ddff05ba2c5e4b9c9465a2">rpmdsNext</a>(provides) >= 0) { <a name="l01796"></a>01796 <span class="keyword">const</span> <span class="keywordtype">char</span> * Name; <a name="l01797"></a>01797 <a name="l01798"></a>01798 <span class="keywordflow">if</span> ((Name = <a class="code" href="rpmds_8c.html#4ec909c373d002650eea296020738fb9">rpmdsN</a>(provides)) == NULL) <a name="l01799"></a>01799 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> <a name="l01800"></a>01800 <a name="l01801"></a>01801 <span class="comment">/* Erasing: check provides against requiredby matches. */</span> <a name="l01802"></a>01802 <span class="keywordflow">if</span> (!<a class="code" href="depends_8c.html#db33c427142b52c5b951943441e442a3">checkDependentPackages</a>(ts, Name)) <a name="l01803"></a>01803 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01804"></a>01804 rc = 1; <a name="l01805"></a>01805 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01806"></a>01806 } <a name="l01807"></a>01807 <span class="keywordflow">if</span> (rc) <a name="l01808"></a>01808 <span class="keywordflow">goto</span> exit; <a name="l01809"></a>01809 <a name="l01810"></a>01810 rc = 0; <a name="l01811"></a>01811 fi = <a class="code" href="rpmte_8c.html#eb0a190d0df41422fcd047ba84368341">rpmteFI</a>(p, <a class="code" href="rpmlib_8h.html#342756dddb61d125ae851a8b1ab0507bea94338039b3e67d9ece3f8c8875c7fc">RPMTAG_BASENAMES</a>); <a name="l01812"></a>01812 fi = <a class="code" href="rpmfi_8c.html#b36cc47b1844de32a67482f092074e1f">rpmfiInit</a>(fi, 0); <a name="l01813"></a>01813 <span class="keywordflow">while</span> (<a class="code" href="rpmfi_8c.html#e165b1266f6927370169df4416b0a687">rpmfiNext</a>(fi) >= 0) { <a name="l01814"></a>01814 <span class="keyword">const</span> <span class="keywordtype">char</span> * fn = <a class="code" href="rpmfi_8c.html#d40fd56a6310dcffddb4dff4877744ab">rpmfiFN</a>(fi); <a name="l01815"></a>01815 <a name="l01816"></a>01816 <span class="comment">/* Erasing: check filename against requiredby matches. */</span> <a name="l01817"></a>01817 <span class="keywordflow">if</span> (!<a class="code" href="depends_8c.html#db33c427142b52c5b951943441e442a3">checkDependentPackages</a>(ts, fn)) <a name="l01818"></a>01818 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; <a name="l01819"></a>01819 rc = 1; <a name="l01820"></a>01820 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; <a name="l01821"></a>01821 } <a name="l01822"></a>01822 <span class="keywordflow">if</span> (rc) <a name="l01823"></a>01823 <span class="keywordflow">goto</span> exit; <a name="l01824"></a>01824 } <a name="l01825"></a>01825 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01826"></a>01826 <a name="l01827"></a>01827 rc = 0; <a name="l01828"></a>01828 <a name="l01829"></a>01829 exit: <a name="l01830"></a>01830 mi = <a class="code" href="group__rpmdb.html#g7d328106a65ab43bbef20b9897e463a4">rpmdbFreeIterator</a>(mi); <a name="l01831"></a>01831 pi = <a class="code" href="rpmte_8h.html#8eb01e2b8f74f34942e20a16d27329da">rpmtsiFree</a>(pi); <a name="l01832"></a>01832 <a name="l01833"></a>01833 (void) <a class="code" href="group__rpmio.html#g59c7d4152875cee4e893b5a27ce6b02a">rpmswExit</a>(<a class="code" href="rpmts_8c.html#c532195f0c1164659306125a44de2246">rpmtsOp</a>(ts, <a class="code" href="rpmts_8h.html#91b5b6bbde8250526b406de6b91735e85356fe639387efd7b53a4057c378ae49">RPMTS_OP_CHECK</a>), 0); <a name="l01834"></a>01834 <a name="l01835"></a>01835 <span class="comment">/*@-branchstate@*/</span> <a name="l01836"></a>01836 <span class="keywordflow">if</span> (closeatexit) <a name="l01837"></a>01837 xx = <a class="code" href="group__rpmts.html#gdf6909a1fd8b304e57583ccae8adefa7">rpmtsCloseDB</a>(ts); <a name="l01838"></a>01838 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="depends_8c.html#b3bbab058bc50bb64ebb30d0b08326e5">_cacheDependsRC</a>) <a name="l01839"></a>01839 xx = <a class="code" href="rpmdb_8c.html#7b663c461a2569587c71dbc53c579cca">rpmdbCloseDBI</a>(<a class="code" href="group__rpmts.html#ge89623057eedd0d767dbd4e8d24badd4">rpmtsGetRdb</a>(ts), <a class="code" href="rpmlib_8h.html#1d47f066b552dfad14808c4226fa4b47">RPMDBI_DEPENDS</a>); <a name="l01840"></a>01840 <span class="comment">/*@=branchstate@*/</span> <a name="l01841"></a>01841 <span class="keywordflow">return</span> rc; <a name="l01842"></a>01842 } </pre></div><hr size="1"><address style="align: right;"><small>Generated on 1 Oct 2013 for rpm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.7 </small></address> </body> </html>