Sophie

Sophie

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

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>python/upgrade.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>python/upgrade.c</h1><a href="upgrade_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00005 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
00006 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
00007 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
00008 <span class="preprocessor">#include &lt;fcntl.h&gt;</span>
00009 <span class="preprocessor">#include &lt;string.h&gt;</span>
00010 
00011 <span class="preprocessor">#include &lt;glob.h&gt;</span>       <span class="comment">/* XXX rpmio.h */</span>
00012 <span class="preprocessor">#include &lt;dirent.h&gt;</span>     <span class="comment">/* XXX rpmio.h */</span>
00013 
00014 <span class="preprocessor">#include &lt;<a class="code" href="rpmlib_8h.html">rpmlib.h</a>&gt;</span>
00015 
00016 <span class="preprocessor">#include "<a class="code" href="hash_8h.html">hash.h</a>"</span>
00017 <span class="preprocessor">#include "<a class="code" href="upgrade_8h.html">upgrade.h</a>"</span>
00018 
<a name="l00019"></a><a class="code" href="upgrade_8c.html#a0">00019</a> <span class="preprocessor">#define MAXPKGS 1024</span>
00020 <span class="preprocessor"></span>
<a name="l00021"></a><a class="code" href="upgrade_8c.html#a1">00021</a> <span class="preprocessor">#define USEDEBUG 0</span>
00022 <span class="preprocessor"></span>
<a name="l00023"></a><a class="code" href="upgrade_8c.html#a2">00023</a> <span class="preprocessor">#define DEBUG(x) {   \</span>
00024 <span class="preprocessor">     if (USEDEBUG)   \</span>
00025 <span class="preprocessor">         printf x; \</span>
00026 <span class="preprocessor">     }</span>
00027 <span class="preprocessor"></span>
00028 <span class="preprocessor">#if 0</span>
00029 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">void</span> printMemStats(<span class="keywordtype">char</span> *mess)
00030 {
00031     <span class="keywordtype">char</span> buf[1024];
00032     printf(<span class="stringliteral">"%s\n"</span>, mess);
00033     sprintf(buf, <span class="stringliteral">"cat /proc/%d/status | grep VmSize"</span>, getpid());
00034     system(buf);
00035 }
00036 <span class="preprocessor">#endif</span>
00037 <span class="preprocessor"></span>
00038 <span class="comment">/*@access Header@*/</span>             <span class="comment">/* compared with NULL. */</span>
00039 <span class="comment">/*@access rpmdbMatchIterator@*/</span> <span class="comment">/* compared with NULL. */</span>
00040 
00041 <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a3">pkgCompare</a>(<span class="keywordtype">void</span> * first, <span class="keywordtype">void</span> * second);    <span class="comment">/* XXX make gcc shut up. */</span>
<a name="l00042"></a><a class="code" href="upgrade_8c.html#a3">00042</a> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a3">pkgCompare</a>(<span class="keywordtype">void</span> * first, <span class="keywordtype">void</span> * second) {
00043     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> ** a = first;
00044     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> ** b = second;
00045 
00046     <span class="comment">/* put packages w/o names at the end */</span>
00047     <span class="keywordflow">if</span> (!(*a)-&gt;name) <span class="keywordflow">return</span> 1;
00048     <span class="keywordflow">if</span> (!(*b)-&gt;name) <span class="keywordflow">return</span> -1;
00049 
00050     <span class="keywordflow">return</span> <a class="code" href="group__rpmio.html#a0">xstrcasecmp</a>((*a)-&gt;name, (*b)-&gt;name);
00051 }
00052 
00053 
00054 <span class="comment">/* Adds all files in the second file list which are not in the first</span>
00055 <span class="comment">   file list to the hash table. */</span>
<a name="l00056"></a><a class="code" href="upgrade_8c.html#a4">00056</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="upgrade_8c.html#a4">compareFileList</a>(<span class="keywordtype">int</span> availFileCount, <span class="keywordtype">char</span> ** availBaseNames,
00057                             <span class="keywordtype">char</span> ** availDirNames, <span class="keywordtype">int</span> * availDirIndexes,
00058                             <span class="keywordtype">int</span> instFileCount, <span class="keywordtype">char</span> ** instBaseNames,
00059                             <span class="keywordtype">char</span> ** instDirNames, <span class="keywordtype">int</span> * instDirIndexes,
00060                             <span class="keyword">struct</span> <a class="code" href="structhash__table.html">hash_table</a> *ht)
00061 {
00062     <span class="keywordtype">int</span> installedX, availX, rc;
00063     <span class="keywordtype">char</span> * availDir, * availBase;
00064     <span class="keywordtype">char</span> * instDir, * instBase;
00065     <span class="keyword">static</span> <span class="keywordtype">int</span> i = 0;
00066     
00067     availX = 0;
00068     installedX = 0;
00069     <span class="keywordflow">while</span> (installedX &lt; instFileCount) {
00070         instBase = instBaseNames[installedX];
00071         instDir = instDirNames[instDirIndexes[installedX]];
00072 
00073         <span class="keywordflow">if</span> (availX == availFileCount) {
00074             <span class="comment">/* All the rest have moved */</span>
00075             <a class="code" href="expression_8c.html#a0">DEBUG</a>((<span class="stringliteral">"=&gt; %d: %s%s\n"</span>, i++, instDir, instBase))
00076             <span class="keywordflow">if</span> (strncmp(instDir, <span class="stringliteral">"/etc/rc.d/"</span>, 10))
00077                 <a class="code" href="hash_8c.html#a7">htAddToTable</a>(ht, instDir, instBase);
00078             installedX++;
00079         } <span class="keywordflow">else</span> {
00080             availBase = availBaseNames[availX];
00081             availDir = availDirNames[availDirIndexes[availX]];
00082 
00083             rc = strcmp(availDir, instDir);
00084             <span class="keywordflow">if</span> (!rc) 
00085                 rc = strcmp(availBase, instBase);
00086 
00087             <span class="keywordflow">if</span> (rc &gt; 0) {
00088                 <span class="comment">/* Avail &gt; Installed -- file has moved */</span>
00089                 <a class="code" href="expression_8c.html#a0">DEBUG</a>((<span class="stringliteral">"=&gt; %d: %s%s\n"</span>, i++, instDir, instBase))
00090                 <span class="keywordflow">if</span> (strncmp(instDir, <span class="stringliteral">"/etc/rc.d/"</span>, 10))
00091                     <a class="code" href="hash_8c.html#a7">htAddToTable</a>(ht, instDir, instBase);
00092                 installedX++;
00093             } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rc &lt; 0) {
00094                 <span class="comment">/* Avail &lt; Installed -- avail has some new files */</span>
00095                 availX++;
00096             } <span class="keywordflow">else</span> {
00097                 <span class="comment">/* Files are equal -- file not moved */</span>
00098                 availX++;
00099                 installedX++;
00100             }
00101         }
00102     }
00103 }
00104 
<a name="l00105"></a><a class="code" href="upgrade_8c.html#a5">00105</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="upgrade_8c.html#a5">addLostFiles</a>(<a class="code" href="structrpmdb__s.html">rpmdb</a> db, <span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp, <span class="keyword">struct</span> <a class="code" href="structhash__table.html">hash_table</a> *ht)
00106 {
00107     <span class="keywordtype">char</span> *name;
00108     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pack;
00109     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> key;
00110     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> *keyaddr = &amp;key;
00111     <span class="keywordtype">char</span> **installedFiles;
00112     <span class="keywordtype">char</span> **installedDirs;
00113     <a class="code" href="header_8h.html#a9">int_32</a> * installedDirIndexes;
00114     <span class="keywordtype">int</span> installedFileCount;
00115     <a class="code" href="structheaderToken.html">Header</a> h = NULL;
00116     <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00117 
00118     mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, NULL, 0);
00119     <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00120 
00121         (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;name, NULL);
00122         <span class="keywordflow">if</span> (name &amp;&amp; !strcmp(name, <span class="stringliteral">"metroess"</span>)) {
00123             <span class="comment">/* metro was removed from 5.1, but leave it if it's already</span>
00124 <span class="comment">               installed */</span>
00125             <span class="keywordflow">continue</span>;
00126         }
00127         key.<a class="code" href="structpackageInfo.html#m2">name</a> = name;
00128         
00129         pack = bsearch(&amp;keyaddr, psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>, psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>,
00130                        <span class="keyword">sizeof</span>(*psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>), (<span class="keywordtype">void</span> *)<a class="code" href="upgrade_8c.html#a3">pkgCompare</a>);
00131         <span class="keywordflow">if</span> (!pack) {
00132             <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL,
00133                           (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedFiles, &amp;installedFileCount)
00134             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL,
00135                           (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedDirIndexes, NULL)
00136             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL,
00137                           (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedDirs, NULL))
00138             {
00139 
00140                 <a class="code" href="upgrade_8c.html#a4">compareFileList</a>(0, NULL, NULL, NULL, installedFileCount,
00141                                 installedFiles, installedDirs,
00142                                 installedDirIndexes, ht);
00143 
00144                 free(installedFiles);
00145                 free(installedDirs);
00146             }
00147         }
00148     }
00149 
00150     mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00151 }
00152 
<a name="l00153"></a><a class="code" href="upgrade_8c.html#a6">00153</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a6">findPackagesWithObsoletes</a>(<a class="code" href="structrpmdb__s.html">rpmdb</a> db, <span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp)
00154 {
00155     <span class="keywordtype">int</span> count, obsoletesCount;
00156     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pip;
00157     <span class="keywordtype">char</span> **obsoletes;
00158 
00159     count = psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>;
00160     pip = psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>;
00161     <span class="keywordflow">while</span> (count--) {
00162         <span class="keywordflow">if</span> ((*pip)-&gt;selected != 0) {
00163             pip++;
00164             <span class="keywordflow">continue</span>;
00165         }
00166 
00167         <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>((*pip)-&gt;h, <a class="code" href="rpmlib_8h.html#a494a194">RPMTAG_OBSOLETENAME</a>, NULL,
00168                        (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;obsoletes, &amp;obsoletesCount)) {
00169             <span class="keywordflow">while</span> (obsoletesCount--) {
00170                 <span class="keywordflow">if</span> (<a class="code" href="group__rpmdb.html#a61">rpmdbCountPackages</a>(db, obsoletes[obsoletesCount]) &gt; 0) {
00171                     (*pip)-&gt;<a class="code" href="structpackageInfo.html#m1">selected</a> = 1;
00172                     <span class="keywordflow">break</span>;
00173                 }
00174             }
00175 
00176             free(obsoletes);
00177         }
00178 
00179         pip++;
00180     }
00181 
00182     <span class="keywordflow">return</span> 0;
00183 }
00184 
<a name="l00185"></a><a class="code" href="upgrade_8c.html#a7">00185</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="upgrade_8c.html#a7">errorFunction</a>(<span class="keywordtype">void</span>)
00186 {
00187 }
00188 
<a name="l00189"></a><a class="code" href="upgrade_8c.html#a8">00189</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a8">findUpgradePackages</a>(<a class="code" href="structrpmdb__s.html">rpmdb</a> db, <span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp,
00190                                <span class="keyword">struct</span> <a class="code" href="structhash__table.html">hash_table</a> *ht)
00191 {
00192     <span class="keywordtype">int</span> skipThis;
00193     <a class="code" href="structheaderToken.html">Header</a> h, installedHeader;
00194     <span class="keywordtype">char</span> *name;
00195     <span class="keywordtype">int</span> count;
00196     <span class="keywordtype">char</span> **installedFiles;
00197     <span class="keywordtype">char</span> ** availFiles = NULL;
00198     <span class="keywordtype">char</span> ** installedDirs;
00199     <span class="keywordtype">char</span> ** availDirs = NULL;
00200     <a class="code" href="header_8h.html#a9">int_32</a> * installedDirIndexes;
00201     <a class="code" href="header_8h.html#a9">int_32</a> * availDirIndexes = NULL;
00202     <span class="keywordtype">int</span> installedFileCount, availFileCount;
00203     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pip;
00204 
00205     count = psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>;
00206     pip = psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>;
00207     <span class="keywordflow">while</span> (count--) {
00208         h = (*pip)-&gt;h;
00209         name = NULL;
00210         <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;name, NULL) ||
00211             name == NULL)
00212         {
00213             <span class="comment">/* bum header */</span>
00214             <span class="comment">/*logMessage("Failed with bad header");*/</span>
00215             <span class="keywordflow">return</span>(-1);
00216         }
00217         
00218         <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"Avail: %s\n"</span>, name));
00219 
00220     {   <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00221 
00222         mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, name, 0);
00223         skipThis = (mi != NULL ? 0 : 1);
00224         (void) <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(<a class="code" href="upgrade_8c.html#a7">errorFunction</a>);
00225         <span class="keywordflow">while</span> ((installedHeader = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00226             <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#a2">rpmVersionCompare</a>(installedHeader, h) &gt;= 0) {
00227                 <span class="comment">/* already have a newer version installed */</span>
00228                 <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"Already have newer version\n"</span>))
00229                 skipThis = 1;
00230                 <span class="keywordflow">break</span>;
00231             }
00232         }
00233         mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00234         (void) <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(NULL);
00235         <span class="keywordflow">if</span> (! skipThis) {
00236             <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"No newer version installed\n"</span>))
00237         }
00238     }
00239         
00240         <span class="keywordflow">if</span> (skipThis) {
00241             <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"DO NOT INSTALL\n"</span>))
00242         } <span class="keywordflow">else</span> {
00243             <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"UPGRADE\n"</span>))
00244             (*pip)-&gt;selected = 1;
00245 
00246             <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL,
00247                           (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availFiles, &amp;availFileCount)) {
00248                 availFiles = NULL;
00249                 availFileCount = 0;
00250             } <span class="keywordflow">else</span> {
00251                 (void) <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL,
00252                             (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirs, NULL);
00253                 (void) <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL,
00254                             (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirIndexes, NULL);
00255             }
00256 
00257         {   <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00258             mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, name, 0);
00259             <span class="keywordflow">while</span>((installedHeader = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00260                 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(installedHeader, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, 
00261                                 NULL, (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedFiles,
00262                                 &amp;installedFileCount)
00263                 &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(installedHeader, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, 
00264                                 NULL, (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedDirs, NULL)
00265                 &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(installedHeader, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, 
00266                                 NULL, (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;installedDirIndexes, NULL))
00267                 {
00268 
00269                     <a class="code" href="upgrade_8c.html#a4">compareFileList</a>(availFileCount, availFiles,
00270                                     availDirs, availDirIndexes,
00271                                     installedFileCount, installedFiles, 
00272                                     installedDirs, installedDirIndexes,
00273                                     ht);
00274 
00275                     free(installedFiles);
00276                     free(installedDirs);
00277                 }
00278             }
00279             mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00280         }
00281 
00282             <span class="keywordflow">if</span> (availFiles) {
00283                 free(availFiles);
00284                 free(availDirs);
00285             }
00286         }
00287 
00288         <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"\n\n"</span>))
00289 
00290         pip++;
00291     }
00292 
00293     <span class="keywordflow">return</span> 0;
00294 }
00295 
<a name="l00296"></a><a class="code" href="upgrade_8c.html#a9">00296</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a9">removeMovedFilesAlreadyHandled</a>(<span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp,
00297                                           <span class="keyword">struct</span> <a class="code" href="structhash__table.html">hash_table</a> *ht)
00298 {
00299     <span class="keywordtype">char</span> *name;
00300     <span class="keywordtype">int</span> i, count;
00301     <a class="code" href="structheaderToken.html">Header</a> h;
00302     <span class="keywordtype">char</span> ** availFiles, ** availDirs;
00303     <a class="code" href="header_8h.html#a9">int_32</a> * availDirIndexes;
00304     <span class="keywordtype">int</span> availFileCount;
00305     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pip;
00306 
00307     count = psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>;
00308     pip = psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>;
00309     <span class="keywordflow">while</span> (count--) {
00310         h = (*pip)-&gt;h;
00311         <span class="keywordflow">if</span> ((*pip)-&gt;selected != 0) {
00312             name = NULL;
00313             (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;name, NULL);
00314 
00315             <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL,
00316                           (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availFiles, &amp;availFileCount)
00317 
00318             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, 
00319                                (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirs, NULL)
00320             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, 
00321                                (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirIndexes, NULL))
00322             {
00323 
00324                 <span class="keywordflow">for</span> (i = 0; i &lt; availFileCount; i++) {
00325                     <span class="keywordflow">if</span> (<a class="code" href="hash_8c.html#a6">htInTable</a>(ht, availDirs[availDirIndexes[i]],
00326                                           availFiles[i])) {
00327                         <a class="code" href="hash_8c.html#a8">htRemoveFromTable</a>(ht, availDirs[availDirIndexes[i]],
00328                                           availFiles[i]);
00329                         <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"File already in %s: %s%s\n"</span>, name, 
00330                                 availDirs[availDirIndexes[i]], availFiles[i]))
00331                         <span class="keywordflow">break</span>;
00332                     }
00333                 }
00334 
00335                 free(availFiles);
00336                 free(availDirs);
00337             }
00338         }
00339 
00340         pip++;
00341     }
00342 
00343     <span class="keywordflow">return</span> 0;
00344 }
00345 
<a name="l00346"></a><a class="code" href="upgrade_8c.html#a10">00346</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a10">findPackagesWithRelocatedFiles</a>(<span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp,
00347                                           <span class="keyword">struct</span> <a class="code" href="structhash__table.html">hash_table</a> *ht)
00348 {
00349     <span class="keywordtype">char</span> *name;
00350     <span class="keywordtype">int</span> i, count;
00351     <a class="code" href="structheaderToken.html">Header</a> h;
00352     <span class="keywordtype">char</span> **availFiles, **availDirs;
00353     <a class="code" href="header_8h.html#a9">int_32</a> * availDirIndexes;
00354     <span class="keywordtype">int</span> availFileCount;
00355     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pip;
00356     <a class="code" href="header_8h.html#a10">int_16</a> * availFileModes;
00357 
00358     count = psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>;
00359     pip = psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>;
00360     <span class="keywordflow">while</span> (count--) {
00361         h = (*pip)-&gt;h;
00362         <span class="keywordflow">if</span> (! (*pip)-&gt;selected) {
00363             name = NULL;
00364             (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;name, NULL);
00365 
00366             <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,
00367                          (<span class="keywordtype">void</span> **) &amp;availFiles, &amp;availFileCount)
00368             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL,
00369                             (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirs, NULL)
00370             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL,
00371                             (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availDirIndexes, NULL)
00372             &amp;&amp;  <a class="code" href="group__header.html#a41">headerGetEntryMinMemory</a>(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL,
00373                             (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &amp;availFileModes, NULL))
00374             {
00375 
00376                 <span class="keywordflow">for</span> (i = 0; i &lt; availFileCount; i++) {
00377                     <span class="keywordflow">if</span> (S_ISDIR(availFileModes[i])) <span class="keywordflow">continue</span>;
00378 
00379                     <span class="keywordflow">if</span> (<a class="code" href="hash_8c.html#a6">htInTable</a>(ht, availDirs[availDirIndexes[i]], 
00380                                     availFiles[i])) {
00381                         <a class="code" href="hash_8c.html#a8">htRemoveFromTable</a>(ht, availDirs[availDirIndexes[i]],
00382                                           availFiles[i]);
00383                         <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"Found file in %s: %s%s\n"</span>, name,
00384                                 availDirs[availDirIndexes[i]], availFiles[i]))
00385                         (*pip)-&gt;selected = 1;
00386                     }
00387                 }
00388                 free(availFiles);
00389                 free(availDirs);
00390             }
00391         }
00392 
00393         pip++;
00394     }
00395 
00396     <span class="keywordflow">return</span> 0;
00397 }
00398 
00399 <span class="comment">/*</span>
00400 <span class="comment">static void printCount(struct pkgSet *psp)</span>
00401 <span class="comment">{</span>
00402 <span class="comment">    int i, upgradeCount;</span>
00403 <span class="comment">    struct packageInfo *pip;</span>
00404 <span class="comment">    </span>
00405 <span class="comment">    upgradeCount = 0;</span>
00406 <span class="comment">    pip = psp-&gt;packages;</span>
00407 <span class="comment">    i = psp-&gt;numPackages;</span>
00408 <span class="comment">    while (i--) {</span>
00409 <span class="comment">        if (pip-&gt;selected) {</span>
00410 <span class="comment">            upgradeCount++;</span>
00411 <span class="comment">        }</span>
00412 <span class="comment">        pip++;</span>
00413 <span class="comment">    }</span>
00414 <span class="comment">    logMessage("marked %d packages for upgrade", upgradeCount);</span>
00415 <span class="comment">}</span>
00416 <span class="comment">*/</span>
00417 
<a name="l00418"></a><a class="code" href="upgrade_8c.html#a11">00418</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a11">unmarkPackagesAlreadyInstalled</a>(<a class="code" href="structrpmdb__s.html">rpmdb</a> db, <span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp)
00419 {
00420     <a class="code" href="structheaderToken.html">Header</a> h, installedHeader;
00421     <span class="keywordtype">char</span> *name;
00422     <span class="keyword">struct </span><a class="code" href="structpackageInfo.html">packageInfo</a> **pip;
00423     <span class="keywordtype">int</span> count;
00424 
00425     count = psp-&gt;<a class="code" href="structpkgSet.html#m1">numPackages</a>;
00426     pip = psp-&gt;<a class="code" href="structpkgSet.html#m0">packages</a>;
00427     <span class="keywordflow">while</span> (count--) {
00428         <span class="keywordflow">if</span> ((*pip)-&gt;selected != 0) {
00429             h = (*pip)-&gt;h;
00430             <span class="comment">/* If this package is already installed, don't bother */</span>
00431             name = NULL;
00432             <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a40">headerGetEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;name, NULL) ||
00433                 name == NULL)
00434             {
00435                 <span class="comment">/* bum header */</span>
00436                 <span class="comment">/*logMessage("Failed with bad header");*/</span>
00437                 <span class="keywordflow">return</span>(-1);
00438             }
00439           { <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00440 
00441             mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, name, 0);
00442             (void) <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(<a class="code" href="upgrade_8c.html#a7">errorFunction</a>);
00443             <span class="keywordflow">while</span>((installedHeader = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00444                 <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#a2">rpmVersionCompare</a>(installedHeader, h) &gt;= 0) {
00445                     <span class="comment">/* already have a newer version installed */</span>
00446                     <a class="code" href="expression_8c.html#a0">DEBUG</a> ((<span class="stringliteral">"Already have newer version\n"</span>))
00447                     (*pip)-&gt;selected = 0;
00448                     <span class="keywordflow">break</span>;
00449                 }
00450             }
00451             mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00452             (void) <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(NULL);
00453           }
00454         }
00455 
00456         pip++;
00457     }
00458 
00459     <span class="keywordflow">return</span> 0;
00460 }
00461             
<a name="l00462"></a><a class="code" href="upgrade_8c.html#a12">00462</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="upgrade_8c.html#a12">emptyErrorCallback</a>(<span class="keywordtype">void</span>) {
00463 }
00464 
<a name="l00465"></a><a class="code" href="upgrade_8c.html#a13">00465</a> <span class="keywordtype">int</span> <a class="code" href="upgrade_8c.html#a13">ugFindUpgradePackages</a>(<span class="keyword">struct</span> <a class="code" href="structpkgSet.html">pkgSet</a> *psp, <span class="keywordtype">char</span> *installRoot)
00466 {
00467     <a class="code" href="structrpmdb__s.html">rpmdb</a> db;
00468     <span class="keyword">struct </span><a class="code" href="structhash__table.html">hash_table</a> *hashTable;
00469     <a class="code" href="rpmerr_8h.html#a10">rpmErrorCallBackType</a> old;    
00470 
00471     <span class="comment">/*logDebugMessage(("ugFindUpgradePackages() ..."));*/</span>
00472 
00473 <span class="comment">/*      rpmReadConfigFiles(NULL, NULL); */</span>
00474 
00475     <a class="code" href="rpmmessages_8h.html#a8">rpmSetVerbosity</a>(<a class="code" href="rpmmessages_8h.html#a5">RPMMESS_FATALERROR</a>);
00476     old = <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(<a class="code" href="upgrade_8c.html#a12">emptyErrorCallback</a>);
00477 
00478     <span class="keywordflow">if</span> (<a class="code" href="group__rpmdb.html#a57">rpmdbOpen</a>(installRoot, &amp;db, O_RDONLY, 0644)) {
00479         <span class="comment">/*logMessage("failed opening %s/var/lib/rpm/packages.rpm",</span>
00480 <span class="comment">                     installRoot);*/</span>
00481         <span class="keywordflow">return</span>(-1);
00482     }
00483 
00484     (void) <a class="code" href="rpmerr_8h.html#a8">rpmErrorSetCallback</a>(old);
00485     <a class="code" href="rpmmessages_8h.html#a8">rpmSetVerbosity</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>);
00486     
00487     hashTable = <a class="code" href="hash_8c.html#a1">htNewTable</a>(1103);
00488     <span class="keywordflow">if</span> (hashTable == NULL) <span class="keywordflow">return</span> (-1);
00489 
00490     <span class="comment">/* For all packages that are installed, if there is no package       */</span>
00491     <span class="comment">/* available by that name, add the package's files to the hash table */</span>
00492     <a class="code" href="upgrade_8c.html#a5">addLostFiles</a>(db, psp, hashTable);
00493     <span class="comment">/*logDebugMessage(("added lost files"));</span>
00494 <span class="comment">    printCount(psp);*/</span>
00495     
00496     <span class="comment">/* Find packges that are new, and mark them in installThisPackage,  */</span>
00497     <span class="comment">/* updating availPkgs with the count.  Also add files to the hash   */</span>
00498     <span class="comment">/* table that do not exist in the new package - they may have moved */</span>
00499     <span class="keywordflow">if</span> (<a class="code" href="upgrade_8c.html#a8">findUpgradePackages</a>(db, psp, hashTable)) {
00500         (void) <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(db);
00501         <span class="keywordflow">return</span>(-1);
00502     }
00503     <span class="comment">/*logDebugMessage(("found basic packages to upgrade"));</span>
00504 <span class="comment">    printCount(psp);</span>
00505 <span class="comment">    hash_stats(hashTable);*/</span>
00506 
00507     <span class="comment">/* Remove any files that were added to the hash table that are in */</span>
00508     <span class="comment">/* some other package marked for upgrade.                         */</span>
00509     (void) <a class="code" href="upgrade_8c.html#a9">removeMovedFilesAlreadyHandled</a>(psp, hashTable);
00510     <span class="comment">/*logDebugMessage(("removed extra files which have moved"));</span>
00511 <span class="comment">    printCount(psp);*/</span>
00512 
00513     (void) <a class="code" href="upgrade_8c.html#a10">findPackagesWithRelocatedFiles</a>(psp, hashTable);
00514     <span class="comment">/*logDebugMessage(("found packages with relocated files"));</span>
00515 <span class="comment">    printCount(psp);*/</span>
00516 
00517     (void) <a class="code" href="upgrade_8c.html#a6">findPackagesWithObsoletes</a>(db, psp);
00518     <span class="comment">/*logDebugMessage(("found packages that obsolete installed packages"));</span>
00519 <span class="comment">    printCount(psp);*/</span>
00520     
00521     (void) <a class="code" href="upgrade_8c.html#a11">unmarkPackagesAlreadyInstalled</a>(db, psp);
00522     <span class="comment">/*logDebugMessage(("unmarked packages already installed"));</span>
00523 <span class="comment">    printCount(psp);*/</span>
00524     
00525     <a class="code" href="hash_8c.html#a2">htFreeHashTable</a>(hashTable);
00526     
00527     <span class="comment">/*printMemStats("Done");*/</span>
00528 
00529     (void) <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(db);
00530 
00531     <span class="keywordflow">return</span> 0;
00532 }
</pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:15:00 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>