<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>lib/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 <<a class="code" href="rpmcli_8h.html">rpmcli.h</a>></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 > <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 < <a class="code" href="rpminstall_8c.html#a0">hashesPrinted</a>; i++) (void) putchar (<span class="charliteral">'#'</span>); 00049 <span class="keywordflow">for</span> (; i < 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 < (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 < <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 & <a class="code" href="group__rpmcli.html#a47a390">INSTALL_LABEL</a>)) 00116 <span class="keywordflow">break</span>; 00117 <span class="keywordflow">if</span> (flags & <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 & <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 & <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 & <a class="code" href="group__rpmcli.html#a47a390">INSTALL_LABEL</a>)) 00151 <span class="keywordflow">break</span>; 00152 <span class="keywordflow">if</span> (flags & <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 & <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-><a class="code" href="structrpmEIU.html#m5">numPkgs</a> = 0; 00224 eiu-><a class="code" href="structrpmEIU.html#m9">prevx</a> = 0; 00225 eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a> = 0; 00226 00227 <span class="keywordflow">if</span> ((eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a> = relocations) != NULL) { 00228 <span class="keywordflow">while</span> (eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>-><a class="code" href="structrpmRelocation__s.html#m0">oldPath</a>) 00229 eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>++; 00230 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>-><a class="code" href="structrpmRelocation__s.html#m1">newPath</a> == NULL) 00231 eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a> = fileArgv; *eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a> != NULL; eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>, &ac, &av); 00241 <span class="keywordflow">if</span> (rc || ac == 0) <span class="keywordflow">continue</span>; 00242 00243 eiu-><a class="code" href="structrpmEIU.html#m16">argv</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-><a class="code" href="structrpmEIU.html#m16">argv</a>, (eiu-><a class="code" href="structrpmEIU.html#m15">argc</a>+ac+1) * <span class="keyword">sizeof</span>(*eiu-><a class="code" href="structrpmEIU.html#m16">argv</a>)); 00244 memcpy(eiu-><a class="code" href="structrpmEIU.html#m16">argv</a>+eiu-><a class="code" href="structrpmEIU.html#m15">argc</a>, av, ac * <span class="keyword">sizeof</span>(*av)); 00245 eiu-><a class="code" href="structrpmEIU.html#m15">argc</a> += ac; 00246 eiu-><a class="code" href="structrpmEIU.html#m16">argv</a>[eiu-><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-><a class="code" href="structrpmEIU.html#m10">pkgx</a> >= eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a>) { 00254 eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a> = eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a> + eiu-><a class="code" href="structrpmEIU.html#m15">argc</a>; 00255 eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>, 00256 (eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a> + 1) * <span class="keyword">sizeof</span>(*eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>)); 00257 memset(eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a> + eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a>, 0, 00258 ((eiu-><a class="code" href="structrpmEIU.html#m15">argc</a> + 1) * <span class="keyword">sizeof</span>(*eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>))); 00259 eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a>, 00260 (eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a> + 1) * <span class="keyword">sizeof</span>(*eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a>)); 00261 memset(eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a> + eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a>, 0, 00262 ((eiu-><a class="code" href="structrpmEIU.html#m15">argc</a> + 1) * <span class="keyword">sizeof</span>(*eiu-><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 < eiu-><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-><a class="code" href="structrpmEIU.html#m16">argv</a>[i]; 00269 eiu-><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 < 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-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; 00294 eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-><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-><a class="code" href="structrpmEIU.html#m8">pkgState</a>[eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a>] = 1; 00299 eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a>] = tfn; 00300 eiu-><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-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[eiu-><a class="code" href="structrpmEIU.html#m10">pkgx</a>] = fileURL; 00305 fileURL = NULL; 00306 eiu-><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-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a> = eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>+eiu-><a class="code" href="structrpmEIU.html#m9">prevx</a>; 00316 *eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a> != NULL; 00317 eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a>++, eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>); 00322 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(*eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a>, &fileName); 00323 00324 <span class="comment">/* Try to read the header from a package file. */</span> 00325 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a>, <span class="stringliteral">"r.ufdio"</span>); 00326 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>, 00328 Fstrerror(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>)); 00329 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>) { 00330 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00331 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = NULL; 00332 } 00333 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> = <a class="code" href="package_8c.html#a5">rpmReadPackageHeader</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>, &eiu-><a class="code" href="structrpmEIU.html#m2">h</a>, 00339 &eiu-><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-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00342 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = NULL; 00343 00344 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a> || eiu-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a93">RPMRC_SHORTREAD</a>) { 00345 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m14">isSource</a> && 00350 (eiu-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || eiu-><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-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a>); 00354 eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>, 00355 (eiu-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a> + 2) * <span class="keyword">sizeof</span>(*eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>)); 00356 eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>[eiu-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a>] = *eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a>; 00357 *eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a> = NULL; 00358 eiu-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a>++; 00359 eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>[eiu-><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-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> || eiu-><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-><a class="code" href="structrpmEIU.html#m1">db</a> == NULL) { 00365 <span class="keywordtype">int</span> mode = (transFlags & <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, &eiu-><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-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m0">ts</a> = <a class="code" href="group__rpmtrans.html#a4">rpmtransCreateSet</a>(eiu-><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-><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-><a class="code" href="structrpmEIU.html#m2">h</a>, <a class="code" href="rpmlib_8h.html#a494a202">RPMTAG_PREFIXES</a>, &pft, 00389 (<span class="keywordtype">void</span> **) &paths, &c) && (c == 1)) { 00390 eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>-><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-><a class="code" href="structrpmEIU.html#m2">h</a>, &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-><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 & <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-><a class="code" href="structrpmEIU.html#m2">h</a>, &name, NULL, NULL); 00411 <span class="comment">/*@-onlytrans@*/</span> 00412 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(eiu-><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-><a class="code" href="structrpmEIU.html#m2">h</a>) < 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-><a class="code" href="structrpmEIU.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(eiu-><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-><a class="code" href="structrpmEIU.html#m0">ts</a>, eiu-><a class="code" href="structrpmEIU.html#m2">h</a>, NULL, fileName, 00431 (interfaceFlags & <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-><a class="code" href="structrpmEIU.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(eiu-><a class="code" href="structrpmEIU.html#m2">h</a>); 00435 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>) 00436 eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>-><a class="code" href="structrpmRelocation__s.html#m0">oldPath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-><a class="code" href="structrpmEIU.html#m17">relocations</a>-><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-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>); 00446 eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>); 00453 eiu-><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-><a class="code" href="structrpmEIU.html#m11">numRPMS</a>++; 00459 <span class="keywordflow">continue</span>; 00460 } 00461 00462 <span class="keywordflow">if</span> (eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>); 00464 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(*eiu-><a class="code" href="structrpmEIU.html#m7">fnp</a>, <span class="stringliteral">"r.fpio"</span>); 00470 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>, 00472 Fstrerror(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>)); 00473 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>) { 00474 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00475 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = NULL; 00476 } 00477 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m3">fd</a>, &eiu-><a class="code" href="structrpmEIU.html#m15">argc</a>, &eiu-><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-><a class="code" href="structrpmEIU.html#m7">fnp</a>, Fstrerror(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>)); 00486 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00487 eiu-><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-><a class="code" href="structrpmEIU.html#m9">prevx</a>++; 00492 <span class="keywordflow">goto</span> restart; 00493 } 00494 00495 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; *eiu-><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-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a>, eiu-><a class="code" href="structrpmEIU.html#m11">numRPMS</a>); 00501 00502 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>) <span class="keywordflow">goto</span> exit; 00503 00504 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m11">numRPMS</a> && !(interfaceFlags & <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-><a class="code" href="structrpmEIU.html#m0">ts</a>, &conflicts, &numConflicts)) { 00509 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-><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 && 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-><a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-><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-><a class="code" href="structrpmEIU.html#m11">numRPMS</a> && !(interfaceFlags & <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-><a class="code" href="structrpmEIU.html#m0">ts</a>)) { 00526 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a> = eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a>; 00527 stopInstall = 1; 00528 } 00529 } 00530 00531 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m11">numRPMS</a> && !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-><a class="code" href="structrpmEIU.html#m11">numRPMS</a> + eiu-><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-><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, &probs, transFlags, probFilter); 00540 00541 <span class="keywordflow">if</span> (rc < 0) { 00542 eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a> += eiu-><a class="code" href="structrpmEIU.html#m11">numRPMS</a>; 00543 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (rc > 0) { 00544 eiu-><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-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a> && !stopInstall) { 00552 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a> != NULL) 00553 <span class="keywordflow">for</span> (i = 0; i < eiu-><a class="code" href="structrpmEIU.html#m12">numSRPMS</a>; i++) { 00554 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i] == NULL) <span class="keywordflow">continue</span>; 00555 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(eiu-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i], <span class="stringliteral">"r.ufdio"</span>); 00556 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(eiu-><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-><a class="code" href="structrpmEIU.html#m13">sourceURL</a>[i], Fstrerror(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>)); 00559 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>) { 00560 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00561 eiu-><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 & <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)) { 00567 eiu-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> = <a class="code" href="psm_8c.html#a10">rpmInstallSourcePackage</a>(rootdir, eiu-><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-><a class="code" href="structrpmEIU.html#m18">rpmrc</a> != <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>) eiu-><a class="code" href="structrpmEIU.html#m4">numFailed</a>++; 00570 } 00571 00572 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(eiu-><a class="code" href="structrpmEIU.html#m3">fd</a>); 00573 eiu-><a class="code" href="structrpmEIU.html#m3">fd</a> = NULL; 00574 } 00575 } 00576 00577 exit: 00578 eiu-><a class="code" href="structrpmEIU.html#m0">ts</a> = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(eiu-><a class="code" href="structrpmEIU.html#m0">ts</a>); 00579 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a> != NULL) 00580 <span class="keywordflow">for</span> (i = 0; i < eiu-><a class="code" href="structrpmEIU.html#m5">numPkgs</a>; i++) { 00581 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i] == NULL) <span class="keywordflow">continue</span>; 00582 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a>[i] == 1) 00583 (void) <a class="code" href="rpmrpc_8c.html#a27">Unlink</a>(eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i]); 00584 eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>[i]); 00585 } 00586 eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-><a class="code" href="structrpmEIU.html#m8">pkgState</a>); 00587 eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-><a class="code" href="structrpmEIU.html#m6">pkgURL</a>); 00588 eiu-><a class="code" href="structrpmEIU.html#m16">argv</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(eiu-><a class="code" href="structrpmEIU.html#m16">argv</a>); 00589 <span class="keywordflow">if</span> (eiu-><a class="code" href="structrpmEIU.html#m1">db</a> != NULL) { 00590 xx = <a class="code" href="group__rpmdb.html#a53">rpmdbClose</a>(eiu-><a class="code" href="structrpmEIU.html#m1">db</a>); 00591 eiu-><a class="code" href="structrpmEIU.html#m1">db</a> = NULL; 00592 } 00593 <span class="keywordflow">return</span> eiu-><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 & <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, &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 <= 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 & <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 & <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, &conflicts, &numConflicts)) { 00656 numFailed = numPackages; 00657 stopUninstall = 1; 00658 } 00659 00660 <span class="comment">/*@-branchstate@*/</span> 00661 <span class="keywordflow">if</span> (!stopUninstall && 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, &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 && *specFile) 00711 *specFile = <a class="code" href="poptint_8h.html#a14">_free</a>(*specFile); 00712 <span class="keywordflow">if</span> (cookie && *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-><a class="code" href="structIDT__s.html#m7">val</a>.u32 - (int)bp-><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-><a class="code" href="structIDT__s.html#m3">n</a>, bp-><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-><a class="code" href="structIDTindex__s.html#m4">idt</a>) 00746 <span class="keywordflow">for</span> (i = 0; i < idtx-><a class="code" href="structIDTindex__s.html#m3">nidt</a>; i++) { 00747 <a class="code" href="structIDT__s.html">IDT</a> idt = idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a> + i; 00748 idt-><a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(idt-><a class="code" href="structIDT__s.html#m2">h</a>); 00749 idt-><a class="code" href="structIDT__s.html#m1">key</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(idt-><a class="code" href="structIDT__s.html#m1">key</a>); 00750 } 00751 idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(idtx-><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-><a class="code" href="structIDTindex__s.html#m0">delta</a> = 10; 00761 idtx-><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 < 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-><a class="code" href="structIDTindex__s.html#m3">nidt</a> + need) > idtx-><a class="code" href="structIDTindex__s.html#m2">alloced</a>) { 00773 <span class="keywordflow">while</span> (need > 0) { 00774 idtx-><a class="code" href="structIDTindex__s.html#m2">alloced</a> += idtx-><a class="code" href="structIDTindex__s.html#m0">delta</a>; 00775 need -= idtx-><a class="code" href="structIDTindex__s.html#m0">delta</a>; 00776 } 00777 idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a>, (idtx-><a class="code" href="structIDTindex__s.html#m2">alloced</a> * idtx-><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 && idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a> != NULL && idtx-><a class="code" href="structIDTindex__s.html#m3">nidt</a> > 0) 00785 qsort(idtx-><a class="code" href="structIDTindex__s.html#m4">idt</a>, idtx-><a class="code" href="structIDTindex__s.html#m3">nidt</a>, idtx-><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, &type, (<span class="keywordtype">void</span> **)&tidp, &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> && (*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-><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-><a class="code" href="structIDTindex__s.html#m4">idt</a> + idtx-><a class="code" href="structIDTindex__s.html#m3">nidt</a>; 00819 <span class="comment">/*@=nullderef@*/</span> 00820 idt-><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-><a class="code" href="structIDT__s.html#m2">h</a>, &idt-><a class="code" href="structIDT__s.html#m3">n</a>, &idt-><a class="code" href="structIDT__s.html#m4">v</a>, &idt-><a class="code" href="structIDT__s.html#m5">r</a>); 00822 idt-><a class="code" href="structIDT__s.html#m1">key</a> = NULL; 00823 idt-><a class="code" href="structIDT__s.html#m0">instance</a> = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(mi); 00824 idt-><a class="code" href="structIDT__s.html#m7">val</a>.u32 = *tidp; 00825 } 00826 idtx-><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, &ac, &av); 00848 00849 <span class="keywordflow">if</span> (rc == 0) 00850 <span class="keywordflow">for</span> (i = 0; i < 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, &h, &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, &type, (<span class="keywordtype">void</span> **) &tidp, &count) && 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-><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-><a class="code" href="structIDTindex__s.html#m4">idt</a> + idtx-><a class="code" href="structIDTindex__s.html#m3">nidt</a>; 00884 idt-><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-><a class="code" href="structIDT__s.html#m2">h</a>, &idt-><a class="code" href="structIDT__s.html#m3">n</a>, &idt-><a class="code" href="structIDT__s.html#m4">v</a>, &idt-><a class="code" href="structIDT__s.html#m5">r</a>); 00886 idt-><a class="code" href="structIDT__s.html#m1">key</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(av[i]); 00887 idt-><a class="code" href="structIDT__s.html#m0">instance</a> = 0; 00888 idt-><a class="code" href="structIDT__s.html#m7">val</a>.u32 = *tidp; 00889 } 00890 idtx-><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 < 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 && *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-><a class="code" href="structrpmInstallArguments__s.html#m9">rootdir</a>, &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-><a class="code" href="structIDTindex__s.html#m4">idt</a>; 00939 niids = itids-><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-><a class="code" href="structIDTindex__s.html#m4">idt</a>; 00954 nrids = rtids-><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-><a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> &= ~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 && ip-><a class="code" href="structIDT__s.html#m7">val</a>.u32 > thistid) 00974 thistid = ip-><a class="code" href="structIDT__s.html#m7">val</a>.u32; 00975 <span class="keywordflow">if</span> (rp != NULL && rp-><a class="code" href="structIDT__s.html#m7">val</a>.u32 > thistid) 00976 thistid = rp-><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 < ia-><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-><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 && rp-><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-><a class="code" href="structIDT__s.html#m3">n</a>, rp-><a class="code" href="structIDT__s.html#m4">v</a>, rp-><a class="code" href="structIDT__s.html#m5">r</a>, basename(rp-><a class="code" href="structIDT__s.html#m1">key</a>)); 00988 00989 <span class="keywordflow">if</span> (!(ia-><a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> & ifmask)) 00990 ia-><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-><a class="code" href="structIDT__s.html#m2">h</a>, NULL, rp-><a class="code" href="structIDT__s.html#m1">key</a>, 00993 (ia-><a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> & <a class="code" href="group__rpmcli.html#a47a391">INSTALL_UPGRADE</a>) != 0, 00994 ia-><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-><a class="code" href="structIDT__s.html#m2">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(rp-><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 > 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 && ip-><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-><a class="code" href="structIDT__s.html#m3">n</a>, ip-><a class="code" href="structIDT__s.html#m4">v</a>, ip-><a class="code" href="structIDT__s.html#m5">r</a>, ip-><a class="code" href="structIDT__s.html#m0">instance</a>); 01023 01024 <span class="keywordflow">if</span> (!(ia-><a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a> & ifmask)) 01025 ia-><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-><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-><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 > 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> <= 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(&tid)); 01051 01052 conflicts = NULL; 01053 numConflicts = 0; 01054 rc = <a class="code" href="group__rpmtrans.html#a11">rpmdepCheck</a>(ts, &conflicts, &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-><a class="code" href="structrpmInstallArguments__s.html#m2">installInterfaceFlags</a>), 01069 NULL, &probs, ia-><a class="code" href="structrpmInstallArguments__s.html#m0">transFlags</a>, 01070 (ia-><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 > 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 < rtids-><a class="code" href="structIDTindex__s.html#m3">nidt</a>; i++) { 01084 <a class="code" href="structIDT__s.html">IDT</a> rrp = rtids-><a class="code" href="structIDTindex__s.html#m4">idt</a> + i; 01085 <span class="keywordflow">if</span> (rrp-><a class="code" href="structIDT__s.html#m7">val</a>.u32 != thistid) 01086 <span class="keywordflow">continue</span>; 01087 (void) unlink(rrp-><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>