Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>lib/psm.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.17 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>lib/psm.c</h1><a href="psm_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00006 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span>
00007 
00008 <span class="preprocessor">#include "<a class="code" href="psm_8h.html">psm.h</a>"</span>
00009 <span class="preprocessor">#include &lt;<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>&gt;</span>
00010 <span class="preprocessor">#include &lt;<a class="code" href="rpmurl_8h.html">rpmurl.h</a>&gt;</span>
00011 
00012 <span class="preprocessor">#include "<a class="code" href="depends_8h.html">depends.h</a>"</span>
00013 
00014 <span class="preprocessor">#include "<a class="code" href="rpmlead_8h.html">rpmlead.h</a>"</span>            <span class="comment">/* writeLead proto */</span>
00015 <span class="preprocessor">#include "<a class="code" href="signature_8h.html">signature.h</a>"</span>          <span class="comment">/* signature constants */</span>
00016 <span class="preprocessor">#include "<a class="code" href="ugid_8h.html">ugid.h</a>"</span>
00017 <span class="preprocessor">#include "<a class="code" href="misc_8h.html">misc.h</a>"</span>
00018 <span class="preprocessor">#include "<a class="code" href="rpmdb_8h.html">rpmdb.h</a>"</span>              <span class="comment">/* XXX for db_chrootDone */</span>
00019 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00020 
00021 <span class="comment">/*@access Header @*/</span>            <span class="comment">/* compared with NULL */</span>
00022 <span class="comment">/*@access rpmTransactionSet @*/</span> <span class="comment">/* compared with NULL */</span>
00023 <span class="comment">/*@access rpmdbMatchIterator @*/</span> <span class="comment">/* compared with NULL */</span>
00024 <span class="comment">/*@access TFI_t @*/</span>             <span class="comment">/* compared with NULL */</span>
00025 <span class="comment">/*@access FSM_t @*/</span>             <span class="comment">/* compared with NULL */</span>
00026 <span class="comment">/*@access PSM_t @*/</span>             <span class="comment">/* compared with NULL */</span>
00027 <span class="comment">/*@access FD_t @*/</span>              <span class="comment">/* compared with NULL */</span>
00028 <span class="comment">/*@access rpmdb @*/</span>             <span class="comment">/* compared with NULL */</span>
00029 
00030 <span class="preprocessor">#ifdef  DYING</span>
00031 <span class="preprocessor"></span><span class="comment">/*@-redecl -declundef -exportheadervar@*/</span>
00032 <span class="keyword">extern</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * chroot_prefix;
00033 <span class="comment">/*@=redecl =declundef =exportheadervar@*/</span>
00034 <span class="preprocessor">#endif</span>
00035 <span class="preprocessor"></span>
<a name="l00036"></a><a class="code" href="psm_8c.html#a2">00036</a> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a2">rpmVersionCompare</a>(<a class="code" href="structheaderToken.html">Header</a> first, <a class="code" href="structheaderToken.html">Header</a> second)
00037 {
00038     <span class="keyword">const</span> <span class="keywordtype">char</span> * one, * two;
00039     <a class="code" href="header_8h.html#a9">int_32</a> * epochOne, * epochTwo;
00040     <span class="keywordtype">int</span> rc;
00041 
00042     <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a40">headerGetEntry</a>(first, <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>, NULL, (<span class="keywordtype">void</span> **) &amp;epochOne, NULL))
00043         epochOne = NULL;
00044     <span class="keywordflow">if</span> (!<a class="code" href="group__header.html#a40">headerGetEntry</a>(second, <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>, NULL, (<span class="keywordtype">void</span> **) &amp;epochTwo,
00045                         NULL))
00046         epochTwo = NULL;
00047 
00048     <span class="keywordflow">if</span> (epochOne &amp;&amp; !epochTwo)
00049         <span class="keywordflow">return</span> 1;
00050     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!epochOne &amp;&amp; epochTwo)
00051         <span class="keywordflow">return</span> -1;
00052     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (epochOne &amp;&amp; epochTwo) {
00053         <span class="keywordflow">if</span> (*epochOne &lt; *epochTwo)
00054             <span class="keywordflow">return</span> -1;
00055         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*epochOne &gt; *epochTwo)
00056             <span class="keywordflow">return</span> 1;
00057     }
00058 
00059     rc = <a class="code" href="group__header.html#a40">headerGetEntry</a>(first, <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>, NULL, (<span class="keywordtype">void</span> **) &amp;one, NULL);
00060     rc = <a class="code" href="group__header.html#a40">headerGetEntry</a>(second, <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>, NULL, (<span class="keywordtype">void</span> **) &amp;two, NULL);
00061 
00062     rc = <a class="code" href="group__rpmtrans.html#a0">rpmvercmp</a>(one, two);
00063     <span class="keywordflow">if</span> (rc)
00064         <span class="keywordflow">return</span> rc;
00065 
00066     (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(first, <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>, NULL, (<span class="keywordtype">void</span> **) &amp;one, NULL);
00067     (void) <a class="code" href="group__header.html#a40">headerGetEntry</a>(second, <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>, NULL, (<span class="keywordtype">void</span> **) &amp;two, NULL);
00068 
00069     <span class="keywordflow">return</span> <a class="code" href="group__rpmtrans.html#a0">rpmvercmp</a>(one, two);
00070 }
00071 
<a name="l00072"></a><a class="code" href="psm_8c.html#a3">00072</a> <span class="keywordtype">void</span> <a class="code" href="psm_8c.html#a3">loadFi</a>(<a class="code" href="structheaderToken.html">Header</a> h, <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi)
00073 {
00074     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge;
00075     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd;
00076     <a class="code" href="header_8h.html#a12">uint_32</a> * uip;
00077     <span class="keywordtype">int</span> len;
00078     <span class="keywordtype">int</span> rc;
00079     <span class="keywordtype">int</span> i;
00080     
00081     <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a> == NULL)
00082         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a> = <a class="code" href="fsm_8c.html#a25">newFSM</a>();
00083 
00084     <span class="comment">/* XXX avoid gcc noise on pointer (4th arg) cast(s) */</span>
00085     hge = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED)
00086         ? (HGE_t) headerGetEntryMinMemory : (HGE_t) headerGetEntry;
00087     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a> = hge;
00088     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m5">hae</a> = (HAE_t) headerAddEntry;
00089     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m6">hme</a> = (HME_t) headerModifyEntry;
00090     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m7">hre</a> = (HRE_t) headerRemoveEntry;
00091     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> = hfd = headerFreeData;
00092 
00093     <span class="keywordflow">if</span> (h &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> == NULL)     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(h);
00094 
00095     <span class="comment">/* Duplicate name-version-release so that headers can be free'd. */</span>
00096     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, NULL);
00097     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>);
00098     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, NULL);
00099     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>);
00100     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>, NULL);
00101     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
00102 
00103     <span class="comment">/* -1 means not found */</span>
00104     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>, NULL, (<span class="keywordtype">void</span> **) &amp;uip, NULL);
00105     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m13">epoch</a> = (rc ? *uip : -1);
00106     <span class="comment">/* 0 means unknown */</span>
00107     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a159">RPMTAG_ARCHIVESIZE</a>, NULL, (<span class="keywordtype">void</span> **) &amp;uip, NULL);
00108     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> = (rc ? *uip : 0);
00109 
00110     <span class="keywordflow">if</span> (!hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>)) {
00111         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> = 0;
00112         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> = 0;
00113         <span class="keywordflow">return</span>;
00114     }
00115 
00116     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, NULL);
00117     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>);
00118     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, NULL);
00119     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, NULL);
00120     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, NULL);
00121     rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, NULL);
00122 
00123     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = <a class="code" href="rpmlib_8h.html#a501a301">FA_UNKNOWN</a>;
00124     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m14">flags</a> = 0;
00125 
00126     <span class="comment">/* actions is initialized earlier for added packages */</span>
00127     <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> == NULL)
00128         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>));
00129 
00130     <span class="keywordflow">switch</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) {
00131     <span class="keywordflow">case</span> TR_ADDED:
00132         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m42">mapflags</a> =
00133                 <a class="code" href="group__payload.html#a25a33">CPIO_MAP_PATH</a> | <a class="code" href="group__payload.html#a25a34">CPIO_MAP_MODE</a> | <a class="code" href="group__payload.html#a25a35">CPIO_MAP_UID</a> | <a class="code" href="group__payload.html#a25a36">CPIO_MAP_GID</a>;
00134         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a148">RPMTAG_FILEMD5S</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, NULL);
00135         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, NULL);
00136         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a201">RPMTAG_FILELANGS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>, NULL);
00137         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m17">fmtimes</a>, NULL);
00138         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a146">RPMTAG_FILERDEVS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m27">frdevs</a>, NULL);
00139 
00140         <span class="comment">/* 0 makes for noops */</span>
00141         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>));
00142 
00143         <span class="keywordflow">break</span>;
00144     <span class="keywordflow">case</span> TR_REMOVED:
00145         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m42">mapflags</a> = 
00146                 <a class="code" href="group__payload.html#a25a38">CPIO_MAP_ABSOLUTE</a> | <a class="code" href="group__payload.html#a25a39">CPIO_MAP_ADDDOT</a> | <a class="code" href="group__payload.html#a25a40">CPIO_ALL_HARDLINKS</a> |
00147                 <a class="code" href="group__payload.html#a25a33">CPIO_MAP_PATH</a> | <a class="code" href="group__payload.html#a25a34">CPIO_MAP_MODE</a> | <a class="code" href="group__payload.html#a25a35">CPIO_MAP_UID</a> | <a class="code" href="group__payload.html#a25a36">CPIO_MAP_GID</a>;
00148         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a148">RPMTAG_FILEMD5S</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, NULL);
00149         rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, NULL);
00150         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>)),
00151                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>));
00152         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>)),
00153                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>));
00154         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>)),
00155                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>));
00156         <span class="comment">/* XXX there's a tedious segfault here for some version(s) of rpm */</span>
00157         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>)
00158             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>)),
00159                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>));
00160         <span class="keywordflow">else</span>
00161             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(1, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>));
00162         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>)),
00163                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>));
00164         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
00165         <span class="keywordflow">break</span>;
00166     }
00167 
00168     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a> = -1;
00169     <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>; i++) {
00170         <span class="keywordflow">if</span> ((len = strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[i])) &gt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a>)
00171             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a> = len;
00172     }
00173 
00174     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a> = -1;
00175     <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
00176         <span class="keywordflow">if</span> ((len = strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i])) &gt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a>)
00177             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a> = len;
00178     }
00179 
00180     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m39">dperms</a> = 0755;
00181     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m40">fperms</a> = 0644;
00182 
00183     <span class="comment">/*@-nullstate@*/</span>    <span class="comment">/* FIX: fi-&gt;h is NULL for TR_REMOVED */</span>
00184     <span class="keywordflow">return</span>;
00185     <span class="comment">/*@=nullstate@*/</span>
00186 }
00187 
<a name="l00188"></a><a class="code" href="psm_8c.html#a4">00188</a> <span class="keywordtype">void</span> <a class="code" href="psm_8c.html#a4">freeFi</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi)
00189 {
00190     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
00191 
00192     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>);
00193     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>);
00194     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
00195     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>);
00196     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>);
00197     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>);
00198 
00199     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, -1);
00200     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, -1);
00201     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m21">obnl</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m21">obnl</a>, -1);
00202     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m22">odnl</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m22">odnl</a>, -1);
00203     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, -1);
00204     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, -1);
00205     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, -1);
00206     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, -1);
00207     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>, -1);
00208 
00209     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>);
00210     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>);
00211     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>);
00212     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>);
00213 
00214     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a> = <a class="code" href="fsm_8c.html#a26">freeFSM</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>);
00215 
00216     <span class="keywordflow">switch</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) {
00217     <span class="keywordflow">case</span> TR_ADDED:
00218             <span class="keywordflow">break</span>;
00219     <span class="keywordflow">case</span> TR_REMOVED:
00220         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, -1);
00221         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, -1);
00222         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, -1);
00223         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, -1);
00224         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, -1);
00225         <span class="keywordflow">break</span>;
00226     }
00227 
00228     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
00229 
00230     <span class="comment">/*@-nullstate@*/</span>
00231     <span class="keywordflow">return</span>;
00232     <span class="comment">/*@=nullstate@*/</span>
00233 }
00234 
<a name="l00235"></a><a class="code" href="psm_8c.html#a5">00235</a> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keyword">const</span> <a class="code" href="psm_8c.html#a5">fiTypeString</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi)
00236 {
00237     <span class="keywordflow">switch</span>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) {
00238     <span class="keywordflow">case</span> TR_ADDED:      <span class="keywordflow">return</span> <span class="stringliteral">" install"</span>;
00239     <span class="keywordflow">case</span> TR_REMOVED:    <span class="keywordflow">return</span> <span class="stringliteral">"   erase"</span>;
00240     <span class="keywordflow">default</span>:            <span class="keywordflow">return</span> <span class="stringliteral">"???"</span>;
00241     }
00242     <span class="comment">/*@noteached@*/</span>
00243 }
00244 
00249 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00250"></a><a class="code" href="structtagMacro.html">00250</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structtagMacro.html">tagMacro</a> {
<a name="l00251"></a><a class="code" href="structtagMacro.html#m0">00251</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *  <a class="code" href="structtagMacro.html#m0">macroname</a>; 
<a name="l00252"></a><a class="code" href="structtagMacro.html#m1">00252</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a>      <a class="code" href="structtagMacro.html#m1">tag</a>;            
00253 } <a class="code" href="psm_8c.html#a0">tagMacros</a>[] = {
00254     { <span class="stringliteral">"name"</span>,           <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a> },
00255     { <span class="stringliteral">"version"</span>,        <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a> },
00256     { <span class="stringliteral">"release"</span>,        <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a> },
00257     { <span class="stringliteral">"epoch"</span>,          <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a> },
00258     { NULL, 0 }
00259 };
00260 
<a name="l00267"></a><a class="code" href="psm_8c.html#a6">00267</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a6">rpmInstallLoadMacros</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, <a class="code" href="structheaderToken.html">Header</a> h)
00268         <span class="comment">/*@globals rpmGlobalMacroContext, internalState @*/</span>
00269         <span class="comment">/*@modifies rpmGlobalMacroContext, internalState @*/</span>
00270 {
00271     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t) fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00272     <span class="keyword">struct </span><a class="code" href="structtagMacro.html">tagMacro</a> * tagm;
00273     <span class="keyword">union </span>{
00274 <span class="comment">/*@unused@*/</span> <span class="keywordtype">void</span> * ptr;
00275 <span class="comment">/*@unused@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv;
00276         <span class="keyword">const</span> <span class="keywordtype">char</span> * str;
00277         <a class="code" href="header_8h.html#a9">int_32</a> * i32p;
00278     } body;
00279     <span class="keywordtype">char</span> numbuf[32];
00280     <a class="code" href="group__header.html#a13">rpmTagType</a> type;
00281 
00282     <span class="keywordflow">for</span> (tagm = <a class="code" href="psm_8c.html#a0">tagMacros</a>; tagm-&gt;<a class="code" href="structtagMacro.html#m0">macroname</a> != NULL; tagm++) {
00283         <span class="keywordflow">if</span> (!hge(h, tagm-&gt;<a class="code" href="structtagMacro.html#m1">tag</a>, &amp;type, (<span class="keywordtype">void</span> **) &amp;body, NULL))
00284             <span class="keywordflow">continue</span>;
00285         <span class="keywordflow">switch</span> (type) {
00286         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>:
00287             sprintf(numbuf, <span class="stringliteral">"%d"</span>, *body.i32p);
00288             <a class="code" href="macro_8c.html#a43">addMacro</a>(NULL, tagm-&gt;<a class="code" href="structtagMacro.html#m0">macroname</a>, NULL, numbuf, -1);
00289             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00290         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>:
00291             <a class="code" href="macro_8c.html#a43">addMacro</a>(NULL, tagm-&gt;<a class="code" href="structtagMacro.html#m0">macroname</a>, NULL, body.str, -1);
00292             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00293         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a66">RPM_NULL_TYPE</a>:
00294         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a67">RPM_CHAR_TYPE</a>:
00295         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a68">RPM_INT8_TYPE</a>:
00296         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>:
00297         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a72">RPM_BIN_TYPE</a>:
00298         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>:
00299         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a74">RPM_I18NSTRING_TYPE</a>:
00300         <span class="keywordflow">default</span>:
00301             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00302         }
00303     }
00304     <span class="keywordflow">return</span> 0;
00305 }
00306 
<a name="l00314"></a><a class="code" href="psm_8c.html#a7">00314</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a7">mergeFiles</a>(<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi, <a class="code" href="structheaderToken.html">Header</a> h, <a class="code" href="structheaderToken.html">Header</a> newH)
00315         <span class="comment">/*@modifies h @*/</span>
00316 {
00317     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00318     <a class="code" href="rpmlib_8h.html#a71">HME_t</a> hme = (HME_t)fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>;
00319     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
00320     <a class="code" href="rpmlib_8h.html#a74">fileAction</a> * actions = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>;
00321     <span class="keywordtype">int</span> i, j, k, fc, xx;
00322     <a class="code" href="group__header.html#a13">rpmTagType</a> type = 0;
00323     <a class="code" href="header_8h.html#a9">int_32</a> count = 0;
00324     <a class="code" href="header_8h.html#a9">int_32</a> dirNamesCount, dirCount;
00325     <span class="keywordtype">void</span> * data, * newdata;
00326     <a class="code" href="header_8h.html#a9">int_32</a> * dirIndexes, * newDirIndexes;
00327     <a class="code" href="header_8h.html#a12">uint_32</a> * fileSizes, fileSize;
00328     <span class="keyword">const</span> <span class="keywordtype">char</span> ** dirNames;
00329     <span class="keyword">const</span> <span class="keywordtype">char</span> ** newDirNames;
00330     <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> mergeTags[] = {
00331         <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>,
00332         <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>,
00333         <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>,
00334         <a class="code" href="rpmlib_8h.html#a494a146">RPMTAG_FILERDEVS</a>,
00335         <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>,
00336         <a class="code" href="rpmlib_8h.html#a494a148">RPMTAG_FILEMD5S</a>,
00337         <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>,
00338         <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>,
00339         <a class="code" href="rpmlib_8h.html#a494a152">RPMTAG_FILEUSERNAME</a>,
00340         <a class="code" href="rpmlib_8h.html#a494a153">RPMTAG_FILEGROUPNAME</a>,
00341         <a class="code" href="rpmlib_8h.html#a494a158">RPMTAG_FILEVERIFYFLAGS</a>,
00342         <a class="code" href="rpmlib_8h.html#a494a199">RPMTAG_FILEDEVICES</a>,
00343         <a class="code" href="rpmlib_8h.html#a494a200">RPMTAG_FILEINODES</a>,
00344         <a class="code" href="rpmlib_8h.html#a494a201">RPMTAG_FILELANGS</a>,
00345         <a class="code" href="rpmlib_8h.html#a494a221">RPMTAG_BASENAMES</a>,
00346         0,
00347     };
00348     <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> requireTags[] = {
00349         <a class="code" href="rpmlib_8h.html#a494a162">RPMTAG_REQUIRENAME</a>, <a class="code" href="rpmlib_8h.html#a494a163">RPMTAG_REQUIREVERSION</a>, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
00350         <a class="code" href="rpmlib_8h.html#a494a160">RPMTAG_PROVIDENAME</a>, <a class="code" href="rpmlib_8h.html#a494a217">RPMTAG_PROVIDEVERSION</a>, <a class="code" href="rpmlib_8h.html#a494a216">RPMTAG_PROVIDEFLAGS</a>,
00351         <a class="code" href="rpmlib_8h.html#a494a167">RPMTAG_CONFLICTNAME</a>, <a class="code" href="rpmlib_8h.html#a494a168">RPMTAG_CONFLICTVERSION</a>, <a class="code" href="rpmlib_8h.html#a494a166">RPMTAG_CONFLICTFLAGS</a>
00352     };
00353 
00354     xx = hge(h, <a class="code" href="rpmlib_8h.html#a494a122">RPMTAG_SIZE</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fileSizes, NULL);
00355     fileSize = *fileSizes;
00356     xx = hge(newH, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;fileSizes, &amp;count);
00357     <span class="keywordflow">for</span> (i = 0, fc = 0; i &lt; count; i++)
00358         <span class="keywordflow">if</span> (actions[i] != <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>) {
00359             fc++;
00360             fileSize += fileSizes[i];
00361         }
00362     xx = hme(h, <a class="code" href="rpmlib_8h.html#a494a122">RPMTAG_SIZE</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &amp;fileSize, 1);
00363 
00364     <span class="comment">/*@-sizeoftype@*/</span>
00365     <span class="keywordflow">for</span> (i = 0; mergeTags[i]; i++) {
00366         <span class="keywordflow">if</span> (!hge(newH, mergeTags[i], &amp;type, (<span class="keywordtype">void</span> **) &amp;data, &amp;count))
00367             <span class="keywordflow">continue</span>;
00368         <span class="keywordflow">switch</span> (type) {
00369         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a67">RPM_CHAR_TYPE</a>:
00370         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a68">RPM_INT8_TYPE</a>:
00371             newdata = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fc, <span class="keyword">sizeof</span>(<a class="code" href="header_8h.html#a11">int_8</a>));
00372             <span class="keywordflow">for</span> (j = 0, k = 0; j &lt; count; j++)
00373                 <span class="keywordflow">if</span> (actions[j] != <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>)
00374                         ((<a class="code" href="header_8h.html#a11">int_8</a> *) newdata)[k++] = ((<a class="code" href="header_8h.html#a11">int_8</a> *) data)[j];
00375             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, mergeTags[i], type, newdata, fc);
00376             free (newdata);
00377             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00378         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>:
00379             newdata = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fc, <span class="keyword">sizeof</span>(<a class="code" href="header_8h.html#a10">int_16</a>));
00380             <span class="keywordflow">for</span> (j = 0, k = 0; j &lt; count; j++)
00381                 <span class="keywordflow">if</span> (actions[j] != <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>)
00382                     ((<a class="code" href="header_8h.html#a10">int_16</a> *) newdata)[k++] = ((<a class="code" href="header_8h.html#a10">int_16</a> *) data)[j];
00383             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, mergeTags[i], type, newdata, fc);
00384             free (newdata);
00385             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00386         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>:
00387             newdata = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fc, <span class="keyword">sizeof</span>(<a class="code" href="header_8h.html#a9">int_32</a>));
00388             <span class="keywordflow">for</span> (j = 0, k = 0; j &lt; count; j++)
00389                 <span class="keywordflow">if</span> (actions[j] != <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>)
00390                     ((<a class="code" href="header_8h.html#a9">int_32</a> *) newdata)[k++] = ((<a class="code" href="header_8h.html#a9">int_32</a> *) data)[j];
00391             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, mergeTags[i], type, newdata, fc);
00392             free (newdata);
00393             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00394         <span class="keywordflow">case</span> <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>:
00395             newdata = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fc, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span> *));
00396             <span class="keywordflow">for</span> (j = 0, k = 0; j &lt; count; j++)
00397                 <span class="keywordflow">if</span> (actions[j] != <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>)
00398                     ((<span class="keywordtype">char</span> **) newdata)[k++] = ((<span class="keywordtype">char</span> **) data)[j];
00399             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, mergeTags[i], type, newdata, fc);
00400             free (newdata);
00401             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00402         <span class="keywordflow">default</span>:
00403             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a72">RPMERR_DATATYPE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Data type %d not supported\n"</span>),
00404                         (<span class="keywordtype">int</span>) type);
00405             <span class="keywordflow">return</span> 1;
00406             <span class="comment">/*@notreached@*/</span> <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
00407         }
00408         data = hfd(data, type);
00409     }
00410     <span class="comment">/*@=sizeoftype@*/</span>
00411     xx = hge(newH, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;newDirIndexes, &amp;count);
00412     xx = hge(newH, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;newDirNames, NULL);
00413     xx = hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;dirIndexes, NULL);
00414     xx = hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;data, &amp;dirNamesCount);
00415 
00416     dirNames = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(dirNamesCount + fc, <span class="keyword">sizeof</span>(*dirNames));
00417     <span class="keywordflow">for</span> (i = 0; i &lt; dirNamesCount; i++)
00418         dirNames[i] = ((<span class="keywordtype">char</span> **) data)[i];
00419     dirCount = dirNamesCount;
00420     newdata = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fc, <span class="keyword">sizeof</span>(*newDirIndexes));
00421     <span class="keywordflow">for</span> (i = 0, k = 0; i &lt; count; i++) {
00422         <span class="keywordflow">if</span> (actions[i] == <a class="code" href="rpmlib_8h.html#a501a312">FA_SKIPMULTILIB</a>)
00423             <span class="keywordflow">continue</span>;
00424         <span class="keywordflow">for</span> (j = 0; j &lt; dirCount; j++)
00425             <span class="keywordflow">if</span> (!strcmp(dirNames[j], newDirNames[newDirIndexes[i]]))
00426                 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00427         <span class="keywordflow">if</span> (j == dirCount)
00428             dirNames[dirCount++] = newDirNames[newDirIndexes[i]];
00429         ((<a class="code" href="header_8h.html#a9">int_32</a> *) newdata)[k++] = j;
00430     }
00431     xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, newdata, fc);
00432     <span class="keywordflow">if</span> (dirCount &gt; dirNamesCount)
00433         xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
00434                                dirNames + dirNamesCount,
00435                                dirCount - dirNamesCount);
00436     data = hfd(data, -1);
00437     newDirNames = hfd(newDirNames, -1);
00438     free (newdata);
00439     free (dirNames);
00440 
00441     <span class="keywordflow">for</span> (i = 0; i &lt; 9; i += 3) {
00442         <span class="keyword">const</span> <span class="keywordtype">char</span> **Names, **EVR, **newNames, **newEVR;
00443         <a class="code" href="group__header.html#a13">rpmTagType</a> nnt, nvt, rnt;
00444         <a class="code" href="header_8h.html#a12">uint_32</a> *Flags, *newFlags;
00445         <span class="keywordtype">int</span> Count = 0, newCount = 0;
00446 
00447         <span class="keywordflow">if</span> (!hge(newH, requireTags[i], &amp;nnt, (<span class="keywordtype">void</span> **) &amp;newNames, &amp;newCount))
00448             <span class="keywordflow">continue</span>;
00449 
00450         xx = hge(newH, requireTags[i+1], &amp;nvt, (<span class="keywordtype">void</span> **) &amp;newEVR, NULL);
00451         xx = hge(newH, requireTags[i+2], NULL, (<span class="keywordtype">void</span> **) &amp;newFlags, NULL);
00452         <span class="keywordflow">if</span> (hge(h, requireTags[i], &amp;rnt, (<span class="keywordtype">void</span> **) &amp;Names, &amp;Count))
00453         {
00454             (void) hge(h, requireTags[i+1], NULL, (<span class="keywordtype">void</span> **) &amp;EVR, NULL);
00455             (void) hge(h, requireTags[i+2], NULL, (<span class="keywordtype">void</span> **) &amp;Flags, NULL);
00456             <span class="keywordflow">for</span> (j = 0; j &lt; newCount; j++)
00457                 <span class="keywordflow">for</span> (k = 0; k &lt; Count; k++)
00458                     <span class="keywordflow">if</span> (!strcmp (newNames[j], Names[k])
00459                         &amp;&amp; !strcmp (newEVR[j], EVR[k])
00460                         &amp;&amp; (newFlags[j] &amp; <a class="code" href="rpmlib_8h.html#a16">RPMSENSE_SENSEMASK</a>) ==
00461                            (Flags[k] &amp; <a class="code" href="rpmlib_8h.html#a16">RPMSENSE_SENSEMASK</a>))
00462                     {
00463                         newNames[j] = NULL;
00464                         <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00465                     }
00466         }
00467         <span class="keywordflow">for</span> (j = 0, k = 0; j &lt; newCount; j++) {
00468             <span class="keywordflow">if</span> (!newNames[j] || !<a class="code" href="rpmlib_8h.html#a18">isDependsMULTILIB</a>(newFlags[j]))
00469                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
00470             <span class="keywordflow">if</span> (j != k) {
00471                 newNames[k] = newNames[j];
00472                 newEVR[k] = newEVR[j];
00473                 newFlags[k] = newFlags[j];
00474             }
00475             k++;
00476         }
00477         <span class="keywordflow">if</span> (k) {
00478             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, requireTags[i],
00479                                        <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, newNames, k);
00480             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, requireTags[i+1],
00481                                        <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, newEVR, k);
00482             xx = <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, requireTags[i+2], <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
00483                                        newFlags, k);
00484         }
00485         newNames = hfd(newNames, nnt);
00486         newEVR = hfd(newEVR, nvt);
00487         Names = hfd(Names, rnt);
00488     }
00489     <span class="keywordflow">return</span> 0;
00490 }
00491 
<a name="l00497"></a><a class="code" href="psm_8c.html#a8">00497</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a8">markReplacedFiles</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm)
00498         <span class="comment">/*@globals fileSystem @*/</span>
00499         <span class="comment">/*@modifies psm, fileSystem @*/</span>
00500 {
00501     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
00502     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
00503     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00504     <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * replaced = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>;
00505     <span class="keyword">const</span> <span class="keyword">struct </span><a class="code" href="structsharedFileInfo.html">sharedFileInfo</a> * sfi;
00506     <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
00507     <a class="code" href="structheaderToken.html">Header</a> h;
00508     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> * offsets;
00509     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> prev;
00510     <span class="keywordtype">int</span> num, xx;
00511 
00512     <span class="keywordflow">if</span> (!(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &gt; 0 &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>))
00513         <span class="keywordflow">return</span> 0;
00514 
00515     num = prev = 0;
00516     <span class="keywordflow">for</span> (sfi = replaced; sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; sfi++) {
00517         <span class="keywordflow">if</span> (prev &amp;&amp; prev == sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>)
00518             <span class="keywordflow">continue</span>;
00519         prev = sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>;
00520         num++;
00521     }
00522     <span class="keywordflow">if</span> (num == 0)
00523         <span class="keywordflow">return</span> 0;
00524 
00525     offsets = <a class="code" href="system_8h.html#a36">alloca</a>(num * <span class="keyword">sizeof</span>(*offsets));
00526     num = prev = 0;
00527     <span class="keywordflow">for</span> (sfi = replaced; sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; sfi++) {
00528         <span class="keywordflow">if</span> (prev &amp;&amp; prev == sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>)
00529             <span class="keywordflow">continue</span>;
00530         prev = sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>;
00531         offsets[num++] = sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>;
00532     }
00533 
00534     mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, NULL, 0);
00535     xx = <a class="code" href="group__rpmdb.html#a84">rpmdbAppendIterator</a>(mi, offsets, num);
00536     xx = <a class="code" href="group__rpmdb.html#a77">rpmdbSetIteratorRewrite</a>(mi, 1);
00537 
00538     sfi = replaced;
00539     <span class="keywordflow">while</span> ((h = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
00540         <span class="keywordtype">char</span> * secStates;
00541         <span class="keywordtype">int</span> modified;
00542         <span class="keywordtype">int</span> count;
00543 
00544         modified = 0;
00545 
00546         <span class="keywordflow">if</span> (!hge(h, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, NULL, (<span class="keywordtype">void</span> **)&amp;secStates, &amp;count))
00547             <span class="keywordflow">continue</span>;
00548         
00549         prev = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(mi);
00550         num = 0;
00551         <span class="keywordflow">while</span> (sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> &amp;&amp; sfi-&gt;<a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> == prev) {
00552             assert(sfi-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a> &lt; count);
00553             <span class="keywordflow">if</span> (secStates[sfi-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>] != <a class="code" href="rpmlib_8h.html#a495a239">RPMFILE_STATE_REPLACED</a>) {
00554                 secStates[sfi-&gt;<a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>] = <a class="code" href="rpmlib_8h.html#a495a239">RPMFILE_STATE_REPLACED</a>;
00555                 <span class="keywordflow">if</span> (modified == 0) {
00556                     <span class="comment">/* Modified header will be rewritten. */</span>
00557                     modified = 1;
00558                     xx = <a class="code" href="group__rpmdb.html#a78">rpmdbSetIteratorModified</a>(mi, modified);
00559                 }
00560                 num++;
00561             }
00562             sfi++;
00563         }
00564     }
00565     mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
00566 
00567     <span class="keywordflow">return</span> 0;
00568 }
00569 
<a name="l00577"></a><a class="code" href="psm_8c.html#a9">00577</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> <a class="code" href="psm_8c.html#a9">chkdir</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * dpath, <span class="keyword">const</span> <span class="keywordtype">char</span> * dname)
00578         <span class="comment">/*@globals fileSystem @*/</span>
00579         <span class="comment">/*@modifies fileSystem @*/</span>
00580 {
00581     <span class="keyword">struct </span>stat st;
00582     <span class="keywordtype">int</span> rc;
00583 
00584     <span class="keywordflow">if</span> ((rc = <a class="code" href="rpmrpc_8c.html#a45">Stat</a>(dpath, &amp;st)) &lt; 0) {
00585         <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(dpath, NULL);
00586         <span class="keywordflow">switch</span> (ut) {
00587         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>:
00588         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>:
00589             <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a29">errno</a> != ENOENT)
00590                 <span class="keywordflow">break</span>;
00591             <span class="comment">/*@fallthrough@*/</span>
00592         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>:
00593         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>:
00594             rc = <a class="code" href="group__rpmrpc.html#a22">Mkdir</a>(dpath, 0755);
00595             <span class="keywordflow">break</span>;
00596         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>:
00597             <span class="keywordflow">break</span>;
00598         }
00599         <span class="keywordflow">if</span> (rc &lt; 0) {
00600             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a38">RPMERR_CREATE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot create %%%s %s\n"</span>),
00601                         dname, dpath);
00602             <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00603         }
00604     }
00605     <span class="keywordflow">if</span> ((rc = <a class="code" href="rpmrpc_8c.html#a48">Access</a>(dpath, <a class="code" href="system_8h.html#a9">W_OK</a>))) {
00606         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a38">RPMERR_CREATE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"cannot write to %%%s %s\n"</span>), dname, dpath);
00607         <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00608     }
00609     <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
00610 }
00611 
<a name="l00612"></a><a class="code" href="psm_8c.html#a10">00612</a> <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> <a class="code" href="psm_8c.html#a10">rpmInstallSourcePackage</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * rootDir, <a class="code" href="struct__FD__s.html">FD_t</a> fd,
00613                         <span class="keyword">const</span> <span class="keywordtype">char</span> ** specFilePtr,
00614                         <a class="code" href="rpmmessages_8h.html#a17">rpmCallbackFunction</a> notify, <a class="code" href="rpmmessages_8h.html#a16">rpmCallbackData</a> notifyData,
00615                         <span class="keywordtype">char</span> ** cookie)
00616 {
00617     <a class="code" href="structrpmdb__s.html">rpmdb</a> <a class="code" href="structrpmdb__s.html">rpmdb</a> = NULL;
00618     <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = <a class="code" href="group__rpmtrans.html#a4">rpmtransCreateSet</a>(rpmdb, rootDir);
00619     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi), 1);
00620     <span class="keyword">const</span> <span class="keywordtype">char</span> * _sourcedir = NULL;
00621     <span class="keyword">const</span> <span class="keywordtype">char</span> * _specdir = NULL;
00622     <span class="keyword">const</span> <span class="keywordtype">char</span> * specFile = NULL;
00623     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge;
00624     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd;
00625     <a class="code" href="structheaderToken.html">Header</a> h = NULL;
00626     <span class="keyword">struct </span><a class="code" href="structpsm__s.html">psm_s</a> psmbuf;
00627     <a class="code" href="structpsm__s.html">PSM_t</a> psm = &amp;psmbuf;
00628     <span class="keywordtype">int</span> isSource;
00629     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc;
00630     <span class="keywordtype">int</span> i;
00631 
00632     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a> = notify;
00633     <span class="comment">/*@-temptrans -assignexpose@*/</span>
00634     ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a> = notifyData;
00635     <span class="comment">/*@=temptrans =assignexpose@*/</span>
00636 
00637     <span class="comment">/*@-mustmod@*/</span>      <span class="comment">/* LCL: segfault */</span>
00638     rc = <a class="code" href="package_8c.html#a5">rpmReadPackageHeader</a>(fd, &amp;h, &amp;isSource, NULL, NULL);
00639     <span class="comment">/*@=mustmod@*/</span>
00640     <span class="keywordflow">if</span> (rc)
00641         <span class="keywordflow">goto</span> exit;
00642 
00643     <span class="keywordflow">if</span> (!isSource) {
00644         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a35">RPMERR_NOTSRPM</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"source package expected, binary found\n"</span>));
00645         rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00646         <span class="keywordflow">goto</span> exit;
00647     }
00648 
00649     (void) <a class="code" href="group__rpmtrans.html#a5">rpmtransAddPackage</a>(ts, h, fd, NULL, 0, NULL);
00650     <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a> == NULL) {       <span class="comment">/* XXX can't happen */</span>
00651         rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00652         <span class="keywordflow">goto</span> exit;
00653     }
00654 
00655     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> = TR_ADDED;
00656     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m12">addedPackages</a>.<a class="code" href="structavailableList__s.html#m0">list</a>;
00657     <a class="code" href="psm_8c.html#a3">loadFi</a>(h, fi);
00658     hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00659     hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
00660     h = <a class="code" href="group__header.html#a16">headerFree</a>(h);  <span class="comment">/* XXX reference held by transaction set */</span>
00661 
00662     (void) <a class="code" href="psm_8c.html#a6">rpmInstallLoadMacros</a>(fi, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
00663 
00664     memset(psm, 0, <span class="keyword">sizeof</span>(*psm));
00665     psm-&gt;ts = ts;
00666     psm-&gt;fi = fi;
00667 
00668     <span class="keywordflow">if</span> (cookie) {
00669         *cookie = NULL;
00670         <span class="keywordflow">if</span> (hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a198">RPMTAG_COOKIE</a>, NULL, (<span class="keywordtype">void</span> **) cookie, NULL))
00671             *cookie = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(*cookie);
00672     }
00673 
00674     <span class="comment">/* XXX FIXME: can't do endian neutral MD5 verification yet. */</span>
00675     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, -1);
00676 
00677     <span class="comment">/* XXX FIXME: don't do per-file mapping, force global flags. */</span>
00678     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>);
00679     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m42">mapflags</a> = <a class="code" href="group__payload.html#a25a33">CPIO_MAP_PATH</a> | <a class="code" href="group__payload.html#a25a34">CPIO_MAP_MODE</a> | <a class="code" href="group__payload.html#a25a35">CPIO_MAP_UID</a> | <a class="code" href="group__payload.html#a25a36">CPIO_MAP_GID</a>;
00680 
00681     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m44">uid</a> = getuid();
00682     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m46">gid</a> = getgid();
00683     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = 0;
00684     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = 0;
00685 
00686     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
00687     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
00688     <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
00689         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m44">uid</a>;
00690         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m46">gid</a>;
00691     }
00692 
00693     <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++)
00694         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a302">FA_CREATE</a>;
00695 
00696     <a class="code" href="lib_2misc_8c.html#a14">rpmBuildFileList</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>, NULL);
00697 
00698     i = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>;
00699     <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a34">headerIsEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a198">RPMTAG_COOKIE</a>))
00700         <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++)
00701                 <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] &amp; <a class="code" href="rpmlib_8h.html#a496a248">RPMFILE_SPECFILE</a>) <span class="keywordflow">break</span>;
00702 
00703     <span class="keywordflow">if</span> (i == fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>) {
00704         <span class="comment">/* Find the spec file by name. */</span>
00705         <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
00706             <span class="keyword">const</span> <span class="keywordtype">char</span> * t = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>[i];
00707             t += strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>[i]) - 5;
00708             <span class="keywordflow">if</span> (!strcmp(t, <span class="stringliteral">".spec"</span>)) <span class="keywordflow">break</span>;
00709         }
00710     }
00711 
00712     _sourcedir = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>, <span class="stringliteral">"%{_sourcedir}"</span>, <span class="stringliteral">""</span>);
00713     rc = <a class="code" href="psm_8c.html#a9">chkdir</a>(_sourcedir, <span class="stringliteral">"sourcedir"</span>);
00714     <span class="keywordflow">if</span> (rc) {
00715         rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00716         <span class="keywordflow">goto</span> exit;
00717     }
00718 
00719     _specdir = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>, <span class="stringliteral">"%{_specdir}"</span>, <span class="stringliteral">""</span>);
00720     rc = <a class="code" href="psm_8c.html#a9">chkdir</a>(_specdir, <span class="stringliteral">"specdir"</span>);
00721     <span class="keywordflow">if</span> (rc) {
00722         rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00723         <span class="keywordflow">goto</span> exit;
00724     }
00725 
00726     <span class="comment">/* Build dnl/dil with {_sourcedir, _specdir} as values. */</span>
00727     <span class="keywordflow">if</span> (i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>) {
00728         <span class="keywordtype">int</span> speclen = strlen(_specdir) + 2;
00729         <span class="keywordtype">int</span> sourcelen = strlen(_sourcedir) + 2;
00730         <span class="keywordtype">char</span> * t;
00731 
00732         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, -1);
00733 
00734         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> = 2;
00735         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>) + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>) +
00736                         speclen + sourcelen);
00737         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = (<span class="keywordtype">int</span> *)(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>);
00738         memset(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, 0, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>));
00739         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i] = 1;
00740         <span class="comment">/*@-dependenttrans@*/</span>
00741         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[0] = t = (<span class="keywordtype">char</span> *)(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
00742         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[1] = t = <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(t, _sourcedir), <span class="stringliteral">"/"</span>) + 1;
00743         <span class="comment">/*@=dependenttrans@*/</span>
00744         (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(t, _specdir), <span class="stringliteral">"/"</span>);
00745 
00746         t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(speclen + strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) + 1);
00747         (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(t, _specdir), <span class="stringliteral">"/"</span>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]);
00748         specFile = t;
00749     } <span class="keywordflow">else</span> {
00750         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a34">RPMERR_NOSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"source package contains no .spec file\n"</span>));
00751         rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00752         <span class="keywordflow">goto</span> exit;
00753     }
00754 
00755     psm-&gt;goal = <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>;
00756 
00757     <span class="comment">/*@-compmempass@*/</span>  <span class="comment">/* FIX: psm-&gt;fi-&gt;dnl should be owned. */</span>
00758     rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a13">PSM_PROCESS</a>);
00759 
00760     (void) <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a16">PSM_FINI</a>);
00761     <span class="comment">/*@=compmempass@*/</span>
00762 
00763     <span class="keywordflow">if</span> (rc) rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
00764 
00765 exit:
00766     <span class="keywordflow">if</span> (specFilePtr &amp;&amp; specFile &amp;&amp; rc == <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>)
00767         *specFilePtr = specFile;
00768     <span class="keywordflow">else</span>
00769         specFile = <a class="code" href="poptint_8h.html#a14">_free</a>(specFile);
00770 
00771     _specdir = <a class="code" href="poptint_8h.html#a14">_free</a>(_specdir);
00772     _sourcedir = <a class="code" href="poptint_8h.html#a14">_free</a>(_sourcedir);
00773 
00774     <span class="keywordflow">if</span> (h) h = <a class="code" href="group__header.html#a16">headerFree</a>(h);
00775 
00776     <span class="keywordflow">if</span> (fi) {
00777         <a class="code" href="psm_8c.html#a4">freeFi</a>(fi);
00778         fi = <a class="code" href="poptint_8h.html#a14">_free</a>(fi);
00779     }
00780     ts = <a class="code" href="group__rpmtrans.html#a8">rpmtransFree</a>(ts);
00781 
00782     <span class="keywordflow">return</span> rc;
00783 }
00784 
00785 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00786"></a><a class="code" href="psm_8c.html#a1">00786</a> <span class="keyword">static</span> <span class="keywordtype">char</span> * <a class="code" href="psm_8c.html#a1">SCRIPT_PATH</a> =
00787         <span class="stringliteral">"PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin"</span>;
00788 
<a name="l00794"></a><a class="code" href="psm_8c.html#a11">00794</a> <span class="keyword">static</span> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> <a class="code" href="psm_8c.html#a11">tag2sln</a>(<span class="keywordtype">int</span> tag)
00795         <span class="comment">/*@*/</span>
00796 {
00797     <span class="keywordflow">switch</span> (tag) {
00798     <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a136">RPMTAG_PREIN</a>:          <span class="keywordflow">return</span> <span class="stringliteral">"%pre"</span>;
00799     <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a137">RPMTAG_POSTIN</a>:         <span class="keywordflow">return</span> <span class="stringliteral">"%post"</span>;
00800     <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a138">RPMTAG_PREUN</a>:          <span class="keywordflow">return</span> <span class="stringliteral">"%preun"</span>;
00801     <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a139">RPMTAG_POSTUN</a>:         <span class="keywordflow">return</span> <span class="stringliteral">"%postun"</span>;
00802     <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a183">RPMTAG_VERIFYSCRIPT</a>:   <span class="keywordflow">return</span> <span class="stringliteral">"%verify"</span>;
00803     }
00804     <span class="keywordflow">return</span> <span class="stringliteral">"%unknownscript"</span>;
00805 }
00806 
<a name="l00825"></a><a class="code" href="psm_8c.html#a12">00825</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a12">runScript</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm, <a class="code" href="structheaderToken.html">Header</a> h,
00826                 <span class="keyword">const</span> <span class="keywordtype">char</span> * sln,
00827                 <span class="keywordtype">int</span> progArgc, <span class="keyword">const</span> <span class="keywordtype">char</span> ** progArgv, 
00828                 <span class="keyword">const</span> <span class="keywordtype">char</span> * script, <span class="keywordtype">int</span> arg1, <span class="keywordtype">int</span> arg2)
00829         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
00830 <span class="comment">                fileSystem, internalState@*/</span>
00831         <span class="comment">/*@modifies psm, rpmGlobalMacroContext, fileSystem, internalState @*/</span>
00832 {
00833     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
00834     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
00835     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
00836     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
00837     <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv = NULL;
00838     <span class="keywordtype">int</span> argc = 0;
00839     <span class="keyword">const</span> <span class="keywordtype">char</span> ** prefixes = NULL;
00840     <span class="keywordtype">int</span> numPrefixes;
00841     <a class="code" href="group__header.html#a13">rpmTagType</a> ipt;
00842     <span class="keyword">const</span> <span class="keywordtype">char</span> * oldPrefix;
00843     <span class="keywordtype">int</span> maxPrefixLength;
00844     <span class="keywordtype">int</span> len;
00845     <span class="keywordtype">char</span> * prefixBuf = NULL;
00846     pid_t child;
00847     <span class="keywordtype">int</span> status = 0;
00848     <span class="keyword">const</span> <span class="keywordtype">char</span> * fn = NULL;
00849     <span class="keywordtype">int</span> i, xx;
00850     <span class="keywordtype">int</span> freePrefixes = 0;
00851     <a class="code" href="struct__FD__s.html">FD_t</a> out;
00852     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
00853     <span class="keyword">const</span> <span class="keywordtype">char</span> *n, *v, *r;
00854 
00855     <span class="keywordflow">if</span> (!progArgv &amp;&amp; !script)
00856         <span class="keywordflow">return</span> 0;
00857 
00858     <span class="keywordflow">if</span> (!progArgv) {
00859         argv = <a class="code" href="system_8h.html#a36">alloca</a>(5 * <span class="keyword">sizeof</span>(*argv));
00860         argv[0] = <span class="stringliteral">"/bin/sh"</span>;
00861         argc = 1;
00862     } <span class="keywordflow">else</span> {
00863         argv = <a class="code" href="system_8h.html#a36">alloca</a>((progArgc + 4) * <span class="keyword">sizeof</span>(*argv));
00864         memcpy(argv, progArgv, progArgc * <span class="keyword">sizeof</span>(*argv));
00865         argc = progArgc;
00866     }
00867 
00868     xx = <a class="code" href="group__header.html#a88">headerNVR</a>(h, &amp;n, &amp;v, &amp;r);
00869     <span class="keywordflow">if</span> (hge(h, <a class="code" href="rpmlib_8h.html#a494a203">RPMTAG_INSTPREFIXES</a>, &amp;ipt, (<span class="keywordtype">void</span> **) &amp;prefixes, &amp;numPrefixes)) {
00870         freePrefixes = 1;
00871     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (hge(h, <a class="code" href="rpmlib_8h.html#a494a171">RPMTAG_INSTALLPREFIX</a>, NULL, (<span class="keywordtype">void</span> **) &amp;oldPrefix, NULL)) {
00872         prefixes = &amp;oldPrefix;
00873         numPrefixes = 1;
00874     } <span class="keywordflow">else</span> {
00875         numPrefixes = 0;
00876     }
00877 
00878     maxPrefixLength = 0;
00879     <span class="keywordflow">for</span> (i = 0; i &lt; numPrefixes; i++) {
00880         len = strlen(prefixes[i]);
00881         <span class="keywordflow">if</span> (len &gt; maxPrefixLength) maxPrefixLength = len;
00882     }
00883     prefixBuf = <a class="code" href="system_8h.html#a36">alloca</a>(maxPrefixLength + 50);
00884 
00885     <span class="keywordflow">if</span> (script) {
00886         <a class="code" href="struct__FD__s.html">FD_t</a> fd;
00887         <span class="comment">/*@-branchstate@*/</span>
00888         <span class="keywordflow">if</span> (<a class="code" href="lib_2misc_8c.html#a8">makeTempFile</a>((!ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> ? ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a> : <span class="stringliteral">"/"</span>), &amp;fn, &amp;fd)) {
00889             <span class="keywordflow">if</span> (freePrefixes) free(prefixes);
00890             <span class="keywordflow">return</span> 1;
00891         }
00892         <span class="comment">/*@=branchstate@*/</span>
00893 
00894         <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a13">rpmIsDebug</a>() &amp;&amp;
00895             (!strcmp(argv[0], <span class="stringliteral">"/bin/sh"</span>) || !strcmp(argv[0], <span class="stringliteral">"/bin/bash"</span>)))
00896             xx = <a class="code" href="group__rpmio.html#a78">Fwrite</a>(<span class="stringliteral">"set -x\n"</span>, <span class="keyword">sizeof</span>(<span class="keywordtype">char</span>), 7, fd);
00897 
00898         xx = <a class="code" href="group__rpmio.html#a78">Fwrite</a>(script, <span class="keyword">sizeof</span>(script[0]), strlen(script), fd);
00899         xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
00900 
00901         {   <span class="keyword">const</span> <span class="keywordtype">char</span> * sn = fn;
00902             <span class="keywordflow">if</span> (!ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> &amp;&amp;
00903                 !(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>[0] == <span class="charliteral">'/'</span> &amp;&amp; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>[1] == <span class="charliteral">'\0'</span>))
00904             {
00905                 sn += strlen(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>)-1;
00906             }
00907             argv[argc++] = sn;
00908         }
00909 
00910         <span class="keywordflow">if</span> (arg1 &gt;= 0) {
00911             <span class="keywordtype">char</span> *av = <a class="code" href="system_8h.html#a36">alloca</a>(20);
00912             sprintf(av, <span class="stringliteral">"%d"</span>, arg1);
00913             argv[argc++] = av;
00914         }
00915         <span class="keywordflow">if</span> (arg2 &gt;= 0) {
00916             <span class="keywordtype">char</span> *av = <a class="code" href="system_8h.html#a36">alloca</a>(20);
00917             sprintf(av, <span class="stringliteral">"%d"</span>, arg2);
00918             argv[argc++] = av;
00919         }
00920     }
00921 
00922     argv[argc] = NULL;
00923 
00924     <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a> != NULL) {
00925         <span class="keywordflow">if</span> (<a class="code" href="rpmmessages_8h.html#a12">rpmIsVerbose</a>()) {
00926             out = <a class="code" href="rpmio_8c.html#a35">fdDup</a>(<a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>));
00927         } <span class="keywordflow">else</span> {
00928             out = <a class="code" href="group__rpmio.html#a83">Fopen</a>(<span class="stringliteral">"/dev/null"</span>, <span class="stringliteral">"w.fdio"</span>);
00929             <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a85">Ferror</a>(out)) {
00930                 out = <a class="code" href="rpmio_8c.html#a35">fdDup</a>(<a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>));
00931             }
00932         }
00933     } <span class="keywordflow">else</span> {
00934         out = <a class="code" href="rpmio_8c.html#a35">fdDup</a>(STDOUT_FILENO);
00935 <span class="preprocessor">#ifdef  DYING</span>
00936 <span class="preprocessor"></span>        out = <a class="code" href="rpmio_8h.html#a5">fdLink</a>(out, <span class="stringliteral">"runScript persist"</span>);
00937 <span class="preprocessor">#endif</span>
00938 <span class="preprocessor"></span>    }
00939     <span class="keywordflow">if</span> (out == NULL) <span class="keywordflow">return</span> 1;  <span class="comment">/* XXX can't happen */</span>
00940     
00941     <span class="comment">/*@-branchstate@*/</span>
00942     <span class="keywordflow">if</span> (!(child = fork())) {
00943         <span class="keyword">const</span> <span class="keywordtype">char</span> * rootDir;
00944         <span class="keywordtype">int</span> pipes[2];
00945 
00946         pipes[0] = pipes[1] = 0;
00947         <span class="comment">/* make stdin inaccessible */</span>
00948         xx = pipe(pipes);
00949         xx = close(pipes[1]);
00950         xx = dup2(pipes[0], STDIN_FILENO);
00951         xx = close(pipes[0]);
00952 
00953         <span class="comment">/* packages aren't prepared for umask != 022 */</span>
00954         (void) umask(022);
00955         
00956         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a> != NULL) {
00957             <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>) != STDERR_FILENO)
00958                 xx = dup2(<a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>), STDERR_FILENO);
00959             <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a86">Fileno</a>(out) != STDOUT_FILENO)
00960                 xx = dup2(<a class="code" href="group__rpmio.html#a86">Fileno</a>(out), STDOUT_FILENO);
00961             <span class="comment">/* make sure we don't close stdin/stderr/stdout by mistake! */</span>
00962             <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a86">Fileno</a>(out) &gt; STDERR_FILENO &amp;&amp; <a class="code" href="group__rpmio.html#a86">Fileno</a>(out) != <a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>)) {
00963                 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a> (out);
00964             }
00965             <span class="keywordflow">if</span> (<a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>) &gt; STDERR_FILENO) {
00966                 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>);
00967             }
00968         }
00969 
00970         {   <span class="keyword">const</span> <span class="keywordtype">char</span> *ipath = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"PATH=%{_install_script_path}"</span>, NULL);
00971             <span class="keyword">const</span> <span class="keywordtype">char</span> *path = <a class="code" href="psm_8c.html#a1">SCRIPT_PATH</a>;
00972 
00973             <span class="keywordflow">if</span> (ipath &amp;&amp; ipath[5] != <span class="charliteral">'%'</span>)
00974                 path = ipath;
00975             xx = <a class="code" href="lib_2misc_8c.html#a5">doputenv</a>(path);
00976             <span class="comment">/*@-modobserver@*/</span>
00977             ipath = <a class="code" href="poptint_8h.html#a14">_free</a>(ipath);
00978             <span class="comment">/*@=modobserver@*/</span>
00979         }
00980 
00981         <span class="keywordflow">for</span> (i = 0; i &lt; numPrefixes; i++) {
00982             sprintf(prefixBuf, <span class="stringliteral">"RPM_INSTALL_PREFIX%d=%s"</span>, i, prefixes[i]);
00983             xx = <a class="code" href="lib_2misc_8c.html#a5">doputenv</a>(prefixBuf);
00984 
00985             <span class="comment">/* backwards compatibility */</span>
00986             <span class="keywordflow">if</span> (i == 0) {
00987                 sprintf(prefixBuf, <span class="stringliteral">"RPM_INSTALL_PREFIX=%s"</span>, prefixes[i]);
00988                 xx = <a class="code" href="lib_2misc_8c.html#a5">doputenv</a>(prefixBuf);
00989             }
00990         }
00991 
00992         <span class="keywordflow">if</span> ((rootDir = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>) != NULL)    <span class="comment">/* XXX can't happen */</span>
00993         <span class="keywordflow">switch</span>(<a class="code" href="url_8c.html#a17">urlIsURL</a>(rootDir)) {
00994         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>:
00995             rootDir += <span class="keyword">sizeof</span>(<span class="stringliteral">"file://"</span>) - 1;
00996             rootDir = strchr(rootDir, <span class="charliteral">'/'</span>);
00997             <span class="comment">/*@fallthrough@*/</span>
00998         <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>:
00999             <span class="keywordflow">if</span> (!ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> &amp;&amp; !(rootDir[0] == <span class="charliteral">'/'</span> &amp;&amp; rootDir[1] == <span class="charliteral">'\0'</span>)) {
01000                 <span class="comment">/*@-unrecog -superuser @*/</span>
01001                 xx = chroot(rootDir);
01002                 <span class="comment">/*@=unrecog =superuser @*/</span>
01003             }
01004             xx = chdir(<span class="stringliteral">"/"</span>);
01005             xx = execv(argv[0], (<span class="keywordtype">char</span> *<span class="keyword">const</span> *)argv);
01006             <span class="keywordflow">break</span>;
01007         <span class="keywordflow">default</span>:
01008             <span class="keywordflow">break</span>;
01009         }
01010 
01011         _exit(-1);
01012         <span class="comment">/*@notreached@*/</span>
01013     }
01014     <span class="comment">/*@=branchstate@*/</span>
01015 
01016     <span class="keywordflow">if</span> (waitpid(child, &amp;status, 0) &lt; 0) {
01017         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a52">RPMERR_SCRIPT</a>,
01018      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"execution of %s scriptlet from %s-%s-%s failed, waitpid returned %s\n"</span>),
01019                  sln, n, v, r, strerror (<a class="code" href="system_8h.html#a29">errno</a>));
01020         <span class="comment">/* XXX what to do here? */</span>
01021         rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01022     } <span class="keywordflow">else</span> {
01023         <span class="keywordflow">if</span> (!WIFEXITED(status) || WEXITSTATUS(status)) {
01024             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a52">RPMERR_SCRIPT</a>,
01025      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"execution of %s scriptlet from %s-%s-%s failed, exit status %d\n"</span>),
01026                      sln, n, v, r, WEXITSTATUS(status));
01027             rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01028         }
01029     }
01030 
01031     <span class="keywordflow">if</span> (freePrefixes) prefixes = hfd(prefixes, ipt);
01032 
01033     xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(out);   <span class="comment">/* XXX dup'd STDOUT_FILENO */</span>
01034     
01035     <span class="keywordflow">if</span> (script) {
01036         <span class="keywordflow">if</span> (!<a class="code" href="rpmmessages_8h.html#a13">rpmIsDebug</a>())
01037             xx = unlink(fn);
01038         fn = <a class="code" href="poptint_8h.html#a14">_free</a>(fn);
01039     }
01040 
01041     <span class="keywordflow">return</span> rc;
01042 }
01043 
<a name="l01049"></a><a class="code" href="psm_8c.html#a13">01049</a> <span class="keyword">static</span> <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> <a class="code" href="psm_8c.html#a13">runInstScript</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm)
01050         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01051 <span class="comment">                fileSystem, internalState @*/</span>
01052         <span class="comment">/*@modifies psm, rpmGlobalMacroContext,</span>
01053 <span class="comment">                fileSystem, internalState @*/</span>
01054 {
01055     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
01056     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
01057     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
01058     <span class="keywordtype">void</span> ** programArgv;
01059     <span class="keywordtype">int</span> programArgc;
01060     <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv;
01061     <a class="code" href="group__header.html#a13">rpmTagType</a> ptt, stt;
01062     <span class="keyword">const</span> <span class="keywordtype">char</span> * script;
01063     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01064     <span class="keywordtype">int</span> xx;
01065 
01066     <span class="comment">/*</span>
01067 <span class="comment">     * headerGetEntry() sets the data pointer to NULL if the entry does</span>
01068 <span class="comment">     * not exist.</span>
01069 <span class="comment">     */</span>
01070     xx = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-&gt;<a class="code" href="structpsm__s.html#m12">progTag</a>, &amp;ptt, (<span class="keywordtype">void</span> **) &amp;programArgv, &amp;programArgc);
01071     xx = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a>, &amp;stt, (<span class="keywordtype">void</span> **) &amp;script, NULL);
01072 
01073     <span class="keywordflow">if</span> (programArgv &amp;&amp; ptt == <a class="code" href="group__header.html#a93a71">RPM_STRING_TYPE</a>) {
01074         argv = <a class="code" href="system_8h.html#a36">alloca</a>(<span class="keyword">sizeof</span>(<span class="keywordtype">char</span> *));
01075         *argv = (<span class="keyword">const</span> <span class="keywordtype">char</span> *) programArgv;
01076     } <span class="keywordflow">else</span> {
01077         argv = (<span class="keyword">const</span> <span class="keywordtype">char</span> **) programArgv;
01078     }
01079 
01080     rc = <a class="code" href="psm_8c.html#a12">runScript</a>(psm, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a>), programArgc, argv,
01081                 script, psm-&gt;<a class="code" href="structpsm__s.html#m14">scriptArg</a>, -1);
01082 
01083     programArgv = hfd(programArgv, ptt);
01084     script = hfd(script, stt);
01085     <span class="keywordflow">return</span> <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01086 }
01087 
<a name="l01096"></a><a class="code" href="psm_8c.html#a14">01096</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a14">handleOneTrigger</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm, <a class="code" href="structheaderToken.html">Header</a> sourceH, <a class="code" href="structheaderToken.html">Header</a> triggeredH,
01097                         <span class="keywordtype">int</span> arg2, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * triggersAlreadyRun)
01098         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01099 <span class="comment">                fileSystem, internalState@*/</span>
01100         <span class="comment">/*@modifies psm, triggeredH, *triggersAlreadyRun, rpmGlobalMacroContext,</span>
01101 <span class="comment">                fileSystem, internalState @*/</span>
01102 {
01103     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
01104     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
01105     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
01106     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
01107     <span class="keyword">const</span> <span class="keywordtype">char</span> ** triggerNames;
01108     <span class="keyword">const</span> <span class="keywordtype">char</span> ** triggerEVR;
01109     <span class="keyword">const</span> <span class="keywordtype">char</span> ** triggerScripts;
01110     <span class="keyword">const</span> <span class="keywordtype">char</span> ** triggerProgs;
01111     <a class="code" href="header_8h.html#a9">int_32</a> * triggerFlags;
01112     <a class="code" href="header_8h.html#a9">int_32</a> * triggerIndices;
01113     <a class="code" href="group__header.html#a13">rpmTagType</a> tnt, tvt, tft;
01114     <span class="keyword">const</span> <span class="keywordtype">char</span> * triggerPackageName;
01115     <span class="keyword">const</span> <span class="keywordtype">char</span> * sourceName;
01116     <span class="keywordtype">int</span> numTriggers;
01117     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01118     <span class="keywordtype">int</span> i;
01119     <span class="keywordtype">int</span> skip;
01120     <span class="keywordtype">int</span> xx;
01121 
01122     <span class="keywordflow">if</span> (!(      hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a179">RPMTAG_TRIGGERNAME</a>, &amp;tnt, 
01123                         (<span class="keywordtype">void</span> **) &amp;triggerNames, &amp;numTriggers) &amp;&amp;
01124                 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a181">RPMTAG_TRIGGERFLAGS</a>, &amp;tft,
01125                         (<span class="keywordtype">void</span> **) &amp;triggerFlags, NULL) &amp;&amp;
01126                 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a180">RPMTAG_TRIGGERVERSION</a>, &amp;tvt,
01127                         (<span class="keywordtype">void</span> **) &amp;triggerEVR, NULL))
01128         )
01129         <span class="keywordflow">return</span> 0;
01130 
01131     xx = <a class="code" href="group__header.html#a88">headerNVR</a>(sourceH, &amp;sourceName, NULL, NULL);
01132 
01133     <span class="keywordflow">for</span> (i = 0; i &lt; numTriggers; i++) {
01134         <a class="code" href="group__header.html#a13">rpmTagType</a> tit, tst, tpt;
01135 
01136         <span class="keywordflow">if</span> (!(triggerFlags[i] &amp; psm-&gt;<a class="code" href="structpsm__s.html#m15">sense</a>)) <span class="keywordflow">continue</span>;
01137         <span class="keywordflow">if</span> (strcmp(triggerNames[i], sourceName)) <span class="keywordflow">continue</span>;
01138 
01139         <span class="comment">/*</span>
01140 <span class="comment">         * For some reason, the TRIGGERVERSION stuff includes the name of</span>
01141 <span class="comment">         * the package which the trigger is based on. We need to skip</span>
01142 <span class="comment">         * over that here. I suspect that we'll change our minds on this</span>
01143 <span class="comment">         * and remove that, so I'm going to just 'do the right thing'.</span>
01144 <span class="comment">         */</span>
01145         skip = strlen(triggerNames[i]);
01146         <span class="keywordflow">if</span> (!strncmp(triggerEVR[i], triggerNames[i], skip) &amp;&amp;
01147             (triggerEVR[i][skip] == <span class="charliteral">'-'</span>))
01148             skip++;
01149         <span class="keywordflow">else</span>
01150             skip = 0;
01151 
01152         <span class="keywordflow">if</span> (!<a class="code" href="group__rpmdep.html#a3">headerMatchesDepFlags</a>(sourceH, triggerNames[i],
01153                 triggerEVR[i] + skip, triggerFlags[i]))
01154             <span class="keywordflow">continue</span>;
01155 
01156         <span class="keywordflow">if</span> (!(  hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a182">RPMTAG_TRIGGERINDEX</a>, &amp;tit,
01157                        (<span class="keywordtype">void</span> **) &amp;triggerIndices, NULL) &amp;&amp;
01158                 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a178">RPMTAG_TRIGGERSCRIPTS</a>, &amp;tst,
01159                        (<span class="keywordtype">void</span> **) &amp;triggerScripts, NULL) &amp;&amp;
01160                 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a196">RPMTAG_TRIGGERSCRIPTPROG</a>, &amp;tpt,
01161                        (<span class="keywordtype">void</span> **) &amp;triggerProgs, NULL))
01162             )
01163             <span class="keywordflow">continue</span>;
01164 
01165         xx = <a class="code" href="group__header.html#a88">headerNVR</a>(triggeredH, &amp;triggerPackageName, NULL, NULL);
01166 
01167         {   <span class="keywordtype">int</span> arg1;
01168             <span class="keywordtype">int</span> index;
01169 
01170             arg1 = <a class="code" href="group__rpmdb.html#a61">rpmdbCountPackages</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, triggerPackageName);
01171             <span class="keywordflow">if</span> (arg1 &lt; 0) {
01172                 <span class="comment">/* XXX W2DO? same as "execution of script failed" */</span>
01173                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01174             } <span class="keywordflow">else</span> {
01175                 arg1 += psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a>;
01176                 index = triggerIndices[i];
01177                 <span class="keywordflow">if</span> (triggersAlreadyRun == NULL ||
01178                     triggersAlreadyRun[index] == 0)
01179                 {
01180                     rc = <a class="code" href="psm_8c.html#a12">runScript</a>(psm, triggeredH, <span class="stringliteral">"%trigger"</span>, 1,
01181                             triggerProgs + index, triggerScripts[index], 
01182                             arg1, arg2);
01183                     <span class="keywordflow">if</span> (triggersAlreadyRun != NULL)
01184                         triggersAlreadyRun[index] = 1;
01185                 }
01186             }
01187         }
01188 
01189         triggerIndices = hfd(triggerIndices, tit);
01190         triggerScripts = hfd(triggerScripts, tst);
01191         triggerProgs = hfd(triggerProgs, tpt);
01192 
01193         <span class="comment">/*</span>
01194 <span class="comment">         * Each target/source header pair can only result in a single</span>
01195 <span class="comment">         * script being run.</span>
01196 <span class="comment">         */</span>
01197         <span class="keywordflow">break</span>;
01198     }
01199 
01200     triggerNames = hfd(triggerNames, tnt);
01201     triggerFlags = hfd(triggerFlags, tft);
01202     triggerEVR = hfd(triggerEVR, tvt);
01203 
01204     <span class="keywordflow">return</span> rc;
01205 }
01206 
<a name="l01212"></a><a class="code" href="psm_8c.html#a15">01212</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a15">runTriggers</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm)
01213         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01214 <span class="comment">                fileSystem, internalState @*/</span>
01215         <span class="comment">/*@modifies psm, rpmGlobalMacroContext,</span>
01216 <span class="comment">                fileSystem, internalState @*/</span>
01217 {
01218     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
01219     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
01220     <span class="keywordtype">int</span> numPackage;
01221     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01222 
01223     numPackage = <a class="code" href="group__rpmdb.html#a61">rpmdbCountPackages</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>) + psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a>;
01224     <span class="keywordflow">if</span> (numPackage &lt; 0)
01225         <span class="keywordflow">return</span> 1;
01226 
01227     {   <a class="code" href="structheaderToken.html">Header</a> triggeredH;
01228         <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
01229         <span class="keywordtype">int</span> countCorrection = psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a>;
01230 
01231         psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a> = 0;
01232         mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a179">RPMTAG_TRIGGERNAME</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, 0);
01233         <span class="keywordflow">while</span>((triggeredH = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
01234             rc |= <a class="code" href="psm_8c.html#a14">handleOneTrigger</a>(psm, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, triggeredH, numPackage, NULL);
01235         }
01236 
01237         mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
01238         psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a> = countCorrection;
01239     }
01240 
01241     <span class="keywordflow">return</span> rc;
01242 }
01243 
<a name="l01249"></a><a class="code" href="psm_8c.html#a16">01249</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a16">runImmedTriggers</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm)
01250         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01251 <span class="comment">                fileSystem, internalState @*/</span>
01252         <span class="comment">/*@modifies psm, rpmGlobalMacroContext,</span>
01253 <span class="comment">                fileSystem, internalState @*/</span>
01254 {
01255     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
01256     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
01257     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
01258     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
01259     <span class="keyword">const</span> <span class="keywordtype">char</span> ** triggerNames;
01260     <span class="keywordtype">int</span> numTriggers;
01261     <a class="code" href="header_8h.html#a9">int_32</a> * triggerIndices;
01262     <a class="code" href="group__header.html#a13">rpmTagType</a> tnt, tit;
01263     <span class="keywordtype">int</span> numTriggerIndices;
01264     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * triggersRun;
01265     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01266 
01267     <span class="keywordflow">if</span> (!(      hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a179">RPMTAG_TRIGGERNAME</a>, &amp;tnt,
01268                         (<span class="keywordtype">void</span> **) &amp;triggerNames, &amp;numTriggers) &amp;&amp;
01269                 hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a182">RPMTAG_TRIGGERINDEX</a>, &amp;tit,
01270                         (<span class="keywordtype">void</span> **) &amp;triggerIndices, &amp;numTriggerIndices))
01271         )
01272         <span class="keywordflow">return</span> 0;
01273 
01274     triggersRun = <a class="code" href="system_8h.html#a36">alloca</a>(<span class="keyword">sizeof</span>(*triggersRun) * numTriggerIndices);
01275     memset(triggersRun, 0, <span class="keyword">sizeof</span>(*triggersRun) * numTriggerIndices);
01276 
01277     {   <a class="code" href="structheaderToken.html">Header</a> sourceH = NULL;
01278         <span class="keywordtype">int</span> i;
01279 
01280         <span class="keywordflow">for</span> (i = 0; i &lt; numTriggers; i++) {
01281             <a class="code" href="struct__rpmdbMatchIterator.html">rpmdbMatchIterator</a> mi;
01282 
01283             <span class="keywordflow">if</span> (triggersRun[triggerIndices[i]] != 0) <span class="keywordflow">continue</span>;
01284         
01285             mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, triggerNames[i], 0);
01286 
01287             <span class="keywordflow">while</span>((sourceH = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(mi)) != NULL) {
01288                 rc |= <a class="code" href="psm_8c.html#a14">handleOneTrigger</a>(psm, sourceH, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, 
01289                                 rpmdbGetIteratorCount(mi),
01290                                 triggersRun);
01291             }
01292 
01293             mi = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(mi);
01294         }
01295     }
01296     triggerIndices = hfd(triggerIndices, tit);
01297     triggerNames = hfd(triggerNames, tnt);
01298     <span class="keywordflow">return</span> rc;
01299 }
01300 
<a name="l01301"></a><a class="code" href="psm_8c.html#a17">01301</a> <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keyword">const</span> <a class="code" href="psm_8c.html#a17">pkgStageString</a>(<a class="code" href="psm_8h.html#a9">pkgStage</a> a)
01302         <span class="comment">/*@*/</span>
01303 {
01304     <span class="keywordflow">switch</span>(a) {
01305     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a10">PSM_UNKNOWN</a>:           <span class="keywordflow">return</span> <span class="stringliteral">"unknown"</span>;
01306 
01307     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>:        <span class="keywordflow">return</span> <span class="stringliteral">"  install"</span>;
01308     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>:          <span class="keywordflow">return</span> <span class="stringliteral">"    erase"</span>;
01309     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a19">PSM_PKGCOMMIT</a>:         <span class="keywordflow">return</span> <span class="stringliteral">"   commit"</span>;
01310     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>:           <span class="keywordflow">return</span> <span class="stringliteral">"repackage"</span>;
01311 
01312     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a11">PSM_INIT</a>:              <span class="keywordflow">return</span> <span class="stringliteral">"init"</span>;
01313     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a12">PSM_PRE</a>:               <span class="keywordflow">return</span> <span class="stringliteral">"pre"</span>;
01314     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a13">PSM_PROCESS</a>:           <span class="keywordflow">return</span> <span class="stringliteral">"process"</span>;
01315     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a14">PSM_POST</a>:              <span class="keywordflow">return</span> <span class="stringliteral">"post"</span>;
01316     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a15">PSM_UNDO</a>:              <span class="keywordflow">return</span> <span class="stringliteral">"undo"</span>;
01317     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a16">PSM_FINI</a>:              <span class="keywordflow">return</span> <span class="stringliteral">"fini"</span>;
01318 
01319     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a21">PSM_CREATE</a>:            <span class="keywordflow">return</span> <span class="stringliteral">"create"</span>;
01320     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>:            <span class="keywordflow">return</span> <span class="stringliteral">"notify"</span>;
01321     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a23">PSM_DESTROY</a>:           <span class="keywordflow">return</span> <span class="stringliteral">"destroy"</span>;
01322     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a24">PSM_COMMIT</a>:            <span class="keywordflow">return</span> <span class="stringliteral">"commit"</span>;
01323 
01324     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a25">PSM_CHROOT_IN</a>:         <span class="keywordflow">return</span> <span class="stringliteral">"chrootin"</span>;
01325     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a26">PSM_CHROOT_OUT</a>:        <span class="keywordflow">return</span> <span class="stringliteral">"chrootout"</span>;
01326     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>:            <span class="keywordflow">return</span> <span class="stringliteral">"script"</span>;
01327     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a28">PSM_TRIGGERS</a>:          <span class="keywordflow">return</span> <span class="stringliteral">"triggers"</span>;
01328     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a29">PSM_IMMED_TRIGGERS</a>:    <span class="keywordflow">return</span> <span class="stringliteral">"immedtriggers"</span>;
01329 
01330     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a30">PSM_RPMIO_FLAGS</a>:       <span class="keywordflow">return</span> <span class="stringliteral">"rpmioflags"</span>;
01331 
01332     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a31">PSM_RPMDB_LOAD</a>:        <span class="keywordflow">return</span> <span class="stringliteral">"rpmdbload"</span>;
01333     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a32">PSM_RPMDB_ADD</a>:         <span class="keywordflow">return</span> <span class="stringliteral">"rpmdbadd"</span>;
01334     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a33">PSM_RPMDB_REMOVE</a>:      <span class="keywordflow">return</span> <span class="stringliteral">"rpmdbremove"</span>;
01335 
01336     <span class="keywordflow">default</span>:                    <span class="keywordflow">return</span> <span class="stringliteral">"???"</span>;
01337     }
01338     <span class="comment">/*@noteached@*/</span>
01339 }
01340 
<a name="l01345"></a><a class="code" href="psm_8c.html#a18">01345</a> <span class="keywordtype">int</span> <a class="code" href="psm_8c.html#a18">psmStage</a>(<a class="code" href="structpsm__s.html">PSM_t</a> psm, <a class="code" href="psm_8h.html#a9">pkgStage</a> stage)
01346 {
01347     <span class="keyword">const</span> <a class="code" href="structrpmTransactionSet__s.html">rpmTransactionSet</a> ts = psm-&gt;<a class="code" href="structpsm__s.html#m0">ts</a>;
01348     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-&gt;<a class="code" href="structpsm__s.html#m1">fi</a>;
01349     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>;
01350     <a class="code" href="rpmlib_8h.html#a71">HME_t</a> hme = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>;
01351     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData);
01352     <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = psm-&gt;<a class="code" href="structpsm__s.html#m21">rc</a>;
01353     <span class="keywordtype">int</span> saveerrno;
01354     <span class="keywordtype">int</span> xx;
01355 
01356     <span class="comment">/*@-branchstate@*/</span>
01357     <span class="keywordflow">switch</span> (stage) {
01358     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a10">PSM_UNKNOWN</a>:
01359         <span class="keywordflow">break</span>;
01360     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a11">PSM_INIT</a>:
01361         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: %s-%s-%s has %d files, test = %d\n"</span>),
01362                 psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>,
01363                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>));
01364 
01365         <span class="comment">/*</span>
01366 <span class="comment">         * When we run scripts, we pass an argument which is the number of </span>
01367 <span class="comment">         * versions of this package that will be installed when we are</span>
01368 <span class="comment">         * finished.</span>
01369 <span class="comment">         */</span>
01370         psm-&gt;<a class="code" href="structpsm__s.html#m13">npkgs_installed</a> = <a class="code" href="group__rpmdb.html#a61">rpmdbCountPackages</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>);
01371         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m13">npkgs_installed</a> &lt; 0) {
01372             rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01373             <span class="keywordflow">break</span>;
01374         }
01375 
01376         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) {
01377             psm-&gt;<a class="code" href="structpsm__s.html#m14">scriptArg</a> = psm-&gt;<a class="code" href="structpsm__s.html#m13">npkgs_installed</a> + 1;
01378 
01379 assert(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> == NULL);
01380             psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, 0);
01381             xx = <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>, <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>,
01382                         <a class="code" href="rpmlib_8h.html#a31a285">RPMMIRE_DEFAULT</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>);
01383             xx = <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>, <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>,
01384                         <a class="code" href="rpmlib_8h.html#a31a285">RPMMIRE_DEFAULT</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
01385 
01386             <span class="keywordflow">while</span> ((psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>))) {
01387                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>);
01388                 <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a329">RPMTRANS_FLAG_MULTILIB</a>)
01389                     psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a71">headerCopy</a>(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>);
01390                 <span class="keywordflow">else</span>
01391                     psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = NULL;
01392                 <span class="comment">/*@loopbreak@*/</span> <span class="keywordflow">break</span>;
01393             }
01394             psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>);
01395             rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01396 
01397             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &gt; 0 &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> == NULL) {
01398                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>) * fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01399                 memset(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, <a class="code" href="rpmlib_8h.html#a495a238">RPMFILE_STATE_NORMAL</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01400             }
01401 
01402             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &lt;= 0)                            <span class="keywordflow">break</span>;
01403             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a324">RPMTRANS_FLAG_JUSTDB</a>)  <span class="keywordflow">break</span>;
01404         
01405             <span class="comment">/*</span>
01406 <span class="comment">             * Old format relocateable packages need the entire default</span>
01407 <span class="comment">             * prefix stripped to form the cpio list, while all other packages</span>
01408 <span class="comment">             * need the leading / stripped.</span>
01409 <span class="comment">             */</span>
01410             {   <span class="keyword">const</span> <span class="keywordtype">char</span> * p;
01411                 rc = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a169">RPMTAG_DEFAULTPREFIX</a>, NULL, (<span class="keywordtype">void</span> **) &amp;p, NULL);
01412                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = (rc ? strlen(p) + 1 : 1); 
01413             }
01414             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m42">mapflags</a> =
01415                 <a class="code" href="group__payload.html#a25a33">CPIO_MAP_PATH</a> | <a class="code" href="group__payload.html#a25a34">CPIO_MAP_MODE</a> | <a class="code" href="group__payload.html#a25a35">CPIO_MAP_UID</a> | <a class="code" href="group__payload.html#a25a36">CPIO_MAP_GID</a>;
01416         
01417             <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a34">headerIsEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a224">RPMTAG_ORIGBASENAMES</a>))
01418                 <a class="code" href="lib_2misc_8c.html#a15">buildOrigFileList</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>, NULL);
01419             <span class="keywordflow">else</span>
01420                 <a class="code" href="lib_2misc_8c.html#a14">rpmBuildFileList</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>, NULL);
01421         
01422             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> == NULL)
01423                 xx = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a152">RPMTAG_FILEUSERNAME</a>, NULL,
01424                                 (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, NULL);
01425             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> == NULL)
01426                 xx = hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a153">RPMTAG_FILEGROUPNAME</a>, NULL,
01427                                 (<span class="keywordtype">void</span> **) &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, NULL);
01428             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> == NULL)
01429                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01430             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> == NULL)
01431                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01432             rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01433         }
01434         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a> || psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01435             psm-&gt;<a class="code" href="structpsm__s.html#m14">scriptArg</a> = psm-&gt;<a class="code" href="structpsm__s.html#m13">npkgs_installed</a> - 1;
01436         
01437             <span class="comment">/* Retrieve installed header. */</span>
01438             rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a31">PSM_RPMDB_LOAD</a>);
01439         }
01440         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01441             <span class="comment">/* Open output package for writing. */</span>
01442             {   <span class="keyword">const</span> <span class="keywordtype">char</span> * bfmt = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_repackage_name_fmt}"</span>, NULL);
01443                 <span class="keyword">const</span> <span class="keywordtype">char</span> * pkgbn =
01444                         <a class="code" href="group__header.html#a60">headerSprintf</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, bfmt, rpmTagTable, rpmHeaderFormats, NULL);
01445 
01446                 bfmt = <a class="code" href="poptint_8h.html#a14">_free</a>(bfmt);
01447                 psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a> = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(<span class="stringliteral">"%{?_repackage_root:%{_repackage_root}}"</span>,
01448                                          <span class="stringliteral">"%{?_repackage_dir:%{_repackage_dir}}"</span>,
01449                                         pkgbn);
01450                 pkgbn = <a class="code" href="poptint_8h.html#a14">_free</a>(pkgbn);
01451                 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a>, &amp;psm-&gt;<a class="code" href="structpsm__s.html#m10">pkgfn</a>);
01452                 psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(psm-&gt;<a class="code" href="structpsm__s.html#m10">pkgfn</a>, <span class="stringliteral">"w.ufdio"</span>);
01453                 <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>)) {
01454                     rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01455                     <span class="keywordflow">break</span>;
01456                 }
01457             }
01458         }
01459         <span class="keywordflow">break</span>;
01460     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a12">PSM_PRE</a>:
01461         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)        <span class="keywordflow">break</span>;
01462 
01463         <span class="comment">/* Change root directory if requested and not already done. */</span>
01464         rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a25">PSM_CHROOT_IN</a>);
01465 
01466         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) {
01467             psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a136">RPMTAG_PREIN</a>;
01468             psm-&gt;<a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a189">RPMTAG_PREINPROG</a>;
01469 
01470             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a337">RPMTRANS_FLAG_NOTRIGGERPREIN</a>)) {
01471                 <span class="comment">/* XXX FIXME: implement %triggerprein. */</span>
01472             }
01473 
01474             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a338">RPMTRANS_FLAG_NOPRE</a>)) {
01475                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>);
01476                 <span class="keywordflow">if</span> (rc) {
01477                     <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a52">RPMERR_SCRIPT</a>,
01478                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: %s scriptlet failed (%d), skipping %s-%s-%s\n"</span>),
01479                         psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a>), rc,
01480                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
01481                     <span class="keywordflow">break</span>;
01482                 }
01483             }
01484         }
01485 
01486         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>) {
01487             psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a138">RPMTAG_PREUN</a>;
01488             psm-&gt;<a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a191">RPMTAG_PREUNPROG</a>;
01489             psm-&gt;<a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a271">RPMSENSE_TRIGGERUN</a>;
01490             psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a> = -1;
01491 
01492             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a341">RPMTRANS_FLAG_NOTRIGGERUN</a>)) {
01493                 <span class="comment">/* Run triggers in other package(s) this package sets off. */</span>
01494                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a28">PSM_TRIGGERS</a>);
01495                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01496 
01497                 <span class="comment">/* Run triggers in this package other package(s) set off. */</span>
01498                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a29">PSM_IMMED_TRIGGERS</a>);
01499                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01500             }
01501 
01502             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a342">RPMTRANS_FLAG_NOPREUN</a>))
01503                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>);
01504         }
01505         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01506             <span class="comment">/* Regenerate original header. */</span>
01507             {   <span class="keywordtype">void</span> * uh = NULL;
01508                 <a class="code" href="header_8h.html#a9">int_32</a> uht, uhc;
01509 
01510                 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a96">RPMTAG_HEADERIMMUTABLE</a>, &amp;uht, &amp;uh, &amp;uhc))
01511                 {
01512                     psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a31">headerCopyLoad</a>(uh);
01513                     uh = hfd(uh, uht);
01514                 } <span class="keywordflow">else</span>
01515                 <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a40">headerGetEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a94">RPMTAG_HEADERIMAGE</a>, &amp;uht, &amp;uh, &amp;uhc))
01516                 {
01517                     <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi;
01518                     <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count;
01519                     <a class="code" href="header_8h.html#a17">hPTR_t</a> ptr;
01520                     <a class="code" href="structheaderToken.html">Header</a> oh;
01521 
01522                     <span class="comment">/* Load the original header from the blob. */</span>
01523                     oh = <a class="code" href="group__header.html#a31">headerCopyLoad</a>(uh);
01524 
01525                     <span class="comment">/* XXX this is headerCopy w/o headerReload() */</span>
01526                     psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a51">headerNew</a>();
01527 
01528                     <span class="comment">/*@-branchstate@*/</span>
01529                     <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(oh);
01530                         <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, &amp;type, &amp;ptr, &amp;count);
01531                         ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>((<span class="keywordtype">void</span> *)ptr, type))
01532                     {
01533                         <span class="keywordflow">if</span> (ptr) (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, tag, type, ptr, count);
01534                     }
01535                     hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
01536                     <span class="comment">/*@=branchstate@*/</span>
01537 
01538                     <a class="code" href="group__header.html#a16">headerFree</a>(oh);
01539                     uh = hfd(uh, uht);
01540                 } <span class="keywordflow">else</span> {
01541                     <span class="keywordflow">break</span>;
01542                 }
01543             }
01544 
01545             <span class="comment">/* Retrieve type of payload compression. */</span>
01546             <span class="comment">/*@-nullstate@*/</span>    <span class="comment">/* FIX: psm-&gt;oh may be NULL */</span>
01547             rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a30">PSM_RPMIO_FLAGS</a>);
01548             <span class="comment">/*@=nullstate@*/</span>
01549 
01550             <span class="comment">/* Write the lead section into the package. */</span>
01551             {   <span class="keywordtype">int</span> archnum = -1;
01552                 <span class="keywordtype">int</span> osnum = -1;
01553                 <span class="keyword">struct </span><a class="code" href="structrpmlead.html">rpmlead</a> lead;
01554 
01555 <span class="preprocessor">#ifndef DYING</span>
01556 <span class="preprocessor"></span>                <a class="code" href="group__rpmrc.html#a50">rpmGetArchInfo</a>(NULL, &amp;archnum);
01557                 <a class="code" href="group__rpmrc.html#a51">rpmGetOsInfo</a>(NULL, &amp;osnum);
01558 <span class="preprocessor">#endif</span>
01559 <span class="preprocessor"></span>
01560                 memset(&amp;lead, 0, <span class="keyword">sizeof</span>(lead));
01561                 <span class="comment">/* XXX Set package version conditioned on noDirTokens. */</span>
01562                 lead.<a class="code" href="structrpmlead.html#m1">major</a> = 3;
01563                 lead.<a class="code" href="structrpmlead.html#m2">minor</a> = 0;
01564                 lead.<a class="code" href="structrpmlead.html#m3">type</a> = <a class="code" href="rpmlib_8h.html#a35">RPMLEAD_BINARY</a>;
01565                 lead.<a class="code" href="structrpmlead.html#m4">archnum</a> = archnum;
01566                 lead.<a class="code" href="structrpmlead.html#m6">osnum</a> = osnum;
01567                 lead.<a class="code" href="structrpmlead.html#m7">signature_type</a> = <a class="code" href="group__signature.html#a12a11">RPMSIGTYPE_HEADERSIG</a>;
01568 
01569                 {   <span class="keywordtype">char</span> buf[256];
01570                     sprintf(buf, <span class="stringliteral">"%s-%s-%s"</span>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
01571                     strncpy(lead.<a class="code" href="structrpmlead.html#m5">name</a>, buf, <span class="keyword">sizeof</span>(lead.<a class="code" href="structrpmlead.html#m5">name</a>));
01572                 }
01573 
01574                 rc = <a class="code" href="group__lead.html#a0">writeLead</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>, &amp;lead);
01575                 <span class="keywordflow">if</span> (rc) {
01576                     <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a39">RPMERR_NOSPACE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Unable to write package: %s\n"</span>),
01577                          <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>));
01578                     rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01579                     <span class="keywordflow">break</span>;
01580                 }
01581             }
01582 
01583             <span class="comment">/* Write the signature section into the package. */</span>
01584             {   <a class="code" href="structheaderToken.html">Header</a> sig = <a class="code" href="group__header.html#a90">headerRegenSigHeader</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
01585                 rc = <a class="code" href="group__signature.html#a6">rpmWriteSignature</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>, sig);
01586                 sig = <a class="code" href="group__signature.html#a9">rpmFreeSignature</a>(sig);
01587                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01588             }
01589 
01590             <span class="comment">/* Add remove transaction id to header. */</span>
01591             <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>)
01592             {   <a class="code" href="header_8h.html#a9">int_32</a> tid = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m24">id</a>;
01593                 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, <a class="code" href="rpmlib_8h.html#a494a233">RPMTAG_REMOVETID</a>,
01594                         <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &amp;tid, 1);
01595             }
01596 
01597             <span class="comment">/* Write the metadata section into the package. */</span>
01598             rc = <a class="code" href="group__header.html#a33">headerWrite</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>, psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, <a class="code" href="group__header.html#a92a65">HEADER_MAGIC_YES</a>);
01599             <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01600         }
01601         <span class="keywordflow">break</span>;
01602     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a13">PSM_PROCESS</a>:
01603         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)        <span class="keywordflow">break</span>;
01604 
01605         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) {
01606             <span class="keyword">struct </span><a class="code" href="structavailablePackage.html">availablePackage</a> * alp = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>;
01607             <span class="keywordtype">int</span> i;
01608 
01609             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &lt;= 0)                            <span class="keywordflow">break</span>;
01610             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a324">RPMTRANS_FLAG_JUSTDB</a>)  <span class="keywordflow">break</span>;
01611 
01612             <span class="keywordflow">for</span> (i = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
01613                 uid_t uid;
01614                 gid_t gid;
01615 
01616                 uid = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m44">uid</a>;
01617                 gid = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m46">gid</a>;
01618                 <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> &amp;&amp; <a class="code" href="ugid_8c.html#a0">unameToUid</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>[i], &amp;uid)) {
01619                     <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a3">RPMMESS_WARNING</a>,
01620                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"user %s does not exist - using root\n"</span>),
01621                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>[i]);
01622                     uid = 0;
01623                     <span class="comment">/* XXX this diddles header memory. */</span>
01624                     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i] &amp;= ~S_ISUID;  <span class="comment">/* turn off the suid bit */</span>
01625                 }
01626 
01627                 <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> &amp;&amp; <a class="code" href="ugid_8c.html#a1">gnameToGid</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>[i], &amp;gid)) {
01628                     <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a3">RPMMESS_WARNING</a>,
01629                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"group %s does not exist - using root\n"</span>),
01630                         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>[i]);
01631                     gid = 0;
01632                     <span class="comment">/* XXX this diddles header memory. */</span>
01633                     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i] &amp;= ~S_ISGID;  <span class="comment">/* turn off the sgid bit */</span>
01634                 }
01635                 <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>) fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = uid;
01636                 <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>) fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = gid;
01637             }
01638 
01639             <span class="comment">/* Retrieve type of payload compression. */</span>
01640             rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a30">PSM_RPMIO_FLAGS</a>);
01641 
01642             <span class="keywordflow">if</span> (alp-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a> == NULL) {      <span class="comment">/* XXX can't happen */</span>
01643                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01644                 <span class="keywordflow">break</span>;
01645             }
01646             <span class="comment">/*@-nullpass@*/</span>     <span class="comment">/* LCL: alp-&gt;fd != NULL here. */</span>
01647             psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> = <a class="code" href="group__rpmio.html#a82">Fdopen</a>(<a class="code" href="rpmio_8c.html#a35">fdDup</a>(<a class="code" href="group__rpmio.html#a86">Fileno</a>(alp-&gt;<a class="code" href="structavailablePackage.html#m24">fd</a>)), psm-&gt;<a class="code" href="structpsm__s.html#m7">rpmio_flags</a>);
01648             <span class="comment">/*@=nullpass@*/</span>
01649             <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> == NULL) {     <span class="comment">/* XXX can't happen */</span>
01650                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01651                 <span class="keywordflow">break</span>;
01652             }
01653 
01654             rc = <a class="code" href="fsm_8c.html#a27">fsmSetup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>, <a class="code" href="fsm_8h.html#a73a17">FSM_PKGINSTALL</a>, ts, fi,
01655                         psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a>, NULL, &amp;psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>);
01656             xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>);
01657 
01658             saveerrno = <a class="code" href="system_8h.html#a29">errno</a>; <span class="comment">/* XXX FIXME: Fclose with libio destroys errno */</span>
01659             xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a>);
01660             psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> = NULL;
01661             <span class="comment">/*@-mods@*/</span>
01662             <a class="code" href="system_8h.html#a29">errno</a> = saveerrno; <span class="comment">/* XXX FIXME: Fclose with libio destroys errno */</span>
01663             <span class="comment">/*@=mods@*/</span>
01664 
01665             <span class="keywordflow">if</span> (!rc)
01666                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a24">PSM_COMMIT</a>);
01667 
01668             <span class="keywordflow">if</span> (rc) {
01669                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a58">RPMERR_CPIO</a>,
01670                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"unpacking of archive failed%s%s: %s\n"</span>),
01671                         (psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a> != NULL ? _(<span class="stringliteral">" on file "</span>) : <span class="stringliteral">""</span>),
01672                         (psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a> != NULL ? psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a> : <span class="stringliteral">""</span>),
01673                         cpioStrerror(rc));
01674                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01675 
01676                 <span class="comment">/* XXX notify callback on error. */</span>
01677                 psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a28">RPMCALLBACK_UNPACK_ERROR</a>;
01678                 psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a> = 0;
01679                 psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a> = 0;
01680                 xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>);
01681 
01682                 <span class="keywordflow">break</span>;
01683             }
01684             psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a18">RPMCALLBACK_INST_PROGRESS</a>;
01685             psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a> = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> : 100);
01686             psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a> = psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a>;
01687             xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>);
01688         }
01689         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>) {
01690 
01691             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &lt;= 0)                            <span class="keywordflow">break</span>;
01692             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a324">RPMTRANS_FLAG_JUSTDB</a>)  <span class="keywordflow">break</span>;
01693             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>)       <span class="keywordflow">break</span>;
01694 
01695             psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a26">RPMCALLBACK_UNINST_START</a>;
01696             psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a> = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>;       <span class="comment">/* XXX W2DO? looks wrong. */</span>
01697             psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a> = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>;
01698             xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>);
01699 
01700             rc = <a class="code" href="fsm_8c.html#a27">fsmSetup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>, <a class="code" href="fsm_8h.html#a73a18">FSM_PKGERASE</a>, ts, fi,
01701                         NULL, NULL, &amp;psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>);
01702             xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>);
01703 
01704             psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a27">RPMCALLBACK_UNINST_STOP</a>;
01705             psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a> = 0;            <span class="comment">/* XXX W2DO? looks wrong. */</span>
01706             psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a> = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>;
01707             xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>);
01708 
01709         }
01710         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01711             <a class="code" href="rpmlib_8h.html#a74">fileAction</a> * actions = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>;
01712             <a class="code" href="rpmlib_8h.html#a74">fileAction</a> action = fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m1">action</a>;
01713 
01714             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = <a class="code" href="rpmlib_8h.html#a501a304">FA_COPYOUT</a>;
01715             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = NULL;
01716 
01717             <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a> == NULL) {      <span class="comment">/* XXX can't happen */</span>
01718                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01719                 <span class="keywordflow">break</span>;
01720             }
01721             <span class="comment">/*@-nullpass@*/</span>     <span class="comment">/* LCL: psm-&gt;fd != NULL here. */</span>
01722             xx = <a class="code" href="group__rpmio.html#a84">Fflush</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>);
01723             psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> = <a class="code" href="group__rpmio.html#a82">Fdopen</a>(<a class="code" href="rpmio_8c.html#a35">fdDup</a>(<a class="code" href="group__rpmio.html#a86">Fileno</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>)), psm-&gt;<a class="code" href="structpsm__s.html#m7">rpmio_flags</a>);
01724             <span class="comment">/*@=nullpass@*/</span>
01725             <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> == NULL) {     <span class="comment">/* XXX can't happen */</span>
01726                 rc = <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>;
01727                 <span class="keywordflow">break</span>;
01728             }
01729 
01730             rc = <a class="code" href="fsm_8c.html#a27">fsmSetup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>, <a class="code" href="fsm_8h.html#a73a19">FSM_PKGBUILD</a>, ts, fi, psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a>,
01731                         NULL, &amp;psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>);
01732             xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>);
01733 
01734             saveerrno = <a class="code" href="system_8h.html#a29">errno</a>; <span class="comment">/* XXX FIXME: Fclose with libio destroys errno */</span>
01735             xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a>);
01736             psm-&gt;<a class="code" href="structpsm__s.html#m2">cfd</a> = NULL;
01737             <span class="comment">/*@-mods@*/</span>
01738             <a class="code" href="system_8h.html#a29">errno</a> = saveerrno;
01739             <span class="comment">/*@=mods@*/</span>
01740 
01741             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = action;
01742             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = actions;
01743         }
01744         <span class="keywordflow">break</span>;
01745     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a14">PSM_POST</a>:
01746         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)        <span class="keywordflow">break</span>;
01747 
01748         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) {
01749             <a class="code" href="header_8h.html#a9">int_32</a> installTime = (int_32) time(NULL);
01750 
01751             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> != NULL &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &gt; 0)
01752                 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a142">RPMTAG_FILESTATES</a>, <a class="code" href="group__header.html#a93a67">RPM_CHAR_TYPE</a>,
01753                                 fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01754 
01755             xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a121">RPMTAG_INSTALLTIME</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01756                                 &amp;installTime, 1);
01757 
01758             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a329">RPMTRANS_FLAG_MULTILIB</a>) {
01759                 <a class="code" href="header_8h.html#a12">uint_32</a> multiLib, * newMultiLib, * p;
01760 
01761                 <span class="keywordflow">if</span> (hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a231">RPMTAG_MULTILIBS</a>, NULL,
01762                                 (<span class="keywordtype">void</span> **) &amp;newMultiLib, NULL) &amp;&amp;
01763                     hge(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, <a class="code" href="rpmlib_8h.html#a494a231">RPMTAG_MULTILIBS</a>, NULL,
01764                                 (<span class="keywordtype">void</span> **) &amp;p, NULL))
01765                 {
01766                     multiLib = *p;
01767                     multiLib |= *newMultiLib;
01768                     xx = hme(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, <a class="code" href="rpmlib_8h.html#a494a231">RPMTAG_MULTILIBS</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01769                                       &amp;multiLib, 1);
01770                 }
01771                 rc = <a class="code" href="psm_8c.html#a7">mergeFiles</a>(fi, psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
01772                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01773             }
01774 
01775 
01776             <span class="comment">/*</span>
01777 <span class="comment">             * If this package has already been installed, remove it from</span>
01778 <span class="comment">             * the database before adding the new one.</span>
01779 <span class="comment">             */</span>
01780             <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a> &amp;&amp; !(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>)) {
01781                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a33">PSM_RPMDB_REMOVE</a>);
01782                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01783             }
01784 
01785             rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a32">PSM_RPMDB_ADD</a>);
01786             <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01787 
01788             psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a137">RPMTAG_POSTIN</a>;
01789             psm-&gt;<a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a190">RPMTAG_POSTINPROG</a>;
01790             psm-&gt;<a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a270">RPMSENSE_TRIGGERIN</a>;
01791             psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a> = 0;
01792 
01793             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a339">RPMTRANS_FLAG_NOPOST</a>)) {
01794                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>);
01795                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01796             }
01797             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a340">RPMTRANS_FLAG_NOTRIGGERIN</a>)) {
01798                 <span class="comment">/* Run triggers in other package(s) this package sets off. */</span>
01799                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a28">PSM_TRIGGERS</a>);
01800                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01801 
01802                 <span class="comment">/* Run triggers in this package other package(s) set off. */</span>
01803                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a29">PSM_IMMED_TRIGGERS</a>);
01804                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01805             }
01806 
01807             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>))
01808                 rc = <a class="code" href="psm_8c.html#a8">markReplacedFiles</a>(psm);
01809 
01810         }
01811         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>) {
01812 
01813             psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a139">RPMTAG_POSTUN</a>;
01814             psm-&gt;<a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a192">RPMTAG_POSTUNPROG</a>;
01815             psm-&gt;<a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a272">RPMSENSE_TRIGGERPOSTUN</a>;
01816             psm-&gt;<a class="code" href="structpsm__s.html#m16">countCorrection</a> = -1;
01817 
01818             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a343">RPMTRANS_FLAG_NOPOSTUN</a>)) {
01819                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>);
01820                 <span class="comment">/* XXX WTFO? postun failures don't cause erasure failure. */</span>
01821             }
01822 
01823             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a344">RPMTRANS_FLAG_NOTRIGGERPOSTUN</a>)) {
01824                 <span class="comment">/* Run triggers in other package(s) this package sets off. */</span>
01825                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a28">PSM_TRIGGERS</a>);
01826                 <span class="keywordflow">if</span> (rc) <span class="keywordflow">break</span>;
01827             }
01828 
01829             <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>))
01830                 rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a33">PSM_RPMDB_REMOVE</a>);
01831         }
01832         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01833         }
01834 
01835         <span class="comment">/* Restore root directory if changed. */</span>
01836         xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a26">PSM_CHROOT_OUT</a>);
01837         <span class="keywordflow">break</span>;
01838     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a15">PSM_UNDO</a>:
01839         <span class="keywordflow">break</span>;
01840     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a16">PSM_FINI</a>:
01841         <span class="comment">/* Restore root directory if changed. */</span>
01842         xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a26">PSM_CHROOT_OUT</a>);
01843 
01844         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>) {
01845             saveerrno = <a class="code" href="system_8h.html#a29">errno</a>; <span class="comment">/* XXX FIXME: Fclose with libio destroys errno */</span>
01846             xx = <a class="code" href="group__rpmio.html#a80">Fclose</a>(psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a>);
01847             psm-&gt;<a class="code" href="structpsm__s.html#m3">fd</a> = NULL;
01848             <span class="comment">/*@-mods@*/</span>
01849             <a class="code" href="system_8h.html#a29">errno</a> = saveerrno;
01850             <span class="comment">/*@=mods@*/</span>
01851         }
01852 
01853         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) {
01854             <span class="keywordflow">if</span> (!rc) {
01855                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a1">RPMMESS_VERBOSE</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Wrote: %s\n"</span>),
01856                         (psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a> ? psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a> : <span class="stringliteral">"???"</span>));
01857             }
01858         }
01859 
01860         <span class="keywordflow">if</span> (rc) {
01861             <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>)
01862                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a58">RPMERR_CPIO</a>,
01863                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s failed on file %s: %s\n"</span>),
01864                         psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a>, psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>, cpioStrerror(rc));
01865             <span class="keywordflow">else</span>
01866                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a58">RPMERR_CPIO</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s failed: %s\n"</span>),
01867                         psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a>, cpioStrerror(rc));
01868 
01869             <span class="comment">/* XXX notify callback on error. */</span>
01870             psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a29">RPMCALLBACK_CPIO_ERROR</a>;
01871             psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a> = 0;
01872             psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a> = 0;
01873             xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>);
01874         }
01875 
01876         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> &amp;&amp; (psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a> || psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>))
01877             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
01878         psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a16">headerFree</a>(psm-&gt;<a class="code" href="structpsm__s.html#m4">oh</a>);
01879         psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-&gt;<a class="code" href="structpsm__s.html#m9">pkgURL</a>);
01880         psm-&gt;<a class="code" href="structpsm__s.html#m7">rpmio_flags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-&gt;<a class="code" href="structpsm__s.html#m7">rpmio_flags</a>);
01881         psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>);
01882 
01883         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>);
01884         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>);
01885         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, -1);
01886         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = hfd(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, -1);
01887         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>);
01888         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>);
01889         <span class="keywordflow">break</span>;
01890 
01891     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>:
01892     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>:
01893     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>:
01894         psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> = stage;
01895         psm-&gt;<a class="code" href="structpsm__s.html#m21">rc</a> = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01896         psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a> = <a class="code" href="psm_8c.html#a17">pkgStageString</a>(stage);
01897 
01898         rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a11">PSM_INIT</a>);
01899         <span class="keywordflow">if</span> (!rc) rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a12">PSM_PRE</a>);
01900         <span class="keywordflow">if</span> (!rc) rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a13">PSM_PROCESS</a>);
01901         <span class="keywordflow">if</span> (!rc) rc = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a14">PSM_POST</a>);
01902         xx = <a class="code" href="psm_8c.html#a18">psmStage</a>(psm, <a class="code" href="psm_8h.html#a38a16">PSM_FINI</a>);
01903         <span class="keywordflow">break</span>;
01904     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a19">PSM_PKGCOMMIT</a>:
01905         <span class="keywordflow">break</span>;
01906 
01907     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a21">PSM_CREATE</a>:
01908         <span class="keywordflow">break</span>;
01909     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a22">PSM_NOTIFY</a>:
01910         <span class="keywordflow">if</span> (ts &amp;&amp; ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>) {
01911             <span class="comment">/*@-noeffectuncon @*/</span> <span class="comment">/* FIX: check rc */</span>
01912             (void) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-&gt;<a class="code" href="structpsm__s.html#m18">what</a>, psm-&gt;<a class="code" href="structpsm__s.html#m19">amount</a>, psm-&gt;<a class="code" href="structpsm__s.html#m20">total</a>,
01913                 (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> ? fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-&gt;<a class="code" href="structavailablePackage.html#m22">key</a> : NULL), ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m2">notifyData</a>);
01914             <span class="comment">/*@=noeffectuncon @*/</span>
01915         }
01916         <span class="keywordflow">break</span>;
01917     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a23">PSM_DESTROY</a>:
01918         <span class="keywordflow">break</span>;
01919     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a24">PSM_COMMIT</a>:
01920         <span class="keywordflow">if</span> (!(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a332">RPMTRANS_FLAG_PKGCOMMIT</a>)) <span class="keywordflow">break</span>;
01921         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>) <span class="keywordflow">break</span>;
01922 
01923         rc = <a class="code" href="fsm_8c.html#a27">fsmSetup</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>, <a class="code" href="fsm_8h.html#a73a20">FSM_PKGCOMMIT</a>, ts, fi,
01924                         NULL, NULL, &amp;psm-&gt;<a class="code" href="structpsm__s.html#m8">failedFile</a>);
01925         xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>);
01926         <span class="keywordflow">break</span>;
01927 
01928     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a25">PSM_CHROOT_IN</a>:
01929         <span class="comment">/* Change root directory if requested and not already done. */</span>
01930         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a> &amp;&amp; !ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> &amp;&amp; !psm-&gt;<a class="code" href="structpsm__s.html#m17">chrootDone</a>) {
01931             <span class="keyword">static</span> <span class="keywordtype">int</span> _loaded = 0;
01932 
01933             <span class="comment">/*</span>
01934 <span class="comment">             * This loads all of the name services libraries, in case we</span>
01935 <span class="comment">             * don't have access to them in the chroot().</span>
01936 <span class="comment">             */</span>
01937             <span class="keywordflow">if</span> (!_loaded) {
01938                 (void)getpwnam(<span class="stringliteral">"root"</span>);
01939                 endpwent();
01940                 _loaded++;
01941             }
01942 
01943             xx = chdir(<span class="stringliteral">"/"</span>);
01944             <span class="comment">/*@-unrecog -superuser @*/</span>
01945             rc = chroot(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>);
01946             <span class="comment">/*@=unrecog =superuser @*/</span>
01947             psm-&gt;<a class="code" href="structpsm__s.html#m17">chrootDone</a> = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 1;
01948             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a> != NULL) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-&gt;<a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 1;
01949 <span class="preprocessor">#ifdef  DYING</span>
01950 <span class="preprocessor"></span>            <span class="comment">/*@-onlytrans@*/</span>
01951             chroot_prefix = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>;
01952             <span class="comment">/*@=onlytrans@*/</span>
01953 <span class="preprocessor">#endif</span>
01954 <span class="preprocessor"></span>        }
01955         <span class="keywordflow">break</span>;
01956     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a26">PSM_CHROOT_OUT</a>:
01957         <span class="comment">/* Restore root directory if changed. */</span>
01958         <span class="keywordflow">if</span> (psm-&gt;<a class="code" href="structpsm__s.html#m17">chrootDone</a>) {
01959             <span class="comment">/*@-superuser @*/</span>
01960             rc = chroot(<span class="stringliteral">"."</span>);
01961             <span class="comment">/*@=superuser @*/</span>
01962             psm-&gt;<a class="code" href="structpsm__s.html#m17">chrootDone</a> = ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0;
01963             <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a> != NULL) ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-&gt;<a class="code" href="structrpmdb__s.html#m9">db_chrootDone</a> = 0;
01964 <span class="preprocessor">#ifdef  DYING</span>
01965 <span class="preprocessor"></span>            chroot_prefix = NULL;
01966 <span class="preprocessor">#endif</span>
01967 <span class="preprocessor"></span>            xx = chdir(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m21">currDir</a>);
01968         }
01969         <span class="keywordflow">break</span>;
01970     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a27">PSM_SCRIPT</a>:
01971         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s: running %s script(s) (if any)\n"</span>),
01972                 psm-&gt;<a class="code" href="structpsm__s.html#m6">stepName</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-&gt;<a class="code" href="structpsm__s.html#m11">scriptTag</a>));
01973         rc = <a class="code" href="psm_8c.html#a13">runInstScript</a>(psm);
01974         <span class="keywordflow">break</span>;
01975     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a28">PSM_TRIGGERS</a>:
01976         <span class="comment">/* Run triggers in other package(s) this package sets off. */</span>
01977         rc = <a class="code" href="psm_8c.html#a15">runTriggers</a>(psm);
01978         <span class="keywordflow">break</span>;
01979     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a29">PSM_IMMED_TRIGGERS</a>:
01980         <span class="comment">/* Run triggers in this package other package(s) set off. */</span>
01981         rc = <a class="code" href="psm_8c.html#a16">runImmedTriggers</a>(psm);
01982         <span class="keywordflow">break</span>;
01983 
01984     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a30">PSM_RPMIO_FLAGS</a>:
01985     {   <span class="keyword">const</span> <span class="keywordtype">char</span> * payload_compressor = NULL;
01986         <span class="keywordtype">char</span> * t;
01987 
01988         <span class="keywordflow">if</span> (!hge(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a229">RPMTAG_PAYLOADCOMPRESSOR</a>, NULL,
01989                             (<span class="keywordtype">void</span> **) &amp;payload_compressor, NULL))
01990             payload_compressor = <span class="stringliteral">"gzip"</span>;
01991         psm-&gt;<a class="code" href="structpsm__s.html#m7">rpmio_flags</a> = t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(<span class="keyword">sizeof</span>(<span class="stringliteral">"w9.gzdio"</span>));
01992         *t = <span class="charliteral">'\0'</span>;
01993         t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, ((psm-&gt;<a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) ? <span class="stringliteral">"w9"</span> : <span class="stringliteral">"r"</span>));
01994         <span class="keywordflow">if</span> (!strcmp(payload_compressor, <span class="stringliteral">"gzip"</span>))
01995             t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">".gzdio"</span>);
01996         <span class="keywordflow">if</span> (!strcmp(payload_compressor, <span class="stringliteral">"bzip2"</span>))
01997             t = <a class="code" href="system_8h.html#a32">stpcpy</a>(t, <span class="stringliteral">".bzdio"</span>);
01998         rc = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>;
01999     }   <span class="keywordflow">break</span>;
02000 
02001     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a31">PSM_RPMDB_LOAD</a>:
02002 assert(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> == NULL);
02003         psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>,
02004                                 &amp;fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>, <span class="keyword">sizeof</span>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>));
02005 
02006         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>);
02007         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>)
02008             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02009 <span class="keywordflow">else</span> {
02010 fprintf(stderr, <span class="stringliteral">"*** PSM_RDB_LOAD: header #%u not found\n"</span>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>);
02011 }
02012         psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(psm-&gt;<a class="code" href="structpsm__s.html#m5">mi</a>);
02013         rc = (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> ? <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a> : <a class="code" href="rpmlib_8h.html#a493a91">RPMRC_FAIL</a>);
02014         <span class="keywordflow">break</span>;
02015     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a32">PSM_RPMDB_ADD</a>:
02016         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)        <span class="keywordflow">break</span>;
02017         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a> != NULL)      <span class="comment">/* XXX can't happen */</span>
02018         rc = <a class="code" href="group__rpmdb.html#a89">rpmdbAdd</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m24">id</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m9">h</a>);
02019 <span class="preprocessor">#if HAVE_SYSLOG_H</span>
02020 <span class="preprocessor"></span>        syslog(LOG_NOTICE, <span class="stringliteral">"[RPM] %s-%s-%s installed\n"</span>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
02021 <span class="preprocessor">#endif</span>
02022 <span class="preprocessor"></span>        <span class="keywordflow">break</span>;
02023     <span class="keywordflow">case</span> <a class="code" href="psm_8h.html#a38a33">PSM_RPMDB_REMOVE</a>:
02024         <span class="keywordflow">if</span> (ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> &amp; <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>)        <span class="keywordflow">break</span>;
02025         rc = <a class="code" href="group__rpmdb.html#a87">rpmdbRemove</a>(ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, ts-&gt;<a class="code" href="structrpmTransactionSet__s.html#m24">id</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m53">record</a>);
02026 <span class="preprocessor">#if HAVE_SYSLOG_H</span>
02027 <span class="preprocessor"></span>        syslog(LOG_NOTICE, <span class="stringliteral">"[RPM] %s-%s-%s removed\n"</span>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m12">release</a>);
02028 <span class="preprocessor">#endif</span>
02029 <span class="preprocessor"></span>        <span class="keywordflow">break</span>;
02030 
02031     <span class="keywordflow">default</span>:
02032         <span class="keywordflow">break</span>;
02033     }
02034     <span class="comment">/*@=branchstate@*/</span>
02035 
02036     <span class="comment">/*@-nullstate@*/</span>    <span class="comment">/* FIX: psm-&gt;oh and psm-&gt;fi-&gt;h may be NULL. */</span>
02037     <span class="keywordflow">return</span> rc;
02038     <span class="comment">/*@=nullstate@*/</span>
02039 }
</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>