<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>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 <stdio.h></span> 00006 <span class="preprocessor">#include <stdlib.h></span> 00007 <span class="preprocessor">#include <unistd.h></span> 00008 <span class="preprocessor">#include <fcntl.h></span> 00009 <span class="preprocessor">#include <string.h></span> 00010 00011 <span class="preprocessor">#include <glob.h></span> <span class="comment">/* XXX rpmio.h */</span> 00012 <span class="preprocessor">#include <dirent.h></span> <span class="comment">/* XXX rpmio.h */</span> 00013 00014 <span class="preprocessor">#include <<a class="code" href="rpmlib_8h.html">rpmlib.h</a>></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)->name) <span class="keywordflow">return</span> 1; 00048 <span class="keywordflow">if</span> (!(*b)->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)->name, (*b)->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 < 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">"=> %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 > 0) { 00088 <span class="comment">/* Avail > Installed -- file has moved */</span> 00089 <a class="code" href="expression_8c.html#a0">DEBUG</a>((<span class="stringliteral">"=> %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 < 0) { 00094 <span class="comment">/* Avail < 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 = &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> **) &name, NULL); 00122 <span class="keywordflow">if</span> (name && !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(&keyaddr, psp-><a class="code" href="structpkgSet.html#m0">packages</a>, psp-><a class="code" href="structpkgSet.html#m1">numPackages</a>, 00130 <span class="keyword">sizeof</span>(*psp-><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> **) &installedFiles, &installedFileCount) 00134 && <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> **) &installedDirIndexes, NULL) 00136 && <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> **) &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-><a class="code" href="structpkgSet.html#m1">numPackages</a>; 00160 pip = psp-><a class="code" href="structpkgSet.html#m0">packages</a>; 00161 <span class="keywordflow">while</span> (count--) { 00162 <span class="keywordflow">if</span> ((*pip)->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)->h, <a class="code" href="rpmlib_8h.html#a494a194">RPMTAG_OBSOLETENAME</a>, NULL, 00168 (<span class="keyword">const</span> <span class="keywordtype">void</span> **) &obsoletes, &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]) > 0) { 00171 (*pip)-><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-><a class="code" href="structpkgSet.html#m1">numPackages</a>; 00206 pip = psp-><a class="code" href="structpkgSet.html#m0">packages</a>; 00207 <span class="keywordflow">while</span> (count--) { 00208 h = (*pip)->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> **) &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) >= 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)->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> **) &availFiles, &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> **) &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> **) &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> **) &installedFiles, 00262 &installedFileCount) 00263 && <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> **) &installedDirs, NULL) 00265 && <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> **) &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-><a class="code" href="structpkgSet.html#m1">numPackages</a>; 00308 pip = psp-><a class="code" href="structpkgSet.html#m0">packages</a>; 00309 <span class="keywordflow">while</span> (count--) { 00310 h = (*pip)->h; 00311 <span class="keywordflow">if</span> ((*pip)->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> **) &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> **) &availFiles, &availFileCount) 00317 00318 && <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> **) &availDirs, NULL) 00320 && <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> **) &availDirIndexes, NULL)) 00322 { 00323 00324 <span class="keywordflow">for</span> (i = 0; i < 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-><a class="code" href="structpkgSet.html#m1">numPackages</a>; 00359 pip = psp-><a class="code" href="structpkgSet.html#m0">packages</a>; 00360 <span class="keywordflow">while</span> (count--) { 00361 h = (*pip)->h; 00362 <span class="keywordflow">if</span> (! (*pip)->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> **) &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> **) &availFiles, &availFileCount) 00368 && <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> **) &availDirs, NULL) 00370 && <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> **) &availDirIndexes, NULL) 00372 && <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> **) &availFileModes, NULL)) 00374 { 00375 00376 <span class="keywordflow">for</span> (i = 0; i < 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)->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->packages;</span> 00407 <span class="comment"> i = psp->numPackages;</span> 00408 <span class="comment"> while (i--) {</span> 00409 <span class="comment"> if (pip->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-><a class="code" href="structpkgSet.html#m1">numPackages</a>; 00426 pip = psp-><a class="code" href="structpkgSet.html#m0">packages</a>; 00427 <span class="keywordflow">while</span> (count--) { 00428 <span class="keywordflow">if</span> ((*pip)->selected != 0) { 00429 h = (*pip)->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> **) &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) >= 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)->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, &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>