<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>lib/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 <<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>></span> 00010 <span class="preprocessor">#include <<a class="code" href="rpmurl_8h.html">rpmurl.h</a>></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> **) &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> **) &epochTwo, 00045 NULL)) 00046 epochTwo = NULL; 00047 00048 <span class="keywordflow">if</span> (epochOne && !epochTwo) 00049 <span class="keywordflow">return</span> 1; 00050 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!epochOne && epochTwo) 00051 <span class="keywordflow">return</span> -1; 00052 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (epochOne && epochTwo) { 00053 <span class="keywordflow">if</span> (*epochOne < *epochTwo) 00054 <span class="keywordflow">return</span> -1; 00055 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*epochOne > *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> **) &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> **) &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> **) &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> **) &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-><a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a> == NULL) 00082 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> == TR_ADDED) 00086 ? (HGE_t) headerGetEntryMinMemory : (HGE_t) headerGetEntry; 00087 fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a> = hge; 00088 fi-><a class="code" href="structtransactionFileInfo__s.html#m5">hae</a> = (HAE_t) headerAddEntry; 00089 fi-><a class="code" href="structtransactionFileInfo__s.html#m6">hme</a> = (HME_t) headerModifyEntry; 00090 fi-><a class="code" href="structtransactionFileInfo__s.html#m7">hre</a> = (HRE_t) headerRemoveEntry; 00091 fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> = hfd = headerFreeData; 00092 00093 <span class="keywordflow">if</span> (h && fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> == NULL) fi-><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-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, NULL); 00097 fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>); 00098 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, NULL); 00099 fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>); 00100 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a>, NULL); 00101 fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a>); 00102 00103 <span class="comment">/* -1 means not found */</span> 00104 rc = hge(fi-><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> **) &uip, NULL); 00105 fi-><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-><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> **) &uip, NULL); 00108 fi-><a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> = (rc ? *uip : 0); 00109 00110 <span class="keywordflow">if</span> (!hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>)) { 00111 fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> = 0; 00112 fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> = 0; 00113 <span class="keywordflow">return</span>; 00114 } 00115 00116 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, NULL); 00117 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>); 00118 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, NULL); 00119 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, NULL); 00120 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, NULL); 00121 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, NULL); 00122 00123 fi-><a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = <a class="code" href="rpmlib_8h.html#a501a301">FA_UNKNOWN</a>; 00124 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> == NULL) 00128 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>)); 00129 00130 <span class="keywordflow">switch</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a>) { 00131 <span class="keywordflow">case</span> TR_ADDED: 00132 fi-><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-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, NULL); 00135 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, NULL); 00136 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>, NULL); 00137 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m17">fmtimes</a>, NULL); 00138 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m27">frdevs</a>, NULL); 00139 00140 <span class="comment">/* 0 makes for noops */</span> 00141 fi-><a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, <span class="keyword">sizeof</span>(*fi-><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-><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-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, NULL); 00149 rc = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, NULL); 00150 fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>)), 00151 fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>)); 00152 fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>)), 00153 fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>)); 00154 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>)), 00155 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>) 00158 fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>)), 00159 fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>)); 00160 <span class="keywordflow">else</span> 00161 fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(1, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>)); 00162 fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = memcpy(<a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>)), 00163 fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>)); 00164 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 00165 <span class="keywordflow">break</span>; 00166 } 00167 00168 fi-><a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a> = -1; 00169 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>; i++) { 00170 <span class="keywordflow">if</span> ((len = strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[i])) > fi-><a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a>) 00171 fi-><a class="code" href="structtransactionFileInfo__s.html#m35">dnlmax</a> = len; 00172 } 00173 00174 fi-><a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a> = -1; 00175 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 00176 <span class="keywordflow">if</span> ((len = strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i])) > fi-><a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a>) 00177 fi-><a class="code" href="structtransactionFileInfo__s.html#m34">bnlmax</a> = len; 00178 } 00179 00180 fi-><a class="code" href="structtransactionFileInfo__s.html#m39">dperms</a> = 0755; 00181 fi-><a class="code" href="structtransactionFileInfo__s.html#m40">fperms</a> = 0644; 00182 00183 <span class="comment">/*@-nullstate@*/</span> <span class="comment">/* FIX: fi->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-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData); 00191 00192 fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>); 00193 fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>); 00194 fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a>); 00195 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>); 00196 fi-><a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m52">replacedSizes</a>); 00197 fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m51">replaced</a>); 00198 00199 fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>, -1); 00200 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, -1); 00201 fi-><a class="code" href="structtransactionFileInfo__s.html#m21">obnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m21">obnl</a>, -1); 00202 fi-><a class="code" href="structtransactionFileInfo__s.html#m22">odnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m22">odnl</a>, -1); 00203 fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m25">flinks</a>, -1); 00204 fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a>, -1); 00205 fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, -1); 00206 fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, -1); 00207 fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m31">flangs</a>, -1); 00208 00209 fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>); 00210 fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>); 00211 fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>); 00212 fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>); 00213 00214 fi-><a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a> = <a class="code" href="fsm_8c.html#a26">freeFSM</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>); 00215 00216 <span class="keywordflow">switch</span> (fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m16">fsizes</a>, -1); 00221 fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>, -1); 00222 fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>, -1); 00223 fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, -1); 00224 fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, -1); 00225 <span class="keywordflow">break</span>; 00226 } 00227 00228 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-><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-><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-><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-><a class="code" href="structtagMacro.html#m0">macroname</a> != NULL; tagm++) { 00283 <span class="keywordflow">if</span> (!hge(h, tagm-><a class="code" href="structtagMacro.html#m1">tag</a>, &type, (<span class="keywordtype">void</span> **) &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-><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-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>; 00319 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData); 00320 <a class="code" href="rpmlib_8h.html#a74">fileAction</a> * actions = fi-><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> **) &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> **) &fileSizes, &count); 00357 <span class="keywordflow">for</span> (i = 0, fc = 0; i < 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>, &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], &type, (<span class="keywordtype">void</span> **) &data, &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 < 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 < 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 < 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 < 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> **) &newDirIndexes, &count); 00412 xx = hge(newH, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &newDirNames, NULL); 00413 xx = hge(h, <a class="code" href="rpmlib_8h.html#a494a220">RPMTAG_DIRINDEXES</a>, NULL, (<span class="keywordtype">void</span> **) &dirIndexes, NULL); 00414 xx = hge(h, <a class="code" href="rpmlib_8h.html#a494a222">RPMTAG_DIRNAMES</a>, NULL, (<span class="keywordtype">void</span> **) &data, &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 < 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 < 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 < 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 > 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 < 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], &nnt, (<span class="keywordtype">void</span> **) &newNames, &newCount)) 00448 <span class="keywordflow">continue</span>; 00449 00450 xx = hge(newH, requireTags[i+1], &nvt, (<span class="keywordtype">void</span> **) &newEVR, NULL); 00451 xx = hge(newH, requireTags[i+2], NULL, (<span class="keywordtype">void</span> **) &newFlags, NULL); 00452 <span class="keywordflow">if</span> (hge(h, requireTags[i], &rnt, (<span class="keywordtype">void</span> **) &Names, &Count)) 00453 { 00454 (void) hge(h, requireTags[i+1], NULL, (<span class="keywordtype">void</span> **) &EVR, NULL); 00455 (void) hge(h, requireTags[i+2], NULL, (<span class="keywordtype">void</span> **) &Flags, NULL); 00456 <span class="keywordflow">for</span> (j = 0; j < newCount; j++) 00457 <span class="keywordflow">for</span> (k = 0; k < Count; k++) 00458 <span class="keywordflow">if</span> (!strcmp (newNames[j], Names[k]) 00459 && !strcmp (newEVR[j], EVR[k]) 00460 && (newFlags[j] & <a class="code" href="rpmlib_8h.html#a16">RPMSENSE_SENSEMASK</a>) == 00461 (Flags[k] & <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 < 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-><a class="code" href="structpsm__s.html#m0">ts</a>; 00502 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><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-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> > 0 && fi-><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-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; sfi++) { 00517 <span class="keywordflow">if</span> (prev && prev == sfi-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 00518 <span class="keywordflow">continue</span>; 00519 prev = sfi-><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-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; sfi++) { 00528 <span class="keywordflow">if</span> (prev && prev == sfi-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>) 00529 <span class="keywordflow">continue</span>; 00530 prev = sfi-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; 00531 offsets[num++] = sfi-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a>; 00532 } 00533 00534 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><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> **)&secStates, &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-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> && sfi-><a class="code" href="structsharedFileInfo.html#m2">otherPkg</a> == prev) { 00552 assert(sfi-><a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a> < count); 00553 <span class="keywordflow">if</span> (secStates[sfi-><a class="code" href="structsharedFileInfo.html#m1">otherFileNum</a>] != <a class="code" href="rpmlib_8h.html#a495a239">RPMFILE_STATE_REPLACED</a>) { 00554 secStates[sfi-><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, &st)) < 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 < 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 = &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-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a> = notify; 00633 <span class="comment">/*@-temptrans -assignexpose@*/</span> 00634 ts-><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, &h, &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-><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-><a class="code" href="structtransactionFileInfo__s.html#m0">type</a> = TR_ADDED; 00656 fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> = ts-><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-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 00659 hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 00663 00664 memset(psm, 0, <span class="keyword">sizeof</span>(*psm)); 00665 psm->ts = ts; 00666 psm->fi = fi; 00667 00668 <span class="keywordflow">if</span> (cookie) { 00669 *cookie = NULL; 00670 <span class="keywordflow">if</span> (hge(fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m24">fmd5s</a> = hfd(fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>); 00679 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m44">uid</a> = getuid(); 00682 fi-><a class="code" href="structtransactionFileInfo__s.html#m46">gid</a> = getgid(); 00683 fi-><a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = 0; 00684 fi-><a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = 0; 00685 00686 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 00687 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 00688 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 00689 fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = fi-><a class="code" href="structtransactionFileInfo__s.html#m44">uid</a>; 00690 fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = fi-><a class="code" href="structtransactionFileInfo__s.html#m46">gid</a>; 00691 } 00692 00693 <span class="keywordflow">for</span> (i = 0; i < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) 00694 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>, NULL); 00697 00698 i = fi-><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-><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 < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) 00701 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m15">fflags</a>[i] & <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-><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 < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 00706 <span class="keyword">const</span> <span class="keywordtype">char</span> * t = fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>[i]; 00707 t += strlen(fi-><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-><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-><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 < fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>, -1); 00733 00734 fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> = 2; 00735 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>) + fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>) + 00736 speclen + sourcelen); 00737 fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = (<span class="keywordtype">int</span> *)(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> + fi-><a class="code" href="structtransactionFileInfo__s.html#m33">dc</a>); 00738 memset(fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>, 0, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>)); 00739 fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i] = 1; 00740 <span class="comment">/*@-dependenttrans@*/</span> 00741 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[0] = t = (<span class="keywordtype">char</span> *)(fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> + fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 00742 fi-><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-><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-><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->goal = <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>; 00756 00757 <span class="comment">/*@-compmempass@*/</span> <span class="comment">/* FIX: psm->fi->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 && specFile && 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-><a class="code" href="structpsm__s.html#m0">ts</a>; 00834 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><a class="code" href="structpsm__s.html#m1">fi</a>; 00835 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 00836 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><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 && !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, &n, &v, &r); 00869 <span class="keywordflow">if</span> (hge(h, <a class="code" href="rpmlib_8h.html#a494a203">RPMTAG_INSTPREFIXES</a>, &ipt, (<span class="keywordtype">void</span> **) &prefixes, &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> **) &oldPrefix, NULL)) { 00872 prefixes = &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 < numPrefixes; i++) { 00880 len = strlen(prefixes[i]); 00881 <span class="keywordflow">if</span> (len > 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-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> ? ts-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a> : <span class="stringliteral">"/"</span>), &fn, &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>() && 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-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> && 00903 !(ts-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>[0] == <span class="charliteral">'/'</span> && ts-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>[1] == <span class="charliteral">'\0'</span>)) 00904 { 00905 sn += strlen(ts-><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 >= 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 >= 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-><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-><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-><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-><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-><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-><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) > STDERR_FILENO && <a class="code" href="group__rpmio.html#a86">Fileno</a>(out) != <a class="code" href="group__rpmio.html#a86">Fileno</a>(ts-><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-><a class="code" href="structrpmTransactionSet__s.html#m22">scriptFd</a>) > STDERR_FILENO) { 00966 xx = <a class="code" href="group__rpmio.html#a80">Fclose</a> (ts-><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 && 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 < 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-><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-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> && !(rootDir[0] == <span class="charliteral">'/'</span> && 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, &status, 0) < 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-><a class="code" href="structpsm__s.html#m1">fi</a>; 01056 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 01057 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-><a class="code" href="structpsm__s.html#m12">progTag</a>, &ptt, (<span class="keywordtype">void</span> **) &programArgv, &programArgc); 01071 xx = hge(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a>, &stt, (<span class="keywordtype">void</span> **) &script, NULL); 01072 01073 <span class="keywordflow">if</span> (programArgv && 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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a>), programArgc, argv, 01081 script, psm-><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-><a class="code" href="structpsm__s.html#m0">ts</a>; 01104 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><a class="code" href="structpsm__s.html#m1">fi</a>; 01105 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 01106 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><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>, &tnt, 01123 (<span class="keywordtype">void</span> **) &triggerNames, &numTriggers) && 01124 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a181">RPMTAG_TRIGGERFLAGS</a>, &tft, 01125 (<span class="keywordtype">void</span> **) &triggerFlags, NULL) && 01126 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a180">RPMTAG_TRIGGERVERSION</a>, &tvt, 01127 (<span class="keywordtype">void</span> **) &triggerEVR, NULL)) 01128 ) 01129 <span class="keywordflow">return</span> 0; 01130 01131 xx = <a class="code" href="group__header.html#a88">headerNVR</a>(sourceH, &sourceName, NULL, NULL); 01132 01133 <span class="keywordflow">for</span> (i = 0; i < 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] & psm-><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) && 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>, &tit, 01157 (<span class="keywordtype">void</span> **) &triggerIndices, NULL) && 01158 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a178">RPMTAG_TRIGGERSCRIPTS</a>, &tst, 01159 (<span class="keywordtype">void</span> **) &triggerScripts, NULL) && 01160 hge(triggeredH, <a class="code" href="rpmlib_8h.html#a494a196">RPMTAG_TRIGGERSCRIPTPROG</a>, &tpt, 01161 (<span class="keywordtype">void</span> **) &triggerProgs, NULL)) 01162 ) 01163 <span class="keywordflow">continue</span>; 01164 01165 xx = <a class="code" href="group__header.html#a88">headerNVR</a>(triggeredH, &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-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, triggerPackageName); 01171 <span class="keywordflow">if</span> (arg1 < 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-><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-><a class="code" href="structpsm__s.html#m0">ts</a>; 01219 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><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-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>) + psm-><a class="code" href="structpsm__s.html#m16">countCorrection</a>; 01224 <span class="keywordflow">if</span> (numPackage < 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-><a class="code" href="structpsm__s.html#m16">countCorrection</a>; 01230 01231 psm-><a class="code" href="structpsm__s.html#m16">countCorrection</a> = 0; 01232 mi = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a179">RPMTAG_TRIGGERNAME</a>, fi-><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-><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-><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-><a class="code" href="structpsm__s.html#m0">ts</a>; 01256 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><a class="code" href="structpsm__s.html#m1">fi</a>; 01257 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 01258 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a179">RPMTAG_TRIGGERNAME</a>, &tnt, 01268 (<span class="keywordtype">void</span> **) &triggerNames, &numTriggers) && 01269 hge(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a182">RPMTAG_TRIGGERINDEX</a>, &tit, 01270 (<span class="keywordtype">void</span> **) &triggerIndices, &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 < 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-><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-><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-><a class="code" href="structpsm__s.html#m0">ts</a>; 01348 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = psm-><a class="code" href="structpsm__s.html#m1">fi</a>; 01349 <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = fi-><a class="code" href="structtransactionFileInfo__s.html#m4">hge</a>; 01350 <a class="code" href="rpmlib_8h.html#a71">HME_t</a> hme = fi-><a class="code" href="structtransactionFileInfo__s.html#m6">hme</a>; 01351 <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = (fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m8">hfd</a> : headerFreeData); 01352 <a class="code" href="rpmlib_8h.html#a43">rpmRC</a> rc = psm-><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-><a class="code" href="structpsm__s.html#m6">stepName</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a>, 01363 fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>, (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structpsm__s.html#m13">npkgs_installed</a> = <a class="code" href="group__rpmdb.html#a61">rpmdbCountPackages</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>); 01371 <span class="keywordflow">if</span> (psm-><a class="code" href="structpsm__s.html#m13">npkgs_installed</a> < 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-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) { 01377 psm-><a class="code" href="structpsm__s.html#m14">scriptArg</a> = psm-><a class="code" href="structpsm__s.html#m13">npkgs_installed</a> + 1; 01378 01379 assert(psm-><a class="code" href="structpsm__s.html#m5">mi</a> == NULL); 01380 psm-><a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, 0); 01381 xx = <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>); 01383 xx = <a class="code" href="group__rpmdb.html#a73">rpmdbSetIteratorRE</a>(psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m12">release</a>); 01385 01386 <span class="keywordflow">while</span> ((psm-><a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(psm-><a class="code" href="structpsm__s.html#m5">mi</a>))) { 01387 fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a> = <a class="code" href="group__rpmdb.html#a67">rpmdbGetIteratorOffset</a>(psm-><a class="code" href="structpsm__s.html#m5">mi</a>); 01388 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a329">RPMTRANS_FLAG_MULTILIB</a>) 01389 psm-><a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a71">headerCopy</a>(psm-><a class="code" href="structpsm__s.html#m4">oh</a>); 01390 <span class="keywordflow">else</span> 01391 psm-><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-><a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> > 0 && fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> == NULL) { 01398 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>) * fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01399 memset(fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, <a class="code" href="rpmlib_8h.html#a495a238">RPMFILE_STATE_NORMAL</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01400 } 01401 01402 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> <= 0) <span class="keywordflow">break</span>; 01403 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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> **) &p, NULL); 01412 fi-><a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = (rc ? strlen(p) + 1 : 1); 01413 } 01414 fi-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, &fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>, NULL); 01421 01422 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> == NULL) 01423 xx = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, NULL); 01425 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> == NULL) 01426 xx = hge(fi-><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> **) &fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, NULL); 01428 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> == NULL) 01429 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01430 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> == NULL) 01431 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-><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-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a> || psm-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>) { 01435 psm-><a class="code" href="structpsm__s.html#m14">scriptArg</a> = psm-><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-><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-><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-><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-><a class="code" href="structpsm__s.html#m9">pkgURL</a>, &psm-><a class="code" href="structpsm__s.html#m10">pkgfn</a>); 01452 psm-><a class="code" href="structpsm__s.html#m3">fd</a> = <a class="code" href="group__rpmio.html#a83">Fopen</a>(psm-><a class="code" href="structpsm__s.html#m10">pkgfn</a>, <span class="stringliteral">"w.ufdio"</span>); 01453 <span class="keywordflow">if</span> (psm-><a class="code" href="structpsm__s.html#m3">fd</a> == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(psm-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a17">PSM_PKGINSTALL</a>) { 01467 psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a136">RPMTAG_PREIN</a>; 01468 psm-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structpsm__s.html#m6">stepName</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a>), rc, 01480 fi-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-><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-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>) { 01487 psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a138">RPMTAG_PREUN</a>; 01488 psm-><a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a191">RPMTAG_PREUNPROG</a>; 01489 psm-><a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a271">RPMSENSE_TRIGGERUN</a>; 01490 psm-><a class="code" href="structpsm__s.html#m16">countCorrection</a> = -1; 01491 01492 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a96">RPMTAG_HEADERIMMUTABLE</a>, &uht, &uh, &uhc)) 01511 { 01512 psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, <a class="code" href="rpmlib_8h.html#a494a94">RPMTAG_HEADERIMAGE</a>, &uht, &uh, &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-><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, &tag, &type, &ptr, &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-><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->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, &archnum); 01557 <a class="code" href="group__rpmrc.html#a51">rpmGetOsInfo</a>(NULL, &osnum); 01558 <span class="preprocessor">#endif</span> 01559 <span class="preprocessor"></span> 01560 memset(&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-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-><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-><a class="code" href="structpsm__s.html#m3">fd</a>, &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-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 01585 rc = <a class="code" href="group__signature.html#a6">rpmWriteSignature</a>(psm-><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-><a class="code" href="structpsm__s.html#m4">oh</a>) 01592 { <a class="code" href="header_8h.html#a9">int_32</a> tid = ts-><a class="code" href="structrpmTransactionSet__s.html#m24">id</a>; 01593 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(psm-><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>, &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-><a class="code" href="structpsm__s.html#m3">fd</a>, psm-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> <= 0) <span class="keywordflow">break</span>; 01610 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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 < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 01613 uid_t uid; 01614 gid_t gid; 01615 01616 uid = fi-><a class="code" href="structtransactionFileInfo__s.html#m44">uid</a>; 01617 gid = fi-><a class="code" href="structtransactionFileInfo__s.html#m46">gid</a>; 01618 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> && <a class="code" href="ugid_8c.html#a0">unameToUid</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>[i], &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-><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-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i] &= ~S_ISUID; <span class="comment">/* turn off the suid bit */</span> 01625 } 01626 01627 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> && <a class="code" href="ugid_8c.html#a1">gnameToGid</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>[i], &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-><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-><a class="code" href="structtransactionFileInfo__s.html#m26">fmodes</a>[i] &= ~S_ISGID; <span class="comment">/* turn off the sgid bit */</span> 01634 } 01635 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>) fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = uid; 01636 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>) fi-><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-><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->fd != NULL here. */</span> 01647 psm-><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-><a class="code" href="structavailablePackage.html#m24">fd</a>)), psm-><a class="code" href="structpsm__s.html#m7">rpmio_flags</a>); 01648 <span class="comment">/*@=nullpass@*/</span> 01649 <span class="keywordflow">if</span> (psm-><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-><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-><a class="code" href="structpsm__s.html#m2">cfd</a>, NULL, &psm-><a class="code" href="structpsm__s.html#m8">failedFile</a>); 01656 xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-><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-><a class="code" href="structpsm__s.html#m2">cfd</a>); 01660 psm-><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-><a class="code" href="structpsm__s.html#m8">failedFile</a> != NULL ? _(<span class="stringliteral">" on file "</span>) : <span class="stringliteral">""</span>), 01672 (psm-><a class="code" href="structpsm__s.html#m8">failedFile</a> != NULL ? psm-><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-><a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a28">RPMCALLBACK_UNPACK_ERROR</a>; 01678 psm-><a class="code" href="structpsm__s.html#m19">amount</a> = 0; 01679 psm-><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-><a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a18">RPMCALLBACK_INST_PROGRESS</a>; 01685 psm-><a class="code" href="structpsm__s.html#m19">amount</a> = (fi-><a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m38">archiveSize</a> : 100); 01686 psm-><a class="code" href="structpsm__s.html#m20">total</a> = psm-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> <= 0) <span class="keywordflow">break</span>; 01692 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a324">RPMTRANS_FLAG_JUSTDB</a>) <span class="keywordflow">break</span>; 01693 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a346">RPMTRANS_FLAG_APPLYONLY</a>) <span class="keywordflow">break</span>; 01694 01695 psm-><a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a26">RPMCALLBACK_UNINST_START</a>; 01696 psm-><a class="code" href="structpsm__s.html#m19">amount</a> = fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; <span class="comment">/* XXX W2DO? looks wrong. */</span> 01697 psm-><a class="code" href="structpsm__s.html#m20">total</a> = fi-><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-><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, &psm-><a class="code" href="structpsm__s.html#m8">failedFile</a>); 01702 xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>); 01703 01704 psm-><a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a27">RPMCALLBACK_UNINST_STOP</a>; 01705 psm-><a class="code" href="structpsm__s.html#m19">amount</a> = 0; <span class="comment">/* XXX W2DO? looks wrong. */</span> 01706 psm-><a class="code" href="structpsm__s.html#m20">total</a> = fi-><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-><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-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>; 01712 <a class="code" href="rpmlib_8h.html#a74">fileAction</a> action = fi-><a class="code" href="structtransactionFileInfo__s.html#m1">action</a>; 01713 01714 fi-><a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = <a class="code" href="rpmlib_8h.html#a501a304">FA_COPYOUT</a>; 01715 fi-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = NULL; 01716 01717 <span class="keywordflow">if</span> (psm-><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->fd != NULL here. */</span> 01722 xx = <a class="code" href="group__rpmio.html#a84">Fflush</a>(psm-><a class="code" href="structpsm__s.html#m3">fd</a>); 01723 psm-><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-><a class="code" href="structpsm__s.html#m3">fd</a>)), psm-><a class="code" href="structpsm__s.html#m7">rpmio_flags</a>); 01724 <span class="comment">/*@=nullpass@*/</span> 01725 <span class="keywordflow">if</span> (psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m49">fsm</a>, <a class="code" href="fsm_8h.html#a73a19">FSM_PKGBUILD</a>, ts, fi, psm-><a class="code" href="structpsm__s.html#m2">cfd</a>, 01731 NULL, &psm-><a class="code" href="structpsm__s.html#m8">failedFile</a>); 01732 xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-><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-><a class="code" href="structpsm__s.html#m2">cfd</a>); 01736 psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m1">action</a> = action; 01742 fi-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> != NULL && fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> > 0) 01752 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01754 01755 xx = <a class="code" href="group__header.html#a45">headerAddEntry</a>(fi-><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 &installTime, 1); 01757 01758 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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> **) &newMultiLib, NULL) && 01763 hge(psm-><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> **) &p, NULL)) 01765 { 01766 multiLib = *p; 01767 multiLib |= *newMultiLib; 01768 xx = hme(psm-><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 &multiLib, 1); 01770 } 01771 rc = <a class="code" href="psm_8c.html#a7">mergeFiles</a>(fi, psm-><a class="code" href="structpsm__s.html#m4">oh</a>, fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a> && !(ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a137">RPMTAG_POSTIN</a>; 01789 psm-><a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a190">RPMTAG_POSTINPROG</a>; 01790 psm-><a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a270">RPMSENSE_TRIGGERIN</a>; 01791 psm-><a class="code" href="structpsm__s.html#m16">countCorrection</a> = 0; 01792 01793 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a>) { 01812 01813 psm-><a class="code" href="structpsm__s.html#m11">scriptTag</a> = <a class="code" href="rpmlib_8h.html#a494a139">RPMTAG_POSTUN</a>; 01814 psm-><a class="code" href="structpsm__s.html#m12">progTag</a> = <a class="code" href="rpmlib_8h.html#a494a192">RPMTAG_POSTUNPROG</a>; 01815 psm-><a class="code" href="structpsm__s.html#m15">sense</a> = <a class="code" href="rpmlib_8h.html#a497a272">RPMSENSE_TRIGGERPOSTUN</a>; 01816 psm-><a class="code" href="structpsm__s.html#m16">countCorrection</a> = -1; 01817 01818 <span class="keywordflow">if</span> (!(ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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-><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-><a class="code" href="structpsm__s.html#m3">fd</a>); 01847 psm-><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-><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-><a class="code" href="structpsm__s.html#m9">pkgURL</a> ? psm-><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-><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-><a class="code" href="structpsm__s.html#m6">stepName</a>, psm-><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-><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-><a class="code" href="structpsm__s.html#m18">what</a> = <a class="code" href="rpmmessages_8h.html#a31a29">RPMCALLBACK_CPIO_ERROR</a>; 01871 psm-><a class="code" href="structpsm__s.html#m19">amount</a> = 0; 01872 psm-><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-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> && (psm-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a18">PSM_PKGERASE</a> || psm-><a class="code" href="structpsm__s.html#m22">goal</a> == <a class="code" href="psm_8h.html#a38a20">PSM_PKGSAVE</a>)) 01877 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a16">headerFree</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>); 01878 psm-><a class="code" href="structpsm__s.html#m4">oh</a> = <a class="code" href="group__header.html#a16">headerFree</a>(psm-><a class="code" href="structpsm__s.html#m4">oh</a>); 01879 psm-><a class="code" href="structpsm__s.html#m9">pkgURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-><a class="code" href="structpsm__s.html#m9">pkgURL</a>); 01880 psm-><a class="code" href="structpsm__s.html#m7">rpmio_flags</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-><a class="code" href="structpsm__s.html#m7">rpmio_flags</a>); 01881 psm-><a class="code" href="structpsm__s.html#m8">failedFile</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(psm-><a class="code" href="structpsm__s.html#m8">failedFile</a>); 01882 01883 fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>); 01884 fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>); 01885 fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a>, -1); 01886 fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = hfd(fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a>, -1); 01887 fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>); 01888 fi-><a class="code" href="structtransactionFileInfo__s.html#m28">fstates</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><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-><a class="code" href="structpsm__s.html#m22">goal</a> = stage; 01895 psm-><a class="code" href="structpsm__s.html#m21">rc</a> = <a class="code" href="rpmlib_8h.html#a493a89">RPMRC_OK</a>; 01896 psm-><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 && ts-><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-><a class="code" href="structrpmTransactionSet__s.html#m1">notify</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>, psm-><a class="code" href="structpsm__s.html#m18">what</a>, psm-><a class="code" href="structpsm__s.html#m19">amount</a>, psm-><a class="code" href="structpsm__s.html#m20">total</a>, 01913 (fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a> ? fi-><a class="code" href="structtransactionFileInfo__s.html#m50">ap</a>-><a class="code" href="structavailablePackage.html#m22">key</a> : NULL), ts-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a332">RPMTRANS_FLAG_PKGCOMMIT</a>)) <span class="keywordflow">break</span>; 01921 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><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, &psm-><a class="code" href="structpsm__s.html#m8">failedFile</a>); 01925 xx = <a class="code" href="fsm_8c.html#a28">fsmTeardown</a>(fi-><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-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a> && !ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> && !psm-><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-><a class="code" href="structrpmTransactionSet__s.html#m20">rootDir</a>); 01946 <span class="comment">/*@=unrecog =superuser @*/</span> 01947 psm-><a class="code" href="structpsm__s.html#m17">chrootDone</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 1; 01948 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a> != NULL) ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-><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-><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-><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-><a class="code" href="structpsm__s.html#m17">chrootDone</a> = ts-><a class="code" href="structrpmTransactionSet__s.html#m19">chrootDone</a> = 0; 01963 <span class="keywordflow">if</span> (ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a> != NULL) ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>-><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-><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-><a class="code" href="structpsm__s.html#m6">stepName</a>, <a class="code" href="psm_8c.html#a11">tag2sln</a>(psm-><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-><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> **) &payload_compressor, NULL)) 01990 payload_compressor = <span class="stringliteral">"gzip"</span>; 01991 psm-><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-><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-><a class="code" href="structpsm__s.html#m5">mi</a> == NULL); 02003 psm-><a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a85">rpmdbInitIterator</a>(ts-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, <a class="code" href="rpmlib_8h.html#a0">RPMDBI_PACKAGES</a>, 02004 &fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a>, <span class="keyword">sizeof</span>(fi-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a>)); 02005 02006 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__rpmdb.html#a80">rpmdbNextIterator</a>(psm-><a class="code" href="structpsm__s.html#m5">mi</a>); 02007 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a>) 02008 fi-><a class="code" href="structtransactionFileInfo__s.html#m9">h</a> = <a class="code" href="group__header.html#a14">headerLink</a>(fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m53">record</a>); 02011 } 02012 psm-><a class="code" href="structpsm__s.html#m5">mi</a> = <a class="code" href="group__rpmdb.html#a65">rpmdbFreeIterator</a>(psm-><a class="code" href="structpsm__s.html#m5">mi</a>); 02013 rc = (fi-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <a class="code" href="group__rpmtrans.html#a19a321">RPMTRANS_FLAG_TEST</a>) <span class="keywordflow">break</span>; 02017 <span class="keywordflow">if</span> (fi-><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-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m24">id</a>, fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-><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-><a class="code" href="structrpmTransactionSet__s.html#m0">transFlags</a> & <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-><a class="code" href="structrpmTransactionSet__s.html#m8">rpmdb</a>, ts-><a class="code" href="structrpmTransactionSet__s.html#m24">id</a>, fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m10">name</a>, fi-><a class="code" href="structtransactionFileInfo__s.html#m11">version</a>, fi-><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->oh and psm->fi->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>