Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 2269bb274471fd2722517c2c0b740d7f > files > 481

rpm-devel-4.0.4-19mdk.i586.rpm

<!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> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </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 &lt;<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>&gt;</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 &lt;sys/statvfs.h&gt;</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 &lt;sys/vfs.h&gt;</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 &lt;sys/mount.h&gt;</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 &lt;sys/statfs.h&gt;</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) &amp;&amp; !(b)) || ((a) &amp;&amp; (b) &amp;&amp; !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 &lt; ts-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; oc++, e++) {
00103             <span class="keywordflow">switch</span> (ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> + ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> = probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> = 0;
00131     probs-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> == probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a>) {
00146         <span class="keywordflow">if</span> (probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a>)
00147             probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> *= 2;
00148         <span class="keywordflow">else</span>
00149             probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> = 2;
00150         probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>,
00151                         probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m1">numProblemsAlloced</a> * <span class="keyword">sizeof</span>(*probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>));
00152     }
00153 
00154     p = probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a> + probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>++;
00155     p-&gt;<a class="code" href="structrpmProblem__s.html#m4">type</a> = type;
00156     <span class="comment">/*@-assignexpose@*/</span>
00157     p-&gt;<a class="code" href="structrpmProblem__s.html#m2">key</a> = alp-&gt;<a class="code" href="structavailablePackage.html#m22">key</a>;
00158     <span class="comment">/*@=assignexpose@*/</span>
00159     p-&gt;<a class="code" href="structrpmProblem__s.html#m7">ulong1</a> = ulong1;
00160     p-&gt;<a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a> = 0;
00161 
00162     <span class="keywordflow">if</span> (dn || bn) {
00163         p-&gt;<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-&gt;<a class="code" href="structrpmProblem__s.html#m6">str1</a> = NULL;
00169 
00170     <span class="keywordflow">if</span> (alp) {
00171         p-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(alp-&gt;<a class="code" href="structavailablePackage.html#m0">h</a>);
00172         p-&gt;<a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a> =
00173             t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(strlen(alp-&gt;<a class="code" href="structavailablePackage.html#m1">name</a>) +
00174                         strlen(alp-&gt;<a class="code" href="structavailablePackage.html#m2">version</a>) +
00175                         strlen(alp-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m3">release</a>);
00181     } <span class="keywordflow">else</span> {
00182         p-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a> = NULL;
00183         p-&gt;<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, &amp;n, &amp;v, &amp;r);
00189         p-&gt;<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-&gt;<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>, &amp;type, (<span class="keywordtype">void</span> **) &amp;pkgArch, &amp;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, &amp;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>, &amp;type, (<span class="keywordtype">void</span> **) &amp;pkgOs, &amp;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 &lt; probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>; i++) {
00261         <a class="code" href="structrpmProblem__s.html">rpmProblem</a> p = probs-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a> + i;
00262         p-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(p-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a>);
00263         p-&gt;<a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-&gt;<a class="code" href="structrpmProblem__s.html#m0">pkgNEVR</a>);
00264         p-&gt;<a class="code" href="structrpmProblem__s.html#m1">altNEVR</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-&gt;<a class="code" href="structrpmProblem__s.html#m1">altNEVR</a>);
00265         p-&gt;<a class="code" href="structrpmProblem__s.html#m6">str1</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(p-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00316     <a class="code" href="rpmlib_8h.html#a70">HAE_t</a> hae = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m5">hae</a>;
00317     <a class="code" href="rpmlib_8h.html#a71">HME_t</a> hme = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>;
00318     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>;
00321     <span class="keywordtype">int</span> allowBadRelocate = (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a353">RPMPROB_FILTER_FORCERELOCATE</a>);
00322     <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * rawRelocations = alp-&gt;<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>, &amp;validType,
00347                         (<span class="keywordtype">void</span> **) &amp;validRelocations, &amp;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 &lt; 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> &amp;&amp; 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> &amp;&amp; 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 &lt; 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 &amp;&amp; !allowBadRelocate &amp;&amp; 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 &gt; 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 &lt; numRelocations; i++) {
00429         <span class="keywordtype">int</span> madeSwap;
00430         madeSwap = 0;
00431         <span class="keywordflow">for</span> (j = 1; j &lt; 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) &lt;= 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 &lt; 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 -&gt; %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 &lt; numValid; i++) {
00467             <span class="keywordflow">for</span> (j = 0; j &lt; 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> **) &amp;baseNames, &amp;fileCount);
00493     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;dirIndexes, NULL);
00494     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;dirNames, &amp;dirCount);
00495     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fFlags, NULL);
00496     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;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 &gt;= 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-&gt;<a class="code" href="structavailablePackage.html#m21">multiLib</a> &amp;&amp; !<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 &gt;= 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 &gt;= 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 &lt; 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 &lt; 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 &lt; dirCount; j++) {
00574                     len = strlen(dirNames[j]) - 1;
00575                     <span class="keywordflow">while</span> (len &gt; 0 &amp;&amp; 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 &lt; 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 &gt; 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 &lt; 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 &lt; 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 &lt; 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 &gt;= 0; i--) {
00651         <span class="keywordflow">for</span> (j = numRelocations - 1; j &gt;= 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 &amp;&amp; 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>, &amp;t, &amp;p, &amp;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>, &amp;t, &amp;p, &amp;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>, &amp;t, &amp;p, &amp;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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = hfd(fi-&gt;<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> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, &amp;fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-&gt;<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> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, &amp;fi-&gt;<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> **) &amp;fi-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>;
00738     <a class="code" href="structrpmProblem__s.html">rpmProblem</a> t = target-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) &lt; filter-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a>) {
00742         <span class="keywordflow">if</span> (!f-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) &lt; target-&gt;<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-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a> == t-&gt;<a class="code" href="structrpmProblem__s.html#m3">h</a> &amp;&amp; f-&gt;<a class="code" href="structrpmProblem__s.html#m4">type</a> == t-&gt;<a class="code" href="structrpmProblem__s.html#m4">type</a> &amp;&amp; t-&gt;<a class="code" href="structrpmProblem__s.html#m2">key</a> == f-&gt;<a class="code" href="structrpmProblem__s.html#m2">key</a> &amp;&amp;
00749                      <a class="code" href="transaction_8c.html#a2">XSTRCMP</a>(f-&gt;<a class="code" href="structrpmProblem__s.html#m6">str1</a>, t-&gt;<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-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) == target-&gt;<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-&gt;<a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a> = f-&gt;<a class="code" href="structrpmProblem__s.html#m5">ignoreProblem</a>;
00762         t++, f++;
00763     }
00764 
00765     <span class="keywordflow">if</span> ((t - target-&gt;<a class="code" href="structrpmProblemSet__s.html#m2">probs</a>) &lt; target-&gt;<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-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> &lt; b-&gt;<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-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> &gt; b-&gt;<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 &amp; <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, &amp;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 &amp; <a class="code" href="group__rpmtrans.html#a19a327">RPMTRANS_FLAG_ALLFILES</a>) &amp;&amp;
00808            (newFlags &amp; <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 &gt;= 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 &amp;&amp; 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> &amp;&amp; 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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00903     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<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>, &amp;shared-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>, <span class="keyword">sizeof</span>(shared-&gt;<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>, &amp;omtype, (<span class="keywordtype">void</span> **) &amp;otherMd5s, NULL);
00925     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>, &amp;oltype, (<span class="keywordtype">void</span> **) &amp;otherLinks, NULL);
00926     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;otherStates, NULL);
00927     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;otherModes, NULL);
00928     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;otherFlags, NULL);
00929     (void) hge(h, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;otherSizes, NULL);
00930 
00931     fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>));
00932 
00933     <span class="keywordflow">for</span> (i = 0; i &lt; sharedCount; i++, shared++) {
00934         <span class="keywordtype">int</span> otherFileNum, fileNum;
00935         otherFileNum = shared-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>;
00936         fileNum = shared-&gt;<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 &amp;&amp; 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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[fileNum],
00949                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[fileNum],
00950                         fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>,
00953                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[fileNum]], fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[fileNum], h, 0);
00954             <span class="keywordflow">if</span> (!(otherFlags[otherFileNum] | fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum])
00955                         &amp; <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) {
00956                 <span class="comment">/*@-assignexpose@*/</span>
00957                 <span class="keywordflow">if</span> (!shared-&gt;<a class="code" href="structsharedFileInfo.html#m3">isRemoved</a>)
00958                     fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum]) &amp; <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) {
00964             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[fileNum] = <a class="code" href="transaction_8c.html#a18">decideFileFate</a>(
00965                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[fileNum]],
00966                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[fileNum],
00967                         otherModes[otherFileNum],
00968                         otherMd5s[otherFileNum],
00969                         otherLinks[otherFileNum],
00970                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[fileNum],
00971                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[fileNum],
00972                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>[fileNum],
00973                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[fileNum],
00974                         transFlags);
00975         }
00976 
00977         fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>,       <span class="comment">/* XXX memory leak */</span>
00985                            <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>) * (numReplaced + 1));
00986     fi-&gt;<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-&gt;<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                         &amp;shared-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>, <span class="keyword">sizeof</span>(shared-&gt;<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> **) &amp;otherStates, NULL);
01012 
01013     <span class="keywordflow">for</span> (i = 0; i &lt; sharedCount; i++, shared++) {
01014         <span class="keywordtype">int</span> otherFileNum, fileNum;
01015         otherFileNum = shared-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>;
01016         fileNum = shared-&gt;<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-&gt;<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 &lt; fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i]))
01048             <span class="keywordflow">continue</span>;
01049 
01050         j = strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]) + strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) + 1;
01051         <span class="keywordflow">if</span> (j &gt; 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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]), fi-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m3">bsize</a> &amp;&amp; ds-&gt;<a class="code" href="structdiskspaceInfo.html#m0">dev</a> != fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i].<a class="code" href="structfingerPrint__s.html#m0">entry</a>-&gt;<a class="code" href="structfprintCacheEntry__s.html#m1">dev</a>) ds++;
01061             <span class="keywordflow">if</span> (!ds-&gt;<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, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i], (<span class="keyword">const</span> <span class="keywordtype">void</span> ***) &amp;recs, &amp;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 &lt; numRecs &amp;&amp; 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 &gt;= 0; otherPkgNum--) {
01100             <span class="comment">/* Added packages need only look at other added packages. */</span>
01101             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED &amp;&amp; recs[otherPkgNum]-&gt;<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 &lt; recs[otherPkgNum]-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> + i) == (recs[otherPkgNum]-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>[i], recs[otherPkgNum]-&gt;<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]-&gt;<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-&gt;<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 &lt; 0) {
01128                 <span class="comment">/* XXX is this test still necessary? */</span>
01129                 <span class="keywordflow">if</span> (fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) &amp;&amp; 
01132                         !lstat(filespec, &amp;sb)) {
01133                     <span class="comment">/* Here is a non-overlapped pre-existing config file. */</span>
01134                     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <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-&gt;<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 &amp;&amp; <a class="code" href="transaction_8c.html#a19">filecmp</a>(recs[otherPkgNum]-&gt;fmodes[otherFileNum],
01144                         recs[otherPkgNum]-&gt;fmd5s[otherFileNum],
01145                         recs[otherPkgNum]-&gt;flinks[otherFileNum],
01146                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i],
01147                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[i],
01148                         fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>,
01150                                 filespec, NULL, recs[otherPkgNum]-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-&gt;<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]-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>[otherFileNum];
01155 
01156             <span class="keywordflow">if</span> ((fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>) &amp;&amp; !lstat(filespec, &amp;sb)) {
01157                 <span class="comment">/* Here is an overlapped  pre-existing config file. */</span>
01158                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <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-&gt;<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 &gt;= 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]-&gt;<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-&gt;<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]-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i]))
01176                 <span class="keywordflow">break</span>;
01177             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> &amp;&amp; fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i]) &amp;&amp; (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>))) {
01180                 fi-&gt;<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) &amp;&amp; strcmp(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>[i], mdsum)) {
01187                     fi-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>[i], ds-&gt;<a class="code" href="structdiskspaceInfo.html#m3">bsize</a>);
01197 
01198             <span class="keywordflow">switch</span> (fi-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>++;
01203                 ds-&gt;<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-&gt;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-&gt;<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> += s;
01213                 ds-&gt;<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> -= <a class="code" href="transaction_8c.html#a1">BLOCK_ROUND</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>[i], ds-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>--;
01218                 ds-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> -= <a class="code" href="transaction_8c.html#a1">BLOCK_ROUND</a>(fixupSize, ds-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m0">h</a>);
01240     <span class="keywordflow">if</span> (result &lt;= 0)
01241         rc = 0;
01242     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (result &gt; 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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <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 &amp;&amp; *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 &amp;&amp; *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 &amp;&amp; *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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*drc));
01294     memset(drc, 0, fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*dff));
01296     memset(dff, 0, fi-&gt;<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 &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
01299         <span class="keywordtype">char</span> **nsp;
01300 
01301         bn = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i];
01302         bnlen = strlen(bn);
01303         ix = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i];
01304         dn = fi-&gt;<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-&gt;<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 &amp;&amp; *nsp; nsp++) {
01321             <span class="keywordtype">int</span> len;
01322 
01323             len = strlen(*nsp);
01324             <span class="keywordflow">if</span> (dnlen &gt;= 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 &lt; (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 &amp;&amp; *nsp) {
01341             drc[ix]--;  dff[ix] = 1;
01342             fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> &amp;&amp; languages &amp;&amp; *fi-&gt;<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-&gt;<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> &amp;&amp; *le != <span class="charliteral">'|'</span>; le++)
01356                         {};
01357                     <span class="keywordflow">if</span> ((le-l) &gt; 0 &amp;&amp; !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-&gt;<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 &amp;&amp; (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a>)) {
01375             drc[ix]--;  dff[ix] = 1;
01376             fi-&gt;<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 &lt; fi-&gt;<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-&gt;<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 &gt; dn &amp;&amp; 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 &lt; fi-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structtsIterator__s.html#m0">ts</a>;
01463         <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> + oc;
01464         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED)
01465             alp = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> + ts-&gt;<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-&gt;<a class="code" href="structtsIterator__s.html#m0">ts</a> = ts;
01494     iter-&gt;<a class="code" href="structtsIterator__s.html#m1">reverse</a> = ((ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a336">RPMTRANS_FLAG_REVERSE</a>) ? 1 : 0);
01495     iter-&gt;<a class="code" href="structtsIterator__s.html#m3">oc</a> = (iter-&gt;<a class="code" href="structtsIterator__s.html#m1">reverse</a> ? (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a> - 1) : 0);
01496     iter-&gt;<a class="code" href="structtsIterator__s.html#m2">ocsave</a> = iter-&gt;<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-&gt;<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-&gt;<a class="code" href="structtsIterator__s.html#m1">reverse</a>) {
01514         <span class="keywordflow">if</span> (iter-&gt;<a class="code" href="structtsIterator__s.html#m3">oc</a> &gt;= 0)              oc = iter-&gt;<a class="code" href="structtsIterator__s.html#m3">oc</a>--;
01515     } <span class="keywordflow">else</span> {
01516         <span class="keywordflow">if</span> (iter-&gt;<a class="code" href="structtsIterator__s.html#m3">oc</a> &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>)  oc = iter-&gt;<a class="code" href="structtsIterator__s.html#m3">oc</a>++;
01517     }
01518     iter-&gt;<a class="code" href="structtsIterator__s.html#m2">ocsave</a> = oc;
01519     <span class="keywordflow">if</span> (oc != -1)
01520         fi = ts-&gt;<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)-&gt;notify) (void) (_ts)-&gt;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 = &amp;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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> = transFlags;
01551     <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a323">RPMTRANS_FLAG_NOSCRIPTS</a>)
01552         ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a325">RPMTRANS_FLAG_NOTRIGGERS</a>)
01554         ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; (<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a> = notify;
01561     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a> = notifyData;
01562     <span class="comment">/*@-assignexpose@*/</span>
01563     ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> = ignoreSet;
01566     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a>);
01567     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a> = <a class="code" href="lib_2misc_8c.html#a9">currentDirectory</a>();
01568     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0;
01569     <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-&gt;<a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 0;
01570     ts-&gt;<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-&gt;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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a357">RPMPROB_FILTER_DISKSPACE</a>) &amp;&amp;
01579                 !<a class="code" href="fs_8c.html#a5">rpmGetFilesystemList</a>(&amp;ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>, &amp;ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>)) {
01580         <span class="keyword">struct </span>stat sb;
01581 
01582         ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a>);
01583         dip = ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a>), ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a> + 1);
01584 
01585         <span class="keywordflow">for</span> (i = 0; (i &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>) &amp;&amp; dip; i++)
01586             <span class="keywordflow">if</span> (strncmp(ts-&gt;<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(&amp;sfb, 0, <span class="keyword">sizeof</span>(sfb));
01590             <span class="keywordflow">if</span> (statvfs(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &amp;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(&amp;sfb, 0, <span class="keyword">sizeof</span>(sfb));
01600             <span class="keywordflow">if</span> (statfs(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &amp;sfb, <span class="keyword">sizeof</span>(sfb), 0))
01601 <span class="preprocessor">#  else</span>
01602 <span class="preprocessor"></span>            memset(&amp;sfb, 0, <span class="keyword">sizeof</span>(sfb));
01603             <span class="keywordflow">if</span> (statfs(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &amp;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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a> = 0;
01611                 ts-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a>[i].<a class="code" href="structdiskspaceInfo.html#m5">iavail</a> = !(sfb.f_ffree == 0 &amp;&amp; sfb.f_files == 0)
01623                                 ? sfb.f_ffree : -1;
01624 
01625                 (void) stat(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m6">filesystems</a>[i], &amp;sb);
01626                 ts-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>;
01644         (alp - ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>) &lt; ts-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m0">h</a>) &amp;&amp; !(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a351">RPMPROB_FILTER_IGNOREARCH</a>))
01648             <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m0">h</a>) &amp;&amp; !(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a350">RPMPROB_FILTER_IGNOREOS</a>))
01651             <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, alp-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a352">RPMPROB_FILTER_REPLACEPKG</a>) &amp;&amp; !alp-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, alp-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a> &gt; 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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m9">removedPackages</a>, ts-&gt;<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, &amp;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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a> = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m3">size</a> + ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a>;
01703     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, <span class="keyword">sizeof</span>(*ts-&gt;<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-&gt;<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-&gt;type must be set for tsGetAlp() to "work" */</span>
01716         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> = ts-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) {
01718         <span class="keywordflow">case</span> TR_ADDED:
01719             i = ts-&gt;<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-&gt;type must be set for tsGetAlp() to "work" */</span>
01721             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = <a class="code" href="transaction_8c.html#a26">tsGetAlp</a>(tsi);
01722             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = 0;
01723             <a class="code" href="psm_8c.html#a3">loadFi</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-&gt;<a class="code" href="structavailablePackage.html#m0">h</a>, fi);
01724             <span class="keywordflow">if</span> (fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = NULL;
01736             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>,
01740                                 &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>, <span class="keyword">sizeof</span>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>));
01741                 <span class="keywordflow">if</span> ((fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL)
01742                     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(fi-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>)
01755             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>);
01763         <span class="comment">/*@=unrecog =superuser @*/</span>
01764         ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 1;
01765         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>);
01782         <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>,
01794         NULL, ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>),
01807                         ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>, NULL, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>));
01808         <span class="comment">/*@=moduncon@*/</span>
01809 
01810         <span class="keywordflow">if</span> (fi-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a>, matches, fi-&gt;<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 &lt; fi-&gt;<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 &lt; fi-&gt;<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 &lt; <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 &amp;&amp; k &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m15">orderCount</a>; k++) {
01833                     <span class="keywordflow">switch</span> (ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structsharedFileInfo.html#m0">pkgFileNum</a> = i;
01844                 shared-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> = <a class="code" href="group__dbi.html#a24">dbiIndexRecordOffset</a>(matches[i], j);
01845                 shared-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a> = <a class="code" href="group__dbi.html#a25">dbiIndexRecordFileNumber</a>(matches[i], j);
01846                 shared-&gt;<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-&gt;<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 &lt; 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 &lt; numShared; nexti++) {
01866                 <span class="keywordflow">if</span> (sharedList[nexti].<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> != shared-&gt;<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 &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m10">numRemovedPackages</a>; j++) {
01873                 <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m9">removedPackages</a>[j] != shared-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, shared, nexti - i,
01883                 !(beingRemoved || (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a355">RPMPROB_FILTER_REPLACEOLDFILES</a>)),
01884                          ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m4">ignoreSet</a> &amp; <a class="code" href="rpmlib_8h.html#a504a354">RPMPROB_FILTER_REPLACENEWFILES</a>)
01898                     ? NULL : ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>), ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m7">di</a> &amp;&amp; fi-&gt;<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 &lt; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m5">filesystemCount</a>; i++) {
01906 
01907                 dip = ts-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m5">iavail</a> &lt;= 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-&gt;<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a>) &gt; dip-&gt;<a class="code" href="structdiskspaceInfo.html#m4">bavail</a>)
01914                     <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a298">RPMPROB_DISKSPACE</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>,
01915                                 ts-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m1">bneeded</a>) - dip-&gt;<a class="code" href="structdiskspaceInfo.html#m4">bavail</a>) * dip-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>) &gt; dip-&gt;<a class="code" href="structdiskspaceInfo.html#m5">iavail</a>)
01919                     <a class="code" href="transaction_8c.html#a9">psAppend</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>, <a class="code" href="rpmlib_8h.html#a500a299">RPMPROB_DISKNODES</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>,
01920                                 ts-&gt;<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-&gt;<a class="code" href="structdiskspaceInfo.html#m2">ineeded</a>) - dip-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0;
01935         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a>,
01944         NULL, ts-&gt;<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-&gt;fi = fi;
01954         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> == 0)
01955             <span class="keywordflow">continue</span>;
01956         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m3">fps</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a322">RPMTRANS_FLAG_BUILD_PROBS</a>) ||
01967            (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>-&gt;<a class="code" href="structrpmProblemSet__s.html#m0">numProblems</a> &amp;&amp; (!okProbs || <a class="code" href="transaction_8c.html#a16">psTrim</a>(okProbs, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>))))
01968     {
01969         *newProbs = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m3">probs</a>;
01970 
01971         ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="transaction_8c.html#a6">freeFl</a>(ts, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>);
01972         ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m18">flEntries</a> = 0;
01973         <span class="comment">/*@-nullstate@*/</span>
01974         <span class="keywordflow">return</span> ts-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; (<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-&gt;fi = fi;
01985             <span class="keywordflow">switch</span> (fi-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <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-&gt;fi = fi;
02009         <span class="keywordflow">switch</span> (fi-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>);
02014             i = alp - ts-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02017             <span class="keywordflow">if</span> (alp-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a> == NULL) {
02018                 alp-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a> = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m22">key</a>, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>);
02020                 <span class="keywordflow">if</span> (alp-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a>, &amp;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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m22">key</a>, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>);
02031                         alp-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a>) gotfd = 1;
02040                 }
02041             }
02042 
02043             <span class="keywordflow">if</span> (alp-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>) {
02047                     hsave = <a class="code" href="group__header.html#a14">headerLink</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02048                     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02049                 }
02050                 fi-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m21">multiLib</a>)
02052                     ts-&gt;<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-&gt;<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-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02060                 <span class="keywordflow">if</span> (hsave) {
02061                     fi-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-&gt;<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-&gt;<a class="code" href="structavailablePackage.html#m22">key</a>, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>);
02074                 alp-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a> = <a class="code" href="transaction_8c.html#a6">freeFl</a>(ts, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m17">flList</a>);
02093     ts-&gt;<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>