Sophie

Sophie

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

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/rpminstall.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/rpminstall.c</h1><a href="rpminstall_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="rpmcli_8h.html">rpmcli.h</a>&gt;</span>
00008 
00009 <span class="preprocessor">#include "<a class="code" href="manifest_8h.html">manifest.h</a>"</span>
00010 <span class="preprocessor">#include "<a class="code" href="misc_8h.html">misc.h</a>"</span>       <span class="comment">/* XXX for rpmGlob() */</span>
00011 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00012 
00013 <span class="comment">/*@access rpmTransactionSet @*/</span> <span class="comment">/* XXX compared with NULL */</span>
00014 <span class="comment">/*@access rpmProblemSet @*/</span>     <span class="comment">/* XXX compared with NULL */</span>
00015 <span class="comment">/*@access Header @*/</span>            <span class="comment">/* XXX compared with NULL */</span>
00016 <span class="comment">/*@access rpmdb @*/</span>             <span class="comment">/* XXX compared with NULL */</span>
00017 <span class="comment">/*@access FD_t @*/</span>              <span class="comment">/* XXX compared with NULL */</span>
00018 <span class="comment">/*@access IDTX @*/</span>
00019 <span class="comment">/*@access IDT @*/</span>
00020 
00021 <span class="comment">/*@unchecked@*/</span>
<a name="l00022"></a><a class="code" href="rpminstall_8c.html#a0">00022</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> = 0;
00023 
00024 <span class="comment">/*@unchecked@*/</span>
<a name="l00025"></a><a class="code" href="rpminstall_8c.html#a1">00025</a> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a> = 0;
00026 <span class="comment">/*@unchecked@*/</span>
<a name="l00027"></a><a class="code" href="rpminstall_8c.html#a2">00027</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a2">progressTotal</a> = 0;
00028 <span class="comment">/*@unchecked@*/</span>
<a name="l00029"></a><a class="code" href="rpminstall_8c.html#a3">00029</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a> = 0;
00030 
<a name="l00033"></a><a class="code" href="rpminstall_8c.html#a7">00033</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="rpminstall_8c.html#a7">printHash</a>(<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> amount, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> total)
00034         <span class="comment">/*@globals hashesPrinted, progressCurrent, fileSystem @*/</span>
00035         <span class="comment">/*@modifies hashesPrinted, progressCurrent, fileSystem @*/</span>
00036 {
00037     <span class="keywordtype">int</span> hashesNeeded;
00038     <span class="keywordtype">int</span> hashesTotal = 50;
00039 
00040     <span class="keywordflow">if</span> (isatty (STDOUT_FILENO))
00041         hashesTotal = 44;
00042 
00043     <span class="keywordflow">if</span> (<a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> != hashesTotal) {
00044         hashesNeeded = hashesTotal * (total ? (((float) amount) / total) : 1);
00045         <span class="keywordflow">while</span> (hashesNeeded &gt; <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a>) {
00046             <span class="keywordflow">if</span> (isatty (STDOUT_FILENO)) {
00047                 <span class="keywordtype">int</span> i;
00048                 <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a>; i++) (void) putchar (<span class="charliteral">'#'</span>);
00049                 <span class="keywordflow">for</span> (; i &lt; hashesTotal; i++) (void) putchar (<span class="charliteral">' '</span>);
00050                 fprintf(stdout, <span class="stringliteral">"(%3d%%)"</span>,
00051                         (<span class="keywordtype">int</span>)(100 * (total ? (((<span class="keywordtype">float</span>) amount) / total) : 1)));
00052                 <span class="keywordflow">for</span> (i = 0; i &lt; (hashesTotal + 6); i++) (void) putchar (<span class="charliteral">'\b'</span>);
00053             } <span class="keywordflow">else</span>
00054                 fprintf(stdout, <span class="stringliteral">"#"</span>);
00055 
00056             <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a>++;
00057         }
00058         (void) fflush(stdout);
00059         <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> = hashesNeeded;
00060 
00061         <span class="keywordflow">if</span> (<a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> == hashesTotal) {
00062             <span class="keywordtype">int</span> i;
00063             <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a>++;
00064             <span class="keywordflow">if</span> (isatty(STDOUT_FILENO)) {
00065                 <span class="keywordflow">for</span> (i = 1; i &lt; <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a>; i++) (void) putchar (<span class="charliteral">'#'</span>);
00066                 fprintf(stdout, <span class="stringliteral">" [%3d%%]"</span>, (<span class="keywordtype">int</span>)(100 * (<a class="code" href="rpminstall_8c.html#a2">progressTotal</a> ?
00067                         (((<span class="keywordtype">float</span>) <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a>) / <a class="code" href="rpminstall_8c.html#a2">progressTotal</a>) : 1)));
00068             }
00069             fprintf(stdout, <span class="stringliteral">"\n"</span>);
00070         }
00071         (void) fflush(stdout);
00072     }
00073 }
00074 
<a name="l00075"></a><a class="code" href="rpminstall_8c.html#a8">00075</a> <span class="keywordtype">void</span> * <a class="code" href="rpminstall_8c.html#a8">rpmShowProgress</a>(<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * arg,
00076                         <span class="keyword">const</span> <a class="code" href="rpmmessages_8h.html#a15">rpmCallbackType</a> what,
00077                         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> amount,
00078                         <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> total,
00079                         <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * pkgKey,
00080                         <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> * data)
00081         <span class="comment">/*@globals hashesPrinted, progressCurrent, progressTotal,</span>
00082 <span class="comment">                fileSystem @*/</span>
00083         <span class="comment">/*@modifies hashesPrinted, progressCurrent, progressTotal,</span>
00084 <span class="comment">                fileSystem @*/</span>
00085 {
00086     <span class="comment">/*@-castexpose@*/</span>
00087     <a class="code" href="structheaderToken.html">Header</a> h = (Header) arg;
00088     <span class="comment">/*@=castexpose@*/</span>
00089     <span class="keywordtype">char</span> * s;
00090     <span class="keywordtype">int</span> flags = (int) ((long)data);
00091     <span class="keywordtype">void</span> * rc = NULL;
00092     <span class="keyword">const</span> <span class="keywordtype">char</span> * filename = pkgKey;
00093     <span class="keyword">static</span> <a class="code" href="struct__FD__s.html">FD_t</a> fd = NULL;
00094 
00095     <span class="keywordflow">switch</span> (what) {
00096     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a20">RPMCALLBACK_INST_OPEN_FILE</a>:
00097         <span class="keywordflow">if</span> (filename == NULL || filename[0] == <span class="charliteral">'\0'</span>)
00098             <span class="keywordflow">return</span> NULL;
00099         fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(filename, <span class="stringliteral">"r.ufdio"</span>);
00100         <span class="keywordflow">if</span> (fd)
00101             fd = <a class="code" href="rpmio_8h.html#a5">fdLink</a>(fd, <span class="stringliteral">"persist (showProgress)"</span>);
00102         <span class="keywordflow">return</span> fd;
00103         <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>;
00104 
00105     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a21">RPMCALLBACK_INST_CLOSE_FILE</a>:
00106         fd = <a class="code" href="rpmio_8h.html#a6">fdFree</a>(fd, <span class="stringliteral">"persist (showProgress)"</span>);
00107         <span class="keywordflow">if</span> (fd) {
00108             (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00109             fd = NULL;
00110         }
00111         <span class="keywordflow">break</span>;
00112 
00113     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a19">RPMCALLBACK_INST_START</a>:
00114         <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> = 0;
00115         <span class="keywordflow">if</span> (h == NULL || !(flags &amp; <a class="code" href="group__rpmcli.html#a47a390">INSTALL_LABEL</a>))
00116             <span class="keywordflow">break</span>;
00117         <span class="keywordflow">if</span> (flags &amp; <a class="code" href="group__rpmcli.html#a47a387">INSTALL_HASH</a>) {
00118             s = <a class="code" href="group__header.html#a60">headerSprintf</a>(h, <span class="stringliteral">"%{NAME}"</span>,
00119                                 rpmTagTable, rpmHeaderFormats, NULL);
00120             <span class="keywordflow">if</span> (isatty (STDOUT_FILENO))
00121                 fprintf(stdout, <span class="stringliteral">"%4d:%-23.23s"</span>, <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a> + 1, s);
00122             <span class="keywordflow">else</span>
00123                 fprintf(stdout, <span class="stringliteral">"%-28.28s"</span>, s);
00124             (void) fflush(stdout);
00125             s = <a class="code" href="poptint_8h.html#a14">_free</a>(s);
00126         } <span class="keywordflow">else</span> {
00127             s = <a class="code" href="group__header.html#a60">headerSprintf</a>(h, <span class="stringliteral">"%{NAME}-%{VERSION}-%{RELEASE}"</span>,
00128                                   rpmTagTable, rpmHeaderFormats, NULL);
00129             fprintf(stdout, <span class="stringliteral">"%s\n"</span>, s);
00130             (void) fflush(stdout);
00131             s = <a class="code" href="poptint_8h.html#a14">_free</a>(s);
00132         }
00133         <span class="keywordflow">break</span>;
00134 
00135     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a22">RPMCALLBACK_TRANS_PROGRESS</a>:
00136     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a18">RPMCALLBACK_INST_PROGRESS</a>:
00137         <span class="keywordflow">if</span> (flags &amp; <a class="code" href="group__rpmcli.html#a47a386">INSTALL_PERCENT</a>)
00138             fprintf(stdout, <span class="stringliteral">"%%%% %f\n"</span>, (<span class="keywordtype">double</span>) (total
00139                                 ? ((((<span class="keywordtype">float</span>) amount) / total) * 100)
00140                                 : 100.0));
00141         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (flags &amp; <a class="code" href="group__rpmcli.html#a47a387">INSTALL_HASH</a>)
00142             <a class="code" href="rpminstall_8c.html#a7">printHash</a>(amount, total);
00143         (void) fflush(stdout);
00144         <span class="keywordflow">break</span>;
00145 
00146     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a23">RPMCALLBACK_TRANS_START</a>:
00147         <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a> = 0;
00148         <a class="code" href="rpminstall_8c.html#a2">progressTotal</a> = 1;
00149         <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a> = 0;
00150         <span class="keywordflow">if</span> (!(flags &amp; <a class="code" href="group__rpmcli.html#a47a390">INSTALL_LABEL</a>))
00151             <span class="keywordflow">break</span>;
00152         <span class="keywordflow">if</span> (flags &amp; <a class="code" href="group__rpmcli.html#a47a387">INSTALL_HASH</a>)
00153             fprintf(stdout, <span class="stringliteral">"%-28s"</span>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Preparing..."</span>));
00154         <span class="keywordflow">else</span>
00155             fprintf(stdout, <span class="stringliteral">"%s\n"</span>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Preparing packages for installation..."</span>));
00156         (void) fflush(stdout);
00157         <span class="keywordflow">break</span>;
00158 
00159     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a24">RPMCALLBACK_TRANS_STOP</a>:
00160         <span class="keywordflow">if</span> (flags &amp; <a class="code" href="group__rpmcli.html#a47a387">INSTALL_HASH</a>)
00161             <a class="code" href="rpminstall_8c.html#a7">printHash</a>(1, 1);    <span class="comment">/* Fixes "preparing..." progress bar */</span>
00162         <a class="code" href="rpminstall_8c.html#a2">progressTotal</a> = <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a>;
00163         <a class="code" href="rpminstall_8c.html#a3">progressCurrent</a> = 0;
00164         <span class="keywordflow">break</span>;
00165 
00166     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a25">RPMCALLBACK_UNINST_PROGRESS</a>:
00167     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a26">RPMCALLBACK_UNINST_START</a>:
00168     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a27">RPMCALLBACK_UNINST_STOP</a>:
00169     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a28">RPMCALLBACK_UNPACK_ERROR</a>:
00170     <span class="keywordflow">case</span> <a class="code" href="rpmmessages_8h.html#a31a29">RPMCALLBACK_CPIO_ERROR</a>:
00171     <span class="keywordflow">default</span>:
00172         <span class="comment">/* ignore */</span>
00173         <span class="keywordflow">break</span>;
00174     }
00175 
00176     <span class="keywordflow">return</span> rc;
00177 }       
00178 
<a name="l00179"></a><a class="code" href="rpminstall_8c.html#a4">00179</a> <span class="keyword">typedef</span> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="rpminstall_8c.html#a4">str_t</a>;
00180 
<a name="l00181"></a><a class="code" href="structrpmEIU.html">00181</a> <span class="keyword">struct </span><a class="code" href="structrpmEIU.html">rpmEIU</a> {
<a name="l00182"></a><a class="code" href="structrpmEIU.html#m0">00182</a> <span class="comment">/*@only@*/</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> <a class="code" href="structrpmEIU.html#m0">ts</a>;
<a name="l00183"></a><a class="code" href="structrpmEIU.html#m1">00183</a> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmEIU.html#m1">db</a>;
<a name="l00184"></a><a class="code" href="structrpmEIU.html#m2">00184</a>     <a class="code" href="structheaderToken.html">Header</a> <a class="code" href="structrpmEIU.html#m2">h</a>;
<a name="l00185"></a><a class="code" href="structrpmEIU.html#m3">00185</a>     <a class="code" href="struct__FD__s.html">FD_t</a> <a class="code" href="structrpmEIU.html#m3">fd</a>;
<a name="l00186"></a><a class="code" href="structrpmEIU.html#m4">00186</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m4">numFailed</a>;
<a name="l00187"></a><a class="code" href="structrpmEIU.html#m5">00187</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m5">numPkgs</a>;
<a name="l00188"></a><a class="code" href="structrpmEIU.html#m6">00188</a> <span class="comment">/*@only@*/</span> <a class="code" href="rpminstall_8c.html#a4">str_t</a> * <a class="code" href="structrpmEIU.html#m6">pkgURL</a>;
<a name="l00189"></a><a class="code" href="structrpmEIU.html#m7">00189</a> <span class="comment">/*@dependent@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpminstall_8c.html#a4">str_t</a> * <a class="code" href="structrpmEIU.html#m7">fnp</a>;
<a name="l00190"></a><a class="code" href="structrpmEIU.html#m8">00190</a> <span class="comment">/*@only@*/</span> <span class="keywordtype">char</span> * <a class="code" href="structrpmEIU.html#m8">pkgState</a>;
<a name="l00191"></a><a class="code" href="structrpmEIU.html#m9">00191</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m9">prevx</a>;
<a name="l00192"></a><a class="code" href="structrpmEIU.html#m10">00192</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m10">pkgx</a>;
<a name="l00193"></a><a class="code" href="structrpmEIU.html#m11">00193</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m11">numRPMS</a>;
<a name="l00194"></a><a class="code" href="structrpmEIU.html#m12">00194</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m12">numSRPMS</a>;
<a name="l00195"></a><a class="code" href="structrpmEIU.html#m13">00195</a> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpminstall_8c.html#a4">str_t</a> * <a class="code" href="structrpmEIU.html#m13">sourceURL</a>;
<a name="l00196"></a><a class="code" href="structrpmEIU.html#m14">00196</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m14">isSource</a>;
<a name="l00197"></a><a class="code" href="structrpmEIU.html#m15">00197</a>     <span class="keywordtype">int</span> <a class="code" href="structrpmEIU.html#m15">argc</a>;
<a name="l00198"></a><a class="code" href="structrpmEIU.html#m16">00198</a> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <a class="code" href="rpminstall_8c.html#a4">str_t</a> * <a class="code" href="structrpmEIU.html#m16">argv</a>;
<a name="l00199"></a><a class="code" href="structrpmEIU.html#m17">00199</a> <span class="comment">/*@temp@*/</span> <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * <a class="code" href="structrpmEIU.html#m17">relocations</a>;
<a name="l00200"></a><a class="code" href="structrpmEIU.html#m18">00200</a>     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> <a class="code" href="structrpmEIU.html#m18">rpmrc</a>;
00201 };
00202 
<a name="l00204"></a><a class="code" href="group__rpmcli.html#a9">00204</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a9">rpmInstall</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * rootdir, <span class="keyword">const</span> <span class="keywordtype">char</span> ** fileArgv,
00205                 <a class="code" href="group__rpmtrans.html#a3">rpmtransFlags</a> transFlags,
00206                 <a class="code" href="group__rpmcli.html#a23">rpmInstallInterfaceFlags</a> interfaceFlags,
00207                 <a class="code" href="rpmlib_8h.html#a82">rpmprobFilterFlags</a> probFilter,
00208                 <a class="code" href="structrpmRelocation__s.html">rpmRelocation</a> * relocations)
00209 {
00210     <span class="keyword">struct </span><a class="code" href="structrpmEIU.html">rpmEIU</a> * eiu = <a class="code" href="system_8h.html#a36">alloca</a>(<span class="keyword">sizeof</span>(*eiu));
00211     <span class="keywordtype">int</span> notifyFlags = interfaceFlags | (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>() ? <a class="code" href="group__rpmcli.html#a47a390">INSTALL_LABEL</a> : 0 );
00212     <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * fileURL = NULL;
00213     <span class="keywordtype">int</span> stopInstall = 0;
00214     <span class="keyword">const</span> <span class="keywordtype">char</span> ** av = NULL;
00215     <span class="keywordtype">int</span> ac = 0;
00216     <span class="keywordtype">int</span> rc;
00217     <span class="keywordtype">int</span> xx;
00218     <span class="keywordtype">int</span> i;
00219 
00220     <span class="keywordflow">if</span> (fileArgv == NULL) <span class="keywordflow">return</span> 0;
00221 
00222     memset(eiu, 0, <span class="keyword">sizeof</span>(*eiu));
00223     eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a> = 0;
00224     eiu-&gt;<a class="code" href="structrpmEIU.html#m9">prevx</a> = 0;
00225     eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a> = 0;
00226 
00227     <span class="keywordflow">if</span> ((eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a> = relocations) != NULL) {
00228         <span class="keywordflow">while</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>-&gt;<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a>)
00229             eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>++;
00230         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>-&gt;<a class="code" href="structrpmRelocation__s.html#m1">newPath</a> == NULL)
00231             eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a> = NULL;
00232     }
00233 
00234     <span class="comment">/* Build fully globbed list of arguments in argv[argc]. */</span>
00235     <span class="comment">/*@-branchstate@*/</span>
00236     <span class="comment">/*@-temptrans@*/</span>
00237     <span class="keywordflow">for</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = fileArgv; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> != NULL; eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>++) {
00238     <span class="comment">/*@=temptrans@*/</span>
00239         av = <a class="code" href="poptint_8h.html#a14">_free</a>(av); ac = 0;
00240         rc = <a class="code" href="lib_2misc_8c.html#a18">rpmGlob</a>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>, &amp;ac, &amp;av);
00241         <span class="keywordflow">if</span> (rc || ac == 0) <span class="keywordflow">continue</span>;
00242 
00243         eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>, (eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>+ac+1) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>));
00244         memcpy(eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>+eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>, av, ac * <span class="keyword">sizeof</span>(*av));
00245         eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a> += ac;
00246         eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>] = NULL;
00247     }
00248     <span class="comment">/*@=branchstate@*/</span>
00249     av = <a class="code" href="poptint_8h.html#a14">_free</a>(av);     ac = 0;
00250 
00251 restart:
00252     <span class="comment">/* Allocate sufficient storage for next set of args. */</span>
00253     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a> &gt;= eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a>) {
00254         eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a> + eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>;
00255         eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>,
00256                         (eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a> + 1) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>));
00257         memset(eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a> + eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>, 0,
00258                         ((eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a> + 1) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>)));
00259         eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>,
00260                         (eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a> + 1) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>));
00261         memset(eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a> + eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>, 0,
00262                         ((eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a> + 1) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>)));
00263     }
00264 
00265     <span class="comment">/* Retrieve next set of args, cache on local storage. */</span>
00266     <span class="keywordflow">for</span> (i = 0; i &lt; eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>; i++) {
00267         fileURL = <a class="code" href="poptint_8h.html#a14">_free</a>(fileURL);
00268         fileURL = eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>[i];
00269         eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>[i] = NULL;
00270 
00271         <span class="keywordflow">switch</span> (<a class="code" href="url_8c.html#a17">urlIsURL</a>(fileURL)) {
00272         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>:
00273         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>:
00274         {   <span class="keyword">const</span> <span class="keywordtype">char</span> *tfn;
00275 
00276             <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>())
00277                 fprintf(stdout, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Retrieving %s\n"</span>), fileURL);
00278 
00279             {   <span class="keywordtype">char</span> tfnbuf[64];
00280                 strcpy(tfnbuf, <span class="stringliteral">"rpm-xfer.XXXXXX"</span>);
00281                 (void) mktemp(tfnbuf);
00282                 tfn = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(rootdir, <span class="stringliteral">"%{_tmppath}/"</span>, tfnbuf);
00283             }
00284 
00285             <span class="comment">/* XXX undefined %{name}/%{version}/%{release} here */</span>
00286             <span class="comment">/* XXX %{_tmpdir} does not exist */</span>
00287             <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">" ... as %s\n"</span>), tfn);
00288             rc = <a class="code" href="url_8c.html#a20">urlGetFile</a>(fileURL, tfn);
00289             <span class="keywordflow">if</span> (rc &lt; 0) {
00290                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>,
00291                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"skipping %s - transfer failed - %s\n"</span>),
00292                         fileURL, <a class="code" href="rpmio_8c.html#a48">ftpStrerror</a>(rc));
00293                 eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++;
00294                 eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>] = NULL;
00295                 tfn = <a class="code" href="poptint_8h.html#a14">_free</a>(tfn);
00296                 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00297             }
00298             eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>] = 1;
00299             eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>] = tfn;
00300             eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>++;
00301         }   <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00302         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>:
00303         <span class="keywordflow">default</span>:
00304             eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>] = fileURL;
00305             fileURL = NULL;
00306             eiu-&gt;<a class="code" href="structrpmEIU.html#m10">pkgx</a>++;
00307             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00308         }
00309     }
00310     fileURL = <a class="code" href="poptint_8h.html#a14">_free</a>(fileURL);
00311 
00312     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>) <span class="keywordflow">goto</span> exit;
00313 
00314     <span class="comment">/* Continue processing file arguments, building transaction set. */</span>
00315     <span class="keywordflow">for</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>+eiu-&gt;<a class="code" href="structrpmEIU.html#m9">prevx</a>;
00316          *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> != NULL;
00317          eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>++, eiu-&gt;<a class="code" href="structrpmEIU.html#m9">prevx</a>++)
00318     {
00319         <span class="keyword">const</span> <span class="keywordtype">char</span> * fileName;
00320 
00321         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <span class="stringliteral">"============== %s\n"</span>, *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>);
00322         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>, &amp;fileName);
00323 
00324         <span class="comment">/* Try to read the header from a package file. */</span>
00325         eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>, <span class="stringliteral">"r.ufdio"</span>);
00326         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>)) {
00327             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a63">RPMERR_OPEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"open of %s failed: %s\n"</span>), *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>,
00328                         Fstrerror(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>));
00329             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>) {
00330                 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00331                 eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00332             }
00333             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00334             <span class="keywordflow">continue</span>;
00335         }
00336 
00337         <span class="comment">/*@-mustmod@*/</span>  <span class="comment">/* LCL: segfault */</span>
00338         eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> = <a class="code" href="package_8c.html#a5">rpmReadPackageHeader</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>, &amp;eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>,
00339                                 &amp;eiu-&gt;<a class="code" href="structrpmEIU.html#m14">isSource</a>, NULL, NULL);
00340         <span class="comment">/*@=mustmod@*/</span>
00341         xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00342         eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00343 
00344         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a> || eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a93">RPMRC_SHORTREAD</a>) {
00345             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00346             <span class="keywordflow">continue</span>;
00347         }
00348 
00349         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m14">isSource</a> &amp;&amp;
00350                 (eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>))
00351         {
00352             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <span class="stringliteral">"\tadded source package [%d]\n"</span>,
00353                 eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>);
00354             eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>,
00355                                 (eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a> + 2) * <span class="keyword">sizeof</span>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>));
00356             eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>] = *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>;
00357             *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00358             eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>++;
00359             eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>[eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>] = NULL;
00360             <span class="keywordflow">continue</span>;
00361         }
00362 
00363         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a92">RPMRC_BADSIZE</a>) {
00364             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a> == NULL) {
00365                 <span class="keywordtype">int</span> mode = (transFlags &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)
00366                                 ? O_RDONLY : (O_RDWR | O_CREAT);
00367 
00368                 <span class="keywordflow">if</span> (<a class="code" href="group__rpmdb.html#a57">rpmdbOpen</a>(rootdir, &amp;eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a>, mode, 0644)) {
00369                     <span class="keyword">const</span> <span class="keywordtype">char</span> *dn;
00370                     dn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>( (rootdir ? rootdir : <span class="stringliteral">""</span>),
00371                                         <span class="stringliteral">"%{_dbpath}"</span>, NULL);
00372                     <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>,
00373                                 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot open Packages database in %s\n"</span>), dn);
00374                     dn = <a class="code" href="poptint_8h.html#a14">_free</a>(dn);
00375                     eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00376                     <span class="keywordflow">break</span>;
00377                 }
00378                 <span class="comment">/*@-onlytrans@*/</span>
00379                 eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a> = <a class="code" href="group__rpmtrans.html#a4">rpmtransCreateSet</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a>, rootdir);
00380                 <span class="comment">/*@=onlytrans@*/</span>
00381             }
00382 
00383             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>) {
00384                 <span class="keyword">const</span> <span class="keywordtype">char</span> ** paths;
00385                 <span class="keywordtype">int</span> pft;
00386                 <span class="keywordtype">int</span> c;
00387 
00388                 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>, <a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>, &amp;pft,
00389                                        (<span class="keywordtype">void</span> **) &amp;paths, &amp;c) &amp;&amp; (c == 1)) {
00390                     eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>-&gt;<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(paths[0]);
00391                     paths = <a class="code" href="group__header.html#a83">headerFreeData</a>(paths, pft);
00392                 } <span class="keywordflow">else</span> {
00393                     <span class="keyword">const</span> <span class="keywordtype">char</span> * name;
00394                     xx = <a class="code" href="group__header.html#a88">headerNVR</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>, &amp;name, NULL, NULL);
00395                     <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>,
00396                                <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"package %s is not relocateable\n"</span>), name);
00397                     eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++;
00398                     <span class="keywordflow">goto</span> exit;
00399                     <span class="comment">/*@notreached@*/</span>
00400                 }
00401             }
00402 
00403             <span class="comment">/* On --freshen, verify package is installed and newer */</span>
00404             <span class="keywordflow">if</span> (interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a47a392">INSTALL_FRESHEN</a>) {
00405                 <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00406                 <span class="keyword">const</span> <span class="keywordtype">char</span> * name;
00407                 <a class="code" href="structheaderToken.html">Header</a> oldH;
00408                 <span class="keywordtype">int</span> count;
00409 
00410                 xx = <a class="code" href="group__header.html#a88">headerNVR</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>, &amp;name, NULL, NULL);
00411                 <span class="comment">/*@-onlytrans@*/</span>
00412                 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, name, 0);
00413                 <span class="comment">/*@=onlytrans@*/</span>
00414                 count = <a class="code" href="group__rpmdb.html#a69">rpmdbGetIteratorCount</a>(mi);
00415                 <span class="keywordflow">while</span> ((oldH = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00416                     <span class="keywordflow">if</span> (<a class="code" href="psm_8c.html#a2">rpmVersionCompare</a>(oldH, eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>) &lt; 0)
00417                         <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
00418                     <span class="comment">/* same or newer package already installed */</span>
00419                     count = 0;
00420                     <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00421                 }
00422                 mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00423                 <span class="keywordflow">if</span> (count == 0) {
00424                     eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>);
00425                     <span class="keywordflow">continue</span>;
00426                 }
00427                 <span class="comment">/* Package is newer than those currently installed. */</span>
00428             }
00429 
00430             rc = <a class="code" href="group__rpmtrans.html#a5">rpmtransAddPackage</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a>, eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>, NULL, fileName,
00431                                (interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a47a391">INSTALL_UPGRADE</a>) != 0,
00432                                relocations);
00433             <span class="comment">/* XXX reference held by transaction set */</span>
00434             eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m2">h</a>);
00435             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>)
00436                 eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>-&gt;<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m17">relocations</a>-&gt;<a class="code" href="structrpmRelocation__s.html#m0">oldPath</a>);
00437 
00438             <span class="keywordflow">switch</span>(rc) {
00439             <span class="keywordflow">case</span> 0:
00440                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <span class="stringliteral">"\tadded binary package [%d]\n"</span>,
00441                         eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a>);
00442                 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00443             <span class="keywordflow">case</span> 1:
00444                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>,
00445                             <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"error reading from file %s\n"</span>), *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>);
00446                 eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++;
00447                 <span class="keywordflow">goto</span> exit;
00448                 <span class="comment">/*@notreached@*/</span> <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00449             <span class="keywordflow">case</span> 2:
00450                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>,
00451                             <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"file %s requires a newer version of RPM\n"</span>),
00452                             *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>);
00453                 eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++;
00454                 <span class="keywordflow">goto</span> exit;
00455                 <span class="comment">/*@notreached@*/</span> <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00456             }
00457 
00458             eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a>++;
00459             <span class="keywordflow">continue</span>;
00460         }
00461 
00462         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> != <a class="code" href="rpmlib_8h.html#a493a90">RPMRC_BADMAGIC</a>) {
00463             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s cannot be installed\n"</span>), *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>);
00464             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00465             <span class="keywordflow">break</span>;
00466         }
00467 
00468         <span class="comment">/* Try to read a package manifest. */</span>
00469         eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>, <span class="stringliteral">"r.fpio"</span>);
00470         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>)) {
00471             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a63">RPMERR_OPEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"open of %s failed: %s\n"</span>), *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>,
00472                         Fstrerror(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>));
00473             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>) {
00474                 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00475                 eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00476             }
00477             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00478             <span class="keywordflow">break</span>;
00479         }
00480 
00481         <span class="comment">/* Read list of packages from manifest. */</span>
00482         rc = <a class="code" href="manifest_8c.html#a1">rpmReadPackageManifest</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>, &amp;eiu-&gt;<a class="code" href="structrpmEIU.html#m15">argc</a>, &amp;eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>);
00483         <span class="keywordflow">if</span> (rc)
00484             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a80">RPMERR_MANIFEST</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: read manifest failed: %s\n"</span>),
00485                         *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a>, Fstrerror(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>));
00486         xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00487         eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00488 
00489         <span class="comment">/* If successful, restart the query loop. */</span>
00490         <span class="keywordflow">if</span> (rc == 0) {
00491             eiu-&gt;<a class="code" href="structrpmEIU.html#m9">prevx</a>++;
00492             <span class="keywordflow">goto</span> restart;
00493         }
00494 
00495         eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-&gt;<a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL;
00496         <span class="keywordflow">break</span>;
00497     }
00498 
00499     <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">"found %d source and %d binary packages\n"</span>),
00500                 eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>, eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a>);
00501 
00502     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>) <span class="keywordflow">goto</span> exit;
00503 
00504     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a> &amp;&amp; !(interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a47a388">INSTALL_NODEPS</a>)) {
00505         <a class="code" href="structrpmDependencyConflict__s.html">rpmDependencyConflict</a> conflicts;
00506         <span class="keywordtype">int</span> numConflicts;
00507 
00508         <span class="keywordflow">if</span> (<a class="code" href="group__rpmtrans.html#a11">rpmdepCheck</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a>, &amp;conflicts, &amp;numConflicts)) {
00509             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a>;
00510             stopInstall = 1;
00511         }
00512 
00513         <span class="comment">/*@-branchstate@*/</span>
00514         <span class="keywordflow">if</span> (!stopInstall &amp;&amp; conflicts) {
00515             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"failed dependencies:\n"</span>));
00516             <a class="code" href="problems_8c.html#a2">printDepProblems</a>(stderr, conflicts, numConflicts);
00517             conflicts = <a class="code" href="group__rpmtrans.html#a13">rpmdepFreeConflicts</a>(conflicts, numConflicts);
00518             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a>;
00519             stopInstall = 1;
00520         }
00521         <span class="comment">/*@=branchstate@*/</span>
00522     }
00523 
00524     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a> &amp;&amp; !(interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a47a389">INSTALL_NOORDER</a>)) {
00525         <span class="keywordflow">if</span> (<a class="code" href="group__rpmtrans.html#a12">rpmdepOrder</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a>)) {
00526             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a>;
00527             stopInstall = 1;
00528         }
00529     }
00530 
00531     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a> &amp;&amp; !stopInstall) {
00532         <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs = NULL;
00533 
00534         <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a> = eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a> + eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>;
00535 
00536         <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">"installing binary packages\n"</span>));
00537         rc = <a class="code" href="group__rpmtrans.html#a30">rpmRunTransactions</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a>, <a class="code" href="rpminstall_8c.html#a87">rpmShowProgress</a>,
00538                         (<span class="keywordtype">void</span> *) ((<span class="keywordtype">long</span>)notifyFlags),
00539                         NULL, &amp;probs, transFlags, probFilter);
00540 
00541         <span class="keywordflow">if</span> (rc &lt; 0) {
00542             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a> += eiu-&gt;<a class="code" href="structrpmEIU.html#m11">numRPMS</a>;
00543         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rc &gt; 0) {
00544             eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a> += rc;
00545             <a class="code" href="problems_8c.html#a7">rpmProblemSetPrint</a>(stderr, probs);
00546         }
00547 
00548         <span class="keywordflow">if</span> (probs != NULL) <a class="code" href="transaction_8c.html#a12">rpmProblemSetFree</a>(probs);
00549     }
00550 
00551     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a> &amp;&amp; !stopInstall) {
00552         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a> != NULL)
00553         <span class="keywordflow">for</span> (i = 0; i &lt; eiu-&gt;<a class="code" href="structrpmEIU.html#m12">numSRPMS</a>; i++) {
00554             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i] == NULL) <span class="keywordflow">continue</span>;
00555             eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i], <span class="stringliteral">"r.ufdio"</span>);
00556             <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>)) {
00557                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot open file %s: %s\n"</span>),
00558                            eiu-&gt;<a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i], Fstrerror(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>));
00559                 <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>) {
00560                     xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00561                     eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00562                 }
00563                 <span class="keywordflow">continue</span>;
00564             }
00565 
00566             <span class="keywordflow">if</span> (!(transFlags &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)) {
00567                 eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> = <a class="code" href="psm_8c.html#a10">rpmInstallSourcePackage</a>(rootdir, eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>, NULL,
00568                         <a class="code" href="rpminstall_8c.html#a87">rpmShowProgress</a>, (<span class="keywordtype">void</span> *) ((<span class="keywordtype">long</span>)notifyFlags), NULL);
00569                 <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m18">rpmrc</a> != <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>) eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>++;
00570             }
00571 
00572             xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a>);
00573             eiu-&gt;<a class="code" href="structrpmEIU.html#m3">fd</a> = NULL;
00574         }
00575     }
00576 
00577 exit:
00578     eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a> = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m0">ts</a>);
00579     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a> != NULL)
00580     <span class="keywordflow">for</span> (i = 0; i &lt; eiu-&gt;<a class="code" href="structrpmEIU.html#m5">numPkgs</a>; i++) {
00581         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i] == NULL) <span class="keywordflow">continue</span>;
00582         <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>[i] == 1)
00583             (void) <a class="code" href="rpmrpc_8c.html#a27">Unlink</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i]);
00584         eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i]);
00585     }
00586     eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m8">pkgState</a>);
00587     eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m6">pkgURL</a>);
00588     eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m16">argv</a>);
00589     <span class="keywordflow">if</span> (eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a> != NULL) {
00590         xx = <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a>);
00591         eiu-&gt;<a class="code" href="structrpmEIU.html#m1">db</a> = NULL;
00592     }
00593     <span class="keywordflow">return</span> eiu-&gt;<a class="code" href="structrpmEIU.html#m4">numFailed</a>;
00594 }
00595 
<a name="l00596"></a><a class="code" href="group__rpmcli.html#a10">00596</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a10">rpmErase</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * rootdir, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv,
00597                 <a class="code" href="group__rpmtrans.html#a3">rpmtransFlags</a> transFlags,
00598                 <a class="code" href="group__rpmcli.html#a24">rpmEraseInterfaceFlags</a> interfaceFlags)
00599 {
00600     <a class="code" href="structrpmdb__s.html">rpmdb</a> db;
00601     <span class="keywordtype">int</span> mode;
00602     <span class="keywordtype">int</span> count;
00603     <span class="keyword">const</span> <span class="keywordtype">char</span> ** arg;
00604     <span class="keywordtype">int</span> numFailed = 0;
00605     <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts;
00606     <a class="code" href="structrpmDependencyConflict__s.html">rpmDependencyConflict</a> conflicts;
00607     <span class="keywordtype">int</span> numConflicts;
00608     <span class="keywordtype">int</span> stopUninstall = 0;
00609     <span class="keywordtype">int</span> numPackages = 0;
00610     <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs;
00611 
00612     <span class="keywordflow">if</span> (argv == NULL) <span class="keywordflow">return</span> 0;
00613 
00614     <span class="keywordflow">if</span> (transFlags &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)
00615         mode = O_RDONLY;
00616     <span class="keywordflow">else</span>
00617         mode = O_RDWR | O_EXCL;
00618         
00619     <span class="keywordflow">if</span> (<a class="code" href="group__rpmdb.html#a57">rpmdbOpen</a>(rootdir, &amp;db, mode, 0644)) {
00620         <span class="keyword">const</span> <span class="keywordtype">char</span> *dn;
00621         dn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>( (rootdir ? rootdir : <span class="stringliteral">""</span>), <span class="stringliteral">"%{_dbpath}"</span>, NULL);
00622         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot open %s/packages.rpm\n"</span>), dn);
00623         dn = <a class="code" href="poptint_8h.html#a14">_free</a>(dn);
00624         <span class="keywordflow">return</span> -1;
00625     }
00626 
00627     ts = <a class="code" href="group__rpmtrans.html#a4">rpmtransCreateSet</a>(db, rootdir);
00628     <span class="keywordflow">for</span> (arg = argv; *arg; arg++) {
00629         <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00630 
00631         <span class="comment">/* XXX HACK to get rpmdbFindByLabel out of the API */</span>
00632         mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, <a class="code" href="rpmlib_8h.html#a2">RPMDBI_LABEL</a>, *arg, 0);
00633         count = <a class="code" href="group__rpmdb.html#a69">rpmdbGetIteratorCount</a>(mi);
00634         <span class="keywordflow">if</span> (count &lt;= 0) {
00635             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"package %s is not installed\n"</span>), *arg);
00636             numFailed++;
00637         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!(count == 1 || (interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a48a397">UNINSTALL_ALLMATCHES</a>))) {
00638             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"\"%s\" specifies multiple packages\n"</span>),
00639                         *arg);
00640             numFailed++;
00641         } <span class="keywordflow">else</span> {
00642             <a class="code" href="structheaderToken.html">Header</a> h;   <span class="comment">/* XXX iterator owns the reference */</span>
00643             <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00644                 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> recOffset = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(mi);
00645                 <span class="keywordflow">if</span> (recOffset) {
00646                     (void) <a class="code" href="group__rpmtrans.html#a7">rpmtransRemovePackage</a>(ts, recOffset);
00647                     numPackages++;
00648                 }
00649             }
00650         }
00651         mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00652     }
00653 
00654     <span class="keywordflow">if</span> (!(interfaceFlags &amp; <a class="code" href="group__rpmcli.html#a48a396">UNINSTALL_NODEPS</a>)) {
00655         <span class="keywordflow">if</span> (<a class="code" href="group__rpmtrans.html#a11">rpmdepCheck</a>(ts, &amp;conflicts, &amp;numConflicts)) {
00656             numFailed = numPackages;
00657             stopUninstall = 1;
00658         }
00659 
00660         <span class="comment">/*@-branchstate@*/</span>
00661         <span class="keywordflow">if</span> (!stopUninstall &amp;&amp; conflicts) {
00662             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"removing these packages would break "</span>
00663                               <span class="stringliteral">"dependencies:\n"</span>));
00664             <a class="code" href="problems_8c.html#a2">printDepProblems</a>(stderr, conflicts, numConflicts);
00665             conflicts = <a class="code" href="group__rpmtrans.html#a13">rpmdepFreeConflicts</a>(conflicts, numConflicts);
00666             numFailed += numPackages;
00667             stopUninstall = 1;
00668         }
00669         <span class="comment">/*@=branchstate@*/</span>
00670     }
00671 
00672     <span class="keywordflow">if</span> (!stopUninstall) {
00673         transFlags |= <a class="code" href="group__rpmtrans.html#a19a336">RPMTRANS_FLAG_REVERSE</a>;
00674         numFailed += <a class="code" href="group__rpmtrans.html#a30">rpmRunTransactions</a>(ts, NULL, NULL, NULL, &amp;probs,
00675                                         transFlags, 0);
00676     }
00677 
00678     ts = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(ts);
00679     (void) <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(db);
00680 
00681     <span class="keywordflow">return</span> numFailed;
00682 }
00683 
<a name="l00684"></a><a class="code" href="group__rpmcli.html#a11">00684</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a11">rpmInstallSource</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * rootdir, <span class="keyword">const</span> <span class="keywordtype">char</span> * arg,
00685                 <span class="keyword">const</span> <span class="keywordtype">char</span> ** specFile, <span class="keywordtype">char</span> ** cookie)
00686 {
00687     <a class="code" href="struct__FD__s.html">FD_t</a> fd;
00688     <span class="keywordtype">int</span> rc;
00689 
00690     fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(arg, <span class="stringliteral">"r.ufdio"</span>);
00691     <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) {
00692         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot open %s: %s\n"</span>), arg, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
00693         <span class="keywordflow">if</span> (fd) (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00694         <span class="keywordflow">return</span> 1;
00695     }
00696 
00697     <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>())
00698         fprintf(stdout, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Installing %s\n"</span>), arg);
00699 
00700     {
00701         <span class="comment">/*@-mayaliasunique@*/</span>
00702         <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rpmrc = <a class="code" href="psm_8c.html#a10">rpmInstallSourcePackage</a>(rootdir, fd, specFile, NULL, NULL,
00703                                  cookie);
00704         <span class="comment">/*@=mayaliasunique@*/</span>
00705         rc = (rpmrc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> ? 0 : 1);
00706     }
00707     <span class="keywordflow">if</span> (rc != 0) {
00708         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s cannot be installed\n"</span>), arg);
00709         <span class="comment">/*@-unqualifiedtrans@*/</span>
00710         <span class="keywordflow">if</span> (specFile &amp;&amp; *specFile)
00711             *specFile = <a class="code" href="poptint_8h.html#a14">_free</a>(*specFile);
00712         <span class="keywordflow">if</span> (cookie &amp;&amp; *cookie)
00713             *cookie = <a class="code" href="poptint_8h.html#a14">_free</a>(*cookie);
00714         <span class="comment">/*@=unqualifiedtrans@*/</span>
00715     }
00716 
00717     (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00718 
00719     <span class="keywordflow">return</span> rc;
00720 }
00721 
00722 <span class="comment">/*@unchecked@*/</span>
<a name="l00723"></a><a class="code" href="rpminstall_8c.html#a5">00723</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a5">reverse</a> = -1;
00724 
<a name="l00727"></a><a class="code" href="rpminstall_8c.html#a12">00727</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpminstall_8c.html#a12">IDTintcmp</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * a, <span class="keyword">const</span> <span class="keywordtype">void</span> * b)
00728         <span class="comment">/*@*/</span>
00729 {
00730     <span class="comment">/*@-castexpose@*/</span>
00731     <a class="code" href="structIDT__s.html">IDT</a> ap = (IDT)a;
00732     <a class="code" href="structIDT__s.html">IDT</a> bp = (IDT)b;
00733     <span class="comment">/*@=castexpose@*/</span>
00734     <span class="keywordtype">int</span> rc = ((int)ap-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 - (int)bp-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32);
00735 
00736     <span class="keywordflow">if</span> (rc)
00737         <span class="keywordflow">return</span> ( <a class="code" href="rpminstall_8c.html#a5">reverse</a> * rc );
00738     <span class="keywordflow">return</span> ( strcmp(ap-&gt;<a class="code" href="structIDT__s.html#m3">n</a>, bp-&gt;<a class="code" href="structIDT__s.html#m3">n</a>) );
00739 }
00740 
<a name="l00741"></a><a class="code" href="rpminstall_8c.html#a13">00741</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a13">IDTXfree</a>(<a class="code" href="structIDTindex__s.html">IDTX</a> idtx)
00742 {
00743     <span class="keywordflow">if</span> (idtx) {
00744         <span class="keywordtype">int</span> i;
00745         <span class="keywordflow">if</span> (idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>)
00746         <span class="keywordflow">for</span> (i = 0; i &lt; idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>; i++) {
00747             <a class="code" href="structIDT__s.html">IDT</a> idt = idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> + i;
00748             idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a>);
00749             idt-&gt;<a class="code" href="structIDT__s.html#m1">key</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(idt-&gt;<a class="code" href="structIDT__s.html#m1">key</a>);
00750         }
00751         idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>);
00752         idtx = <a class="code" href="poptint_8h.html#a14">_free</a>(idtx);
00753     }
00754     <span class="keywordflow">return</span> NULL;
00755 }
00756 
<a name="l00757"></a><a class="code" href="rpminstall_8c.html#a6">00757</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a6">IDTXnew</a>(<span class="keywordtype">void</span>)
00758 {
00759     <a class="code" href="structIDTindex__s.html">IDTX</a> idtx = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(1, <span class="keyword">sizeof</span>(*idtx));
00760     idtx-&gt;<a class="code" href="structIDTindex__s.html#m0">delta</a> = 10;
00761     idtx-&gt;<a class="code" href="structIDTindex__s.html#m1">size</a> = <span class="keyword">sizeof</span>(*((IDT)0));
00762     <span class="keywordflow">return</span> idtx;
00763 }
00764 
<a name="l00765"></a><a class="code" href="rpminstall_8c.html#a14">00765</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a14">IDTXgrow</a>(<a class="code" href="structIDTindex__s.html">IDTX</a> idtx, <span class="keywordtype">int</span> need)
00766 {
00767     <span class="keywordflow">if</span> (need &lt; 0) <span class="keywordflow">return</span> NULL;
00768     <span class="keywordflow">if</span> (idtx == NULL)
00769         idtx = <a class="code" href="rpminstall_8c.html#a6">IDTXnew</a>();
00770     <span class="keywordflow">if</span> (need == 0) <span class="keywordflow">return</span> idtx;
00771 
00772     <span class="keywordflow">if</span> ((idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a> + need) &gt; idtx-&gt;<a class="code" href="structIDTindex__s.html#m2">alloced</a>) {
00773         <span class="keywordflow">while</span> (need &gt; 0) {
00774             idtx-&gt;<a class="code" href="structIDTindex__s.html#m2">alloced</a> += idtx-&gt;<a class="code" href="structIDTindex__s.html#m0">delta</a>;
00775             need -= idtx-&gt;<a class="code" href="structIDTindex__s.html#m0">delta</a>;
00776         }
00777         idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>, (idtx-&gt;<a class="code" href="structIDTindex__s.html#m2">alloced</a> * idtx-&gt;<a class="code" href="structIDTindex__s.html#m1">size</a>) );
00778     }
00779     <span class="keywordflow">return</span> idtx;
00780 }
00781 
<a name="l00782"></a><a class="code" href="rpminstall_8c.html#a15">00782</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a15">IDTXsort</a>(<a class="code" href="structIDTindex__s.html">IDTX</a> idtx)
00783 {
00784     <span class="keywordflow">if</span> (idtx != NULL &amp;&amp; idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> != NULL &amp;&amp; idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a> &gt; 0)
00785         qsort(idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>, idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>, idtx-&gt;<a class="code" href="structIDTindex__s.html#m1">size</a>, <a class="code" href="rpminstall_8c.html#a12">IDTintcmp</a>);
00786     <span class="keywordflow">return</span> idtx;
00787 }
00788 
<a name="l00789"></a><a class="code" href="rpminstall_8c.html#a16">00789</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a16">IDTXload</a>(<a class="code" href="structrpmdb__s.html">rpmdb</a> db, <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> tag)
00790 {
00791     <a class="code" href="structIDTindex__s.html">IDTX</a> idtx = NULL;
00792     <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00793     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t) headerGetEntry;
00794     <a class="code" href="structheaderToken.html">Header</a> h;
00795 
00796     mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(db, tag, NULL, 0);
00797     <span class="comment">/*@-branchstate@*/</span>
00798     <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00799         <a class="code" href="group__header.html#a13">rpmTagType</a> type = <a class="code" href="group__header.html#a93a66">RPM_NULL_TYPE</a>;
00800         <a class="code" href="header_8h.html#a9">int_32</a> count = 0;
00801         <a class="code" href="header_8h.html#a9">int_32</a> * tidp;
00802 
00803         tidp = NULL;
00804         <span class="keywordflow">if</span> (!hge(h, tag, &amp;type, (<span class="keywordtype">void</span> **)&amp;tidp, &amp;count) || tidp == NULL)
00805             <span class="keywordflow">continue</span>;
00806 
00807         <span class="keywordflow">if</span> (type == <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a> &amp;&amp; (*tidp == 0 || *tidp == -1))
00808             <span class="keywordflow">continue</span>;
00809 
00810         idtx = <a class="code" href="rpminstall_8c.html#a14">IDTXgrow</a>(idtx, 1);
00811         <span class="keywordflow">if</span> (idtx == NULL)
00812             <span class="keywordflow">continue</span>;
00813         <span class="keywordflow">if</span> (idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> == NULL)
00814             <span class="keywordflow">continue</span>;
00815 
00816         {   <a class="code" href="structIDT__s.html">IDT</a> idt;
00817             <span class="comment">/*@-nullderef@*/</span>
00818             idt = idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> + idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>;
00819             <span class="comment">/*@=nullderef@*/</span>
00820             idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(h);
00821             (void) <a class="code" href="group__header.html#a88">headerNVR</a>(idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m3">n</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m4">v</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m5">r</a>);
00822             idt-&gt;<a class="code" href="structIDT__s.html#m1">key</a> = NULL;
00823             idt-&gt;<a class="code" href="structIDT__s.html#m0">instance</a> = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(mi);
00824             idt-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 = *tidp;
00825         }
00826         idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>++;
00827     }
00828     <span class="comment">/*@=branchstate@*/</span>
00829     mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00830 
00831     <span class="keywordflow">return</span> <a class="code" href="rpminstall_8c.html#a15">IDTXsort</a>(idtx);
00832 }
00833 
<a name="l00834"></a><a class="code" href="rpminstall_8c.html#a17">00834</a> <a class="code" href="structIDTindex__s.html">IDTX</a> <a class="code" href="rpminstall_8c.html#a17">IDTXglob</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * globstr, <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> tag)
00835 {
00836     <a class="code" href="structIDTindex__s.html">IDTX</a> idtx = NULL;
00837     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t) headerGetEntry;
00838     <a class="code" href="structheaderToken.html">Header</a> h;
00839     <a class="code" href="header_8h.html#a9">int_32</a> * tidp;
00840     <a class="code" href="struct__FD__s.html">FD_t</a> fd;
00841     <span class="keyword">const</span> <span class="keywordtype">char</span> ** av = NULL;
00842     <span class="keywordtype">int</span> ac = 0;
00843     <span class="keywordtype">int</span> rc;
00844     <span class="keywordtype">int</span> i;
00845 
00846     av = NULL;  ac = 0;
00847     rc = <a class="code" href="lib_2misc_8c.html#a18">rpmGlob</a>(globstr, &amp;ac, &amp;av);
00848 
00849     <span class="keywordflow">if</span> (rc == 0)
00850     <span class="keywordflow">for</span> (i = 0; i &lt; ac; i++) {
00851         <a class="code" href="group__header.html#a13">rpmTagType</a> type;
00852         <a class="code" href="header_8h.html#a9">int_32</a> count;
00853         <span class="keywordtype">int</span> isSource;
00854         <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rpmrc;
00855 
00856         fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(av[i], <span class="stringliteral">"r.ufdio"</span>);
00857         <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) {
00858             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a63">RPMERR_OPEN</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"open of %s failed: %s\n"</span>), av[i],
00859                         <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
00860             <span class="keywordflow">if</span> (fd) (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00861             <span class="keywordflow">continue</span>;
00862         }
00863 
00864         <span class="comment">/*@-mustmod@*/</span>  <span class="comment">/* LCL: segfault */</span>
00865         rpmrc = <a class="code" href="package_8c.html#a5">rpmReadPackageHeader</a>(fd, &amp;h, &amp;isSource, NULL, NULL);
00866         <span class="comment">/*@=mustmod@*/</span>
00867         <span class="keywordflow">if</span> (rpmrc != <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || isSource) {
00868             (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00869             <span class="keywordflow">continue</span>;
00870         }
00871 
00872         tidp = NULL;
00873         <span class="comment">/*@-branchstate@*/</span>
00874         <span class="keywordflow">if</span> (hge(h, tag, &amp;type, (<span class="keywordtype">void</span> **) &amp;tidp, &amp;count) &amp;&amp; tidp) {
00875 
00876             idtx = <a class="code" href="rpminstall_8c.html#a14">IDTXgrow</a>(idtx, 1);
00877             <span class="keywordflow">if</span> (idtx == NULL || idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> == NULL) {
00878                 h = <a class="code" href="group__header.html#a16">headerFree</a>(h);
00879                 (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00880                 <span class="keywordflow">continue</span>;
00881             }
00882             {   <a class="code" href="structIDT__s.html">IDT</a> idt;
00883                 idt = idtx-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> + idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>;
00884                 idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(h);
00885                 (void) <a class="code" href="group__header.html#a88">headerNVR</a>(idt-&gt;<a class="code" href="structIDT__s.html#m2">h</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m3">n</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m4">v</a>, &amp;idt-&gt;<a class="code" href="structIDT__s.html#m5">r</a>);
00886                 idt-&gt;<a class="code" href="structIDT__s.html#m1">key</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(av[i]);
00887                 idt-&gt;<a class="code" href="structIDT__s.html#m0">instance</a> = 0;
00888                 idt-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 = *tidp;
00889             }
00890             idtx-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>++;
00891         }
00892         <span class="comment">/*@=branchstate@*/</span>
00893 
00894         h = <a class="code" href="group__header.html#a16">headerFree</a>(h);
00895         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00896     }
00897 
00898     <span class="keywordflow">for</span> (i = 0; i &lt; ac; i++)
00899         av[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(av[i]);
00900     av = <a class="code" href="poptint_8h.html#a14">_free</a>(av);     ac = 0;
00901 
00902     <span class="keywordflow">return</span> <a class="code" href="rpminstall_8c.html#a15">IDTXsort</a>(idtx);
00903 }
00904 
<a name="l00905"></a><a class="code" href="group__rpmcli.html#a18">00905</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a18">rpmRollback</a>(<span class="keyword">struct</span> <a class="code" href="structrpmInstallArguments__s.html">rpmInstallArguments_s</a> * ia, <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv)
00906 {
00907     <a class="code" href="structrpmdb__s.html">rpmdb</a> db = NULL;
00908     <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = NULL;
00909     <a class="code" href="structrpmDependencyConflict__s.html">rpmDependencyConflict</a> conflicts = NULL;
00910     <span class="keywordtype">int</span> numConflicts = 0;
00911     <a class="code" href="structrpmProblemSet__s.html">rpmProblemSet</a> probs = NULL;
00912     <a class="code" href="structIDTindex__s.html">IDTX</a> itids = NULL;
00913     <a class="code" href="structIDTindex__s.html">IDTX</a> rtids = NULL;
00914     <span class="keywordtype">unsigned</span> thistid = 0xffffffff;
00915     <span class="keywordtype">unsigned</span> prevtid;
00916     time_t tid;
00917     <a class="code" href="structIDT__s.html">IDT</a> rp;
00918     <span class="keywordtype">int</span> nrids = 0;
00919     <a class="code" href="structIDT__s.html">IDT</a> ip;
00920     <span class="keywordtype">int</span> niids = 0;
00921     <span class="keywordtype">int</span> packagesIn;
00922     <span class="keywordtype">int</span> packagesOut;
00923     <span class="keywordtype">int</span> rc;
00924     <span class="keywordtype">int</span> i;
00925     <span class="keywordtype">int</span> ifmask= (<a class="code" href="group__rpmcli.html#a47a391">INSTALL_UPGRADE</a>|<a class="code" href="group__rpmcli.html#a47a392">INSTALL_FRESHEN</a>|<a class="code" href="group__rpmcli.html#a47a393">INSTALL_INSTALL</a>|<a class="code" href="group__rpmcli.html#a47a394">INSTALL_ERASE</a>);
00926 
00927     <span class="keywordflow">if</span> (argv != NULL &amp;&amp; *argv != NULL) {
00928         rc = -1;
00929         <span class="keywordflow">goto</span> exit;
00930     }
00931 
00932     rc = <a class="code" href="group__rpmdb.html#a57">rpmdbOpen</a>(ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m9">rootdir</a>, &amp;db, O_RDWR, 0644);
00933     <span class="keywordflow">if</span> (rc != 0)
00934         <span class="keywordflow">goto</span> exit;
00935 
00936     itids = <a class="code" href="rpminstall_8c.html#a16">IDTXload</a>(db, <a class="code" href="rpmlib_8h.html#a494a232">RPMTAG_INSTALLTID</a>);
00937     <span class="keywordflow">if</span> (itids != NULL) {
00938         ip = itids-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>;
00939         niids = itids-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>;
00940     } <span class="keywordflow">else</span> {
00941         ip = NULL;
00942         niids = 0;
00943     }
00944 
00945     {   <span class="keyword">const</span> <span class="keywordtype">char</span> * globstr = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_repackage_dir}/*.rpm"</span>, NULL);
00946         <span class="keywordflow">if</span> (globstr == NULL || *globstr == <span class="charliteral">'%'</span>) {
00947             globstr = <a class="code" href="poptint_8h.html#a14">_free</a>(globstr);
00948             rc = -1;
00949             <span class="keywordflow">goto</span> exit;
00950         }
00951         rtids = <a class="code" href="rpminstall_8c.html#a17">IDTXglob</a>(globstr, <a class="code" href="rpmlib_8h.html#a494a233">RPMTAG_REMOVETID</a>);
00952         <span class="keywordflow">if</span> (rtids != NULL) {
00953             rp = rtids-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a>;
00954             nrids = rtids-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>;
00955         } <span class="keywordflow">else</span> {
00956             rp = NULL;
00957             nrids = 0;
00958         }
00959         globstr = <a class="code" href="poptint_8h.html#a14">_free</a>(globstr);
00960     }
00961 
00962     <span class="comment">/* Run transactions until rollback goal is achieved. */</span>
00963     <span class="keywordflow">do</span> {
00964         prevtid = thistid;
00965         rc = 0;
00966         <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a> = 0;
00967         packagesIn = 0;
00968         packagesOut = 0;
00969         ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> &amp;= ~ifmask;
00970 
00971         <span class="comment">/* Find larger of the remaining install/erase transaction id's. */</span>
00972         thistid = 0;
00973         <span class="keywordflow">if</span> (ip != NULL &amp;&amp; ip-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 &gt; thistid)
00974             thistid = ip-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32;
00975         <span class="keywordflow">if</span> (rp != NULL &amp;&amp; rp-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 &gt; thistid)
00976             thistid = rp-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32;
00977 
00978         <span class="comment">/* If we've achieved the rollback goal, then we're done. */</span>
00979         <span class="keywordflow">if</span> (thistid == 0 || thistid &lt; ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m10">rbtid</a>)
00980             <span class="keywordflow">break</span>;
00981 
00982         ts = <a class="code" href="group__rpmtrans.html#a4">rpmtransCreateSet</a>(db, ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m9">rootdir</a>);
00983 
00984         <span class="comment">/* Install the previously erased packages for this transaction. */</span>
00985         <span class="keywordflow">while</span> (rp != NULL &amp;&amp; rp-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 == thistid) {
00986 
00987             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <span class="stringliteral">"\t+++ %s-%s-%s\t(from %s)\n"</span>, rp-&gt;<a class="code" href="structIDT__s.html#m3">n</a>, rp-&gt;<a class="code" href="structIDT__s.html#m4">v</a>, rp-&gt;<a class="code" href="structIDT__s.html#m5">r</a>, basename(rp-&gt;<a class="code" href="structIDT__s.html#m1">key</a>));
00988 
00989             <span class="keywordflow">if</span> (!(ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> &amp; ifmask))
00990                 ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> |= <a class="code" href="group__rpmcli.html#a47a393">INSTALL_INSTALL</a>;
00991 
00992             rc = <a class="code" href="group__rpmtrans.html#a5">rpmtransAddPackage</a>(ts, rp-&gt;<a class="code" href="structIDT__s.html#m2">h</a>, NULL, rp-&gt;<a class="code" href="structIDT__s.html#m1">key</a>,
00993                         (ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> &amp; <a class="code" href="group__rpmcli.html#a47a391">INSTALL_UPGRADE</a>) != 0,
00994                         ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m4">relocations</a>);
00995             <span class="keywordflow">if</span> (rc != 0)
00996                 <span class="keywordflow">goto</span> exit;
00997 
00998             <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a>++;
00999             packagesIn++;
01000 
01001 <span class="preprocessor">#ifdef  NOTYET</span>
01002 <span class="preprocessor"></span>            rp-&gt;<a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(rp-&gt;<a class="code" href="structIDT__s.html#m2">h</a>);
01003 <span class="preprocessor">#endif</span>
01004 <span class="preprocessor"></span>            nrids--;
01005             <span class="keywordflow">if</span> (nrids &gt; 0)
01006                 rp++;
01007             <span class="keywordflow">else</span>
01008                 rp = NULL;
01009         }
01010 
01011         <span class="comment">/*</span>
01012 <span class="comment">         * XXX OK, let's prevent disaster right here, as rollbacks will merrily</span>
01013 <span class="comment">         * XXX erase everything in order to achieve the desired goal.</span>
01014 <span class="comment">         */</span>
01015         <span class="keywordflow">if</span> (packagesIn == 0)
01016             <span class="keywordflow">break</span>;
01017 
01018         <span class="comment">/* Erase the previously installed packages for this transaction. */</span>
01019         <span class="keywordflow">while</span> (ip != NULL &amp;&amp; ip-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 == thistid) {
01020 
01021             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>,
01022                         <span class="stringliteral">"\t--- %s-%s-%s\t(from rpmdb instance #%u)\n"</span>, ip-&gt;<a class="code" href="structIDT__s.html#m3">n</a>, ip-&gt;<a class="code" href="structIDT__s.html#m4">v</a>, ip-&gt;<a class="code" href="structIDT__s.html#m5">r</a>, ip-&gt;<a class="code" href="structIDT__s.html#m0">instance</a>);
01023 
01024             <span class="keywordflow">if</span> (!(ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> &amp; ifmask))
01025                 ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> |= <a class="code" href="group__rpmcli.html#a47a394">INSTALL_ERASE</a>;
01026 
01027             rc = <a class="code" href="group__rpmtrans.html#a7">rpmtransRemovePackage</a>(ts, ip-&gt;<a class="code" href="structIDT__s.html#m0">instance</a>);
01028             <span class="keywordflow">if</span> (rc != 0)
01029                 <span class="keywordflow">goto</span> exit;
01030 
01031             <a class="code" href="rpminstall_8c.html#a1">packagesTotal</a>++;
01032             packagesOut++;
01033 
01034 <span class="preprocessor">#ifdef  NOTYET</span>
01035 <span class="preprocessor"></span>            ip-&gt;<a class="code" href="structIDT__s.html#m0">instance</a> = 0;
01036 <span class="preprocessor">#endif</span>
01037 <span class="preprocessor"></span>            niids--;
01038             <span class="keywordflow">if</span> (niids &gt; 0)
01039                 ip++;
01040             <span class="keywordflow">else</span>
01041                 ip = NULL;
01042         }
01043 
01044         <span class="comment">/* Anything to do? */</span>
01045         <span class="keywordflow">if</span> (<a class="code" href="rpminstall_8c.html#a1">packagesTotal</a> &lt;= 0)
01046             <span class="keywordflow">break</span>;
01047 
01048         tid = (time_t)thistid;
01049         <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">"rollback (+%d,-%d) packages to %s"</span>),
01050                         packagesIn, packagesOut, ctime(&amp;tid));
01051 
01052         conflicts = NULL;
01053         numConflicts = 0;
01054         rc = <a class="code" href="group__rpmtrans.html#a11">rpmdepCheck</a>(ts, &amp;conflicts, &amp;numConflicts);
01055         <span class="keywordflow">if</span> (rc != 0) {
01056             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"failed dependencies:\n"</span>));
01057             <a class="code" href="problems_8c.html#a2">printDepProblems</a>(stderr, conflicts, numConflicts);
01058             conflicts = <a class="code" href="group__rpmtrans.html#a13">rpmdepFreeConflicts</a>(conflicts, numConflicts);
01059             <span class="keywordflow">goto</span> exit;
01060         }
01061 
01062         rc = <a class="code" href="group__rpmtrans.html#a12">rpmdepOrder</a>(ts);
01063         <span class="keywordflow">if</span> (rc != 0)
01064             <span class="keywordflow">goto</span> exit;
01065 
01066         probs = NULL;
01067         rc = <a class="code" href="group__rpmtrans.html#a30">rpmRunTransactions</a>(ts,  <a class="code" href="rpminstall_8c.html#a87">rpmShowProgress</a>,
01068                 (<span class="keywordtype">void</span> *) ((<span class="keywordtype">long</span>)ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a>),
01069                 NULL, &amp;probs, ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m0">transFlags</a>,
01070                 (ia-&gt;<a class="code" href="structrpmInstallArguments__s.html#m1">probFilter</a>|<a class="code" href="rpmlib_8h.html#a504a356">RPMPROB_FILTER_OLDPACKAGE</a>));
01071         <span class="keywordflow">if</span> (rc &gt; 0) {
01072             <a class="code" href="problems_8c.html#a7">rpmProblemSetPrint</a>(stderr, probs);
01073             <span class="keywordflow">if</span> (probs != NULL) <a class="code" href="transaction_8c.html#a12">rpmProblemSetFree</a>(probs);
01074             probs = NULL;
01075         }
01076         <span class="keywordflow">if</span> (rc)
01077             <span class="keywordflow">goto</span> exit;
01078 
01079         ts = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(ts);
01080 
01081         <span class="comment">/* Clean up after successful rollback. */</span>
01082         <span class="keywordflow">if</span> (!<a class="code" href="rpmmessages_8h.html#a13">rpmIsDebug</a>())
01083         <span class="keywordflow">for</span> (i = 0; i &lt; rtids-&gt;<a class="code" href="structIDTindex__s.html#m3">nidt</a>; i++) {
01084             <a class="code" href="structIDT__s.html">IDT</a> rrp = rtids-&gt;<a class="code" href="structIDTindex__s.html#m4">idt</a> + i;
01085             <span class="keywordflow">if</span> (rrp-&gt;<a class="code" href="structIDT__s.html#m7">val</a>.u32 != thistid)
01086                 <span class="keywordflow">continue</span>;
01087             (void) unlink(rrp-&gt;<a class="code" href="structIDT__s.html#m1">key</a>);
01088         }
01089 
01090     } <span class="keywordflow">while</span> (1);
01091 
01092 exit:
01093     ts = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(ts);
01094 
01095     <span class="keywordflow">if</span> (db != NULL) (void) <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(db);
01096 
01097     rtids = <a class="code" href="rpminstall_8c.html#a13">IDTXfree</a>(rtids);
01098     itids = <a class="code" href="rpminstall_8c.html#a13">IDTXfree</a>(itids);
01099 
01100     <span class="keywordflow">return</span> rc;
01101 }
</pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:58 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>