<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>lib/transaction.c Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.2.17 --> <center> <a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>lib/transaction.c</h1><a href="transaction_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 00005 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span> 00006 00007 <span class="preprocessor">#include <<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>></span> <span class="comment">/* XXX for rpmExpand */</span> 00008 00009 <span class="preprocessor">#include "<a class="code" href="psm_8h.html">psm.h</a>"</span> 00010 00011 <span class="preprocessor">#include "<a class="code" href="rpmdb_8h.html">rpmdb.h</a>"</span> 00012 <span class="preprocessor">#include "<a class="code" href="fprint_8h.html">fprint.h</a>"</span> 00013 <span class="preprocessor">#include "<a class="code" href="rpmhash_8h.html">rpmhash.h</a>"</span> 00014 <span class="preprocessor">#include "<a class="code" href="misc_8h.html">misc.h</a>"</span> <span class="comment">/* XXX stripTrailingChar, splitString, currentDirectory */</span> 00015 00016 <span class="preprocessor">#ifdef DYING</span> 00017 <span class="preprocessor"></span><span class="comment">/*@-redecl -exportheadervar@*/</span> 00018 <span class="keyword">extern</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * chroot_prefix; 00019 <span class="comment">/*@=redecl =exportheadervar@*/</span> 00020 <span class="preprocessor">#endif</span> 00021 <span class="preprocessor"></span> 00022 <span class="comment">/* XXX FIXME: merge with existing (broken?) tests in system.h */</span> 00023 <span class="comment">/* portability fiddles */</span> 00024 <span class="preprocessor">#if STATFS_IN_SYS_STATVFS</span> 00025 <span class="preprocessor"></span><span class="preprocessor"># include <sys/statvfs.h></span> 00026 <span class="preprocessor">#else</span> 00027 <span class="preprocessor"></span><span class="preprocessor"># if STATFS_IN_SYS_VFS</span> 00028 <span class="preprocessor"></span><span class="preprocessor"># include <sys/vfs.h></span> 00029 <span class="preprocessor"># else</span> 00030 <span class="preprocessor"></span><span class="preprocessor"># if STATFS_IN_SYS_MOUNT</span> 00031 <span class="preprocessor"></span><span class="preprocessor"># include <sys/mount.h></span> 00032 <span class="preprocessor"># else</span> 00033 <span class="preprocessor"></span><span class="preprocessor"># if STATFS_IN_SYS_STATFS</span> 00034 <span class="preprocessor"></span><span class="preprocessor"># include <sys/statfs.h></span> 00035 <span class="preprocessor"># endif</span> 00036 <span class="preprocessor"></span><span class="preprocessor"># endif</span> 00037 <span class="preprocessor"></span><span class="preprocessor"># endif</span> 00038 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 00039 <span class="preprocessor"></span> 00040 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span> 00041 00042 <span class="comment">/*@access FD_t@*/</span> <span class="comment">/* XXX compared with NULL */</span> 00043 <span class="comment">/*@access Header@*/</span> <span class="comment">/* XXX compared with NULL */</span> 00044 <span class="comment">/*@access dbiIndexSet@*/</span> 00045 <span class="comment">/*@access rpmdb@*/</span> 00046 <span class="comment">/*@access rpmTransactionSet@*/</span> 00047 <span class="comment">/*@access TFI_t@*/</span> 00048 <span class="comment">/*@access PSM_t@*/</span> 00049 <span class="comment">/*@access rpmProblemSet@*/</span> 00050 <span class="comment">/*@access rpmProblem@*/</span> 00051 <a name="l00052"></a><a class="code" href="structdiskspaceInfo.html">00052</a> <span class="keyword">struct </span><a class="code" href="structdiskspaceInfo.html">diskspaceInfo</a> { <a name="l00053"></a><a class="code" href="structdiskspaceInfo.html#m0">00053</a> dev_t <a class="code" href="structdiskspaceInfo.html#m0">dev</a>; <a name="l00054"></a><a class="code" href="structdiskspaceInfo.html#m1">00054</a> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <a class="code" href="structdiskspaceInfo.html#m1">bneeded</a>; <a name="l00055"></a><a class="code" href="structdiskspaceInfo.html#m2">00055</a> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>; <a name="l00056"></a><a class="code" href="structdiskspaceInfo.html#m3">00056</a> <span class="keywordtype">int</span> <a class="code" href="structdiskspaceInfo.html#m3">bsize</a>; <a name="l00057"></a><a class="code" href="structdiskspaceInfo.html#m4">00057</a> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <a class="code" href="structdiskspaceInfo.html#m4">bavail</a>; <a name="l00058"></a><a class="code" href="structdiskspaceInfo.html#m5">00058</a> <span class="keywordtype">signed</span> <span class="keywordtype">long</span> <a class="code" href="structdiskspaceInfo.html#m5">iavail</a>; 00059 }; 00060 00061 <span class="comment">/* Adjust for root only reserved space. On linux e2fs, this is 5%. */</span> <a name="l00062"></a><a class="code" href="transaction_8c.html#a0">00062</a> <span class="preprocessor">#define adj_fs_blocks(_nb) (((_nb) * 21) / 20)</span> 00063 <span class="preprocessor"></span> 00064 <span class="comment">/* argon thought a shift optimization here was a waste of time... he's</span> 00065 <span class="comment"> probably right :-( */</span> <a name="l00066"></a><a class="code" href="transaction_8c.html#a1">00066</a> <span class="preprocessor">#define BLOCK_ROUND(size, block) (((size) + (block) - 1) / (block))</span> 00067 <span class="preprocessor"></span> <a name="l00068"></a><a class="code" href="transaction_8c.html#a2">00068</a> <span class="preprocessor">#define XSTRCMP(a, b) ((!(a) && !(b)) || ((a) && (b) && !strcmp((a), (b))))</span> 00069 <span class="preprocessor"></span> <a name="l00070"></a><a class="code" href="transaction_8c.html#a6">00070</a> <span class="keyword">static</span> <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> * <a class="code" href="transaction_8c.html#a6">freeFl</a>(<a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, 00071 <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> flList) 00072 <span class="comment">/*@*/</span> 00073 { 00074 <span class="keywordflow">if</span> (flList) { 00075 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi; 00076 <span class="keywordtype">int</span> oc; 00077 00078 <span class="comment">/*@-usereleased@*/</span> 00079 <span class="keywordflow">for</span> (oc = 0, fi = flList; oc < ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; oc++, fi++) 00080 <a class="code" href="psm_8c.html#a4">freeFi</a>(fi); 00081 flList = <a class="code" href="poptint_8h.html#a14">_free</a>(flList); 00082 <span class="comment">/*@=usereleased@*/</span> 00083 } 00084 <span class="keywordflow">return</span> NULL; 00085 } 00086 <a name="l00087"></a><a class="code" href="group__rpmtrans.html#a7">00087</a> <span class="keywordtype">void</span> <a class="code" href="group__rpmtrans.html#a7">rpmtransSetScriptFd</a>(<a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, <a class="code" href="struct__FD__s.html">FD_t</a> fd) 00088 { 00089 ts-><a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a> = (fd ? <a class="code" href="rpmio_8h.html#a5">fdLink</a>(fd, <span class="stringliteral">"rpmtransSetScriptFd"</span>) : NULL); 00090 } 00091 <a name="l00092"></a><a class="code" href="group__rpmtrans.html#a8">00092</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmtrans.html#a8">rpmtransGetKeys</a>(<span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, <span class="keyword">const</span> <span class="keywordtype">void</span> *** ep, <span class="keywordtype">int</span> * nep) 00093 { 00094 <span class="keywordtype">int</span> rc = 0; 00095 00096 <span class="keywordflow">if</span> (nep) *nep = ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; 00097 <span class="keywordflow">if</span> (ep) { 00098 <span class="keyword">const</span> <span class="keywordtype">void</span> ** e; 00099 <span class="keywordtype">int</span> oc; 00100 00101 *ep = e = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a> * <span class="keyword">sizeof</span>(*e)); 00102 <span class="keywordflow">for</span> (oc = 0; oc < ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; oc++, e++) { 00103 <span class="keywordflow">switch</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m0">type</a>) { 00104 <span class="keywordflow">case</span> TR_ADDED: 00105 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>) { 00106 <span class="keyword">struct </span><a class="code" href="structavailablePackage.html">availablePackage</a> * alp; 00107 alp = ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> + ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m5">u</a>.addedIndex; 00108 *e = alp-><a class="code" href="structavailablePackage.html#m22">key</a>; 00109 <span class="keywordflow">break</span>; 00110 } 00111 <span class="comment">/*@fallthrough@*/</span> 00112 <span class="keywordflow">default</span>: 00113 <span class="keywordflow">case</span> TR_REMOVED: 00114 <span class="comment">/*@-mods@*/</span> <span class="comment">/* FIX: double indirection. */</span> 00115 *e = NULL; 00116 <span class="comment">/*@=mods@*/</span> 00117 <span class="keywordflow">break</span>; 00118 } 00119 } 00120 } 00121 <span class="keywordflow">return</span> rc; 00122 } 00123 <a name="l00124"></a><a class="code" href="transaction_8c.html#a5">00124</a> <span class="keyword">static</span> <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> <a class="code" href="transaction_8c.html#a5">psCreate</a>(<span class="keywordtype">void</span>) 00125 <span class="comment">/*@*/</span> 00126 { 00127 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs; 00128 00129 probs = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(<span class="keyword">sizeof</span>(*probs)); <span class="comment">/* XXX memory leak */</span> 00130 probs-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> = probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> = 0; 00131 probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a> = NULL; 00132 00133 <span class="keywordflow">return</span> probs; 00134 } 00135 <a name="l00136"></a><a class="code" href="transaction_8c.html#a9">00136</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="transaction_8c.html#a9">psAppend</a>(<a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs, <a class="code" href="rpmlib_8h.html#a64">rpmProblemType</a> type, 00137 <span class="keyword">const</span> <span class="keyword">struct</span> <a class="code" href="structavailablePackage.html">availablePackage</a> * alp, 00138 <span class="keyword">const</span> <span class="keywordtype">char</span> * dn, <span class="keyword">const</span> <span class="keywordtype">char</span> *bn, 00139 <a class="code" href="structheaderToken.html">Header</a> altH, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ulong1) 00140 <span class="comment">/*@modifies probs, alp @*/</span> 00141 { 00142 <a class="code" href="structrpmProblem__s.html">rpmProblem</a> p; 00143 <span class="keywordtype">char</span> *t; 00144 00145 <span class="keywordflow">if</span> (probs-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> == probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a>) { 00146 <span class="keywordflow">if</span> (probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a>) 00147 probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> *= 2; 00148 <span class="keywordflow">else</span> 00149 probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> = 2; 00150 probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>, 00151 probs-><a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> * <span class="keyword">sizeof</span>(*probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>)); 00152 } 00153 00154 p = probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a> + probs-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>++; 00155 p-><a class="code" href="structrpmProblem__s.html#m4">type</a> = type; 00156 <span class="comment">/*@-assignexpose@*/</span> 00157 p-><a class="code" href="structrpmProblem__s.html#m2">key</a> = alp-><a class="code" href="structavailablePackage.html#m22">key</a>; 00158 <span class="comment">/*@=assignexpose@*/</span> 00159 p-><a class="code" href="structrpmProblem__s.html#m7">ulong1</a> = ulong1; 00160 p-><a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a> = 0; 00161 00162 <span class="keywordflow">if</span> (dn || bn) { 00163 p-><a class="code" href="structrpmProblem__s.html#m6">str1</a> = 00164 t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>((dn ? strlen(dn) : 0) + (bn ? strlen(bn) : 0) + 1); 00165 <span class="keywordflow">if</span> (dn) t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, dn); 00166 <span class="keywordflow">if</span> (bn) t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, bn); 00167 } <span class="keywordflow">else</span> 00168 p-><a class="code" href="structrpmProblem__s.html#m6">str1</a> = NULL; 00169 00170 <span class="keywordflow">if</span> (alp) { 00171 p-><a class="code" href="structrpmProblem__s.html#m3">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(alp-><a class="code" href="structavailablePackage.html#m0">h</a>); 00172 p-><a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a> = 00173 t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(strlen(alp-><a class="code" href="structavailablePackage.html#m1">name</a>) + 00174 strlen(alp-><a class="code" href="structavailablePackage.html#m2">version</a>) + 00175 strlen(alp-><a class="code" href="structavailablePackage.html#m3">release</a>) + <span class="keyword">sizeof</span>(<span class="stringliteral">"--"</span>)); 00176 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, alp-><a class="code" href="structavailablePackage.html#m1">name</a>); 00177 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">"-"</span>); 00178 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, alp-><a class="code" href="structavailablePackage.html#m2">version</a>); 00179 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">"-"</span>); 00180 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, alp-><a class="code" href="structavailablePackage.html#m3">release</a>); 00181 } <span class="keywordflow">else</span> { 00182 p-><a class="code" href="structrpmProblem__s.html#m3">h</a> = NULL; 00183 p-><a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a> = NULL; 00184 } 00185 00186 <span class="keywordflow">if</span> (altH) { 00187 <span class="keyword">const</span> <span class="keywordtype">char</span> * n, * v, * r; 00188 (void) <a class="code" href="group__header.html#a88">headerNVR</a>(altH, &n, &v, &r); 00189 p-><a class="code" href="structrpmProblem__s.html#m1">altNEVR</a> = 00190 t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(strlen(n) + strlen(v) + strlen(r) + <span class="keyword">sizeof</span>(<span class="stringliteral">"--"</span>)); 00191 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, n); 00192 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">"-"</span>); 00193 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, v); 00194 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">"-"</span>); 00195 t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, r); 00196 } <span class="keywordflow">else</span> 00197 p-><a class="code" href="structrpmProblem__s.html#m1">altNEVR</a> = NULL; 00198 } 00199 <a name="l00200"></a><a class="code" href="transaction_8c.html#a10">00200</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a10">archOkay</a>(<a class="code" href="structheaderToken.html">Header</a> h) 00201 <span class="comment">/*@*/</span> 00202 { 00203 <span class="keywordtype">void</span> * pkgArch; 00204 <span class="keywordtype">int</span> type, count; 00205 00206 <span class="comment">/* make sure we're trying to install this on the proper architecture */</span> 00207 (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a135">RPMTAG_ARCH</a>, &type, (<span class="keywordtype">void</span> **) &pkgArch, &count); 00208 <span class="preprocessor">#ifndef DYING</span> 00209 <span class="preprocessor"></span> <span class="keywordflow">if</span> (type == <a class="code" href="group__header.html#a93a68">RPM_INT8_TYPE</a>) { 00210 <a class="code" href="header_8h.html#a11">int_8</a> * pkgArchNum; 00211 <span class="keywordtype">int</span> archNum; 00212 00213 <span class="comment">/* old arch handling */</span> 00214 <a class="code" href="group__rpmrc.html#a50">rpmGetArchInfo</a>(NULL, &archNum); 00215 pkgArchNum = pkgArch; 00216 <span class="keywordflow">if</span> (archNum != *pkgArchNum) { 00217 <span class="keywordflow">return</span> 0; 00218 } 00219 } <span class="keywordflow">else</span> 00220 <span class="preprocessor">#endif</span> 00221 <span class="preprocessor"></span> { 00222 <span class="comment">/* new arch handling */</span> 00223 <span class="keywordflow">if</span> (!<a class="code" href="group__rpmrc.html#a46">rpmMachineScore</a>(<a class="code" href="group__rpmrc.html#a13a281">RPM_MACHTABLE_INSTARCH</a>, pkgArch)) { 00224 <span class="keywordflow">return</span> 0; 00225 } 00226 } 00227 00228 <span class="keywordflow">return</span> 1; 00229 } 00230 <a name="l00231"></a><a class="code" href="transaction_8c.html#a11">00231</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a11">osOkay</a>(<a class="code" href="structheaderToken.html">Header</a> h) 00232 <span class="comment">/*@*/</span> 00233 { 00234 <span class="keywordtype">void</span> * pkgOs; 00235 <span class="keywordtype">int</span> type, count; 00236 00237 <span class="comment">/* make sure we're trying to install this on the proper os */</span> 00238 (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a134">RPMTAG_OS</a>, &type, (<span class="keywordtype">void</span> **) &pkgOs, &count); 00239 <span class="preprocessor">#ifndef DYING</span> 00240 <span class="preprocessor"></span> <span class="keywordflow">if</span> (type == <a class="code" href="group__header.html#a93a68">RPM_INT8_TYPE</a>) { 00241 <span class="comment">/* v1 packages and v2 packages both used improper OS numbers, so just</span> 00242 <span class="comment"> deal with it hope things work */</span> 00243 <span class="keywordflow">return</span> 1; 00244 } <span class="keywordflow">else</span> 00245 <span class="preprocessor">#endif</span> 00246 <span class="preprocessor"></span> { 00247 <span class="comment">/* new os handling */</span> 00248 <span class="keywordflow">if</span> (!<a class="code" href="group__rpmrc.html#a46">rpmMachineScore</a>(<a class="code" href="group__rpmrc.html#a13a282">RPM_MACHTABLE_INSTOS</a>, pkgOs)) { 00249 <span class="keywordflow">return</span> 0; 00250 } 00251 } 00252 00253 <span class="keywordflow">return</span> 1; 00254 } 00255 <a name="l00256"></a><a class="code" href="transaction_8c.html#a12">00256</a> <span class="keywordtype">void</span> <a class="code" href="transaction_8c.html#a12">rpmProblemSetFree</a>(<a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs) 00257 { 00258 <span class="keywordtype">int</span> i; 00259 00260 <span class="keywordflow">for</span> (i = 0; i < probs-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>; i++) { 00261 <a class="code" href="structrpmProblem__s.html">rpmProblem</a> p = probs-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a> + i; 00262 p-><a class="code" href="structrpmProblem__s.html#m3">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(p-><a class="code" href="structrpmProblem__s.html#m3">h</a>); 00263 p-><a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-><a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a>); 00264 p-><a class="code" href="structrpmProblem__s.html#m1">altNEVR</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-><a class="code" href="structrpmProblem__s.html#m1">altNEVR</a>); 00265 p-><a class="code" href="structrpmProblem__s.html#m6">str1</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-><a class="code" href="structrpmProblem__s.html#m6">str1</a>); 00266 } 00267 free(probs); 00268 } 00269 <a name="l00270"></a><a class="code" href="transaction_8c.html#a13">00270</a> <span class="keyword">static</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="transaction_8c.html#a13">ftstring</a> (<a class="code" href="rpmlib_8h.html#a75">fileTypes</a> ft) 00271 <span class="comment">/*@*/</span> 00272 { 00273 <span class="keywordflow">switch</span> (ft) { 00274 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a315">XDIR</a>: <span class="keywordflow">return</span> <span class="stringliteral">"directory"</span>; 00275 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a314">CDEV</a>: <span class="keywordflow">return</span> <span class="stringliteral">"char dev"</span>; 00276 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a316">BDEV</a>: <span class="keywordflow">return</span> <span class="stringliteral">"block dev"</span>; 00277 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a318">LINK</a>: <span class="keywordflow">return</span> <span class="stringliteral">"link"</span>; 00278 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a319">SOCK</a>: <span class="keywordflow">return</span> <span class="stringliteral">"sock"</span>; 00279 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a313">PIPE</a>: <span class="keywordflow">return</span> <span class="stringliteral">"fifo/pipe"</span>; 00280 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a502a317">REG</a>: <span class="keywordflow">return</span> <span class="stringliteral">"file"</span>; 00281 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> <span class="stringliteral">"unknown file type"</span>; 00282 } 00283 <span class="comment">/*@notreached@*/</span> 00284 } 00285 <a name="l00286"></a><a class="code" href="transaction_8c.html#a14">00286</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a75">fileTypes</a> <a class="code" href="transaction_8c.html#a14">whatis</a>(<a class="code" href="header_8h.html#a13">uint_16</a> mode) 00287 <span class="comment">/*@*/</span> 00288 { 00289 <span class="keywordflow">if</span> (S_ISDIR(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a315">XDIR</a>; 00290 <span class="keywordflow">if</span> (S_ISCHR(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a314">CDEV</a>; 00291 <span class="keywordflow">if</span> (S_ISBLK(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a316">BDEV</a>; 00292 <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a22">S_ISLNK</a>(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a318">LINK</a>; 00293 <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a23">S_ISSOCK</a>(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a319">SOCK</a>; 00294 <span class="keywordflow">if</span> (S_ISFIFO(mode)) <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a313">PIPE</a>; 00295 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a502a317">REG</a>; 00296 } 00297 <a name="l00298"></a><a class="code" href="transaction_8c.html#a3">00298</a> <span class="preprocessor">#define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))</span> 00299 <span class="preprocessor"></span> <a name="l00310"></a><a class="code" href="transaction_8c.html#a15">00310</a> <span class="keyword">static</span> <a class="code" href="structheaderToken.html">Header</a> <a class="code" href="transaction_8c.html#a15">relocateFileList</a>(<span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, 00311 <span class="keyword">struct</span> <a class="code" href="structavailablePackage.html">availablePackage</a> * alp, 00312 <a class="code" href="structheaderToken.html">Header</a> origH, <a class="code" href="rpmlib_8h.html#a74">fileAction</a> * actions) 00313 <span class="comment">/*@modifies ts, fi, alp, origH, actions @*/</span> 00314 { 00315 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 00316 <a class="code" href="rpmlib_8h.html#a70">HAE_t</a> hae = fi-><a class="code" href="structtransactionFileInfo__s.html#m5">hae</a>; 00317 <a class="code" href="rpmlib_8h.html#a71">HME_t</a> hme = fi-><a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>; 00318 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData); 00319 <span class="keyword">static</span> <span class="keywordtype">int</span> _printed = 0; 00320 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs = ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>; 00321 <span class="keywordtype">int</span> allowBadRelocate = (ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a353">RPMPROB_FILTER_FORCERELOCATE</a>); 00322 <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * rawRelocations = alp-><a class="code" href="structavailablePackage.html#m23">relocs</a>; 00323 <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * relocations = NULL; 00324 <span class="keywordtype">int</span> numRelocations; 00325 <span class="keyword">const</span> <span class="keywordtype">char</span> ** validRelocations; 00326 <a class="code" href="group__header.html#a13">rpmTagType</a> validType; 00327 <span class="keywordtype">int</span> numValid; 00328 <span class="keyword">const</span> <span class="keywordtype">char</span> ** baseNames; 00329 <span class="keyword">const</span> <span class="keywordtype">char</span> ** dirNames; 00330 <a class="code" href="header_8h.html#a9">int_32</a> * dirIndexes; 00331 <a class="code" href="header_8h.html#a9">int_32</a> * newDirIndexes; 00332 <a class="code" href="header_8h.html#a9">int_32</a> fileCount; 00333 <a class="code" href="header_8h.html#a9">int_32</a> dirCount; 00334 <a class="code" href="header_8h.html#a12">uint_32</a> * fFlags = NULL; 00335 <a class="code" href="header_8h.html#a13">uint_16</a> * fModes = NULL; 00336 <span class="keywordtype">char</span> * skipDirList; 00337 <a class="code" href="structheaderToken.html">Header</a> h; 00338 <span class="keywordtype">int</span> nrelocated = 0; 00339 <span class="keywordtype">int</span> fileAlloced = 0; 00340 <span class="keywordtype">char</span> * fn = NULL; 00341 <span class="keywordtype">int</span> haveRelocatedFile = 0; 00342 <span class="keywordtype">int</span> reldel = 0; 00343 <span class="keywordtype">int</span> len; 00344 <span class="keywordtype">int</span> i, j; 00345 00346 <span class="keywordflow">if</span> (!hge(origH, <a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>, &validType, 00347 (<span class="keywordtype">void</span> **) &validRelocations, &numValid)) 00348 numValid = 0; 00349 00350 numRelocations = 0; 00351 <span class="keywordflow">if</span> (rawRelocations) 00352 <span class="keywordflow">while</span> (rawRelocations[numRelocations].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> || 00353 rawRelocations[numRelocations].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a>) 00354 numRelocations++; 00355 00356 <span class="comment">/*</span> 00357 <span class="comment"> * If no relocations are specified (usually the case), then return the</span> 00358 <span class="comment"> * original header. If there are prefixes, however, then INSTPREFIXES</span> 00359 <span class="comment"> * should be added, but, since relocateFileList() can be called more</span> 00360 <span class="comment"> * than once for the same header, don't bother if already present.</span> 00361 <span class="comment"> */</span> 00362 <span class="keywordflow">if</span> (rawRelocations == NULL || numRelocations == 0) { 00363 <span class="keywordflow">if</span> (numValid) { 00364 <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a34">headerIsEntry</a>(origH, <a class="code" href="rpmlib_8h.html#a494a203">RPMTAG_INSTPREFIXES</a>)) 00365 (void) hae(origH, <a class="code" href="rpmlib_8h.html#a494a203">RPMTAG_INSTPREFIXES</a>, 00366 validType, validRelocations, numValid); 00367 validRelocations = hfd(validRelocations, validType); 00368 } 00369 <span class="comment">/* XXX FIXME multilib file actions need to be checked. */</span> 00370 <span class="keywordflow">return</span> <a class="code" href="group__header.html#a14">headerLink</a>(origH); 00371 } 00372 00373 <span class="preprocessor">#ifdef DYING</span> 00374 <span class="preprocessor"></span> h = <a class="code" href="group__header.html#a71">headerCopy</a>(origH); 00375 <span class="preprocessor">#else</span> 00376 <span class="preprocessor"></span> h = <a class="code" href="group__header.html#a14">headerLink</a>(origH); 00377 <span class="preprocessor">#endif</span> 00378 <span class="preprocessor"></span> 00379 relocations = <a class="code" href="system_8h.html#a36">alloca</a>(<span class="keyword">sizeof</span>(*relocations) * numRelocations); 00380 00381 <span class="comment">/* Build sorted relocation list from raw relocations. */</span> 00382 <span class="keywordflow">for</span> (i = 0; i < numRelocations; i++) { 00383 <span class="keywordtype">char</span> * t; 00384 00385 <span class="comment">/*</span> 00386 <span class="comment"> * Default relocations (oldPath == NULL) are handled in the UI,</span> 00387 <span class="comment"> * not rpmlib.</span> 00388 <span class="comment"> */</span> 00389 <span class="keywordflow">if</span> (rawRelocations[i].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> 00390 00391 <span class="comment">/* FIXME: Trailing /'s will confuse us greatly. Internal ones will </span> 00392 <span class="comment"> too, but those are more trouble to fix up. :-( */</span> 00393 t = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(rawRelocations[i].oldPath); 00394 relocations[i].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> = (t[0] == <span class="charliteral">'/'</span> && t[1] == <span class="charliteral">'\0'</span>) 00395 ? t 00396 : <a class="code" href="misc_8h.html#a2">stripTrailingChar</a>(t, <span class="charliteral">'/'</span>); 00397 00398 <span class="comment">/* An old path w/o a new path is valid, and indicates exclusion */</span> 00399 <span class="keywordflow">if</span> (rawRelocations[i].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a>) { 00400 <span class="keywordtype">int</span> del; 00401 00402 t = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(rawRelocations[i].newPath); 00403 relocations[i].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> = (t[0] == <span class="charliteral">'/'</span> && t[1] == <span class="charliteral">'\0'</span>) 00404 ? t 00405 : <a class="code" href="misc_8h.html#a2">stripTrailingChar</a>(t, <span class="charliteral">'/'</span>); 00406 00407 <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* FIX: relocations[i].oldPath == NULL */</span> 00408 <span class="comment">/* Verify that the relocation's old path is in the header. */</span> 00409 <span class="keywordflow">for</span> (j = 0; j < numValid; j++) 00410 <span class="keywordflow">if</span> (!strcmp(validRelocations[j], relocations[i].oldPath)) 00411 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00412 <span class="comment">/* XXX actions check prevents problem from being appended twice. */</span> 00413 <span class="keywordflow">if</span> (j == numValid && !allowBadRelocate && actions) 00414 <a class="code" href="transaction_8c.html#a9">psAppend</a>(probs, <a class="code" href="rpmlib_8h.html#a500a292">RPMPROB_BADRELOCATE</a>, alp, 00415 relocations[i].oldPath, NULL, NULL, 0); 00416 del = 00417 strlen(relocations[i].newPath) - strlen(relocations[i].oldPath); 00418 <span class="comment">/*@=nullpass@*/</span> 00419 00420 <span class="keywordflow">if</span> (del > reldel) 00421 reldel = del; 00422 } <span class="keywordflow">else</span> { 00423 relocations[i].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> = NULL; 00424 } 00425 } 00426 00427 <span class="comment">/* stupid bubble sort, but it's probably faster here */</span> 00428 <span class="keywordflow">for</span> (i = 0; i < numRelocations; i++) { 00429 <span class="keywordtype">int</span> madeSwap; 00430 madeSwap = 0; 00431 <span class="keywordflow">for</span> (j = 1; j < numRelocations; j++) { 00432 <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> tmpReloc; 00433 <span class="keywordflow">if</span> (relocations[j - 1].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL || <span class="comment">/* XXX can't happen */</span> 00434 relocations[j ].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL || <span class="comment">/* XXX can't happen */</span> 00435 strcmp(relocations[j - 1].oldPath, relocations[j].oldPath) <= 0) 00436 <span class="keywordflow">continue</span>; 00437 tmpReloc = relocations[j - 1]; 00438 relocations[j - 1] = relocations[j]; 00439 relocations[j] = tmpReloc; 00440 madeSwap = 1; 00441 } 00442 <span class="keywordflow">if</span> (!madeSwap) <span class="keywordflow">break</span>; 00443 } 00444 00445 <span class="keywordflow">if</span> (!_printed) { 00446 _printed = 1; 00447 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"========== relocations\n"</span>)); 00448 <span class="keywordflow">for</span> (i = 0; i < numRelocations; i++) { 00449 <span class="keywordflow">if</span> (relocations[i].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> 00450 <span class="keywordflow">if</span> (relocations[i].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> == NULL) 00451 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%5d exclude %s\n"</span>), 00452 i, relocations[i].oldPath); 00453 <span class="keywordflow">else</span> 00454 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%5d relocate %s -> %s\n"</span>), 00455 i, relocations[i].oldPath, relocations[i].newPath); 00456 } 00457 } 00458 00459 <span class="comment">/* Add relocation values to the header */</span> 00460 <span class="keywordflow">if</span> (numValid) { 00461 <span class="keyword">const</span> <span class="keywordtype">char</span> ** actualRelocations; 00462 <span class="keywordtype">int</span> numActual; 00463 00464 actualRelocations = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(numValid * <span class="keyword">sizeof</span>(*actualRelocations)); 00465 numActual = 0; 00466 <span class="keywordflow">for</span> (i = 0; i < numValid; i++) { 00467 <span class="keywordflow">for</span> (j = 0; j < numRelocations; j++) { 00468 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL || <span class="comment">/* XXX can't happen */</span> 00469 strcmp(validRelocations[i], relocations[j].oldPath)) 00470 <span class="keywordflow">continue</span>; 00471 <span class="comment">/* On install, a relocate to NULL means skip the path. */</span> 00472 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a>) { 00473 actualRelocations[numActual] = relocations[j].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a>; 00474 numActual++; 00475 } 00476 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00477 } 00478 <span class="keywordflow">if</span> (j == numRelocations) { 00479 actualRelocations[numActual] = validRelocations[i]; 00480 numActual++; 00481 } 00482 } 00483 00484 <span class="keywordflow">if</span> (numActual) 00485 (void) hae(h, <a class="code" href="rpmlib_8h.html#a494a203">RPMTAG_INSTPREFIXES</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, 00486 (<span class="keywordtype">void</span> **) actualRelocations, numActual); 00487 00488 actualRelocations = <a class="code" href="poptint_8h.html#a14">_free</a>(actualRelocations); 00489 validRelocations = hfd(validRelocations, validType); 00490 } 00491 00492 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL, (<span class="keywordtype">void</span> **) &baseNames, &fileCount); 00493 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &dirIndexes, NULL); 00494 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &dirNames, &dirCount); 00495 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, NULL, (<span class="keywordtype">void</span> **) &fFlags, NULL); 00496 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL, (<span class="keywordtype">void</span> **) &fModes, NULL); 00497 00498 skipDirList = <a class="code" href="system_8h.html#a36">alloca</a>(dirCount * <span class="keyword">sizeof</span>(*skipDirList)); 00499 memset(skipDirList, 0, dirCount * <span class="keyword">sizeof</span>(*skipDirList)); 00500 00501 newDirIndexes = <a class="code" href="system_8h.html#a36">alloca</a>(<span class="keyword">sizeof</span>(*newDirIndexes) * fileCount); 00502 memcpy(newDirIndexes, dirIndexes, <span class="keyword">sizeof</span>(*newDirIndexes) * fileCount); 00503 dirIndexes = newDirIndexes; 00504 00505 <span class="comment">/*</span> 00506 <span class="comment"> * For all relocations, we go through sorted file/relocation lists </span> 00507 <span class="comment"> * backwards so that /usr/local relocations take precedence over /usr </span> 00508 <span class="comment"> * ones.</span> 00509 <span class="comment"> */</span> 00510 00511 <span class="comment">/* Relocate individual paths. */</span> 00512 00513 <span class="keywordflow">for</span> (i = fileCount - 1; i >= 0; i--) { 00514 <a class="code" href="rpmlib_8h.html#a75">fileTypes</a> ft; 00515 <span class="keywordtype">int</span> fnlen; 00516 00517 <span class="comment">/*</span> 00518 <span class="comment"> * If only adding libraries of different arch into an already</span> 00519 <span class="comment"> * installed package, skip all other files.</span> 00520 <span class="comment"> */</span> 00521 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m21">multiLib</a> && !<a class="code" href="rpmlib_8h.html#a15">isFileMULTILIB</a>((fFlags[i]))) { 00522 <span class="keywordflow">if</span> (actions) { 00523 actions[i] = <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>; 00524 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"excluding multilib path %s%s\n"</span>), 00525 dirNames[dirIndexes[i]], baseNames[i]); 00526 } 00527 <span class="keywordflow">continue</span>; 00528 } 00529 00530 len = reldel + 00531 strlen(dirNames[dirIndexes[i]]) + strlen(baseNames[i]) + 1; 00532 <span class="keywordflow">if</span> (len >= fileAlloced) { 00533 fileAlloced = len * 2; 00534 fn = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fn, fileAlloced); 00535 } 00536 *fn = <span class="charliteral">'\0'</span>; 00537 fnlen = <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(fn, dirNames[dirIndexes[i]]), baseNames[i]) - fn; 00538 00539 <span class="comment">/*</span> 00540 <span class="comment"> * See if this file path needs relocating.</span> 00541 <span class="comment"> */</span> 00542 <span class="comment">/*</span> 00543 <span class="comment"> * XXX FIXME: Would a bsearch of the (already sorted) </span> 00544 <span class="comment"> * relocation list be a good idea?</span> 00545 <span class="comment"> */</span> 00546 <span class="keywordflow">for</span> (j = numRelocations - 1; j >= 0; j--) { 00547 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> 00548 len = strcmp(relocations[j].oldPath, <span class="stringliteral">"/"</span>) 00549 ? strlen(relocations[j].oldPath) 00550 : 0; 00551 00552 <span class="keywordflow">if</span> (fnlen < len) 00553 <span class="keywordflow">continue</span>; 00554 <span class="comment">/*</span> 00555 <span class="comment"> * Only subdirectories or complete file paths may be relocated. We</span> 00556 <span class="comment"> * don't check for '\0' as our directory names all end in '/'.</span> 00557 <span class="comment"> */</span> 00558 <span class="keywordflow">if</span> (!(fn[len] == <span class="charliteral">'/'</span> || fnlen == len)) 00559 <span class="keywordflow">continue</span>; 00560 00561 <span class="keywordflow">if</span> (strncmp(relocations[j].oldPath, fn, len)) 00562 <span class="keywordflow">continue</span>; 00563 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00564 } 00565 <span class="keywordflow">if</span> (j < 0) <span class="keywordflow">continue</span>; 00566 00567 ft = <a class="code" href="transaction_8c.html#a14">whatis</a>(fModes[i]); 00568 00569 <span class="comment">/* On install, a relocate to NULL means skip the path. */</span> 00570 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> == NULL) { 00571 <span class="keywordflow">if</span> (ft == <a class="code" href="rpmlib_8h.html#a502a315">XDIR</a>) { 00572 <span class="comment">/* Start with the parent, looking for directory to exclude. */</span> 00573 <span class="keywordflow">for</span> (j = dirIndexes[i]; j < dirCount; j++) { 00574 len = strlen(dirNames[j]) - 1; 00575 <span class="keywordflow">while</span> (len > 0 && dirNames[j][len-1] == <span class="charliteral">'/'</span>) len--; 00576 <span class="keywordflow">if</span> (fnlen != len) 00577 <span class="keywordflow">continue</span>; 00578 <span class="keywordflow">if</span> (strncmp(fn, dirNames[j], fnlen)) 00579 <span class="keywordflow">continue</span>; 00580 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00581 } 00582 <span class="keywordflow">if</span> (j < dirCount) 00583 skipDirList[j] = 1; 00584 } 00585 <span class="keywordflow">if</span> (actions) { 00586 actions[i] = <a class="code" href="rpmlib_8h.html#a501a310">FA_SKIPNSTATE</a>; 00587 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"excluding %s %s\n"</span>), 00588 <a class="code" href="transaction_8c.html#a13">ftstring</a>(ft), fn); 00589 } 00590 <span class="keywordflow">continue</span>; 00591 } 00592 00593 <span class="comment">/* Relocation on full paths only, please. */</span> 00594 <span class="keywordflow">if</span> (fnlen != len) <span class="keywordflow">continue</span>; 00595 00596 <span class="keywordflow">if</span> (actions) 00597 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"relocating %s to %s\n"</span>), 00598 fn, relocations[j].newPath); 00599 nrelocated++; 00600 00601 strcpy(fn, relocations[j].newPath); 00602 { <span class="keywordtype">char</span> * te = strrchr(fn, <span class="charliteral">'/'</span>); 00603 <span class="keywordflow">if</span> (te) { 00604 <span class="keywordflow">if</span> (te > fn) te++; <span class="comment">/* root is special */</span> 00605 fnlen = te - fn; 00606 } <span class="keywordflow">else</span> 00607 te = fn + strlen(fn); 00608 <span class="comment">/*@-nullpass -nullderef@*/</span> <span class="comment">/* LCL: te != NULL here. */</span> 00609 <span class="keywordflow">if</span> (strcmp(baseNames[i], te)) <span class="comment">/* basename changed too? */</span> 00610 baseNames[i] = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(te); 00611 *te = <span class="charliteral">'\0'</span>; <span class="comment">/* terminate new directory name */</span> 00612 <span class="comment">/*@=nullpass =nullderef@*/</span> 00613 } 00614 00615 <span class="comment">/* Does this directory already exist in the directory list? */</span> 00616 <span class="keywordflow">for</span> (j = 0; j < dirCount; j++) { 00617 <span class="keywordflow">if</span> (fnlen != strlen(dirNames[j])) 00618 <span class="keywordflow">continue</span>; 00619 <span class="keywordflow">if</span> (strncmp(fn, dirNames[j], fnlen)) 00620 <span class="keywordflow">continue</span>; 00621 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00622 } 00623 00624 <span class="keywordflow">if</span> (j < dirCount) { 00625 dirIndexes[i] = j; 00626 <span class="keywordflow">continue</span>; 00627 } 00628 00629 <span class="comment">/* Creating new paths is a pita */</span> 00630 <span class="keywordflow">if</span> (!haveRelocatedFile) { 00631 <span class="keyword">const</span> <span class="keywordtype">char</span> ** newDirList; 00632 00633 haveRelocatedFile = 1; 00634 newDirList = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>((dirCount + 1) * <span class="keyword">sizeof</span>(*newDirList)); 00635 <span class="keywordflow">for</span> (j = 0; j < dirCount; j++) 00636 newDirList[j] = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(dirNames[j]); 00637 dirNames = hfd(dirNames, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>); 00638 dirNames = newDirList; 00639 } <span class="keywordflow">else</span> { 00640 dirNames = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(dirNames, 00641 <span class="keyword">sizeof</span>(*dirNames) * (dirCount + 1)); 00642 } 00643 00644 dirNames[dirCount] = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(fn); 00645 dirIndexes[i] = dirCount; 00646 dirCount++; 00647 } 00648 00649 <span class="comment">/* Finish off by relocating directories. */</span> 00650 <span class="keywordflow">for</span> (i = dirCount - 1; i >= 0; i--) { 00651 <span class="keywordflow">for</span> (j = numRelocations - 1; j >= 0; j--) { 00652 00653 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> == NULL) <span class="keywordflow">continue</span>; <span class="comment">/* XXX can't happen */</span> 00654 len = strcmp(relocations[j].oldPath, <span class="stringliteral">"/"</span>) 00655 ? strlen(relocations[j].oldPath) 00656 : 0; 00657 00658 <span class="keywordflow">if</span> (len && strncmp(relocations[j].oldPath, dirNames[i], len)) 00659 <span class="keywordflow">continue</span>; 00660 00661 <span class="comment">/*</span> 00662 <span class="comment"> * Only subdirectories or complete file paths may be relocated. We</span> 00663 <span class="comment"> * don't check for '\0' as our directory names all end in '/'.</span> 00664 <span class="comment"> */</span> 00665 <span class="keywordflow">if</span> (dirNames[i][len] != <span class="charliteral">'/'</span>) 00666 <span class="keywordflow">continue</span>; 00667 00668 <span class="keywordflow">if</span> (relocations[j].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a>) { <span class="comment">/* Relocate the path */</span> 00669 <span class="keyword">const</span> <span class="keywordtype">char</span> * s = relocations[j].<a class="code" href="structrpmRelocation__s.html#m1">newPath</a>; 00670 <span class="keywordtype">char</span> * t = <a class="code" href="system_8h.html#a36">alloca</a>(strlen(s) + strlen(dirNames[i]) - len + 1); 00671 00672 (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(t, s) , dirNames[i] + len); 00673 <span class="keywordflow">if</span> (actions) 00674 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, 00675 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"relocating directory %s to %s\n"</span>), dirNames[i], t); 00676 dirNames[i] = t; 00677 nrelocated++; 00678 } 00679 } 00680 } 00681 00682 <span class="comment">/* Save original filenames in header and replace (relocated) filenames. */</span> 00683 <span class="keywordflow">if</span> (nrelocated) { 00684 <span class="keywordtype">int</span> c; 00685 <span class="keywordtype">void</span> * p; 00686 <a class="code" href="group__header.html#a13">rpmTagType</a> t; 00687 00688 p = NULL; 00689 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, &t, &p, &c); 00690 (void) hae(h, <a class="code" href="rpmlib_8h.html#a494a224">RPMTAG_ORIGBASENAMES</a>, t, p, c); 00691 p = hfd(p, t); 00692 00693 p = NULL; 00694 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, &t, &p, &c); 00695 (void) hae(h, <a class="code" href="rpmlib_8h.html#a494a225">RPMTAG_ORIGDIRNAMES</a>, t, p, c); 00696 p = hfd(p, t); 00697 00698 p = NULL; 00699 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, &t, &p, &c); 00700 (void) hae(h, <a class="code" href="rpmlib_8h.html#a494a223">RPMTAG_ORIGDIRINDEXES</a>, t, p, c); 00701 p = hfd(p, t); 00702 00703 (void) hme(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, 00704 baseNames, fileCount); 00705 fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>); 00706 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL, (<span class="keywordtype">void</span> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 00707 00708 (void) hme(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, 00709 dirNames, dirCount); 00710 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>); 00711 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>); 00712 00713 (void) hme(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, 00714 dirIndexes, fileCount); 00715 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, NULL); 00716 } 00717 00718 baseNames = hfd(baseNames, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>); 00719 dirNames = hfd(dirNames, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>); 00720 fn = <a class="code" href="poptint_8h.html#a14">_free</a>(fn); 00721 00722 <span class="keywordflow">return</span> h; 00723 } 00724 00725 <span class="comment">/*</span> 00726 <span class="comment"> * As the problem sets are generated in an order solely dependent</span> 00727 <span class="comment"> * on the ordering of the packages in the transaction, and that</span> 00728 <span class="comment"> * ordering can't be changed, the problem sets must be parallel to</span> 00729 <span class="comment"> * one another. Additionally, the filter set must be a subset of the</span> 00730 <span class="comment"> * target set, given the operations available on transaction set.</span> 00731 <span class="comment"> * This is good, as it lets us perform this trim in linear time, rather</span> 00732 <span class="comment"> * then logarithmic or quadratic.</span> 00733 <span class="comment"> */</span> <a name="l00734"></a><a class="code" href="transaction_8c.html#a16">00734</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a16">psTrim</a>(<a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> filter, <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> target) 00735 <span class="comment">/*@modifies target @*/</span> 00736 { 00737 <a class="code" href="structrpmProblem__s.html">rpmProblem</a> f = filter-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>; 00738 <a class="code" href="structrpmProblem__s.html">rpmProblem</a> t = target-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>; 00739 <span class="keywordtype">int</span> gotProblems = 0; 00740 00741 <span class="keywordflow">while</span> ((f - filter-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) < filter-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>) { 00742 <span class="keywordflow">if</span> (!f-><a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a>) { 00743 f++; 00744 <span class="keywordflow">continue</span>; 00745 } 00746 <span class="keywordflow">while</span> ((t - target-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) < target-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>) { 00747 <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* LCL: looks good to me */</span> 00748 <span class="keywordflow">if</span> (f-><a class="code" href="structrpmProblem__s.html#m3">h</a> == t-><a class="code" href="structrpmProblem__s.html#m3">h</a> && f-><a class="code" href="structrpmProblem__s.html#m4">type</a> == t-><a class="code" href="structrpmProblem__s.html#m4">type</a> && t-><a class="code" href="structrpmProblem__s.html#m2">key</a> == f-><a class="code" href="structrpmProblem__s.html#m2">key</a> && 00749 <a class="code" href="transaction_8c.html#a2">XSTRCMP</a>(f-><a class="code" href="structrpmProblem__s.html#m6">str1</a>, t-><a class="code" href="structrpmProblem__s.html#m6">str1</a>)) 00750 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00751 <span class="comment">/*@=nullpass@*/</span> 00752 t++; 00753 gotProblems = 1; 00754 } 00755 00756 <span class="keywordflow">if</span> ((t - target-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) == target-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>) { 00757 <span class="comment">/* this can't happen ;-) lets be sane if it doesn though */</span> 00758 <span class="keywordflow">break</span>; 00759 } 00760 00761 t-><a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a> = f-><a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a>; 00762 t++, f++; 00763 } 00764 00765 <span class="keywordflow">if</span> ((t - target-><a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) < target-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>) 00766 gotProblems = 1; 00767 00768 <span class="keywordflow">return</span> gotProblems; 00769 } 00770 <a name="l00771"></a><a class="code" href="transaction_8c.html#a17">00771</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a17">sharedCmp</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * one, <span class="keyword">const</span> <span class="keywordtype">void</span> * two) 00772 <span class="comment">/*@*/</span> 00773 { 00774 <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * a = one; 00775 <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * b = two; 00776 00777 <span class="keywordflow">if</span> (a-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> < b-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 00778 <span class="keywordflow">return</span> -1; 00779 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (a-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> > b-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 00780 <span class="keywordflow">return</span> 1; 00781 00782 <span class="keywordflow">return</span> 0; 00783 } 00784 <a name="l00785"></a><a class="code" href="transaction_8c.html#a18">00785</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a74">fileAction</a> <a class="code" href="transaction_8c.html#a18">decideFileFate</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * dirName, 00786 <span class="keyword">const</span> <span class="keywordtype">char</span> * baseName, <span class="keywordtype">short</span> dbMode, 00787 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbMd5, <span class="keyword">const</span> <span class="keywordtype">char</span> * dbLink, <span class="keywordtype">short</span> newMode, 00788 <span class="keyword">const</span> <span class="keywordtype">char</span> * newMd5, <span class="keyword">const</span> <span class="keywordtype">char</span> * newLink, <span class="keywordtype">int</span> newFlags, 00789 <a class="code" href="group__rpmtrans.html#a3">rpmtransFlags</a> transFlags) 00790 <span class="comment">/*@*/</span> 00791 { 00792 <span class="keywordtype">char</span> buffer[1024]; 00793 <span class="keyword">const</span> <span class="keywordtype">char</span> * dbAttr, * newAttr; 00794 <a class="code" href="rpmlib_8h.html#a75">fileTypes</a> dbWhat, newWhat, diskWhat; 00795 <span class="keyword">struct </span>stat sb; 00796 <span class="keywordtype">int</span> i, rc; 00797 <span class="keywordtype">int</span> save = (newFlags & <a class="code" href="rpmlib_8h.html#a496a247">RPMFILE_NOREPLACE</a>) ? <a class="code" href="rpmlib_8h.html#a501a308">FA_ALTNAME</a> : <a class="code" href="rpmlib_8h.html#a501a306">FA_SAVE</a>; 00798 <span class="keywordtype">char</span> * filespec = <a class="code" href="system_8h.html#a36">alloca</a>(strlen(dirName) + strlen(baseName) + 1); 00799 00800 (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(filespec, dirName), baseName); 00801 00802 <span class="keywordflow">if</span> (lstat(filespec, &sb)) { 00803 <span class="comment">/*</span> 00804 <span class="comment"> * The file doesn't exist on the disk. Create it unless the new</span> 00805 <span class="comment"> * package has marked it as missingok, or allfiles is requested.</span> 00806 <span class="comment"> */</span> 00807 <span class="keywordflow">if</span> (!(transFlags & <a class="code" href="group__rpmtrans.html#a19a327">RPMTRANS_FLAG_ALLFILES</a>) && 00808 (newFlags & <a class="code" href="rpmlib_8h.html#a496a246">RPMFILE_MISSINGOK</a>)) { 00809 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s skipped due to missingok flag\n"</span>), 00810 filespec); 00811 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 00812 } <span class="keywordflow">else</span> { 00813 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00814 } 00815 } 00816 00817 diskWhat = <a class="code" href="transaction_8c.html#a14">whatis</a>(sb.st_mode); 00818 dbWhat = <a class="code" href="transaction_8c.html#a14">whatis</a>(dbMode); 00819 newWhat = <a class="code" href="transaction_8c.html#a14">whatis</a>(newMode); 00820 00821 <span class="comment">/* RPM >= 2.3.10 shouldn't create config directories -- we'll ignore</span> 00822 <span class="comment"> them in older packages as well */</span> 00823 <span class="keywordflow">if</span> (newWhat == <a class="code" href="rpmlib_8h.html#a502a315">XDIR</a>) { 00824 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00825 } 00826 00827 <span class="keywordflow">if</span> (diskWhat != newWhat) { 00828 <span class="keywordflow">return</span> save; 00829 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (newWhat != dbWhat && diskWhat != dbWhat) { 00830 <span class="keywordflow">return</span> save; 00831 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dbWhat != newWhat) { 00832 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00833 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (dbWhat != <a class="code" href="rpmlib_8h.html#a502a318">LINK</a> && dbWhat != <a class="code" href="rpmlib_8h.html#a502a317">REG</a>) { 00834 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00835 } 00836 00837 <span class="keywordflow">if</span> (dbWhat == <a class="code" href="rpmlib_8h.html#a502a317">REG</a>) { 00838 rc = <a class="code" href="lib_2misc_8c.html#a22">domd5</a>(filespec, buffer, 1); 00839 <span class="keywordflow">if</span> (rc) { 00840 <span class="comment">/* assume the file has been removed, don't freak */</span> 00841 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00842 } 00843 dbAttr = dbMd5; 00844 newAttr = newMd5; 00845 } <span class="keywordflow">else</span> <span class="comment">/* dbWhat == LINK */</span> { 00846 memset(buffer, 0, <span class="keyword">sizeof</span>(buffer)); 00847 i = readlink(filespec, buffer, <span class="keyword">sizeof</span>(buffer) - 1); 00848 <span class="keywordflow">if</span> (i == -1) { 00849 <span class="comment">/* assume the file has been removed, don't freak */</span> 00850 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00851 } 00852 dbAttr = dbLink; 00853 newAttr = newLink; 00854 } 00855 00856 <span class="comment">/* this order matters - we'd prefer to CREATE the file if at all</span> 00857 <span class="comment"> possible in case something else (like the timestamp) has changed */</span> 00858 00859 <span class="keywordflow">if</span> (!strcmp(dbAttr, buffer)) { 00860 <span class="comment">/* this config file has never been modified, so just replace it */</span> 00861 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 00862 } 00863 00864 <span class="keywordflow">if</span> (!strcmp(dbAttr, newAttr)) { 00865 <span class="comment">/* this file is the same in all versions of this package */</span> 00866 <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 00867 } 00868 00869 <span class="comment">/*</span> 00870 <span class="comment"> * The config file on the disk has been modified, but</span> 00871 <span class="comment"> * the ones in the two packages are different. It would</span> 00872 <span class="comment"> * be nice if RPM was smart enough to at least try and</span> 00873 <span class="comment"> * merge the difference ala CVS, but...</span> 00874 <span class="comment"> */</span> 00875 <span class="keywordflow">return</span> save; 00876 } 00877 <a name="l00878"></a><a class="code" href="transaction_8c.html#a19">00878</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a19">filecmp</a>(<span class="keywordtype">short</span> mode1, <span class="keyword">const</span> <span class="keywordtype">char</span> * md51, <span class="keyword">const</span> <span class="keywordtype">char</span> * link1, 00879 <span class="keywordtype">short</span> mode2, <span class="keyword">const</span> <span class="keywordtype">char</span> * md52, <span class="keyword">const</span> <span class="keywordtype">char</span> * link2) 00880 <span class="comment">/*@*/</span> 00881 { 00882 <a class="code" href="rpmlib_8h.html#a75">fileTypes</a> what1 = <a class="code" href="transaction_8c.html#a14">whatis</a>(mode1); 00883 <a class="code" href="rpmlib_8h.html#a75">fileTypes</a> what2 = <a class="code" href="transaction_8c.html#a14">whatis</a>(mode2); 00884 00885 <span class="keywordflow">if</span> (what1 != what2) <span class="keywordflow">return</span> 1; 00886 00887 <span class="keywordflow">if</span> (what1 == <a class="code" href="rpmlib_8h.html#a502a318">LINK</a>) 00888 <span class="keywordflow">return</span> strcmp(link1, link2); 00889 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (what1 == <a class="code" href="rpmlib_8h.html#a502a317">REG</a>) 00890 <span class="keywordflow">return</span> strcmp(md51, md52); 00891 00892 <span class="keywordflow">return</span> 0; 00893 } 00894 <a name="l00895"></a><a class="code" href="transaction_8c.html#a20">00895</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a20">handleInstInstalledFiles</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, <span class="comment">/*@null@*/</span> <a class="code" href="structrpmdb__s.html">rpmdb</a> db, 00896 <span class="keyword">struct</span> <a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * shared, 00897 <span class="keywordtype">int</span> sharedCount, <span class="keywordtype">int</span> reportConflicts, 00898 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs, 00899 <a class="code" href="group__rpmtrans.html#a3">rpmtransFlags</a> transFlags) 00900 <span class="comment">/*@modifies fi, db, probs @*/</span> 00901 { 00902 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 00903 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData); 00904 <a class="code" href="group__header.html#a13">rpmTagType</a> oltype, omtype; 00905 <a class="code" href="structheaderToken.html">Header</a> h; 00906 <span class="keywordtype">int</span> i; 00907 <span class="keyword">const</span> <span class="keywordtype">char</span> ** otherMd5s; 00908 <span class="keyword">const</span> <span class="keywordtype">char</span> ** otherLinks; 00909 <span class="keyword">const</span> <span class="keywordtype">char</span> * otherStates; 00910 <a class="code" href="header_8h.html#a12">uint_32</a> * otherFlags; 00911 <a class="code" href="header_8h.html#a12">uint_32</a> * otherSizes; 00912 <a class="code" href="header_8h.html#a13">uint_16</a> * otherModes; 00913 <span class="keywordtype">int</span> numReplaced = 0; 00914 00915 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 00916 00917 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, &shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>, <span class="keyword">sizeof</span>(shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>)); 00918 h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi); 00919 <span class="keywordflow">if</span> (h == NULL) { 00920 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 00921 <span class="keywordflow">return</span> 1; 00922 } 00923 00924 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a148">RPMTAG_FILEMD5S</a>, &omtype, (<span class="keywordtype">void</span> **) &otherMd5s, NULL); 00925 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>, &oltype, (<span class="keywordtype">void</span> **) &otherLinks, NULL); 00926 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, NULL, (<span class="keywordtype">void</span> **) &otherStates, NULL); 00927 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL, (<span class="keywordtype">void</span> **) &otherModes, NULL); 00928 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, NULL, (<span class="keywordtype">void</span> **) &otherFlags, NULL); 00929 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, NULL, (<span class="keywordtype">void</span> **) &otherSizes, NULL); 00930 00931 fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(sharedCount * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>)); 00932 00933 <span class="keywordflow">for</span> (i = 0; i < sharedCount; i++, shared++) { 00934 <span class="keywordtype">int</span> otherFileNum, fileNum; 00935 otherFileNum = shared-><a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>; 00936 fileNum = shared-><a class="code" href="structsharedFileInfo.html#m0">pkgFileNum</a>; 00937 00938 <span class="comment">/* XXX another tedious segfault, assume file state normal. */</span> 00939 <span class="keywordflow">if</span> (otherStates && otherStates[otherFileNum] != <a class="code" href="rpmlib_8h.html#a495a238">RPMFILE_STATE_NORMAL</a>) 00940 <span class="keywordflow">continue</span>; 00941 00942 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[fileNum])) 00943 <span class="keywordflow">continue</span>; 00944 00945 <span class="keywordflow">if</span> (<a class="code" href="transaction_8c.html#a19">filecmp</a>(otherModes[otherFileNum], 00946 otherMd5s[otherFileNum], 00947 otherLinks[otherFileNum], 00948 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[fileNum], 00949 fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[fileNum], 00950 fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>[fileNum])) { 00951 <span class="keywordflow">if</span> (reportConflicts) 00952 <a class="code" href="transaction_8c.html#a9">psAppend</a>(probs, <a class="code" href="rpmlib_8h.html#a500a296">RPMPROB_FILE_CONFLICT</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, 00953 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[fileNum]], fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[fileNum], h, 0); 00954 <span class="keywordflow">if</span> (!(otherFlags[otherFileNum] | fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum]) 00955 & <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) { 00956 <span class="comment">/*@-assignexpose@*/</span> 00957 <span class="keywordflow">if</span> (!shared-><a class="code" href="structsharedFileInfo.html#m3">isRemoved</a>) 00958 fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>[numReplaced++] = *shared; 00959 <span class="comment">/*@=assignexpose@*/</span> 00960 } 00961 } 00962 00963 <span class="keywordflow">if</span> ((otherFlags[otherFileNum] | fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum]) & <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) { 00964 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[fileNum] = <a class="code" href="transaction_8c.html#a18">decideFileFate</a>( 00965 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[fileNum]], 00966 fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[fileNum], 00967 otherModes[otherFileNum], 00968 otherMd5s[otherFileNum], 00969 otherLinks[otherFileNum], 00970 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[fileNum], 00971 fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[fileNum], 00972 fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>[fileNum], 00973 fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum], 00974 transFlags); 00975 } 00976 00977 fi-><a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>[fileNum] = otherSizes[otherFileNum]; 00978 } 00979 00980 otherMd5s = hfd(otherMd5s, omtype); 00981 otherLinks = hfd(otherLinks, oltype); 00982 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 00983 00984 fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>, <span class="comment">/* XXX memory leak */</span> 00985 <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>) * (numReplaced + 1)); 00986 fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>[numReplaced].<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> = 0; 00987 00988 <span class="keywordflow">return</span> 0; 00989 } 00990 <a name="l00991"></a><a class="code" href="transaction_8c.html#a21">00991</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a21">handleRmvdInstalledFiles</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, <span class="comment">/*@null@*/</span> <a class="code" href="structrpmdb__s.html">rpmdb</a> db, 00992 <span class="keyword">struct</span> <a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * shared, 00993 <span class="keywordtype">int</span> sharedCount) 00994 <span class="comment">/*@modifies fi, db @*/</span> 00995 { 00996 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 00997 <a class="code" href="structheaderToken.html">Header</a> h; 00998 <span class="keyword">const</span> <span class="keywordtype">char</span> * otherStates; 00999 <span class="keywordtype">int</span> i; 01000 01001 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 01002 01003 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, 01004 &shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>, <span class="keyword">sizeof</span>(shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>)); 01005 h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi); 01006 <span class="keywordflow">if</span> (h == NULL) { 01007 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01008 <span class="keywordflow">return</span> 1; 01009 } 01010 01011 (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, NULL, (<span class="keywordtype">void</span> **) &otherStates, NULL); 01012 01013 <span class="keywordflow">for</span> (i = 0; i < sharedCount; i++, shared++) { 01014 <span class="keywordtype">int</span> otherFileNum, fileNum; 01015 otherFileNum = shared-><a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>; 01016 fileNum = shared-><a class="code" href="structsharedFileInfo.html#m0">pkgFileNum</a>; 01017 01018 <span class="keywordflow">if</span> (otherStates[otherFileNum] != <a class="code" href="rpmlib_8h.html#a495a238">RPMFILE_STATE_NORMAL</a>) 01019 <span class="keywordflow">continue</span>; 01020 01021 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[fileNum] = <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 01022 } 01023 01024 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01025 01026 <span class="keywordflow">return</span> 0; 01027 } 01028 <a name="l01032"></a><a class="code" href="transaction_8c.html#a22">01032</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="transaction_8c.html#a22">handleOverlappedFiles</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, <a class="code" href="structhash__table.html">hashTable</a> ht, 01033 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs, <span class="keyword">struct</span> <a class="code" href="structdiskspaceInfo.html">diskspaceInfo</a> * dsl) 01034 <span class="comment">/*@modifies fi, probs, dsl @*/</span> 01035 { 01036 <span class="keywordtype">int</span> i, j; 01037 <span class="keyword">struct </span><a class="code" href="structdiskspaceInfo.html">diskspaceInfo</a> * ds = NULL; 01038 <a class="code" href="header_8h.html#a12">uint_32</a> fixupSize = 0; 01039 <span class="keywordtype">char</span> * filespec = NULL; 01040 <span class="keywordtype">int</span> fileSpecAlloced = 0; 01041 01042 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01043 <span class="keywordtype">int</span> otherPkgNum, otherFileNum; 01044 <span class="keyword">const</span> <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> * recs; 01045 <span class="keywordtype">int</span> numRecs; 01046 01047 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i])) 01048 <span class="keywordflow">continue</span>; 01049 01050 j = strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]) + strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) + 1; 01051 <span class="keywordflow">if</span> (j > fileSpecAlloced) { 01052 fileSpecAlloced = j * 2; 01053 filespec = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(filespec, fileSpecAlloced); 01054 } 01055 01056 (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>( filespec, fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]), fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]); 01057 01058 <span class="keywordflow">if</span> (dsl) { 01059 ds = dsl; 01060 <span class="keywordflow">while</span> (ds-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a> && ds-><a class="code" href="structdiskspaceInfo.html#m0">dev</a> != fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i].<a class="code" href="structfingerPrint__s.html#m0">entry</a>-><a class="code" href="structfprintCacheEntry__s.html#m1">dev</a>) ds++; 01061 <span class="keywordflow">if</span> (!ds-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a>) ds = NULL; 01062 fixupSize = 0; 01063 } 01064 01065 <span class="comment">/*</span> 01066 <span class="comment"> * Retrieve all records that apply to this file. Note that the</span> 01067 <span class="comment"> * file info records were built in the same order as the packages</span> 01068 <span class="comment"> * will be installed and removed so the records for an overlapped</span> 01069 <span class="comment"> * files will be sorted in exactly the same order.</span> 01070 <span class="comment"> */</span> 01071 (void) <a class="code" href="rpmhash_8c.html#a9">htGetEntry</a>(ht, &fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i], (<span class="keyword">const</span> <span class="keywordtype">void</span> ***) &recs, &numRecs, NULL); 01072 01073 <span class="comment">/*</span> 01074 <span class="comment"> * If this package is being added, look only at other packages</span> 01075 <span class="comment"> * being added -- removed packages dance to a different tune.</span> 01076 <span class="comment"> * If both this and the other package are being added, overlapped</span> 01077 <span class="comment"> * files must be identical (or marked as a conflict). The</span> 01078 <span class="comment"> * disposition of already installed config files leads to</span> 01079 <span class="comment"> * a small amount of extra complexity.</span> 01080 <span class="comment"> *</span> 01081 <span class="comment"> * If this package is being removed, then there are two cases that</span> 01082 <span class="comment"> * need to be worried about:</span> 01083 <span class="comment"> * If the other package is being added, then skip any overlapped files</span> 01084 <span class="comment"> * so that this package removal doesn't nuke the overlapped files</span> 01085 <span class="comment"> * that were just installed.</span> 01086 <span class="comment"> * If both this and the other package are being removed, then each</span> 01087 <span class="comment"> * file removal from preceding packages needs to be skipped so that</span> 01088 <span class="comment"> * the file removal occurs only on the last occurence of an overlapped</span> 01089 <span class="comment"> * file in the transaction set.</span> 01090 <span class="comment"> *</span> 01091 <span class="comment"> */</span> 01092 01093 <span class="comment">/* Locate this overlapped file in the set of added/removed packages. */</span> 01094 <span class="keywordflow">for</span> (j = 0; j < numRecs && recs[j] != fi; j++) 01095 {}; 01096 01097 <span class="comment">/* Find what the previous disposition of this file was. */</span> 01098 otherFileNum = -1; <span class="comment">/* keep gcc quiet */</span> 01099 <span class="keywordflow">for</span> (otherPkgNum = j - 1; otherPkgNum >= 0; otherPkgNum--) { 01100 <span class="comment">/* Added packages need only look at other added packages. */</span> 01101 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED && recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> != TR_ADDED) 01102 <span class="keywordflow">continue</span>; 01103 01104 <span class="comment">/* TESTME: there are more efficient searches in the world... */</span> 01105 <span class="keywordflow">for</span> (otherFileNum = 0; otherFileNum < recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; 01106 otherFileNum++) { 01107 01108 <span class="comment">/* If the addresses are the same, so are the values. */</span> 01109 <span class="keywordflow">if</span> ((fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> + i) == (recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> + otherFileNum)) 01110 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01111 01112 <span class="comment">/* Otherwise, compare fingerprints by value. */</span> 01113 <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* LCL: looks good to me */</span> 01114 <span class="keywordflow">if</span> (<a class="code" href="fprint_8h.html#a2">FP_EQUAL</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i], recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[otherFileNum])) 01115 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01116 <span class="comment">/*@=nullpass@*/</span> 01117 01118 } 01119 <span class="comment">/* XXX is this test still necessary? */</span> 01120 <span class="keywordflow">if</span> (recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[otherFileNum] != <a class="code" href="rpmlib_8h.html#a501a301">FA_UNKNOWN</a>) 01121 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01122 } 01123 01124 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 01125 <span class="keywordflow">case</span> TR_ADDED: 01126 { <span class="keyword">struct </span>stat sb; 01127 <span class="keywordflow">if</span> (otherPkgNum < 0) { 01128 <span class="comment">/* XXX is this test still necessary? */</span> 01129 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] != <a class="code" href="rpmlib_8h.html#a501a301">FA_UNKNOWN</a>) 01130 <span class="keywordflow">break</span>; 01131 <span class="keywordflow">if</span> ((fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) && 01132 !lstat(filespec, &sb)) { 01133 <span class="comment">/* Here is a non-overlapped pre-existing config file. */</span> 01134 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = (fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a247">RPMFILE_NOREPLACE</a>) 01135 ? <a class="code" href="rpmlib_8h.html#a501a308">FA_ALTNAME</a> : <a class="code" href="rpmlib_8h.html#a501a305">FA_BACKUP</a>; 01136 } <span class="keywordflow">else</span> { 01137 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 01138 } 01139 <span class="keywordflow">break</span>; 01140 } 01141 01142 <span class="comment">/* Mark added overlapped non-identical files as a conflict. */</span> 01143 <span class="keywordflow">if</span> (probs && <a class="code" href="transaction_8c.html#a19">filecmp</a>(recs[otherPkgNum]->fmodes[otherFileNum], 01144 recs[otherPkgNum]->fmd5s[otherFileNum], 01145 recs[otherPkgNum]->flinks[otherFileNum], 01146 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i], 01147 fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[i], 01148 fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>[i])) { 01149 <a class="code" href="transaction_8c.html#a9">psAppend</a>(probs, <a class="code" href="rpmlib_8h.html#a500a295">RPMPROB_NEW_FILE_CONFLICT</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, 01150 filespec, NULL, recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-><a class="code" href="structavailablePackage.html#m0">h</a>, 0); 01151 } 01152 01153 <span class="comment">/* Try to get the disk accounting correct even if a conflict. */</span> 01154 fixupSize = recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>[otherFileNum]; 01155 01156 <span class="keywordflow">if</span> ((fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) && !lstat(filespec, &sb)) { 01157 <span class="comment">/* Here is an overlapped pre-existing config file. */</span> 01158 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = (fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a247">RPMFILE_NOREPLACE</a>) 01159 ? <a class="code" href="rpmlib_8h.html#a501a308">FA_ALTNAME</a> : <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 01160 } <span class="keywordflow">else</span> { 01161 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>; 01162 } 01163 } <span class="keywordflow">break</span>; 01164 <span class="keywordflow">case</span> TR_REMOVED: 01165 <span class="keywordflow">if</span> (otherPkgNum >= 0) { 01166 <span class="comment">/* Here is an overlapped added file we don't want to nuke. */</span> 01167 <span class="keywordflow">if</span> (recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[otherFileNum] != <a class="code" href="rpmlib_8h.html#a501a309">FA_ERASE</a>) { 01168 <span class="comment">/* On updates, don't remove files. */</span> 01169 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 01170 <span class="keywordflow">break</span>; 01171 } 01172 <span class="comment">/* Here is an overlapped removed file: skip in previous. */</span> 01173 recs[otherPkgNum]-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[otherFileNum] = <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>; 01174 } 01175 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i])) 01176 <span class="keywordflow">break</span>; 01177 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> && fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>[i] != <a class="code" href="rpmlib_8h.html#a495a238">RPMFILE_STATE_NORMAL</a>) 01178 <span class="keywordflow">break</span>; 01179 <span class="keywordflow">if</span> (!(S_ISREG(fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i]) && (fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>))) { 01180 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a309">FA_ERASE</a>; 01181 <span class="keywordflow">break</span>; 01182 } 01183 01184 <span class="comment">/* Here is a pre-existing modified config file that needs saving. */</span> 01185 { <span class="keywordtype">char</span> mdsum[50]; 01186 <span class="keywordflow">if</span> (!<a class="code" href="rpmmodule_8c.html#a12">mdfile</a>(filespec, mdsum) && strcmp(fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[i], mdsum)) { 01187 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a305">FA_BACKUP</a>; 01188 <span class="keywordflow">break</span>; 01189 } 01190 } 01191 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a309">FA_ERASE</a>; 01192 <span class="keywordflow">break</span>; 01193 } 01194 01195 <span class="keywordflow">if</span> (ds) { 01196 <a class="code" href="header_8h.html#a12">uint_32</a> s = <a class="code" href="transaction_8c.html#a1">BLOCK_ROUND</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>[i], ds-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a>); 01197 01198 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i]) { 01199 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a501a305">FA_BACKUP</a>: 01200 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a501a306">FA_SAVE</a>: 01201 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a501a308">FA_ALTNAME</a>: 01202 ds-><a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>++; 01203 ds-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> += s; 01204 <span class="keywordflow">break</span>; 01205 01206 <span class="comment">/*</span> 01207 <span class="comment"> * FIXME: If two packages share a file (same md5sum), and</span> 01208 <span class="comment"> * that file is being replaced on disk, will ds->bneeded get</span> 01209 <span class="comment"> * decremented twice? Quite probably!</span> 01210 <span class="comment"> */</span> 01211 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>: 01212 ds-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> += s; 01213 ds-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> -= <a class="code" href="transaction_8c.html#a1">BLOCK_ROUND</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>[i], ds-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a>); 01214 <span class="keywordflow">break</span>; 01215 01216 <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a501a309">FA_ERASE</a>: 01217 ds-><a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>--; 01218 ds-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> -= s; 01219 <span class="keywordflow">break</span>; 01220 01221 <span class="keywordflow">default</span>: 01222 <span class="keywordflow">break</span>; 01223 } 01224 01225 ds-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> -= <a class="code" href="transaction_8c.html#a1">BLOCK_ROUND</a>(fixupSize, ds-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a>); 01226 } 01227 } 01228 <span class="keywordflow">if</span> (filespec) free(filespec); 01229 } 01230 <a name="l01231"></a><a class="code" href="transaction_8c.html#a23">01231</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a23">ensureOlder</a>(<span class="keyword">struct</span> <a class="code" href="structavailablePackage.html">availablePackage</a> * alp, <a class="code" href="structheaderToken.html">Header</a> old, 01232 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs) 01233 <span class="comment">/*@modifies alp, probs @*/</span> 01234 { 01235 <span class="keywordtype">int</span> result, rc = 0; 01236 01237 <span class="keywordflow">if</span> (old == NULL) <span class="keywordflow">return</span> 1; 01238 01239 result = <a class="code" href="psm_8c.html#a2">rpmVersionCompare</a>(old, alp-><a class="code" href="structavailablePackage.html#m0">h</a>); 01240 <span class="keywordflow">if</span> (result <= 0) 01241 rc = 0; 01242 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result > 0) { 01243 rc = 1; 01244 <a class="code" href="transaction_8c.html#a9">psAppend</a>(probs, <a class="code" href="rpmlib_8h.html#a500a297">RPMPROB_OLDPACKAGE</a>, alp, NULL, NULL, old, 0); 01245 } 01246 01247 <span class="keywordflow">return</span> rc; 01248 } 01249 <a name="l01250"></a><a class="code" href="transaction_8c.html#a24">01250</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="transaction_8c.html#a24">skipFiles</a>(<span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi) 01251 <span class="comment">/*@globals rpmGlobalMacroContext @*/</span> 01252 <span class="comment">/*@modifies fi, rpmGlobalMacroContext @*/</span> 01253 { 01254 <span class="keywordtype">int</span> noDocs = (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a326">RPMTRANS_FLAG_NODOCS</a>); 01255 <span class="keywordtype">char</span> ** netsharedPaths = NULL; 01256 <span class="keyword">const</span> <span class="keywordtype">char</span> ** languages; 01257 <span class="keyword">const</span> <span class="keywordtype">char</span> * dn, * bn; 01258 <span class="keywordtype">int</span> dnlen, bnlen, ix; 01259 <span class="keyword">const</span> <span class="keywordtype">char</span> * s; 01260 <span class="keywordtype">int</span> * drc; 01261 <span class="keywordtype">char</span> * dff; 01262 <span class="keywordtype">int</span> i, j; 01263 01264 <span class="keywordflow">if</span> (!noDocs) 01265 noDocs = <a class="code" href="macro_8c.html#a51">rpmExpandNumeric</a>(<span class="stringliteral">"%{_excludedocs}"</span>); 01266 01267 { <span class="keyword">const</span> <span class="keywordtype">char</span> *tmpPath = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_netsharedpath}"</span>, NULL); 01268 <span class="keywordflow">if</span> (tmpPath && *tmpPath != <span class="charliteral">'%'</span>) 01269 netsharedPaths = <a class="code" href="lib_2misc_8c.html#a3">splitString</a>(tmpPath, strlen(tmpPath), <span class="charliteral">':'</span>); 01270 tmpPath = <a class="code" href="poptint_8h.html#a14">_free</a>(tmpPath); 01271 } 01272 01273 { 01274 <span class="keywordtype">char</span> *tmp; 01275 01276 tmp = <a class="code" href="system_8h.html#a34">getenv</a>(<span class="stringliteral">"RPM_INSTALL_LANG"</span>); 01277 <span class="keywordflow">if</span> (tmp && *tmp) { 01278 s = malloc(strlen(tmp)+1); 01279 strcpy(s, tmp); 01280 } <span class="keywordflow">else</span> { 01281 s = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_install_langs}"</span>, NULL); 01282 } 01283 } 01284 <span class="keywordflow">if</span> (!(s && *s != <span class="charliteral">'%'</span>)) 01285 s = <a class="code" href="poptint_8h.html#a14">_free</a>(s); 01286 <span class="keywordflow">if</span> (s) { 01287 languages = (<span class="keyword">const</span> <span class="keywordtype">char</span> **) <a class="code" href="lib_2misc_8c.html#a3">splitString</a>(s, strlen(s), <span class="charliteral">':'</span>); 01288 s = <a class="code" href="poptint_8h.html#a14">_free</a>(s); 01289 } <span class="keywordflow">else</span> 01290 languages = NULL; 01291 01292 <span class="comment">/* Compute directory refcount, skip directory if now empty. */</span> 01293 drc = <a class="code" href="system_8h.html#a36">alloca</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*drc)); 01294 memset(drc, 0, fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*drc)); 01295 dff = <a class="code" href="system_8h.html#a36">alloca</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*dff)); 01296 memset(dff, 0, fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*dff)); 01297 01298 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01299 <span class="keywordtype">char</span> **nsp; 01300 01301 bn = fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]; 01302 bnlen = strlen(bn); 01303 ix = fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]; 01304 dn = fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[ix]; 01305 dnlen = strlen(dn); 01306 01307 drc[ix]++; 01308 01309 <span class="comment">/* Don't bother with skipped files */</span> 01310 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i])) { 01311 drc[ix]--; 01312 <span class="keywordflow">continue</span>; 01313 } 01314 01315 <span class="comment">/*</span> 01316 <span class="comment"> * Skip net shared paths.</span> 01317 <span class="comment"> * Net shared paths are not relative to the current root (though</span> 01318 <span class="comment"> * they do need to take package relocations into account).</span> 01319 <span class="comment"> */</span> 01320 <span class="keywordflow">for</span> (nsp = netsharedPaths; nsp && *nsp; nsp++) { 01321 <span class="keywordtype">int</span> len; 01322 01323 len = strlen(*nsp); 01324 <span class="keywordflow">if</span> (dnlen >= len) { 01325 <span class="keywordflow">if</span> (strncmp(dn, *nsp, len)) <span class="keywordflow">continue</span>; 01326 <span class="comment">/* Only directories or complete file paths can be net shared */</span> 01327 <span class="keywordflow">if</span> (!(dn[len] == <span class="charliteral">'/'</span> || dn[len] == <span class="charliteral">'\0'</span>)) <span class="keywordflow">continue</span>; 01328 } <span class="keywordflow">else</span> { 01329 <span class="keywordflow">if</span> (len < (dnlen + bnlen)) <span class="keywordflow">continue</span>; 01330 <span class="keywordflow">if</span> (strncmp(dn, *nsp, dnlen)) <span class="keywordflow">continue</span>; 01331 <span class="keywordflow">if</span> (strncmp(bn, (*nsp) + dnlen, bnlen)) <span class="keywordflow">continue</span>; 01332 len = dnlen + bnlen; 01333 <span class="comment">/* Only directories or complete file paths can be net shared */</span> 01334 <span class="keywordflow">if</span> (!((*nsp)[len] == <span class="charliteral">'/'</span> || (*nsp)[len] == <span class="charliteral">'\0'</span>)) <span class="keywordflow">continue</span>; 01335 } 01336 01337 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01338 } 01339 01340 <span class="keywordflow">if</span> (nsp && *nsp) { 01341 drc[ix]--; dff[ix] = 1; 01342 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a311">FA_SKIPNETSHARED</a>; 01343 <span class="keywordflow">continue</span>; 01344 } 01345 01346 <span class="comment">/*</span> 01347 <span class="comment"> * Skip i18n language specific files.</span> 01348 <span class="comment"> */</span> 01349 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> && languages && *fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>[i]) { 01350 <span class="keyword">const</span> <span class="keywordtype">char</span> **lang, *l, *le; 01351 <span class="keywordflow">for</span> (lang = languages; *lang != <span class="charliteral">'\0'</span>; lang++) { 01352 <span class="keywordflow">if</span> (!strcmp(*lang, <span class="stringliteral">"all"</span>)) 01353 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01354 <span class="keywordflow">for</span> (l = fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>[i]; *l != <span class="charliteral">'\0'</span>; l = le) { 01355 <span class="keywordflow">for</span> (le = l; *le != <span class="charliteral">'\0'</span> && *le != <span class="charliteral">'|'</span>; le++) 01356 {}; 01357 <span class="keywordflow">if</span> ((le-l) > 0 && !strncmp(*lang, l, (le-l))) 01358 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01359 <span class="keywordflow">if</span> (*le == <span class="charliteral">'|'</span>) le++; <span class="comment">/* skip over | */</span> 01360 } 01361 <span class="keywordflow">if</span> (*l != <span class="charliteral">'\0'</span>) 01362 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01363 } 01364 <span class="keywordflow">if</span> (*lang == NULL) { 01365 drc[ix]--; dff[ix] = 1; 01366 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a310">FA_SKIPNSTATE</a>; 01367 <span class="keywordflow">continue</span>; 01368 } 01369 } 01370 01371 <span class="comment">/*</span> 01372 <span class="comment"> * Skip documentation if requested.</span> 01373 <span class="comment"> */</span> 01374 <span class="keywordflow">if</span> (noDocs && (fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a>)) { 01375 drc[ix]--; dff[ix] = 1; 01376 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a310">FA_SKIPNSTATE</a>; 01377 <span class="keywordflow">continue</span>; 01378 } 01379 } 01380 01381 <span class="comment">/* Skip (now empty) directories that had skipped files. */</span> 01382 <span class="keywordflow">for</span> (j = 0; j < fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>; j++) { 01383 01384 <span class="keywordflow">if</span> (drc[j]) <span class="keywordflow">continue</span>; <span class="comment">/* dir still has files. */</span> 01385 <span class="keywordflow">if</span> (!dff[j]) <span class="keywordflow">continue</span>; <span class="comment">/* dir was not emptied here. */</span> 01386 01387 <span class="comment">/* Find parent directory and basename. */</span> 01388 dn = fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[j]; dnlen = strlen(dn) - 1; 01389 bn = dn + dnlen; bnlen = 0; 01390 <span class="keywordflow">while</span> (bn > dn && bn[-1] != <span class="charliteral">'/'</span>) { 01391 bnlen++; 01392 dnlen--; 01393 bn--; 01394 } 01395 01396 <span class="comment">/* If explicitly included in the package, skip the directory. */</span> 01397 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01398 <span class="keyword">const</span> <span class="keywordtype">char</span> * dir; 01399 01400 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i])) 01401 <span class="keywordflow">continue</span>; 01402 <span class="keywordflow">if</span> (<a class="code" href="transaction_8c.html#a14">whatis</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i]) != <a class="code" href="rpmlib_8h.html#a502a315">XDIR</a>) 01403 <span class="keywordflow">continue</span>; 01404 dir = fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]; 01405 <span class="keywordflow">if</span> (strlen(dir) != dnlen) 01406 <span class="keywordflow">continue</span>; 01407 <span class="keywordflow">if</span> (strncmp(dir, dn, dnlen)) 01408 <span class="keywordflow">continue</span>; 01409 <span class="keywordflow">if</span> (strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) != bnlen) 01410 <span class="keywordflow">continue</span>; 01411 <span class="keywordflow">if</span> (strncmp(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i], bn, bnlen)) 01412 <span class="keywordflow">continue</span>; 01413 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"excluding directory %s\n"</span>), dn); 01414 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a310">FA_SKIPNSTATE</a>; 01415 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01416 } 01417 } 01418 01419 <span class="keywordflow">if</span> (netsharedPaths) <a class="code" href="lib_2misc_8c.html#a4">freeSplitString</a>(netsharedPaths); 01420 <span class="preprocessor">#ifdef DYING </span><span class="comment">/* XXX freeFi will deal with this later. */</span> 01421 fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>); 01422 <span class="preprocessor">#endif</span> 01423 <span class="preprocessor"></span> <span class="keywordflow">if</span> (languages) <a class="code" href="lib_2misc_8c.html#a4">freeSplitString</a>((<span class="keywordtype">char</span> **)languages); 01424 } 01425 <a name="l01429"></a><a class="code" href="structtsIterator__s.html">01429</a> <span class="keyword">struct </span><a class="code" href="structtsIterator__s.html">tsIterator_s</a> { <a name="l01430"></a><a class="code" href="structtsIterator__s.html#m0">01430</a> <span class="comment">/*@kept@*/</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> <a class="code" href="structtsIterator__s.html#m0">ts</a>; <a name="l01431"></a><a class="code" href="structtsIterator__s.html#m1">01431</a> <span class="keywordtype">int</span> <a class="code" href="structtsIterator__s.html#m1">reverse</a>; <a name="l01432"></a><a class="code" href="structtsIterator__s.html#m2">01432</a> <span class="keywordtype">int</span> <a class="code" href="structtsIterator__s.html#m2">ocsave</a>; <a name="l01433"></a><a class="code" href="structtsIterator__s.html#m3">01433</a> <span class="keywordtype">int</span> <a class="code" href="structtsIterator__s.html#m3">oc</a>; 01434 }; 01435 <a name="l01441"></a><a class="code" href="transaction_8c.html#a25">01441</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="transaction_8c.html#a25">tsGetOc</a>(<span class="keywordtype">void</span> * a) 01442 <span class="comment">/*@*/</span> 01443 { 01444 <span class="keyword">struct </span><a class="code" href="structtsIterator__s.html">tsIterator_s</a> * iter = a; 01445 <span class="keywordtype">int</span> oc = iter-><a class="code" href="structtsIterator__s.html#m2">ocsave</a>; 01446 <span class="keywordflow">return</span> oc; 01447 } 01448 <a name="l01454"></a><a class="code" href="transaction_8c.html#a26">01454</a> <span class="keyword">static</span> <span class="comment">/*@dependent@*/</span> <span class="keyword">struct </span><a class="code" href="structavailablePackage.html">availablePackage</a> * tsGetAlp(void * a) 01455 <span class="comment">/*@*/</span> 01456 { 01457 <span class="keyword">struct </span><a class="code" href="structtsIterator__s.html">tsIterator_s</a> * iter = a; 01458 <span class="keyword">struct </span><a class="code" href="structavailablePackage.html">availablePackage</a> * alp = NULL; 01459 <span class="keywordtype">int</span> oc = iter-><a class="code" href="structtsIterator__s.html#m2">ocsave</a>; 01460 01461 <span class="keywordflow">if</span> (oc != -1) { 01462 <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = iter-><a class="code" href="structtsIterator__s.html#m0">ts</a>; 01463 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> + oc; 01464 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> && fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED) 01465 alp = ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> + ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m5">u</a>.addedIndex; 01466 } 01467 <span class="keywordflow">return</span> alp; 01468 } 01469 <a name="l01475"></a><a class="code" href="transaction_8c.html#a27">01475</a> <span class="keyword">static</span> <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> * <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(<span class="comment">/*@only@*/</span><span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * a) 01476 <span class="comment">/*@modifies a @*/</span> 01477 { 01478 <span class="keywordflow">return</span> <a class="code" href="poptint_8h.html#a14">_free</a>(a); 01479 } 01480 <a name="l01486"></a><a class="code" href="transaction_8c.html#a28">01486</a> <span class="keyword">static</span> <span class="keywordtype">void</span> * <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(<span class="comment">/*@kept@*/</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * a) 01487 <span class="comment">/*@*/</span> 01488 { 01489 <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = (<span class="keywordtype">void</span> *)a; 01490 <span class="keyword">struct </span><a class="code" href="structtsIterator__s.html">tsIterator_s</a> * iter = NULL; 01491 01492 iter = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(1, <span class="keyword">sizeof</span>(*iter)); 01493 iter-><a class="code" href="structtsIterator__s.html#m0">ts</a> = ts; 01494 iter-><a class="code" href="structtsIterator__s.html#m1">reverse</a> = ((ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a336">RPMTRANS_FLAG_REVERSE</a>) ? 1 : 0); 01495 iter-><a class="code" href="structtsIterator__s.html#m3">oc</a> = (iter-><a class="code" href="structtsIterator__s.html#m1">reverse</a> ? (ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a> - 1) : 0); 01496 iter-><a class="code" href="structtsIterator__s.html#m2">ocsave</a> = iter-><a class="code" href="structtsIterator__s.html#m3">oc</a>; 01497 <span class="keywordflow">return</span> iter; 01498 } 01499 <a name="l01505"></a><a class="code" href="transaction_8c.html#a29">01505</a> <span class="keyword">static</span> <span class="comment">/*@dependent@*/</span> <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(<span class="keywordtype">void</span> * a) 01506 <span class="comment">/*@*/</span> 01507 { 01508 <span class="keyword">struct </span><a class="code" href="structtsIterator__s.html">tsIterator_s</a> * iter = a; 01509 <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = iter-><a class="code" href="structtsIterator__s.html#m0">ts</a>; 01510 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = NULL; 01511 <span class="keywordtype">int</span> oc = -1; 01512 01513 <span class="keywordflow">if</span> (iter-><a class="code" href="structtsIterator__s.html#m1">reverse</a>) { 01514 <span class="keywordflow">if</span> (iter-><a class="code" href="structtsIterator__s.html#m3">oc</a> >= 0) oc = iter-><a class="code" href="structtsIterator__s.html#m3">oc</a>--; 01515 } <span class="keywordflow">else</span> { 01516 <span class="keywordflow">if</span> (iter-><a class="code" href="structtsIterator__s.html#m3">oc</a> < ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>) oc = iter-><a class="code" href="structtsIterator__s.html#m3">oc</a>++; 01517 } 01518 iter-><a class="code" href="structtsIterator__s.html#m2">ocsave</a> = oc; 01519 <span class="keywordflow">if</span> (oc != -1) 01520 fi = ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> + oc; 01521 <span class="keywordflow">return</span> fi; 01522 } 01523 <a name="l01524"></a><a class="code" href="transaction_8c.html#a4">01524</a> <span class="preprocessor">#define NOTIFY(_ts, _al) if ((_ts)->notify) (void) (_ts)->notify _al</span> 01525 <span class="preprocessor"></span> <a name="l01526"></a><a class="code" href="group__rpmtrans.html#a30">01526</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmtrans.html#a30">rpmRunTransactions</a>( <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts, 01527 <a class="code" href="rpmmessages_8h.html#a17">rpmCallbackFunction</a> notify, <a class="code" href="rpmmessages_8h.html#a16">rpmCallbackData</a> notifyData, 01528 <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> okProbs, <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> * newProbs, 01529 <a class="code" href="group__rpmtrans.html#a3">rpmtransFlags</a> transFlags, <a class="code" href="rpmlib_8h.html#a82">rpmprobFilterFlags</a> ignoreSet) 01530 { 01531 <span class="keywordtype">int</span> i, j; 01532 <span class="keywordtype">int</span> ourrc = 0; 01533 <span class="keyword">struct </span><a class="code" href="structavailablePackage.html">availablePackage</a> * alp; 01534 <span class="keywordtype">int</span> totalFileCount = 0; 01535 <a class="code" href="structhash__table.html">hashTable</a> ht; 01536 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi; 01537 <span class="keyword">struct </span><a class="code" href="structdiskspaceInfo.html">diskspaceInfo</a> * dip; 01538 <span class="keyword">struct </span><a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * shared, * sharedList; 01539 <span class="keywordtype">int</span> numShared; 01540 <span class="keywordtype">int</span> nexti; 01541 <span class="keywordtype">int</span> lastFailed; 01542 <span class="keywordtype">int</span> oc; 01543 <a class="code" href="structfprintCache__s.html">fingerPrintCache</a> fpc; 01544 <span class="keyword">struct </span><a class="code" href="structpsm__s.html">psm_s</a> psmbuf; 01545 <a class="code" href="structpsm__s.html">PSM_t</a> psm = &psmbuf; 01546 <span class="keywordtype">void</span> * tsi; 01547 01548 <span class="comment">/* FIXME: what if the same package is included in ts twice? */</span> 01549 01550 ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> = transFlags; 01551 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a323">RPMTRANS_FLAG_NOSCRIPTS</a>) 01552 ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> |= (<a class="code" href="rpmlib_8h.html#a33">_noTransScripts</a> | <a class="code" href="rpmlib_8h.html#a34">_noTransTriggers</a>); 01553 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a325">RPMTRANS_FLAG_NOTRIGGERS</a>) 01554 ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> |= <a class="code" href="rpmlib_8h.html#a34">_noTransTriggers</a>; 01555 01556 <span class="comment">/* XXX MULTILIB is broken, as packages can and do execute /sbin/ldconfig. */</span> 01557 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & (<a class="code" href="group__rpmtrans.html#a19a324">RPMTRANS_FLAG_JUSTDB</a> | <a class="code" href="group__rpmtrans.html#a19a329">RPMTRANS_FLAG_MULTILIB</a>)) 01558 ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> |= (<a class="code" href="rpmlib_8h.html#a33">_noTransScripts</a> | <a class="code" href="rpmlib_8h.html#a34">_noTransTriggers</a>); 01559 01560 ts-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a> = notify; 01561 ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a> = notifyData; 01562 <span class="comment">/*@-assignexpose@*/</span> 01563 ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a> = *newProbs = <a class="code" href="transaction_8c.html#a5">psCreate</a>(); 01564 <span class="comment">/*@=assignexpose@*/</span> 01565 ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> = ignoreSet; 01566 ts-><a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a>); 01567 ts-><a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a> = <a class="code" href="lib_2misc_8c.html#a9">currentDirectory</a>(); 01568 ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0; 01569 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 0; 01570 ts-><a class="code" href="structrpmTransactionSet__s.html#m24">id</a> = (int_32) time(NULL); 01571 01572 memset(psm, 0, <span class="keyword">sizeof</span>(*psm)); 01573 <span class="comment">/*@-assignexpose@*/</span> 01574 psm->ts = ts; 01575 <span class="comment">/*@=assignexpose@*/</span> 01576 01577 <span class="comment">/* Get available space on mounted file systems. */</span> 01578 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a357">RPMPROB_FILTER_DISKSPACE</a>) && 01579 !<a class="code" href="fs_8c.html#a5">rpmGetFilesystemList</a>(&ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>, &ts-><a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>)) { 01580 <span class="keyword">struct </span>stat sb; 01581 01582 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>); 01583 dip = ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>), ts-><a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a> + 1); 01584 01585 <span class="keywordflow">for</span> (i = 0; (i < ts-><a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>) && dip; i++) 01586 <span class="keywordflow">if</span> (strncmp(ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], <span class="stringliteral">"/mnt/"</span>, 5)) { 01587 <span class="preprocessor">#if STATFS_IN_SYS_STATVFS</span> 01588 <span class="preprocessor"></span> <span class="keyword">struct </span>statvfs sfb; 01589 memset(&sfb, 0, <span class="keyword">sizeof</span>(sfb)); 01590 <span class="keywordflow">if</span> (statvfs(ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &sfb)) 01591 <span class="preprocessor">#else</span> 01592 <span class="preprocessor"></span> <span class="keyword">struct </span>statfs sfb; 01593 <span class="preprocessor"># if STAT_STATFS4</span> 01594 <span class="preprocessor"></span><span class="comment">/* This platform has the 4-argument version of the statfs call. The last two</span> 01595 <span class="comment"> * should be the size of struct statfs and 0, respectively. The 0 is the</span> 01596 <span class="comment"> * filesystem type, and is always 0 when statfs is called on a mounted</span> 01597 <span class="comment"> * filesystem, as we're doing.</span> 01598 <span class="comment"> */</span> 01599 memset(&sfb, 0, <span class="keyword">sizeof</span>(sfb)); 01600 <span class="keywordflow">if</span> (statfs(ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &sfb, <span class="keyword">sizeof</span>(sfb), 0)) 01601 <span class="preprocessor"># else</span> 01602 <span class="preprocessor"></span> memset(&sfb, 0, <span class="keyword">sizeof</span>(sfb)); 01603 <span class="keywordflow">if</span> (statfs(ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &sfb)) 01604 <span class="preprocessor"># endif</span> 01605 <span class="preprocessor"></span><span class="preprocessor">#endif</span> 01606 <span class="preprocessor"></span> { 01607 dip = NULL; 01608 } <span class="keywordflow">else</span> { 01609 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m3">bsize</a> = sfb.f_bsize; 01610 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> = 0; 01611 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m2">ineeded</a> = 0; 01612 <span class="preprocessor">#ifdef STATFS_HAS_F_BAVAIL</span> 01613 <span class="preprocessor"></span> ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m4">bavail</a> = sfb.f_bavail; 01614 <span class="preprocessor">#else</span> 01615 <span class="preprocessor"></span><span class="comment">/* FIXME: the statfs struct doesn't have a member to tell how many blocks are</span> 01616 <span class="comment"> * available for non-superusers. f_blocks - f_bfree is probably too big, but</span> 01617 <span class="comment"> * it's about all we can do.</span> 01618 <span class="comment"> */</span> 01619 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m4">bavail</a> = sfb.f_blocks - sfb.f_bfree; 01620 <span class="preprocessor">#endif</span> 01621 <span class="preprocessor"></span> <span class="comment">/* XXX Avoid FAT and other file systems that have not inodes. */</span> 01622 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m5">iavail</a> = !(sfb.f_ffree == 0 && sfb.f_files == 0) 01623 ? sfb.f_ffree : -1; 01624 01625 (void) stat(ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &sb); 01626 ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m0">dev</a> = sb.st_dev; 01627 } 01628 } 01629 01630 <span class="keywordflow">if</span> (dip) ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m3">bsize</a> = 0; 01631 } 01632 01633 <span class="comment">/* ===============================================</span> 01634 <span class="comment"> * For packages being installed:</span> 01635 <span class="comment"> * - verify package arch/os.</span> 01636 <span class="comment"> * - verify package epoch:version-release is newer.</span> 01637 <span class="comment"> * - count files.</span> 01638 <span class="comment"> * For packages being removed:</span> 01639 <span class="comment"> * - count files.</span> 01640 <span class="comment"> */</span> 01641 <span class="comment">/* The ordering doesn't matter here */</span> 01642 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> != NULL) 01643 <span class="keywordflow">for</span> (alp = ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>; 01644 (alp - ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>) < ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m3">size</a>; 01645 alp++) 01646 { 01647 <span class="keywordflow">if</span> (!<a class="code" href="transaction_8c.html#a10">archOkay</a>(alp-><a class="code" href="structavailablePackage.html#m0">h</a>) && !(ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a351">RPMPROB_FILTER_IGNOREARCH</a>)) 01648 <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a289">RPMPROB_BADARCH</a>, alp, NULL, NULL, NULL, 0); 01649 01650 <span class="keywordflow">if</span> (!<a class="code" href="transaction_8c.html#a11">osOkay</a>(alp-><a class="code" href="structavailablePackage.html#m0">h</a>) && !(ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a350">RPMPROB_FILTER_IGNOREOS</a>)) 01651 <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a290">RPMPROB_BADOS</a>, alp, NULL, NULL, NULL, 0); 01652 01653 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a356">RPMPROB_FILTER_OLDPACKAGE</a>)) { 01654 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 01655 <a class="code" href="structheaderToken.html">Header</a> oldH; 01656 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, alp-><a class="code" href="structavailablePackage.html#m1">name</a>, 0); 01657 <span class="keywordflow">while</span> ((oldH = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) 01658 (void) <a class="code" href="transaction_8c.html#a23">ensureOlder</a>(alp, oldH, ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>); 01659 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01660 } 01661 01662 <span class="comment">/* XXX multilib should not display "already installed" problems */</span> 01663 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a352">RPMPROB_FILTER_REPLACEPKG</a>) && !alp-><a class="code" href="structavailablePackage.html#m21">multiLib</a>) { 01664 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 01665 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, alp-><a class="code" href="structavailablePackage.html#m1">name</a>, 0); 01666 (void) <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(mi, <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>, 01667 <a class="code" href="rpmlib_8h.html#a31a285">RPMMIRE_DEFAULT</a>, alp-><a class="code" href="structavailablePackage.html#m2">version</a>); 01668 (void) <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(mi, <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>, 01669 <a class="code" href="rpmlib_8h.html#a31a285">RPMMIRE_DEFAULT</a>, alp-><a class="code" href="structavailablePackage.html#m3">release</a>); 01670 01671 <span class="keywordflow">while</span> (<a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi) != NULL) { 01672 <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a291">RPMPROB_PKG_INSTALLED</a>, alp, 01673 NULL, NULL, NULL, 0); 01674 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01675 } 01676 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01677 } 01678 01679 totalFileCount += alp-><a class="code" href="structavailablePackage.html#m14">filesCount</a>; 01680 01681 } 01682 01683 <span class="comment">/* FIXME: it seems a bit silly to read in all of these headers twice */</span> 01684 <span class="comment">/* The ordering doesn't matter here */</span> 01685 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a> > 0) { 01686 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 01687 <a class="code" href="structheaderToken.html">Header</a> h; 01688 <span class="keywordtype">int</span> fileCount; 01689 01690 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, NULL, 0); 01691 (void) <a class="code" href="group__rpmdb.html#a84">rpmdbAppendIterator</a>(mi, ts-><a class="code" href="structrpmTransactionSet__s.html#m9">removedPackages</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a>); 01692 <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) { 01693 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL, NULL, &fileCount)) 01694 totalFileCount += fileCount; 01695 } 01696 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01697 } 01698 01699 <span class="comment">/* ===============================================</span> 01700 <span class="comment"> * Initialize file list:</span> 01701 <span class="comment"> */</span> 01702 ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m3">size</a> + ts-><a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a>; 01703 ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, <span class="keyword">sizeof</span>(*ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>)); 01704 01705 <span class="comment">/*</span> 01706 <span class="comment"> * FIXME?: we'd be better off assembling one very large file list and</span> 01707 <span class="comment"> * calling fpLookupList only once. I'm not sure that the speedup is</span> 01708 <span class="comment"> * worth the trouble though.</span> 01709 <span class="comment"> */</span> 01710 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 01711 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 01712 oc = <a class="code" href="transaction_8c.html#a25">tsGetOc</a>(tsi); 01713 fi-><a class="code" href="structtransactionFileInfo__s.html#m48">magic</a> = <a class="code" href="psm_8h.html#a0">TFIMAGIC</a>; 01714 01715 <span class="comment">/* XXX watchout: fi->type must be set for tsGetAlp() to "work" */</span> 01716 fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m0">type</a>; 01717 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 01718 <span class="keywordflow">case</span> TR_ADDED: 01719 i = ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m5">u</a>.addedIndex; 01720 <span class="comment">/* XXX watchout: fi->type must be set for tsGetAlp() to "work" */</span> 01721 fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = <a class="code" href="transaction_8c.html#a26">tsGetAlp</a>(tsi); 01722 fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = 0; 01723 <a class="code" href="psm_8c.html#a3">loadFi</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-><a class="code" href="structavailablePackage.html#m0">h</a>, fi); 01724 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> == 0) 01725 <span class="keywordflow">continue</span>; 01726 01727 { <a class="code" href="structheaderToken.html">Header</a> foo = <a class="code" href="transaction_8c.html#a15">relocateFileList</a>(ts, fi, fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>); 01728 foo = <a class="code" href="group__header.html#a16">headerFree</a>(foo); 01729 } 01730 01731 <span class="comment">/* Skip netshared paths, not our i18n files, and excluded docs */</span> 01732 <a class="code" href="transaction_8c.html#a24">skipFiles</a>(ts, fi); 01733 <span class="keywordflow">break</span>; 01734 <span class="keywordflow">case</span> TR_REMOVED: 01735 fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = NULL; 01736 fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m5">u</a>.removed.dboffset; 01737 { <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi; 01738 01739 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, 01740 &fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a>, <span class="keyword">sizeof</span>(fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a>)); 01741 <span class="keywordflow">if</span> ((fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) 01742 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 01743 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi); 01744 } 01745 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> == NULL) { 01746 <span class="comment">/* ACK! */</span> 01747 <span class="keywordflow">continue</span>; 01748 } 01749 <span class="comment">/* XXX header arg unused. */</span> 01750 <a class="code" href="psm_8c.html#a3">loadFi</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, fi); 01751 <span class="keywordflow">break</span>; 01752 } 01753 01754 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>) 01755 fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>)); 01756 } 01757 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 01758 01759 <span class="keywordflow">if</span> (!ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a>) { 01760 (void) chdir(<span class="stringliteral">"/"</span>); 01761 <span class="comment">/*@-unrecog -superuser @*/</span> 01762 (void) chroot(ts-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>); 01763 <span class="comment">/*@=unrecog =superuser @*/</span> 01764 ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 1; 01765 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 1; 01766 <span class="preprocessor">#ifdef DYING</span> 01767 <span class="preprocessor"></span> <span class="comment">/*@-onlytrans@*/</span> 01768 chroot_prefix = ts-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>; 01769 <span class="comment">/*@=onlytrans@*/</span> 01770 <span class="preprocessor">#endif</span> 01771 <span class="preprocessor"></span> } 01772 01773 ht = <a class="code" href="rpmhash_8c.html#a5">htCreate</a>(totalFileCount * 2, 0, 0, fpHashFunction, fpEqual); 01774 fpc = <a class="code" href="fprint_8c.html#a0">fpCacheCreate</a>(totalFileCount); 01775 01776 <span class="comment">/* ===============================================</span> 01777 <span class="comment"> * Add fingerprint for each file not skipped.</span> 01778 <span class="comment"> */</span> 01779 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 01780 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 01781 <a class="code" href="fprint_8c.html#a7">fpLookupList</a>(fpc, fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>); 01782 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01783 <span class="keywordflow">if</span> (<a class="code" href="rpmlib_8h.html#a32">XFA_SKIPPING</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i])) 01784 <span class="keywordflow">continue</span>; 01785 <span class="comment">/*@-dependenttrans@*/</span> 01786 <a class="code" href="rpmhash_8c.html#a6">htAddEntry</a>(ht, fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> + i, fi); 01787 <span class="comment">/*@=dependenttrans@*/</span> 01788 } 01789 } 01790 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 01791 01792 <span class="comment">/*@-moduncon@*/</span> 01793 <a class="code" href="transaction_8c.html#a4">NOTIFY</a>(ts, (NULL, <a class="code" href="rpmmessages_8h.html#a31a23">RPMCALLBACK_TRANS_START</a>, 6, ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, 01794 NULL, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>)); 01795 <span class="comment">/*@=moduncon@*/</span> 01796 01797 <span class="comment">/* ===============================================</span> 01798 <span class="comment"> * Compute file disposition for each package in transaction set.</span> 01799 <span class="comment"> */</span> 01800 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 01801 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 01802 <a class="code" href="struct__dbiIndexSet.html">dbiIndexSet</a> * matches; 01803 <span class="keywordtype">int</span> knownBad; 01804 01805 <span class="comment">/*@-moduncon@*/</span> 01806 <a class="code" href="transaction_8c.html#a4">NOTIFY</a>(ts, (NULL, <a class="code" href="rpmmessages_8h.html#a31a22">RPMCALLBACK_TRANS_PROGRESS</a>, (fi - ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>), 01807 ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, NULL, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>)); 01808 <span class="comment">/*@=moduncon@*/</span> 01809 01810 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> == 0) <span class="keywordflow">continue</span>; 01811 01812 <span class="comment">/* Extract file info for all files in this package from the database. */</span> 01813 matches = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*matches), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01814 <span class="keywordflow">if</span> (<a class="code" href="group__rpmdb.html#a90">rpmdbFindFpList</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>, matches, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>)) 01815 <span class="keywordflow">return</span> 1; <span class="comment">/* XXX WTFO? */</span> 01816 01817 numShared = 0; 01818 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) 01819 numShared += <a class="code" href="group__dbi.html#a23">dbiIndexSetCount</a>(matches[i]); 01820 01821 <span class="comment">/* Build sorted file info list for this package. */</span> 01822 shared = sharedList = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>((numShared + 1) * <span class="keyword">sizeof</span>(*sharedList)); 01823 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01824 <span class="comment">/*</span> 01825 <span class="comment"> * Take care not to mark files as replaced in packages that will</span> 01826 <span class="comment"> * have been removed before we will get here.</span> 01827 <span class="comment"> */</span> 01828 <span class="keywordflow">for</span> (j = 0; j < <a class="code" href="group__dbi.html#a23">dbiIndexSetCount</a>(matches[i]); j++) { 01829 <span class="keywordtype">int</span> k, ro; 01830 ro = <a class="code" href="group__dbi.html#a24">dbiIndexRecordOffset</a>(matches[i], j); 01831 knownBad = 0; 01832 <span class="keywordflow">for</span> (k = 0; ro != knownBad && k < ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; k++) { 01833 <span class="keywordflow">switch</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[k].<a class="code" href="structtransactionElement__s.html#m0">type</a>) { 01834 <span class="keywordflow">case</span> TR_REMOVED: 01835 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[k].<a class="code" href="structtransactionElement__s.html#m5">u</a>.removed.dboffset == ro) 01836 knownBad = ro; 01837 <span class="keywordflow">break</span>; 01838 <span class="keywordflow">case</span> TR_ADDED: 01839 <span class="keywordflow">break</span>; 01840 } 01841 } 01842 01843 shared-><a class="code" href="structsharedFileInfo.html#m0">pkgFileNum</a> = i; 01844 shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> = <a class="code" href="group__dbi.html#a24">dbiIndexRecordOffset</a>(matches[i], j); 01845 shared-><a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a> = <a class="code" href="group__dbi.html#a25">dbiIndexRecordFileNumber</a>(matches[i], j); 01846 shared-><a class="code" href="structsharedFileInfo.html#m3">isRemoved</a> = (knownBad == ro); 01847 shared++; 01848 } 01849 matches[i] = <a class="code" href="group__dbi.html#a22">dbiFreeIndexSet</a>(matches[i]); 01850 } 01851 numShared = shared - sharedList; 01852 shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> = -1; 01853 matches = <a class="code" href="poptint_8h.html#a14">_free</a>(matches); 01854 01855 <span class="comment">/* Sort file info by other package index (otherPkg) */</span> 01856 qsort(sharedList, numShared, <span class="keyword">sizeof</span>(*shared), <a class="code" href="transaction_8c.html#a17">sharedCmp</a>); 01857 01858 <span class="comment">/* For all files from this package that are in the database ... */</span> 01859 <span class="keywordflow">for</span> (i = 0; i < numShared; i = nexti) { 01860 <span class="keywordtype">int</span> beingRemoved; 01861 01862 shared = sharedList + i; 01863 01864 <span class="comment">/* Find the end of the files in the other package. */</span> 01865 <span class="keywordflow">for</span> (nexti = i + 1; nexti < numShared; nexti++) { 01866 <span class="keywordflow">if</span> (sharedList[nexti].<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> != shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 01867 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01868 } 01869 01870 <span class="comment">/* Is this file from a package being removed? */</span> 01871 beingRemoved = 0; 01872 <span class="keywordflow">for</span> (j = 0; j < ts-><a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a>; j++) { 01873 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m9">removedPackages</a>[j] != shared-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 01874 <span class="keywordflow">continue</span>; 01875 beingRemoved = 1; 01876 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 01877 } 01878 01879 <span class="comment">/* Determine the fate of each file. */</span> 01880 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 01881 <span class="keywordflow">case</span> TR_ADDED: 01882 (void) <a class="code" href="transaction_8c.html#a20">handleInstInstalledFiles</a>(fi, ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, shared, nexti - i, 01883 !(beingRemoved || (ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a355">RPMPROB_FILTER_REPLACEOLDFILES</a>)), 01884 ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a>); 01885 <span class="keywordflow">break</span>; 01886 <span class="keywordflow">case</span> TR_REMOVED: 01887 <span class="keywordflow">if</span> (!beingRemoved) 01888 (void) <a class="code" href="transaction_8c.html#a21">handleRmvdInstalledFiles</a>(fi, ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, shared, nexti - i); 01889 <span class="keywordflow">break</span>; 01890 } 01891 } 01892 01893 free(sharedList); 01894 01895 <span class="comment">/* Update disk space needs on each partition for this package. */</span> 01896 <a class="code" href="transaction_8c.html#a22">handleOverlappedFiles</a>(fi, ht, 01897 ((ts-><a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> & <a class="code" href="rpmlib_8h.html#a504a354">RPMPROB_FILTER_REPLACENEWFILES</a>) 01898 ? NULL : ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>), ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a>); 01899 01900 <span class="comment">/* Check added package has sufficient space on each partition used. */</span> 01901 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 01902 <span class="keywordflow">case</span> TR_ADDED: 01903 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a> && fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>)) 01904 <span class="keywordflow">break</span>; 01905 <span class="keywordflow">for</span> (i = 0; i < ts-><a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>; i++) { 01906 01907 dip = ts-><a class="code" href="structrpmTransactionSet__s.html#m7">di</a> + i; 01908 01909 <span class="comment">/* XXX Avoid FAT and other file systems that have not inodes. */</span> 01910 <span class="keywordflow">if</span> (dip-><a class="code" href="structdiskspaceInfo.html#m5">iavail</a> <= 0) 01911 <span class="keywordflow">continue</span>; 01912 01913 <span class="keywordflow">if</span> (<a class="code" href="transaction_8c.html#a0">adj_fs_blocks</a>(dip-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a>) > dip-><a class="code" href="structdiskspaceInfo.html#m4">bavail</a>) 01914 <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a298">RPMPROB_DISKSPACE</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, 01915 ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], NULL, NULL, 01916 (<a class="code" href="transaction_8c.html#a0">adj_fs_blocks</a>(dip-><a class="code" href="structdiskspaceInfo.html#m1">bneeded</a>) - dip-><a class="code" href="structdiskspaceInfo.html#m4">bavail</a>) * dip-><a class="code" href="structdiskspaceInfo.html#m3">bsize</a>); 01917 01918 <span class="keywordflow">if</span> (<a class="code" href="transaction_8c.html#a0">adj_fs_blocks</a>(dip-><a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>) > dip-><a class="code" href="structdiskspaceInfo.html#m5">iavail</a>) 01919 <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a299">RPMPROB_DISKNODES</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, 01920 ts-><a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], NULL, NULL, 01921 (<a class="code" href="transaction_8c.html#a0">adj_fs_blocks</a>(dip-><a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>) - dip-><a class="code" href="structdiskspaceInfo.html#m5">iavail</a>)); 01922 } 01923 <span class="keywordflow">break</span>; 01924 <span class="keywordflow">case</span> TR_REMOVED: 01925 <span class="keywordflow">break</span>; 01926 } 01927 } 01928 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 01929 01930 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a>) { 01931 <span class="comment">/*@-unrecog -superuser @*/</span> 01932 (void) chroot(<span class="stringliteral">"."</span>); 01933 <span class="comment">/*@=unrecog =superuser @*/</span> 01934 ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0; 01935 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-><a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 0; 01936 <span class="preprocessor">#ifdef DYING</span> 01937 <span class="preprocessor"></span> chroot_prefix = NULL; 01938 <span class="preprocessor">#endif</span> 01939 <span class="preprocessor"></span> (void) chdir(ts-><a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a>); 01940 } 01941 01942 <span class="comment">/*@-moduncon@*/</span> 01943 <a class="code" href="transaction_8c.html#a4">NOTIFY</a>(ts, (NULL, <a class="code" href="rpmmessages_8h.html#a31a24">RPMCALLBACK_TRANS_STOP</a>, 6, ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, 01944 NULL, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>)); 01945 <span class="comment">/*@=moduncon@*/</span> 01946 01947 <span class="comment">/* ===============================================</span> 01948 <span class="comment"> * Free unused memory as soon as possible.</span> 01949 <span class="comment"> */</span> 01950 01951 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 01952 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 01953 psm->fi = fi; 01954 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> == 0) 01955 <span class="keywordflow">continue</span>; 01956 fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>); 01957 } 01958 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 01959 01960 <a class="code" href="fprint_8c.html#a1">fpCacheFree</a>(fpc); 01961 <a class="code" href="rpmhash_8c.html#a7">htFree</a>(ht); 01962 01963 <span class="comment">/* ===============================================</span> 01964 <span class="comment"> * If unfiltered problems exist, free memory and return.</span> 01965 <span class="comment"> */</span> 01966 <span class="keywordflow">if</span> ((ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a322">RPMTRANS_FLAG_BUILD_PROBS</a>) || 01967 (ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>-><a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> && (!okProbs || <a class="code" href="transaction_8c.html#a16">psTrim</a>(okProbs, ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>)))) 01968 { 01969 *newProbs = ts-><a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>; 01970 01971 ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="transaction_8c.html#a6">freeFl</a>(ts, ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>); 01972 ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a> = 0; 01973 <span class="comment">/*@-nullstate@*/</span> 01974 <span class="keywordflow">return</span> ts-><a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; 01975 <span class="comment">/*@=nullstate@*/</span> 01976 } 01977 01978 <span class="comment">/* ===============================================</span> 01979 <span class="comment"> * Save removed files before erasing.</span> 01980 <span class="comment"> */</span> 01981 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & (<a class="code" href="group__rpmtrans.html#a19a330">RPMTRANS_FLAG_DIRSTASH</a> | <a class="code" href="group__rpmtrans.html#a19a331">RPMTRANS_FLAG_REPACKAGE</a>)) { 01982 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 01983 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 01984 psm->fi = fi; 01985 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 01986 <span class="keywordflow">case</span> TR_ADDED: 01987 <span class="keywordflow">break</span>; 01988 <span class="keywordflow">case</span> TR_REMOVED: 01989 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a331">RPMTRANS_FLAG_REPACKAGE</a>) 01990 (void) <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>); 01991 <span class="keywordflow">break</span>; 01992 } 01993 } 01994 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 01995 } 01996 01997 <span class="comment">/* ===============================================</span> 01998 <span class="comment"> * Install and remove packages.</span> 01999 <span class="comment"> */</span> 02000 02001 lastFailed = -2; <span class="comment">/* erased packages have -1 */</span> 02002 tsi = <a class="code" href="transaction_8c.html#a28">tsInitIterator</a>(ts); 02003 <span class="keywordflow">while</span> ((fi = <a class="code" href="transaction_8c.html#a29">tsNextIterator</a>(tsi)) != NULL) { 02004 <a class="code" href="structheaderToken.html">Header</a> h; 02005 <span class="keywordtype">int</span> gotfd; 02006 02007 gotfd = 0; 02008 psm->fi = fi; 02009 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) 02010 { 02011 <span class="keywordflow">case</span> TR_ADDED: 02012 alp = <a class="code" href="transaction_8c.html#a26">tsGetAlp</a>(tsi); 02013 assert(alp == fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>); 02014 i = alp - ts-><a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>; 02015 02016 h = <a class="code" href="group__header.html#a14">headerLink</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 02017 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m24">fd</a> == NULL) { 02018 alp-><a class="code" href="structavailablePackage.html#m24">fd</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmmessages_8h.html#a31a20">RPMCALLBACK_INST_OPEN_FILE</a>, 0, 0, 02019 alp-><a class="code" href="structavailablePackage.html#m22">key</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>); 02020 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m24">fd</a>) { 02021 <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rpmrc; 02022 02023 h = <a class="code" href="group__header.html#a16">headerFree</a>(h); 02024 02025 <span class="comment">/*@-mustmod@*/</span> <span class="comment">/* LCL: segfault */</span> 02026 rpmrc = <a class="code" href="package_8c.html#a5">rpmReadPackageHeader</a>(alp-><a class="code" href="structavailablePackage.html#m24">fd</a>, &h, NULL, NULL, NULL); 02027 <span class="comment">/*@=mustmod@*/</span> 02028 <span class="keywordflow">if</span> (!(rpmrc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || rpmrc == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>)) { 02029 (void)ts-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmmessages_8h.html#a31a21">RPMCALLBACK_INST_CLOSE_FILE</a>, 02030 0, 0, alp-><a class="code" href="structavailablePackage.html#m22">key</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>); 02031 alp-><a class="code" href="structavailablePackage.html#m24">fd</a> = NULL; 02032 ourrc++; 02033 } <span class="keywordflow">else</span> { 02034 <a class="code" href="structheaderToken.html">Header</a> foo = <a class="code" href="transaction_8c.html#a15">relocateFileList</a>(ts, fi, alp, h, NULL); 02035 h = <a class="code" href="group__header.html#a16">headerFree</a>(h); 02036 h = <a class="code" href="group__header.html#a14">headerLink</a>(foo); 02037 foo = <a class="code" href="group__header.html#a16">headerFree</a>(foo); 02038 } 02039 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m24">fd</a>) gotfd = 1; 02040 } 02041 } 02042 02043 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m24">fd</a>) { 02044 <a class="code" href="structheaderToken.html">Header</a> hsave = NULL; 02045 02046 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>) { 02047 hsave = <a class="code" href="group__header.html#a14">headerLink</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 02048 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 02049 } 02050 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(h); 02051 <span class="keywordflow">if</span> (alp-><a class="code" href="structavailablePackage.html#m21">multiLib</a>) 02052 ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> |= <a class="code" href="group__rpmtrans.html#a19a329">RPMTRANS_FLAG_MULTILIB</a>; 02053 02054 assert(alp == fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>); 02055 <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>)) { 02056 ourrc++; 02057 lastFailed = i; 02058 } 02059 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 02060 <span class="keywordflow">if</span> (hsave) { 02061 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(hsave); 02062 hsave = <a class="code" href="group__header.html#a16">headerFree</a>(hsave); 02063 } 02064 } <span class="keywordflow">else</span> { 02065 ourrc++; 02066 lastFailed = i; 02067 } 02068 02069 h = <a class="code" href="group__header.html#a16">headerFree</a>(h); 02070 02071 <span class="keywordflow">if</span> (gotfd) { 02072 (void)ts-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmmessages_8h.html#a31a21">RPMCALLBACK_INST_CLOSE_FILE</a>, 0, 0, 02073 alp-><a class="code" href="structavailablePackage.html#m22">key</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>); 02074 alp-><a class="code" href="structavailablePackage.html#m24">fd</a> = NULL; 02075 } 02076 <span class="keywordflow">break</span>; 02077 <span class="keywordflow">case</span> TR_REMOVED: 02078 oc = <a class="code" href="transaction_8c.html#a25">tsGetOc</a>(tsi); 02079 <span class="comment">/* If install failed, then we shouldn't erase. */</span> 02080 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m14">order</a>[oc].<a class="code" href="structtransactionElement__s.html#m5">u</a>.removed.dependsOnIndex == lastFailed) 02081 <span class="keywordflow">break</span>; 02082 02083 <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>)) 02084 ourrc++; 02085 02086 <span class="keywordflow">break</span>; 02087 } 02088 (void) <a class="code" href="group__rpmdb.html#a54">rpmdbSync</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>); 02089 } 02090 tsi = <a class="code" href="transaction_8c.html#a27">tsFreeIterator</a>(tsi); 02091 02092 ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="transaction_8c.html#a6">freeFl</a>(ts, ts-><a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>); 02093 ts-><a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a> = 0; 02094 02095 <span class="comment">/*@-nullstate@*/</span> 02096 <span class="keywordflow">if</span> (ourrc) 02097 <span class="keywordflow">return</span> -1; 02098 <span class="keywordflow">else</span> 02099 <span class="keywordflow">return</span> 0; 02100 <span class="comment">/*@=nullstate@*/</span> 02101 } </pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:59 2002 for rpm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 width=110 height=53></a>1.2.17 </small></address> </body> </html>