Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>build/files.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.2.17 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>build/files.c</h1><a href="files_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 
00007 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span>
00008 
<a name="l00009"></a><a class="code" href="files_8c.html#a0">00009</a> <span class="preprocessor">#define MYALLPERMS      07777</span>
00010 <span class="preprocessor"></span>
00011 <span class="preprocessor">#include &lt;regex.h&gt;</span>
00012 <span class="preprocessor">#include &lt;signal.h&gt;</span>     <span class="comment">/* getOutputFrom() */</span>
00013 
00014 <span class="preprocessor">#include &lt;<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>&gt;</span>
00015 <span class="preprocessor">#include &lt;<a class="code" href="rpmbuild_8h.html">rpmbuild.h</a>&gt;</span>
00016 
00017 <span class="preprocessor">#include "<a class="code" href="buildio_8h.html">buildio.h</a>"</span>
00018 
00019 <span class="preprocessor">#include "<a class="code" href="myftw_8h.html">myftw.h</a>"</span>
00020 <span class="preprocessor">#include "md5.h"</span>
00021 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00022 
00023 <span class="comment">/*@access Header @*/</span>
00024 <span class="comment">/*@access TFI_t @*/</span>
00025 <span class="comment">/*@access FD_t @*/</span>
00026 <span class="comment">/*@access StringBuf @*/</span>         <span class="comment">/* compared with NULL */</span>
00027 
<a name="l00028"></a><a class="code" href="files_8c.html#a1">00028</a> <span class="preprocessor">#define SKIPWHITE(_x)   {while(*(_x) &amp;&amp; (xisspace(*_x) || *(_x) == ',')) (_x)++;}</span>
<a name="l00029"></a><a class="code" href="files_8c.html#a2">00029</a> <span class="preprocessor"></span><span class="preprocessor">#define SKIPNONWHITE(_x){while(*(_x) &amp;&amp;!(xisspace(*_x) || *(_x) == ',')) (_x)++;}</span>
00030 <span class="preprocessor"></span>
<a name="l00031"></a><a class="code" href="files_8c.html#a3">00031</a> <span class="preprocessor">#define MAXDOCDIR 1024</span>
00032 <span class="preprocessor"></span>
00033 <span class="comment">/*@-redecl@*/</span>
<a name="l00034"></a><a class="code" href="group__rpmcli.html#a14">00034</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="group__rpmcli.html#a14">_noDirTokens</a>;
00035 <span class="comment">/*@=redecl@*/</span>
00036 
<a name="l00039"></a><a class="code" href="files_8c.html#a63">00039</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> <a class="code" href="files_8c.html#a63">specdFlags_e</a> {
00040     <a class="code" href="files_8c.html#a63a24">SPECD_DEFFILEMODE</a>   = (1 &lt;&lt; 0),
00041     <a class="code" href="files_8c.html#a63a25">SPECD_DEFDIRMODE</a>    = (1 &lt;&lt; 1),
00042     <a class="code" href="files_8c.html#a63a26">SPECD_DEFUID</a>        = (1 &lt;&lt; 2),
00043     <a class="code" href="files_8c.html#a63a27">SPECD_DEFGID</a>        = (1 &lt;&lt; 3),
00044     <a class="code" href="files_8c.html#a63a28">SPECD_DEFVERIFY</a>     = (1 &lt;&lt; 4),
00045 
00046     <a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a>      = (1 &lt;&lt; 8),
00047     <a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a>       = (1 &lt;&lt; 9),
00048     <a class="code" href="files_8c.html#a63a31">SPECD_UID</a>           = (1 &lt;&lt; 10),
00049     <a class="code" href="files_8c.html#a63a32">SPECD_GID</a>           = (1 &lt;&lt; 11),
00050     <a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a>        = (1 &lt;&lt; 12)
00051 } <a class="code" href="files_8c.html#a15">specdFlags</a>;
00052 
<a name="l00055"></a><a class="code" href="structFileListRec__s.html">00055</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structFileListRec__s.html">FileListRec_s</a> {
<a name="l00056"></a><a class="code" href="structFileListRec__s.html#m0">00056</a>     <span class="keyword">struct </span>stat <a class="code" href="structFileListRec__s.html#m0">fl_st</a>;
<a name="l00057"></a><a class="code" href="files_8c.html#a4">00057</a> <span class="preprocessor">#define fl_dev  fl_st.st_dev</span>
<a name="l00058"></a><a class="code" href="files_8c.html#a5">00058</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_ino  fl_st.st_ino</span>
<a name="l00059"></a><a class="code" href="files_8c.html#a6">00059</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_mode fl_st.st_mode</span>
<a name="l00060"></a><a class="code" href="files_8c.html#a7">00060</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_nlink fl_st.st_nlink</span>
<a name="l00061"></a><a class="code" href="files_8c.html#a8">00061</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_uid  fl_st.st_uid</span>
<a name="l00062"></a><a class="code" href="files_8c.html#a9">00062</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_gid  fl_st.st_gid</span>
<a name="l00063"></a><a class="code" href="files_8c.html#a10">00063</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_rdev fl_st.st_rdev</span>
<a name="l00064"></a><a class="code" href="files_8c.html#a11">00064</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_size fl_st.st_size</span>
<a name="l00065"></a><a class="code" href="files_8c.html#a12">00065</a> <span class="preprocessor"></span><span class="preprocessor">#define fl_mtime fl_st.st_mtime</span>
00066 <span class="preprocessor"></span>
<a name="l00067"></a><a class="code" href="structFileListRec__s.html#m1">00067</a> <span class="comment">/*@only@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileListRec__s.html#m1">diskURL</a>;        <span class="comment">/* get file from here       */</span>
<a name="l00068"></a><a class="code" href="structFileListRec__s.html#m2">00068</a> <span class="comment">/*@only@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileListRec__s.html#m2">fileURL</a>;        <span class="comment">/* filename in cpio archive */</span>
<a name="l00069"></a><a class="code" href="structFileListRec__s.html#m3">00069</a> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileListRec__s.html#m3">uname</a>;
<a name="l00070"></a><a class="code" href="structFileListRec__s.html#m4">00070</a> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileListRec__s.html#m4">gname</a>;
<a name="l00071"></a><a class="code" href="structFileListRec__s.html#m5">00071</a>     <span class="keywordtype">unsigned</span>    <a class="code" href="structFileListRec__s.html#m5">flags</a>;
<a name="l00072"></a><a class="code" href="structFileListRec__s.html#m6">00072</a>     <a class="code" href="structFileListRec__s.html#m6">specdFlags</a>  <a class="code" href="structFileListRec__s.html#m6">specdFlags</a>;     <span class="comment">/* which attributes have been explicitly specified. */</span>
<a name="l00073"></a><a class="code" href="structFileListRec__s.html#m7">00073</a>     <span class="keywordtype">unsigned</span>    <a class="code" href="structFileListRec__s.html#m7">verifyFlags</a>;
<a name="l00074"></a><a class="code" href="structFileListRec__s.html#m8">00074</a> <span class="comment">/*@only@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *<a class="code" href="structFileListRec__s.html#m8">langs</a>;   <span class="comment">/* XXX locales separated with | */</span>
00075 } * <a class="code" href="structFileListRec__s.html">FileListRec</a>;
00076 
<a name="l00079"></a><a class="code" href="structAttrRec__s.html">00079</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structAttrRec__s.html">AttrRec_s</a> {
<a name="l00080"></a><a class="code" href="structAttrRec__s.html#m0">00080</a>     <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>;
<a name="l00081"></a><a class="code" href="structAttrRec__s.html#m1">00081</a>     <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>;
<a name="l00082"></a><a class="code" href="structAttrRec__s.html#m2">00082</a>     <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structAttrRec__s.html#m2">ar_user</a>;
<a name="l00083"></a><a class="code" href="structAttrRec__s.html#m3">00083</a>     <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structAttrRec__s.html#m3">ar_group</a>;
<a name="l00084"></a><a class="code" href="structAttrRec__s.html#m4">00084</a>     mode_t      <a class="code" href="structAttrRec__s.html#m4">ar_fmode</a>;
<a name="l00085"></a><a class="code" href="structAttrRec__s.html#m5">00085</a>     mode_t      <a class="code" href="structAttrRec__s.html#m5">ar_dmode</a>;
00086 } * <a class="code" href="structAttrRec__s.html">AttrRec</a>;
00087 
00090 <span class="comment">/*@unchecked@*/</span>
<a name="l00091"></a><a class="code" href="files_8c.html#a18">00091</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a18">multiLib</a> = 0;        <span class="comment">/* MULTILIB */</span>
00092 
<a name="l00096"></a><a class="code" href="structFileList__s.html">00096</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structFileList__s.html">FileList_s</a> {
<a name="l00097"></a><a class="code" href="structFileList__s.html#m0">00097</a> <span class="comment">/*@only@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileList__s.html#m0">buildRootURL</a>;
<a name="l00098"></a><a class="code" href="structFileList__s.html#m1">00098</a> <span class="comment">/*@only@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileList__s.html#m1">prefix</a>;
00099 
<a name="l00100"></a><a class="code" href="structFileList__s.html#m2">00100</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m2">fileCount</a>;
<a name="l00101"></a><a class="code" href="structFileList__s.html#m3">00101</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m3">totalFileSize</a>;
<a name="l00102"></a><a class="code" href="structFileList__s.html#m4">00102</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m4">processingFailed</a>;
00103 
<a name="l00104"></a><a class="code" href="structFileList__s.html#m5">00104</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a>;
<a name="l00105"></a><a class="code" href="structFileList__s.html#m6">00105</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m6">isSpecialDoc</a>;
00106 
<a name="l00107"></a><a class="code" href="structFileList__s.html#m7">00107</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m7">noGlob</a>;
<a name="l00108"></a><a class="code" href="structFileList__s.html#m8">00108</a>     <span class="keywordtype">unsigned</span> <a class="code" href="structFileList__s.html#m8">devtype</a>;
<a name="l00109"></a><a class="code" href="structFileList__s.html#m9">00109</a>     <span class="keywordtype">unsigned</span> <a class="code" href="structFileList__s.html#m9">devmajor</a>;
<a name="l00110"></a><a class="code" href="structFileList__s.html#m10">00110</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m10">devminor</a>;
00111     
<a name="l00112"></a><a class="code" href="structFileList__s.html#m11">00112</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m11">isDir</a>;
<a name="l00113"></a><a class="code" href="structFileList__s.html#m12">00113</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m12">inFtw</a>;
<a name="l00114"></a><a class="code" href="structFileList__s.html#m13">00114</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m13">currentFlags</a>;
<a name="l00115"></a><a class="code" href="structFileList__s.html#m14">00115</a>     <a class="code" href="files_8c.html#a15">specdFlags</a> <a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a>;
<a name="l00116"></a><a class="code" href="structFileList__s.html#m15">00116</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a>;
<a name="l00117"></a><a class="code" href="structFileList__s.html#m16">00117</a>     <span class="keyword">struct </span><a class="code" href="structAttrRec__s.html">AttrRec_s</a> cur_ar;
<a name="l00118"></a><a class="code" href="structFileList__s.html#m17">00118</a>     <span class="keyword">struct </span><a class="code" href="structAttrRec__s.html">AttrRec_s</a> def_ar;
<a name="l00119"></a><a class="code" href="structFileList__s.html#m18">00119</a>     <a class="code" href="files_8c.html#a15">specdFlags</a> <a class="code" href="structFileList__s.html#m18">defSpecdFlags</a>;
<a name="l00120"></a><a class="code" href="structFileList__s.html#m19">00120</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m19">defVerifyFlags</a>;
<a name="l00121"></a><a class="code" href="structFileList__s.html#m20">00121</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m20">nLangs</a>;
<a name="l00122"></a><a class="code" href="structFileList__s.html#m21">00122</a> <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** <a class="code" href="structFileList__s.html#m21">currentLangs</a>;
00123 
00124     <span class="comment">/* Hard coded limit of MAXDOCDIR docdirs.         */</span>
00125     <span class="comment">/* If you break it you are doing something wrong. */</span>
<a name="l00126"></a><a class="code" href="structFileList__s.html#m22">00126</a>     <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structFileList__s.html#m22">docDirs</a>[<a class="code" href="files_8c.html#a3">MAXDOCDIR</a>];
<a name="l00127"></a><a class="code" href="structFileList__s.html#m23">00127</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m23">docDirCount</a>;
00128     
<a name="l00129"></a><a class="code" href="structFileList__s.html#m24">00129</a> <span class="comment">/*@only@*/</span> <a class="code" href="structFileListRec__s.html">FileListRec</a> <a class="code" href="structFileList__s.html#m24">fileList</a>;
<a name="l00130"></a><a class="code" href="structFileList__s.html#m25">00130</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a>;
<a name="l00131"></a><a class="code" href="structFileList__s.html#m26">00131</a>     <span class="keywordtype">int</span> <a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>;
00132 } * <a class="code" href="structFileList__s.html">FileList</a>;
00133 
<a name="l00136"></a><a class="code" href="files_8c.html#a34">00136</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a34">nullAttrRec</a>(<span class="comment">/*@out@*/</span> <a class="code" href="structAttrRec__s.html">AttrRec</a> ar)   <span class="comment">/*@modifies ar @*/</span>
00137 {
00138     ar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = NULL;
00139     ar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = NULL;
00140     ar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a> = NULL;
00141     ar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a> = NULL;
00142     ar-&gt;<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> = 0;
00143     ar-&gt;<a class="code" href="structAttrRec__s.html#m5">ar_dmode</a> = 0;
00144 }
00145 
<a name="l00148"></a><a class="code" href="files_8c.html#a35">00148</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a35">freeAttrRec</a>(<a class="code" href="structAttrRec__s.html">AttrRec</a> ar)     <span class="comment">/*@modifies ar @*/</span>
00149 {
00150     ar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>);
00151     ar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>);
00152     ar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a>);
00153     ar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a>);
00154     <span class="comment">/* XXX doesn't free ar (yet) */</span>
00155     <span class="comment">/*@-nullstate@*/</span>
00156     <span class="keywordflow">return</span>;
00157     <span class="comment">/*@=nullstate@*/</span>
00158 }
00159 
<a name="l00162"></a><a class="code" href="files_8c.html#a36">00162</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a36">dupAttrRec</a>(<span class="keyword">const</span> <a class="code" href="structAttrRec__s.html">AttrRec</a> oar, <span class="comment">/*@in@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="structAttrRec__s.html">AttrRec</a> nar)
00163         <span class="comment">/*@modifies nar @*/</span>
00164 {
00165     <span class="keywordflow">if</span> (oar == nar)
00166         <span class="keywordflow">return</span>;
00167     <a class="code" href="files_8c.html#a35">freeAttrRec</a>(nar);
00168     nar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = (oar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>) : NULL);
00169     nar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = (oar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>) : NULL);
00170     nar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a> = (oar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a>) : NULL);
00171     nar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a> = (oar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a>) : NULL);
00172     nar-&gt;<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> = oar-&gt;<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a>;
00173     nar-&gt;<a class="code" href="structAttrRec__s.html#m5">ar_dmode</a> = oar-&gt;<a class="code" href="structAttrRec__s.html#m5">ar_dmode</a>;
00174 }
00175 
00176 <span class="preprocessor">#if 0</span>
00177 <span class="preprocessor"></span>
00179 <span class="keyword">static</span> <span class="keywordtype">void</span> dumpAttrRec(<span class="keyword">const</span> <span class="keywordtype">char</span> * msg, <a class="code" href="structAttrRec__s.html">AttrRec</a> ar)
00180         <span class="comment">/*@globals fileSystem@*/</span>
00181         <span class="comment">/*@modifies fileSystem @*/</span>
00182 {
00183     <span class="keywordflow">if</span> (msg)
00184         fprintf(stderr, <span class="stringliteral">"%s:\t"</span>, msg);
00185     fprintf(stderr, <span class="stringliteral">"(%s, %s, %s, %s)\n"</span>,
00186         ar-&gt;<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>,
00187         ar-&gt;<a class="code" href="structAttrRec__s.html#m2">ar_user</a>,
00188         ar-&gt;<a class="code" href="structAttrRec__s.html#m3">ar_group</a>,
00189         ar-&gt;<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>);
00190 }
00191 <span class="preprocessor">#endif</span>
00192 <span class="preprocessor"></span>
00193 <span class="comment">/* strtokWithQuotes() modified from glibc strtok() */</span>
00194 <span class="comment">/* Copyright (C) 1991, 1996 Free Software Foundation, Inc.</span>
00195 <span class="comment">   This file is part of the GNU C Library.</span>
00196 <span class="comment"></span>
00197 <span class="comment">   The GNU C Library is free software; you can redistribute it and/or</span>
00198 <span class="comment">   modify it under the terms of the GNU Library General Public License as</span>
00199 <span class="comment">   published by the Free Software Foundation; either version 2 of the</span>
00200 <span class="comment">   License, or (at your option) any later version.</span>
00201 <span class="comment"></span>
00202 <span class="comment">   The GNU C Library is distributed in the hope that it will be useful,</span>
00203 <span class="comment">   but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
00204 <span class="comment">   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
00205 <span class="comment">   Library General Public License for more details.</span>
00206 <span class="comment"></span>
00207 <span class="comment">   You should have received a copy of the GNU Library General Public</span>
00208 <span class="comment">   License along with the GNU C Library; see the file COPYING.LIB.  If</span>
00209 <span class="comment">   not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,</span>
00210 <span class="comment">   Boston, MA 02111-1307, USA.  */</span>
00211 
<a name="l00214"></a><a class="code" href="files_8c.html#a37">00214</a> <span class="keyword">static</span> <span class="keywordtype">char</span> *<a class="code" href="files_8c.html#a37">strtokWithQuotes</a>(<span class="keywordtype">char</span> *s, <span class="keywordtype">char</span> *delim)
00215         <span class="comment">/*@modifies *s @*/</span>
00216 {
00217     <span class="keyword">static</span> <span class="keywordtype">char</span> *olds = NULL;
00218     <span class="keywordtype">char</span> *token;
00219 
00220     <span class="keywordflow">if</span> (s == NULL) {
00221         s = olds;
00222     }
00223 
00224     <span class="comment">/* Skip leading delimiters */</span>
00225     s += strspn(s, delim);
00226     <span class="keywordflow">if</span> (*s == <span class="charliteral">'\0'</span>) {
00227         <span class="keywordflow">return</span> NULL;
00228     }
00229 
00230     <span class="comment">/* Find the end of the token.  */</span>
00231     token = s;
00232     <span class="keywordflow">if</span> (*token == <span class="charliteral">'"'</span>) {
00233         token++;
00234         <span class="comment">/* Find next " char */</span>
00235         s = strchr(token, <span class="charliteral">'"'</span>);
00236     } <span class="keywordflow">else</span> {
00237         s = strpbrk(token, delim);
00238     }
00239 
00240     <span class="comment">/* Terminate it */</span>
00241     <span class="keywordflow">if</span> (s == NULL) {
00242         <span class="comment">/* This token finishes the string */</span>
00243         olds = strchr(token, <span class="charliteral">'\0'</span>);
00244     } <span class="keywordflow">else</span> {
00245         <span class="comment">/* Terminate the token and make olds point past it */</span>
00246         *s = <span class="charliteral">'\0'</span>;
00247         olds = s+1;
00248     }
00249 
00250     <span class="comment">/*@-retalias -temptrans @*/</span>
00251     <span class="keywordflow">return</span> token;
00252     <span class="comment">/*@=retalias =temptrans @*/</span>
00253 }
00254 
<a name="l00257"></a><a class="code" href="files_8c.html#a38">00257</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a38">timeCheck</a>(<span class="keywordtype">int</span> tc, <a class="code" href="structheaderToken.html">Header</a> h)
00258         <span class="comment">/*@globals internalState @*/</span>
00259         <span class="comment">/*@modifies internalState @*/</span>
00260 {
00261     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
00262     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = headerFreeData;
00263     <span class="keywordtype">int</span> * mtime;
00264     <span class="keyword">const</span> <span class="keywordtype">char</span> ** files;
00265     <a class="code" href="group__header.html#a13">rpmTagType</a> fnt;
00266     <span class="keywordtype">int</span> count, x;
00267     time_t currentTime = time(NULL);
00268 
00269     x = hge(h, <a class="code" href="rpmlib_8h.html#a494a140">RPMTAG_OLDFILENAMES</a>, &amp;fnt, (<span class="keywordtype">void</span> **) &amp;files, &amp;count);
00270     x = hge(h, <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>, NULL, (<span class="keywordtype">void</span> **) &amp;mtime, NULL);
00271     
00272     <span class="keywordflow">for</span> (x = 0; x &lt; count; x++) {
00273         <span class="keywordflow">if</span> ((currentTime - mtime[x]) &gt; tc)
00274             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a3">RPMMESS_WARNING</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"TIMECHECK failure: %s\n"</span>), files[x]);
00275     }
00276     files = hfd(files, fnt);
00277 }
00278 
<a name="l00281"></a><a class="code" href="structVFA.html">00281</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structVFA.html">VFA</a> {
<a name="l00282"></a><a class="code" href="structVFA.html#m0">00282</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="structVFA.html#m0">attribute</a>;
<a name="l00283"></a><a class="code" href="structVFA.html#m1">00283</a>     <span class="keywordtype">int</span> <a class="code" href="structVFA.html#m1">flag</a>;
00284 } <a class="code" href="structVFA.html">VFA_t</a>;
00285 
00288 <span class="comment">/*@-exportlocal -exportheadervar@*/</span>
00289 <span class="comment">/*@unchecked@*/</span>
<a name="l00290"></a><a class="code" href="files_8c.html#a21">00290</a> <a class="code" href="structVFA.html">VFA_t</a> <a class="code" href="files_8c.html#a21">verifyAttrs</a>[] = {
00291     { <span class="stringliteral">"md5"</span>,    <a class="code" href="group__rpmcli.html#a46a374">RPMVERIFY_MD5</a> },
00292     { <span class="stringliteral">"size"</span>,   <a class="code" href="group__rpmcli.html#a46a375">RPMVERIFY_FILESIZE</a> },
00293     { <span class="stringliteral">"link"</span>,   <a class="code" href="group__rpmcli.html#a46a376">RPMVERIFY_LINKTO</a> },
00294     { <span class="stringliteral">"user"</span>,   <a class="code" href="group__rpmcli.html#a46a377">RPMVERIFY_USER</a> },
00295     { <span class="stringliteral">"group"</span>,  <a class="code" href="group__rpmcli.html#a46a378">RPMVERIFY_GROUP</a> },
00296     { <span class="stringliteral">"mtime"</span>,  <a class="code" href="group__rpmcli.html#a46a379">RPMVERIFY_MTIME</a> },
00297     { <span class="stringliteral">"mode"</span>,   <a class="code" href="group__rpmcli.html#a46a380">RPMVERIFY_MODE</a> },
00298     { <span class="stringliteral">"rdev"</span>,   <a class="code" href="group__rpmcli.html#a46a381">RPMVERIFY_RDEV</a> },
00299     { NULL, 0 }
00300 };
00301 <span class="comment">/*@=exportlocal =exportheadervar@*/</span>
00302 
<a name="l00306"></a><a class="code" href="files_8c.html#a39">00306</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a39">parseForVerify</a>(<span class="keywordtype">char</span> * buf, <a class="code" href="structFileList__s.html">FileList</a> fl)
00307         <span class="comment">/*@modifies buf, fl-&gt;processingFailed,</span>
00308 <span class="comment">                fl-&gt;currentVerifyFlags, fl-&gt;defVerifyFlags,</span>
00309 <span class="comment">                fl-&gt;currentSpecdFlags, fl-&gt;defSpecdFlags @*/</span>
00310 {
00311     <span class="keywordtype">char</span> *p, *pe, *q;
00312     <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
00313     <span class="keywordtype">int</span> *resultVerify;
00314     <span class="keywordtype">int</span> negated;
00315     <span class="keywordtype">int</span> verifyFlags;
00316     <a class="code" href="files_8c.html#a15">specdFlags</a> * <a class="code" href="files_8c.html#a15">specdFlags</a>;
00317 
00318     <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%verify"</span>))) != NULL) {
00319         resultVerify = &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a>);
00320         <a class="code" href="files_8c.html#a15">specdFlags</a> = &amp;fl-&gt;<a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a>;
00321     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%defverify"</span>))) != NULL) {
00322         resultVerify = &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m19">defVerifyFlags</a>);
00323         <a class="code" href="files_8c.html#a15">specdFlags</a> = &amp;fl-&gt;<a class="code" href="structFileList__s.html#m18">defSpecdFlags</a>;
00324     } <span class="keywordflow">else</span>
00325         <span class="keywordflow">return</span> 0;
00326 
00327     <span class="keywordflow">for</span> (pe = p; (pe-p) &lt; strlen(name); pe++)
00328         *pe = <span class="charliteral">' '</span>;
00329 
00330     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(pe);
00331 
00332     <span class="keywordflow">if</span> (*pe != <span class="charliteral">'('</span>) {
00333         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing '(' in %s %s\n"</span>), name, pe);
00334         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00335         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00336     }
00337 
00338     <span class="comment">/* Bracket %*verify args */</span>
00339     *pe++ = <span class="charliteral">' '</span>;
00340     <span class="keywordflow">for</span> (p = pe; *pe &amp;&amp; *pe != <span class="charliteral">')'</span>; pe++)
00341         {};
00342 
00343     <span class="keywordflow">if</span> (*pe == <span class="charliteral">'\0'</span>) {
00344         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing ')' in %s(%s\n"</span>), name, p);
00345         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00346         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00347     }
00348 
00349     <span class="comment">/* Localize. Erase parsed string */</span>
00350     q = <a class="code" href="system_8h.html#a36">alloca</a>((pe-p) + 1);
00351     strncpy(q, p, pe-p);
00352     q[pe-p] = <span class="charliteral">'\0'</span>;
00353     <span class="keywordflow">while</span> (p &lt;= pe)
00354         *p++ = <span class="charliteral">' '</span>;
00355 
00356     negated = 0;
00357     verifyFlags = <a class="code" href="group__rpmcli.html#a46a373">RPMVERIFY_NONE</a>;
00358 
00359     <span class="keywordflow">for</span> (p = q; *p != <span class="charliteral">'\0'</span>; p = pe) {
00360         <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00361         <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>)
00362             <span class="keywordflow">break</span>;
00363         pe = p;
00364         <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe);
00365         <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>)
00366             *pe++ = <span class="charliteral">'\0'</span>;
00367 
00368         {   <a class="code" href="structVFA.html">VFA_t</a> *vfa;
00369             <span class="keywordflow">for</span> (vfa = verifyAttrs; vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a> != NULL; vfa++) {
00370                 <span class="keywordflow">if</span> (strcmp(p, vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a>))
00371                     <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
00372                 verifyFlags |= vfa-&gt;<a class="code" href="structVFA.html#m1">flag</a>;
00373                 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00374             }
00375             <span class="keywordflow">if</span> (vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a>)
00376                 <span class="keywordflow">continue</span>;
00377         }
00378 
00379         <span class="keywordflow">if</span> (!strcmp(p, <span class="stringliteral">"not"</span>)) {
00380             negated ^= 1;
00381         } <span class="keywordflow">else</span> {
00382             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Invalid %s token: %s\n"</span>), name, p);
00383             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00384             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00385         }
00386     }
00387 
00388     *resultVerify = negated ? ~(verifyFlags) : verifyFlags;
00389     *<a class="code" href="files_8c.html#a15">specdFlags</a> |= <a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a>;
00390 
00391     <span class="keywordflow">return</span> 0;
00392 }
00393 
<a name="l00394"></a><a class="code" href="files_8c.html#a13">00394</a> <span class="preprocessor">#define isAttrDefault(_ars)     ((_ars)[0] == '-' &amp;&amp; (_ars)[1] == '\0')</span>
00395 <span class="preprocessor"></span>
<a name="l00400"></a><a class="code" href="files_8c.html#a40">00400</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a40">parseForDev</a>(<span class="keywordtype">char</span> * buf, <a class="code" href="structFileList__s.html">FileList</a> fl)
00401         <span class="comment">/*@modifies buf, fl-&gt;processingFailed,</span>
00402 <span class="comment">                fl-&gt;noGlob, fl-&gt;devtype, fl-&gt;devmajor, fl-&gt;devminor @*/</span>
00403 {
00404     <span class="keyword">const</span> <span class="keywordtype">char</span> * name;
00405     <span class="keyword">const</span> <span class="keywordtype">char</span> * errstr = NULL;
00406     <span class="keywordtype">char</span> *p, *pe, *q;
00407     <span class="keywordtype">int</span> rc = <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;    <span class="comment">/* assume error */</span>
00408 
00409     <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%dev"</span>))) == NULL)
00410         <span class="keywordflow">return</span> 0;
00411 
00412     <span class="keywordflow">for</span> (pe = p; (pe-p) &lt; strlen(name); pe++)
00413         *pe = <span class="charliteral">' '</span>;
00414     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(pe);
00415 
00416     <span class="keywordflow">if</span> (*pe != <span class="charliteral">'('</span>) {
00417         errstr = <span class="stringliteral">"'('"</span>;
00418         <span class="keywordflow">goto</span> exit;
00419     }
00420 
00421     <span class="comment">/* Bracket %dev args */</span>
00422     *pe++ = <span class="charliteral">' '</span>;
00423     <span class="keywordflow">for</span> (p = pe; *pe &amp;&amp; *pe != <span class="charliteral">')'</span>; pe++)
00424         {};
00425     <span class="keywordflow">if</span> (*pe != <span class="charliteral">')'</span>) {
00426         errstr = <span class="stringliteral">"')'"</span>;
00427         <span class="keywordflow">goto</span> exit;
00428     }
00429 
00430     <span class="comment">/* Localize. Erase parsed string */</span>
00431     q = <a class="code" href="system_8h.html#a36">alloca</a>((pe-p) + 1);
00432     strncpy(q, p, pe-p);
00433     q[pe-p] = <span class="charliteral">'\0'</span>;
00434     <span class="keywordflow">while</span> (p &lt;= pe)
00435         *p++ = <span class="charliteral">' '</span>;
00436 
00437     p = q; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00438     pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00439     <span class="keywordflow">if</span> (*p == <span class="charliteral">'b'</span>)
00440         fl-&gt;<a class="code" href="structFileList__s.html#m8">devtype</a> = <span class="charliteral">'b'</span>;
00441     <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*p == <span class="charliteral">'c'</span>)
00442         fl-&gt;<a class="code" href="structFileList__s.html#m8">devtype</a> = <span class="charliteral">'c'</span>;
00443     <span class="keywordflow">else</span> {
00444         errstr = <span class="stringliteral">"devtype"</span>;
00445         <span class="keywordflow">goto</span> exit;
00446     }
00447 
00448     p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00449     pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00450     <span class="keywordflow">for</span> (pe = p; *pe &amp;&amp; <a class="code" href="rpmio_8h.html#a99">xisdigit</a>(*pe); pe++)
00451         {} ;
00452     <span class="keywordflow">if</span> (*pe == <span class="charliteral">'\0'</span>) {
00453         fl-&gt;<a class="code" href="structFileList__s.html#m9">devmajor</a> = atoi(p);
00454         <span class="comment">/*@-unsignedcompare @*/</span> <span class="comment">/* LCL: ge is ok */</span>
00455         <span class="keywordflow">if</span> (!(fl-&gt;<a class="code" href="structFileList__s.html#m9">devmajor</a> &gt;= 0 &amp;&amp; fl-&gt;<a class="code" href="structFileList__s.html#m9">devmajor</a> &lt; 256)) {
00456             errstr = <span class="stringliteral">"devmajor"</span>;
00457             <span class="keywordflow">goto</span> exit;
00458         }
00459         <span class="comment">/*@=unsignedcompare @*/</span>
00460         pe++;
00461     } <span class="keywordflow">else</span> {
00462         errstr = <span class="stringliteral">"devmajor"</span>;
00463         <span class="keywordflow">goto</span> exit;
00464     }
00465 
00466     p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00467     pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00468     <span class="keywordflow">for</span> (pe = p; *pe &amp;&amp; <a class="code" href="rpmio_8h.html#a99">xisdigit</a>(*pe); pe++)
00469         {} ;
00470     <span class="keywordflow">if</span> (*pe == <span class="charliteral">'\0'</span>) {
00471         fl-&gt;<a class="code" href="structFileList__s.html#m10">devminor</a> = atoi(p);
00472         <span class="keywordflow">if</span> (!(fl-&gt;<a class="code" href="structFileList__s.html#m10">devminor</a> &gt;= 0 &amp;&amp; fl-&gt;<a class="code" href="structFileList__s.html#m10">devminor</a> &lt; 256)) {
00473             errstr = <span class="stringliteral">"devminor"</span>;
00474             <span class="keywordflow">goto</span> exit;
00475         }
00476         pe++;
00477     } <span class="keywordflow">else</span> {
00478         errstr = <span class="stringliteral">"devminor"</span>;
00479         <span class="keywordflow">goto</span> exit;
00480     }
00481 
00482     fl-&gt;<a class="code" href="structFileList__s.html#m7">noGlob</a> = 1;
00483 
00484     rc = 0;
00485 
00486 exit:
00487     <span class="keywordflow">if</span> (rc) {
00488         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing %s in %s %s\n"</span>), errstr, name, p);
00489         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00490     }
00491     <span class="keywordflow">return</span> rc;
00492 }
00493 
<a name="l00498"></a><a class="code" href="files_8c.html#a41">00498</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a41">parseForAttr</a>(<span class="keywordtype">char</span> * buf, <a class="code" href="structFileList__s.html">FileList</a> fl)
00499         <span class="comment">/*@modifies buf, fl-&gt;processingFailed,</span>
00500 <span class="comment">                fl-&gt;cur_ar, fl-&gt;def_ar,</span>
00501 <span class="comment">                fl-&gt;currentSpecdFlags, fl-&gt;defSpecdFlags @*/</span>
00502 {
00503     <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
00504     <span class="keywordtype">char</span> *p, *pe, *q;
00505     <span class="keywordtype">int</span> x;
00506     <span class="keyword">struct </span><a class="code" href="structAttrRec__s.html">AttrRec_s</a> arbuf;
00507     <a class="code" href="structAttrRec__s.html">AttrRec</a> ar = &amp;arbuf, ret_ar;
00508     <a class="code" href="files_8c.html#a15">specdFlags</a> * <a class="code" href="files_8c.html#a15">specdFlags</a>;
00509 
00510     <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%attr"</span>))) != NULL) {
00511         ret_ar = &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>);
00512         <a class="code" href="files_8c.html#a15">specdFlags</a> = &amp;fl-&gt;<a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a>;
00513     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%defattr"</span>))) != NULL) {
00514         ret_ar = &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m17">def_ar</a>);
00515         <a class="code" href="files_8c.html#a15">specdFlags</a> = &amp;fl-&gt;<a class="code" href="structFileList__s.html#m18">defSpecdFlags</a>;
00516     } <span class="keywordflow">else</span>
00517         <span class="keywordflow">return</span> 0;
00518 
00519     <span class="keywordflow">for</span> (pe = p; (pe-p) &lt; strlen(name); pe++)
00520         *pe = <span class="charliteral">' '</span>;
00521 
00522     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(pe);
00523 
00524     <span class="keywordflow">if</span> (*pe != <span class="charliteral">'('</span>) {
00525         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing '(' in %s %s\n"</span>), name, pe);
00526         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00527         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00528     }
00529 
00530     <span class="comment">/* Bracket %*attr args */</span>
00531     *pe++ = <span class="charliteral">' '</span>;
00532     <span class="keywordflow">for</span> (p = pe; *pe &amp;&amp; *pe != <span class="charliteral">')'</span>; pe++)
00533         {};
00534 
00535     <span class="keywordflow">if</span> (ret_ar == &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m17">def_ar</a>)) {      <span class="comment">/* %defattr */</span>
00536         q = pe;
00537         q++;
00538         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(q);
00539         <span class="keywordflow">if</span> (*q != <span class="charliteral">'\0'</span>) {
00540             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00541                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Non-white space follows %s(): %s\n"</span>), name, q);
00542             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00543             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00544         }
00545     }
00546 
00547     <span class="comment">/* Localize. Erase parsed string */</span>
00548     q = <a class="code" href="system_8h.html#a36">alloca</a>((pe-p) + 1);
00549     strncpy(q, p, pe-p);
00550     q[pe-p] = <span class="charliteral">'\0'</span>;
00551     <span class="keywordflow">while</span> (p &lt;= pe)
00552         *p++ = <span class="charliteral">' '</span>;
00553 
00554     <a class="code" href="files_8c.html#a34">nullAttrRec</a>(ar);
00555 
00556     p = q; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00557     <span class="keywordflow">if</span> (*p != <span class="charliteral">'\0'</span>) {
00558         pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00559         ar-&gt;ar_fmodestr = p;
00560         p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00561     }
00562     <span class="keywordflow">if</span> (*p != <span class="charliteral">'\0'</span>) {
00563         pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00564         ar-&gt;ar_user = p;
00565         p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00566     }
00567     <span class="keywordflow">if</span> (*p != <span class="charliteral">'\0'</span>) {
00568         pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00569         ar-&gt;ar_group = p;
00570         p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00571     }
00572     <span class="keywordflow">if</span> (*p != <span class="charliteral">'\0'</span> &amp;&amp; ret_ar == &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m17">def_ar</a>)) {        <span class="comment">/* %defattr */</span>
00573         pe = p; <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe); <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>) *pe++ = <span class="charliteral">'\0'</span>;
00574         ar-&gt;ar_dmodestr = p;
00575         p = pe; <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00576     }
00577 
00578     <span class="keywordflow">if</span> (!(ar-&gt;ar_fmodestr &amp;&amp; ar-&gt;ar_user &amp;&amp; ar-&gt;ar_group) || *p != <span class="charliteral">'\0'</span>) {
00579         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad syntax: %s(%s)\n"</span>), name, q);
00580         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00581         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00582     }
00583 
00584     <span class="comment">/* Do a quick test on the mode argument and adjust for "-" */</span>
00585     <span class="keywordflow">if</span> (ar-&gt;ar_fmodestr &amp;&amp; !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar-&gt;ar_fmodestr)) {
00586         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ui;
00587         x = sscanf(ar-&gt;ar_fmodestr, <span class="stringliteral">"%o"</span>, &amp;ui);
00588         <span class="keywordflow">if</span> ((x == 0) || (ar-&gt;ar_fmode &amp; ~<a class="code" href="files_8c.html#a0">MYALLPERMS</a>)) {
00589             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad mode spec: %s(%s)\n"</span>), name, q);
00590             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00591             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00592         }
00593         ar-&gt;ar_fmode = ui;
00594     } <span class="keywordflow">else</span>
00595         ar-&gt;ar_fmodestr = NULL;
00596 
00597     <span class="keywordflow">if</span> (ar-&gt;ar_dmodestr &amp;&amp; !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar-&gt;ar_dmodestr)) {
00598         <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ui;
00599         x = sscanf(ar-&gt;ar_dmodestr, <span class="stringliteral">"%o"</span>, &amp;ui);
00600         <span class="keywordflow">if</span> ((x == 0) || (ar-&gt;ar_dmode &amp; ~<a class="code" href="files_8c.html#a0">MYALLPERMS</a>)) {
00601             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad dirmode spec: %s(%s)\n"</span>), name, q);
00602             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00603             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00604         }
00605         ar-&gt;ar_dmode = ui;
00606     } <span class="keywordflow">else</span>
00607         ar-&gt;ar_dmodestr = NULL;
00608 
00609     <span class="keywordflow">if</span> (!(ar-&gt;ar_user &amp;&amp; !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar-&gt;ar_user)))
00610         ar-&gt;ar_user = NULL;
00611 
00612     <span class="keywordflow">if</span> (!(ar-&gt;ar_group &amp;&amp; !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar-&gt;ar_group)))
00613         ar-&gt;ar_group = NULL;
00614 
00615     <a class="code" href="files_8c.html#a36">dupAttrRec</a>(ar, ret_ar);
00616 
00617     <span class="comment">/* XXX fix all this */</span>
00618     *<a class="code" href="files_8c.html#a15">specdFlags</a> |= <a class="code" href="files_8c.html#a63a31">SPECD_UID</a> | <a class="code" href="files_8c.html#a63a32">SPECD_GID</a> | <a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a> | <a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a>;
00619     
00620     <span class="keywordflow">return</span> 0;
00621 }
00622 
<a name="l00626"></a><a class="code" href="files_8c.html#a42">00626</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a42">parseForConfig</a>(<span class="keywordtype">char</span> * buf, <a class="code" href="structFileList__s.html">FileList</a> fl)
00627         <span class="comment">/*@modifies buf, fl-&gt;processingFailed,</span>
00628 <span class="comment">                fl-&gt;currentFlags @*/</span>
00629 {
00630     <span class="keywordtype">char</span> *p, *pe, *q;
00631     <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
00632 
00633     <span class="keywordflow">if</span> ((p = strstr(buf, (name = <span class="stringliteral">"%config"</span>))) == NULL)
00634         <span class="keywordflow">return</span> 0;
00635 
00636     fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> = <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>;
00637 
00638     <span class="keywordflow">for</span> (pe = p; (pe-p) &lt; strlen(name); pe++)
00639         *pe = <span class="charliteral">' '</span>;
00640     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(pe);
00641     <span class="keywordflow">if</span> (*pe != <span class="charliteral">'('</span>)
00642         <span class="keywordflow">return</span> 0;
00643 
00644     <span class="comment">/* Bracket %config args */</span>
00645     *pe++ = <span class="charliteral">' '</span>;
00646     <span class="keywordflow">for</span> (p = pe; *pe &amp;&amp; *pe != <span class="charliteral">')'</span>; pe++)
00647         {};
00648 
00649     <span class="keywordflow">if</span> (*pe == <span class="charliteral">'\0'</span>) {
00650         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing ')' in %s(%s\n"</span>), name, p);
00651         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00652         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00653     }
00654 
00655     <span class="comment">/* Localize. Erase parsed string */</span>
00656     q = <a class="code" href="system_8h.html#a36">alloca</a>((pe-p) + 1);
00657     strncpy(q, p, pe-p);
00658     q[pe-p] = <span class="charliteral">'\0'</span>;
00659     <span class="keywordflow">while</span> (p &lt;= pe)
00660         *p++ = <span class="charliteral">' '</span>;
00661 
00662     <span class="keywordflow">for</span> (p = q; *p != <span class="charliteral">'\0'</span>; p = pe) {
00663         <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00664         <span class="keywordflow">if</span> (*p == <span class="charliteral">'\0'</span>)
00665             <span class="keywordflow">break</span>;
00666         pe = p;
00667         <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe);
00668         <span class="keywordflow">if</span> (*pe != <span class="charliteral">'\0'</span>)
00669             *pe++ = <span class="charliteral">'\0'</span>;
00670         <span class="keywordflow">if</span> (!strcmp(p, <span class="stringliteral">"missingok"</span>)) {
00671             fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> |= <a class="code" href="rpmlib_8h.html#a496a246">RPMFILE_MISSINGOK</a>;
00672         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(p, <span class="stringliteral">"noreplace"</span>)) {
00673             fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> |= <a class="code" href="rpmlib_8h.html#a496a247">RPMFILE_NOREPLACE</a>;
00674         } <span class="keywordflow">else</span> {
00675             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Invalid %s token: %s\n"</span>), name, p);
00676             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00677             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00678         }
00679     }
00680 
00681     <span class="keywordflow">return</span> 0;
00682 }
00683 
<a name="l00686"></a><a class="code" href="files_8c.html#a43">00686</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a43">langCmp</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * ap, <span class="keyword">const</span> <span class="keywordtype">void</span> * bp)    <span class="comment">/*@*/</span>
00687 {
00688     <span class="keywordflow">return</span> strcmp(*(<span class="keyword">const</span> <span class="keywordtype">char</span> **)ap, *(<span class="keyword">const</span> <span class="keywordtype">char</span> **)bp);
00689 }
00690 
<a name="l00694"></a><a class="code" href="files_8c.html#a44">00694</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a44">parseForLang</a>(<span class="keywordtype">char</span> * buf, <a class="code" href="structFileList__s.html">FileList</a> fl)
00695         <span class="comment">/*@modifies buf, fl-&gt;processingFailed,</span>
00696 <span class="comment">                fl-&gt;currentLangs, fl-&gt;nLangs @*/</span>
00697 {
00698     <span class="keywordtype">char</span> *p, *pe, *q;
00699     <span class="keyword">const</span> <span class="keywordtype">char</span> *name;
00700 
00701   <span class="keywordflow">while</span> ((p = strstr(buf, (name = <span class="stringliteral">"%lang"</span>))) != NULL) {
00702 
00703     <span class="keywordflow">for</span> (pe = p; (pe-p) &lt; strlen(name); pe++)
00704         *pe = <span class="charliteral">' '</span>;
00705     <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(pe);
00706 
00707     <span class="keywordflow">if</span> (*pe != <span class="charliteral">'('</span>) {
00708         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing '(' in %s %s\n"</span>), name, pe);
00709         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00710         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00711     }
00712 
00713     <span class="comment">/* Bracket %lang args */</span>
00714     *pe++ = <span class="charliteral">' '</span>;
00715     <span class="keywordflow">for</span> (pe = p; *pe &amp;&amp; *pe != <span class="charliteral">')'</span>; pe++)
00716         {};
00717 
00718     <span class="keywordflow">if</span> (*pe == <span class="charliteral">'\0'</span>) {
00719         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Missing ')' in %s(%s\n"</span>), name, p);
00720         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00721         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00722     }
00723 
00724     <span class="comment">/* Localize. Erase parsed string */</span>
00725     q = <a class="code" href="system_8h.html#a36">alloca</a>((pe-p) + 1);
00726     strncpy(q, p, pe-p);
00727     q[pe-p] = <span class="charliteral">'\0'</span>;
00728     <span class="keywordflow">while</span> (p &lt;= pe)
00729         *p++ = <span class="charliteral">' '</span>;
00730 
00731     <span class="comment">/* Parse multiple arguments from %lang */</span>
00732     <span class="keywordflow">for</span> (p = q; *p != <span class="charliteral">'\0'</span>; p = pe) {
00733         <span class="keywordtype">char</span> *newp;
00734         size_t np;
00735         <span class="keywordtype">int</span> i;
00736 
00737         <a class="code" href="files_8c.html#a1">SKIPWHITE</a>(p);
00738         pe = p;
00739         <a class="code" href="files_8c.html#a2">SKIPNONWHITE</a>(pe);
00740 
00741         np = pe - p;
00742         
00743         <span class="comment">/* Sanity check on locale lengths */</span>
00744         <span class="keywordflow">if</span> (np &lt; 1 || (np == 1 &amp;&amp; *p != 'C') || np &gt;= 32) {
00745             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00746                 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Unusual locale length: \"%.*s\" in %%lang(%s)\n"</span>),
00747                 (<span class="keywordtype">int</span>)np, p, q);
00748             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00749             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00750         }
00751 
00752         <span class="comment">/* Check for duplicate locales */</span>
00753         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a> != NULL)
00754         <span class="keywordflow">for</span> (i = 0; i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++) {
00755             <span class="keywordflow">if</span> (strncmp(fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i], p, np))
00756                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
00757             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Duplicate locale %.*s in %%lang(%s)\n"</span>),
00758                 (<span class="keywordtype">int</span>)np, p, q);
00759             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00760             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
00761         }
00762 
00763         <span class="comment">/* Add new locale */</span>
00764         fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>,
00765                                 (fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a> + 1) * <span class="keyword">sizeof</span>(*fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>));
00766         newp = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>( np+1 );
00767         strncpy(newp, p, np);
00768         newp[np] = <span class="charliteral">'\0'</span>;
00769         fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>[fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a>++] = newp;
00770         <span class="keywordflow">if</span> (*pe == <span class="charliteral">','</span>) pe++;   <span class="comment">/* skip , if present */</span>
00771     }
00772   }
00773 
00774     <span class="comment">/* Insure that locales are sorted. */</span>
00775     <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>)
00776         qsort(fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>, fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a>, <span class="keyword">sizeof</span>(*fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>), <a class="code" href="files_8c.html#a43">langCmp</a>);
00777 
00778     <span class="keywordflow">return</span> 0;
00779 }
00780 
<a name="l00783"></a><a class="code" href="files_8c.html#a45">00783</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a45">parseForRegexLang</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * fileName, <span class="comment">/*@out@*/</span> <span class="keywordtype">char</span> ** lang)
00784         <span class="comment">/*@globals rpmGlobalMacroContext @*/</span>
00785         <span class="comment">/*@modifies *lang, rpmGlobalMacroContext @*/</span>
00786 {
00787     <span class="keyword">static</span> <span class="keywordtype">int</span> initialized = 0;
00788     <span class="keyword">static</span> <span class="keywordtype">int</span> hasRegex = 0;
00789     <span class="keyword">static</span> regex_t compiledPatt;
00790     <span class="keyword">static</span> <span class="keywordtype">char</span> buf[BUFSIZ];
00791     <span class="keywordtype">int</span> x;
00792     regmatch_t matches[2];
00793     <span class="keyword">const</span> <span class="keywordtype">char</span> *s;
00794 
00795     <span class="keywordflow">if</span> (! initialized) {
00796         <span class="keyword">const</span> <span class="keywordtype">char</span> *patt = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_langpatt}"</span>, NULL);
00797         <span class="keywordtype">int</span> rc = 0;
00798         <span class="keywordflow">if</span> (!(patt &amp;&amp; *patt != <span class="charliteral">'%'</span>))
00799             rc = 1;
00800         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (regcomp(&amp;compiledPatt, patt, REG_EXTENDED))
00801             rc = -1;
00802         patt = <a class="code" href="poptint_8h.html#a14">_free</a>(patt);
00803         <span class="keywordflow">if</span> (rc)
00804             <span class="keywordflow">return</span> rc;
00805         hasRegex = 1;
00806         initialized = 1;
00807     }
00808     
00809     memset(matches, 0, <span class="keyword">sizeof</span>(matches));
00810     <span class="keywordflow">if</span> (! hasRegex || regexec(&amp;compiledPatt, fileName, 2, matches, REG_NOTEOL))
00811         <span class="keywordflow">return</span> 1;
00812 
00813     <span class="comment">/* Got match */</span>
00814     s = fileName + matches[1].rm_eo - 1;
00815     x = matches[1].rm_eo - matches[1].rm_so;
00816     buf[x] = <span class="charliteral">'\0'</span>;
00817     <span class="keywordflow">while</span> (x) {
00818         buf[--x] = *s--;
00819     }
00820     <span class="keywordflow">if</span> (lang)
00821         *lang = buf;
00822     <span class="keywordflow">return</span> 0;
00823 }
00824 
<a name="l00827"></a><a class="code" href="files_8c.html#a46">00827</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a46">parseForRegexMultiLib</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *fileName)
00828         <span class="comment">/*@globals rpmGlobalMacroContext @*/</span>
00829         <span class="comment">/*@modifies rpmGlobalMacroContext @*/</span>
00830 {
00831     <span class="keyword">static</span> <span class="keywordtype">int</span> initialized = 0;
00832     <span class="keyword">static</span> <span class="keywordtype">int</span> hasRegex = 0;
00833     <span class="keyword">static</span> regex_t compiledPatt;
00834 
00835     <span class="keywordflow">if</span> (! initialized) {
00836         <span class="keyword">const</span> <span class="keywordtype">char</span> *patt;
00837         <span class="keywordtype">int</span> rc = 0;
00838 
00839         initialized = 1;
00840         patt = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_multilibpatt}"</span>, NULL);
00841         <span class="keywordflow">if</span> (!(patt &amp;&amp; *patt != <span class="charliteral">'%'</span>))
00842             rc = 1;
00843         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (regcomp(&amp;compiledPatt, patt, REG_EXTENDED | REG_NOSUB))
00844             rc = -1;
00845         patt = <a class="code" href="poptint_8h.html#a14">_free</a>(patt);
00846         <span class="keywordflow">if</span> (rc)
00847             <span class="keywordflow">return</span> rc;
00848         hasRegex = 1;
00849     }
00850 
00851     <span class="keywordflow">if</span> (! hasRegex || regexec(&amp;compiledPatt, fileName, 0, NULL, 0))
00852         <span class="keywordflow">return</span> 1;
00853 
00854     <span class="keywordflow">return</span> 0;
00855 }
00856 
00859 <span class="comment">/*@-exportlocal -exportheadervar@*/</span>
00860 <span class="comment">/*@unchecked@*/</span>
<a name="l00861"></a><a class="code" href="files_8c.html#a22">00861</a> <a class="code" href="structVFA.html">VFA_t</a> <a class="code" href="files_8c.html#a22">virtualFileAttributes</a>[] = {
00862         { <span class="stringliteral">"%dir"</span>,       0 },    <span class="comment">/* XXX why not RPMFILE_DIR? */</span>
00863         { <span class="stringliteral">"%doc"</span>,       <a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a> },
00864         { <span class="stringliteral">"%ghost"</span>,     <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a> },
00865         { <span class="stringliteral">"%exclude"</span>,   <a class="code" href="rpmlib_8h.html#a496a252">RPMFILE_EXCLUDE</a> },
00866         { <span class="stringliteral">"%readme"</span>,    <a class="code" href="rpmlib_8h.html#a496a251">RPMFILE_README</a> },
00867         { <span class="stringliteral">"%license"</span>,   <a class="code" href="rpmlib_8h.html#a496a250">RPMFILE_LICENSE</a> },
00868         { <span class="stringliteral">"%multilib"</span>,  0 },
00869 
00870 <span class="preprocessor">#if WHY_NOT</span>
00871 <span class="preprocessor"></span>        { <span class="stringliteral">"%spec"</span>,      RPMFILE_SPEC },
00872         { <span class="stringliteral">"%config"</span>,    <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a> },
00873         { <span class="stringliteral">"%donotuse"</span>,  <a class="code" href="rpmlib_8h.html#a496a245">RPMFILE_DONOTUSE</a> },     <span class="comment">/* XXX WTFO? */</span>
00874         { <span class="stringliteral">"%missingok"</span>, <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>|<a class="code" href="rpmlib_8h.html#a496a246">RPMFILE_MISSINGOK</a> },
00875         { <span class="stringliteral">"%noreplace"</span>, <a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>|<a class="code" href="rpmlib_8h.html#a496a247">RPMFILE_NOREPLACE</a> },
00876 <span class="preprocessor">#endif</span>
00877 <span class="preprocessor"></span>
00878         { NULL, 0 }
00879 };
00880 <span class="comment">/*@=exportlocal =exportheadervar@*/</span>
00881 
<a name="l00885"></a><a class="code" href="files_8c.html#a47">00885</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a47">parseForSimple</a>(<span class="comment">/*@unused@*/</span><a class="code" href="structSpecStruct.html">Spec</a> spec, <a class="code" href="structPackageStruct.html">Package</a> pkg, <span class="keywordtype">char</span> * buf,
00886                           <a class="code" href="structFileList__s.html">FileList</a> fl, <span class="comment">/*@out@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** fileName)
00887         <span class="comment">/*@globals rpmGlobalMacroContext @*/</span>
00888         <span class="comment">/*@modifies buf, fl-&gt;processingFailed, *fileName,</span>
00889 <span class="comment">                fl-&gt;currentFlags,</span>
00890 <span class="comment">                fl-&gt;docDirs, fl-&gt;docDirCount, fl-&gt;isDir,</span>
00891 <span class="comment">                fl-&gt;passedSpecialDoc, fl-&gt;isSpecialDoc,</span>
00892 <span class="comment">                pkg-&gt;specialDoc, rpmGlobalMacroContext @*/</span>
00893 {
00894     <span class="keywordtype">char</span> *s, *t;
00895     <span class="keywordtype">int</span> res, specialDoc = 0;
00896     <span class="keywordtype">char</span> specialDocBuf[BUFSIZ];
00897 
00898     specialDocBuf[0] = <span class="charliteral">'\0'</span>;
00899     *fileName = NULL;
00900     res = 0;
00901 
00902     t = buf;
00903     <span class="keywordflow">while</span> ((s = <a class="code" href="files_8c.html#a37">strtokWithQuotes</a>(t, <span class="stringliteral">" \t\n"</span>)) != NULL) {
00904         t = NULL;
00905         <span class="keywordflow">if</span> (!strcmp(s, <span class="stringliteral">"%docdir"</span>)) {
00906             s = <a class="code" href="files_8c.html#a37">strtokWithQuotes</a>(NULL, <span class="stringliteral">" \t\n"</span>);
00907             <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m23">docDirCount</a> == <a class="code" href="files_8c.html#a3">MAXDOCDIR</a>) {
00908                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a14">RPMERR_INTERNAL</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Hit limit for %%docdir\n"</span>));
00909                 fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00910                 res = 1;
00911             }
00912             fl-&gt;<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl-&gt;<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(s);
00913             <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a37">strtokWithQuotes</a>(NULL, <span class="stringliteral">" \t\n"</span>)) {
00914                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a14">RPMERR_INTERNAL</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Only one arg for %%docdir\n"</span>));
00915                 fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00916                 res = 1;
00917             }
00918             <span class="keywordflow">break</span>;
00919         }
00920 
00921     <span class="comment">/* Set flags for virtual file attributes */</span>
00922     {   <a class="code" href="structVFA.html">VFA_t</a> *vfa;
00923         <span class="keywordflow">for</span> (vfa = virtualFileAttributes; vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a> != NULL; vfa++) {
00924             <span class="keywordflow">if</span> (strcmp(s, vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a>))
00925                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
00926             <span class="keywordflow">if</span> (!vfa-&gt;<a class="code" href="structVFA.html#m1">flag</a>) {
00927                 <span class="keywordflow">if</span> (!strcmp(s, <span class="stringliteral">"%dir"</span>))
00928                     fl-&gt;<a class="code" href="structFileList__s.html#m11">isDir</a> = 1;      <span class="comment">/* XXX why not RPMFILE_DIR? */</span>
00929                 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!strcmp(s, <span class="stringliteral">"%multilib"</span>))
00930                     fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> |= <a class="code" href="files_8c.html#a18">multiLib</a>;
00931             } <span class="keywordflow">else</span>
00932                 fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> |= vfa-&gt;<a class="code" href="structVFA.html#m1">flag</a>;
00933             <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>;
00934         }
00935         <span class="comment">/* if we got an attribute, continue with next token */</span>
00936         <span class="keywordflow">if</span> (vfa-&gt;<a class="code" href="structVFA.html#m0">attribute</a> != NULL)
00937             <span class="keywordflow">continue</span>;
00938     }
00939 
00940         <span class="keywordflow">if</span> (*fileName) {
00941             <span class="comment">/* We already got a file -- error */</span>
00942             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Two files on one line: %s\n"</span>),
00943                 *fileName);
00944             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00945             res = 1;
00946         }
00947 
00948         <span class="comment">/*@-branchstate@*/</span>
00949         <span class="keywordflow">if</span> (*s != <span class="charliteral">'/'</span>) {
00950             <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a>) {
00951                 specialDoc = 1;
00952                 strcat(specialDocBuf, <span class="stringliteral">" "</span>);
00953                 strcat(specialDocBuf, s);
00954             } <span class="keywordflow">else</span> {
00955                 <span class="comment">/* not in %doc, does not begin with / -- error */</span>
00956                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00957                     <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File must begin with \"/\": %s\n"</span>), s);
00958                 fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00959                 res = 1;
00960             }
00961         } <span class="keywordflow">else</span> {
00962             *fileName = s;
00963         }
00964         <span class="comment">/*@=branchstate@*/</span>
00965     }
00966 
00967     <span class="keywordflow">if</span> (specialDoc) {
00968         <span class="keywordflow">if</span> (*fileName || (fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a> &amp; ~(RPMFILE_DOC))) {
00969             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
00970                      <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Can't mix special %%doc with other forms: %s\n"</span>),
00971                      (*fileName ? *fileName : <span class="stringliteral">""</span>));
00972             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
00973             res = 1;
00974         } <span class="keywordflow">else</span> {
00975         <span class="comment">/* XXX WATCHOUT: buf is an arg */</span>
00976             {   <span class="keyword">const</span> <span class="keywordtype">char</span> *ddir, *n, *v;
00977 
00978                 (void) <a class="code" href="group__header.html#a88">headerNVR</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, &amp;n, &amp;v, NULL);
00979 
00980                 ddir = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_docdir}/"</span>, n, <span class="stringliteral">"-"</span>, v, NULL);
00981                 strcpy(buf, ddir);
00982                 ddir = <a class="code" href="poptint_8h.html#a14">_free</a>(ddir);
00983             }
00984 
00985         <span class="comment">/* XXX FIXME: this is easy to do as macro expansion */</span>
00986 
00987             <span class="keywordflow">if</span> (! fl-&gt;<a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a>) {
00988                 pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a> = <a class="code" href="stringbuf_8c.html#a3">newStringBuf</a>();
00989                 <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <span class="stringliteral">"DOCDIR=$RPM_BUILD_ROOT"</span>);
00990                 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, buf);
00991                 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <span class="stringliteral">"export DOCDIR"</span>);
00992                 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <span class="stringliteral">"rm -rf $DOCDIR"</span>);
00993                 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <a class="code" href="config_8h.html#a15">MKDIR_P</a> <span class="stringliteral">" $DOCDIR"</span>);
00994 
00995                 <span class="comment">/*@-temptrans@*/</span>
00996                 *fileName = buf;
00997                 <span class="comment">/*@=temptrans@*/</span>
00998                 fl-&gt;<a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a> = 1;
00999                 fl-&gt;<a class="code" href="structFileList__s.html#m6">isSpecialDoc</a> = 1;
01000             }
01001 
01002             <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <span class="stringliteral">"cp -pr "</span>);
01003             <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, specialDocBuf);
01004             <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, <span class="stringliteral">" $DOCDIR"</span>);
01005         }
01006     }
01007 
01008     <span class="keywordflow">return</span> res;
01009 }
01010 
<a name="l01013"></a><a class="code" href="files_8c.html#a48">01013</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a48">compareFileListRecs</a>(<span class="keyword">const</span> <span class="keywordtype">void</span> * ap, <span class="keyword">const</span> <span class="keywordtype">void</span> * bp)        <span class="comment">/*@*/</span>
01014 {
01015     <span class="keyword">const</span> <span class="keywordtype">char</span> *a = ((FileListRec)ap)-&gt;fileURL;
01016     <span class="keyword">const</span> <span class="keywordtype">char</span> *b = ((FileListRec)bp)-&gt;fileURL;
01017     <span class="keywordflow">return</span> strcmp(a, b);
01018 }
01019 
<a name="l01023"></a><a class="code" href="files_8c.html#a49">01023</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a49">isDoc</a>(<a class="code" href="structFileList__s.html">FileList</a> fl, <span class="keyword">const</span> <span class="keywordtype">char</span> * fileName)    <span class="comment">/*@*/</span>
01024 {
01025     <span class="keywordtype">int</span> x = fl-&gt;<a class="code" href="structFileList__s.html#m23">docDirCount</a>;
01026 
01027     <span class="keywordflow">while</span> (x--) {
01028         <span class="keywordflow">if</span> (strstr(fileName, fl-&gt;<a class="code" href="structFileList__s.html#m22">docDirs</a>[x]) == fileName)
01029             <span class="keywordflow">return</span> 1;
01030     }
01031     <span class="keywordflow">return</span> 0;
01032 }
01033 
<a name="l01041"></a><a class="code" href="files_8c.html#a50">01041</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a50">checkHardLinks</a>(<a class="code" href="structFileList__s.html">FileList</a> fl)
01042         <span class="comment">/*@*/</span>
01043 {
01044     <a class="code" href="structFileListRec__s.html">FileListRec</a> ilp, jlp;
01045     <span class="keywordtype">int</span> i, j;
01046 
01047     <span class="keywordflow">for</span> (i = 0;  i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; i++) {
01048 
01049         ilp = fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a> + i;
01050 
01051         <span class="comment">/* Is this a hard link? */</span>
01052         <span class="keywordflow">if</span> (!(S_ISREG(ilp-&gt;fl_mode) &amp;&amp; ilp-&gt;fl_nlink &gt; 1))
01053             <span class="keywordflow">continue</span>;
01054 
01055         <span class="comment">/* Find all members of hardlink set. */</span>
01056         <span class="keywordflow">for</span> (j = i + 1; j &lt; fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; j++) {
01057             jlp = fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a> + j;
01058 
01059             <span class="comment">/* Member of same hardlink set? */</span>
01060             <span class="keywordflow">if</span> (!S_ISREG(jlp-&gt;fl_mode))
01061                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
01062             <span class="keywordflow">if</span> (ilp-&gt;fl_nlink != jlp-&gt;fl_nlink)
01063                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
01064             <span class="keywordflow">if</span> (ilp-&gt;fl_ino != jlp-&gt;fl_ino)
01065                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
01066             <span class="keywordflow">if</span> (ilp-&gt;fl_dev != jlp-&gt;fl_dev)
01067                 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>;
01068 
01069             <span class="comment">/* Identical locale coloring? */</span>
01070             <span class="keywordflow">if</span> (!strcmp(ilp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a>, jlp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a>))
01071                 <span class="keywordflow">continue</span>;
01072             <span class="keywordflow">return</span> 1;
01073         }
01074     }
01075     <span class="keywordflow">return</span> 0;
01076 }
01077 
<a name="l01083"></a><a class="code" href="files_8c.html#a51">01083</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a51">genCpioListAndHeader</a>(<span class="comment">/*@partial@*/</span> <a class="code" href="structFileList__s.html">FileList</a> fl,
01084                 <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> * cpioList, <a class="code" href="structheaderToken.html">Header</a> h, <span class="keywordtype">int</span> isSrc)
01085         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01086 <span class="comment">                fileSystem @*/</span>
01087         <span class="comment">/*@modifies h, *cpioList, fl-&gt;processingFailed, fl-&gt;fileList,</span>
01088 <span class="comment">                rpmGlobalMacroContext, fileSystem @*/</span>
01089 {
01090     <span class="keywordtype">int</span> _addDotSlash = !(isSrc || <a class="code" href="macro_8c.html#a51">rpmExpandNumeric</a>(<span class="stringliteral">"%{_noPayloadPrefix}"</span>));
01091     <a class="code" href="header_8h.html#a12">uint_32</a> multiLibMask = 0;
01092     <span class="keywordtype">int</span> apathlen = 0;
01093     <span class="keywordtype">int</span> dpathlen = 0;
01094     <span class="keywordtype">int</span> skipLen = 0;
01095     <a class="code" href="structFileListRec__s.html">FileListRec</a> flp;
01096     <span class="keywordtype">char</span> buf[BUFSIZ];
01097     <span class="keywordtype">int</span> i;
01098     
01099     <span class="comment">/* Sort the big list */</span>
01100     qsort(fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>, fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>,
01101           <span class="keyword">sizeof</span>(*(fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>)), <a class="code" href="files_8c.html#a48">compareFileListRecs</a>);
01102     
01103     <span class="comment">/* Generate the header. */</span>
01104     <span class="keywordflow">if</span> (! isSrc) {
01105         skipLen = 1;
01106         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m1">prefix</a>)
01107             skipLen += strlen(fl-&gt;<a class="code" href="structFileList__s.html#m1">prefix</a>);
01108     }
01109 
01110     <span class="keywordflow">for</span> (i = 0, flp = fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>; i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; i++, flp++) {
01111         <span class="keywordtype">char</span> *s;
01112 
01113         <span class="comment">/* Merge duplicate entries. */</span>
01114         <span class="keywordflow">while</span> (i &lt; (fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> - 1) &amp;&amp;
01115             !strcmp(flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>, flp[1].<a class="code" href="structFileListRec__s.html#m2">fileURL</a>)) {
01116 
01117             <span class="comment">/* Two entries for the same file found, merge the entries. */</span>
01118             <span class="comment">/* Note that an %exclude is a duplication of a file reference */</span>
01119 
01120             <span class="comment">/* file flags */</span>
01121             flp[1].<a class="code" href="structFileListRec__s.html#m5">flags</a> |= flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a>; 
01122 
01123             <span class="keywordflow">if</span> (!(flp[1].<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a252">RPMFILE_EXCLUDE</a>))
01124                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a3">RPMMESS_WARNING</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File listed twice: %s\n"</span>),
01125                         flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>);
01126    
01127             <span class="comment">/* file mode */</span>
01128             <span class="keywordflow">if</span> (S_ISDIR(flp-&gt;fl_mode)) {
01129                 <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a> | <a class="code" href="files_8c.html#a63a25">SPECD_DEFDIRMODE</a>)) &lt;
01130                     (flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a> | <a class="code" href="files_8c.html#a63a25">SPECD_DEFDIRMODE</a>)))
01131                         flp[1].fl_mode = flp-&gt;fl_mode;
01132             } <span class="keywordflow">else</span> {
01133                 <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a> | <a class="code" href="files_8c.html#a63a24">SPECD_DEFFILEMODE</a>)) &lt;
01134                     (flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a> | <a class="code" href="files_8c.html#a63a24">SPECD_DEFFILEMODE</a>)))
01135                         flp[1].fl_mode = flp-&gt;fl_mode;
01136             }
01137 
01138             <span class="comment">/* uid */</span>
01139             <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a31">SPECD_UID</a> | <a class="code" href="files_8c.html#a63a26">SPECD_DEFUID</a>)) &lt;
01140                 (flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a31">SPECD_UID</a> | <a class="code" href="files_8c.html#a63a26">SPECD_DEFUID</a>)))
01141             {
01142                 flp[1].fl_uid = flp-&gt;fl_uid;
01143                 flp[1].<a class="code" href="structFileListRec__s.html#m3">uname</a> = flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a>;
01144             }
01145 
01146             <span class="comment">/* gid */</span>
01147             <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a32">SPECD_GID</a> | <a class="code" href="files_8c.html#a63a27">SPECD_DEFGID</a>)) &lt;
01148                 (flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a32">SPECD_GID</a> | <a class="code" href="files_8c.html#a63a27">SPECD_DEFGID</a>)))
01149             {
01150                 flp[1].fl_gid = flp-&gt;fl_gid;
01151                 flp[1].<a class="code" href="structFileListRec__s.html#m4">gname</a> = flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a>;
01152             }
01153 
01154             <span class="comment">/* verify flags */</span>
01155             <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a> | <a class="code" href="files_8c.html#a63a28">SPECD_DEFVERIFY</a>)) &lt;
01156                 (flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> &amp; (<a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a> | <a class="code" href="files_8c.html#a63a28">SPECD_DEFVERIFY</a>)))
01157                     flp[1].<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> = flp-&gt;<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a>;
01158 
01159             <span class="comment">/* XXX to-do: language */</span>
01160 
01161             flp++; i++;
01162         }
01163 
01164         <span class="comment">/* Skip files that were marked with %exclude. */</span>
01165         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a252">RPMFILE_EXCLUDE</a>) <span class="keywordflow">continue</span>;
01166 
01167         <span class="comment">/* Omit '/' and/or URL prefix, leave room for "./" prefix */</span>
01168         apathlen += (strlen(flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>) - skipLen + (_addDotSlash ? 3 : 1));
01169 
01170         <span class="comment">/* Leave room for both dirname and basename NUL's */</span>
01171         dpathlen += (strlen(flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a>) + 2);
01172 
01173         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>)
01174             multiLibMask |=
01175                 (1u &lt;&lt; ((flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>))
01176                       &gt;&gt; <a class="code" href="rpmlib_8h.html#a11">RPMFILE_MULTILIB_SHIFT</a>);
01177 
01178         <span class="comment">/*</span>
01179 <span class="comment">         * Make the header, the OLDFILENAMES will get converted to a </span>
01180 <span class="comment">         * compressed file list write before we write the actual package to</span>
01181 <span class="comment">         * disk.</span>
01182 <span class="comment">         */</span>
01183         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a140">RPMTAG_OLDFILENAMES</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01184                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>), 1);
01185 
01186 <span class="comment">/*@-sizeoftype@*/</span>
01187       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_size) != <span class="keyword">sizeof</span>(uint_32)) {
01188         <a class="code" href="header_8h.html#a12">uint_32</a> psize = (uint_32)flp-&gt;fl_size;
01189         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01190                                &amp;(psize), 1);
01191       } <span class="keywordflow">else</span> {
01192         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a141">RPMTAG_FILESIZES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01193                                &amp;(flp-&gt;fl_size), 1);
01194       }
01195         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a152">RPMTAG_FILEUSERNAME</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01196                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a>), 1);
01197         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a153">RPMTAG_FILEGROUPNAME</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01198                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a>), 1);
01199       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_mtime) != <span class="keyword">sizeof</span>(uint_32)) {
01200         <a class="code" href="header_8h.html#a12">uint_32</a> mtime = (uint_32)flp-&gt;fl_mtime;
01201         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01202                                &amp;(mtime), 1);
01203       } <span class="keywordflow">else</span> {
01204         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01205                                &amp;(flp-&gt;fl_mtime), 1);
01206       }
01207       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_mode) != <span class="keyword">sizeof</span>(uint_16)) {
01208         <a class="code" href="header_8h.html#a13">uint_16</a> pmode = (uint_16)flp-&gt;fl_mode;
01209         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>,
01210                                &amp;(pmode), 1);
01211       } <span class="keywordflow">else</span> {
01212         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a143">RPMTAG_FILEMODES</a>, <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>,
01213                                &amp;(flp-&gt;fl_mode), 1);
01214       }
01215       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_rdev) != <span class="keyword">sizeof</span>(uint_16)) {
01216         <a class="code" href="header_8h.html#a13">uint_16</a> prdev = (uint_16)flp-&gt;fl_rdev;
01217         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a146">RPMTAG_FILERDEVS</a>, <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>,
01218                                &amp;(prdev), 1);
01219       } <span class="keywordflow">else</span> {
01220         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a146">RPMTAG_FILERDEVS</a>, <a class="code" href="group__header.html#a93a69">RPM_INT16_TYPE</a>,
01221                                &amp;(flp-&gt;fl_rdev), 1);
01222       }
01223       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_dev) != <span class="keyword">sizeof</span>(uint_32)) {
01224         <a class="code" href="header_8h.html#a12">uint_32</a> pdevice = (uint_32)flp-&gt;fl_dev;
01225         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a199">RPMTAG_FILEDEVICES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01226                                &amp;(pdevice), 1);
01227       } <span class="keywordflow">else</span> {
01228         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a199">RPMTAG_FILEDEVICES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01229                                &amp;(flp-&gt;fl_dev), 1);
01230       }
01231       <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp-&gt;fl_ino) != <span class="keyword">sizeof</span>(uint_32)) {
01232         <a class="code" href="header_8h.html#a12">uint_32</a> ino = (uint_32)flp-&gt;fl_ino;
01233         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a200">RPMTAG_FILEINODES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01234                                 &amp;(ino), 1);
01235       } <span class="keywordflow">else</span> {
01236         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a200">RPMTAG_FILEINODES</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01237                                 &amp;(flp-&gt;fl_ino), 1);
01238       }
01239 <span class="comment">/*@=sizeoftype@*/</span>
01240 
01241         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a201">RPMTAG_FILELANGS</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01242                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a>),  1);
01243         
01244         <span class="comment">/* We used to add these, but they should not be needed */</span>
01245         <span class="comment">/* (void) headerAddOrAppendEntry(h, RPMTAG_FILEUIDS,</span>
01246 <span class="comment">         *                 RPM_INT32_TYPE, &amp;(flp-&gt;fl_uid), 1);</span>
01247 <span class="comment">         * (void) headerAddOrAppendEntry(h, RPMTAG_FILEGIDS,</span>
01248 <span class="comment">         *                 RPM_INT32_TYPE, &amp;(flp-&gt;fl_gid), 1);</span>
01249 <span class="comment">         */</span>
01250         
01251         buf[0] = <span class="charliteral">'\0'</span>;
01252         <span class="keywordflow">if</span> (S_ISREG(flp-&gt;fl_mode))
01253             (void) <a class="code" href="lib_2misc_8c.html#a22">domd5</a>(flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a>, buf, 1);
01254         s = buf;
01255         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a148">RPMTAG_FILEMD5S</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01256                                &amp;s, 1);
01257         
01258         buf[0] = <span class="charliteral">'\0'</span>;
01259         <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a22">S_ISLNK</a>(flp-&gt;fl_mode)) {
01260             buf[<a class="code" href="rpmrpc_8c.html#a47">Readlink</a>(flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a>, buf, BUFSIZ)] = <span class="charliteral">'\0'</span>;
01261             <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>) {
01262                 <span class="keyword">const</span> <span class="keywordtype">char</span> * buildRoot;
01263                 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>, &amp;buildRoot);
01264 
01265                 <span class="keywordflow">if</span> (buf[0] == <span class="charliteral">'/'</span> &amp;&amp; strcmp(buildRoot, <span class="stringliteral">"/"</span>) &amp;&amp;
01266                     !strncmp(buf, buildRoot, strlen(buildRoot))) {
01267                      <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>,
01268                                 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Symlink points to BuildRoot: %s -&gt; %s\n"</span>),
01269                                 flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>, buf);
01270                     fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
01271                 }
01272             }
01273         }
01274         s = buf;
01275         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a149">RPMTAG_FILELINKTOS</a>, <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
01276                                &amp;s, 1);
01277         
01278         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a>) {
01279             flp-&gt;<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> &amp;= ~(<a class="code" href="group__rpmcli.html#a46a374">RPMVERIFY_MD5</a> | <a class="code" href="group__rpmcli.html#a46a375">RPMVERIFY_FILESIZE</a> |
01280                                 <a class="code" href="group__rpmcli.html#a46a376">RPMVERIFY_LINKTO</a> | <a class="code" href="group__rpmcli.html#a46a379">RPMVERIFY_MTIME</a>);
01281         }
01282         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a158">RPMTAG_FILEVERIFYFLAGS</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01283                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a>), 1);
01284         
01285         <span class="keywordflow">if</span> (!isSrc &amp;&amp; <a class="code" href="files_8c.html#a49">isDoc</a>(fl, flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>))
01286             flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> |= <a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a>;
01287         <span class="comment">/* XXX Should directories have %doc/%config attributes? (#14531) */</span>
01288         <span class="keywordflow">if</span> (S_ISDIR(flp-&gt;fl_mode))
01289             flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp;= ~(<a class="code" href="rpmlib_8h.html#a496a243">RPMFILE_CONFIG</a>|<a class="code" href="rpmlib_8h.html#a496a244">RPMFILE_DOC</a>);
01290 
01291         (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a150">RPMTAG_FILEFLAGS</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01292                                &amp;(flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a>), 1);
01293 
01294     }
01295     (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a122">RPMTAG_SIZE</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01296                    &amp;(fl-&gt;<a class="code" href="structFileList__s.html#m3">totalFileSize</a>), 1);
01297 
01298     <span class="comment">/* XXX This should be added always so that packages look alike.</span>
01299 <span class="comment">     * XXX However, there is logic in files.c/depends.c that checks for</span>
01300 <span class="comment">     * XXX existence (rather than value) that will need to change as well.</span>
01301 <span class="comment">     */</span>
01302     <span class="keywordflow">if</span> (multiLibMask)
01303         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(h, <a class="code" href="rpmlib_8h.html#a494a231">RPMTAG_MULTILIBS</a>, <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>,
01304                        &amp;multiLibMask, 1);
01305 
01306     <span class="keywordflow">if</span> (_addDotSlash)
01307         (void) <a class="code" href="group__rpmbuild.html#a43">rpmlibNeedsFeature</a>(h, <span class="stringliteral">"PayloadFilesHavePrefix"</span>, <span class="stringliteral">"4.0-1"</span>);
01308 
01309     <span class="comment">/* Choose how filenames are represented. */</span>
01310     <span class="keywordflow">if</span> (_noDirTokens)
01311         <a class="code" href="lib_2misc_8c.html#a13">expandFilelist</a>(h);
01312     <span class="keywordflow">else</span> {
01313         <a class="code" href="lib_2misc_8c.html#a11">compressFilelist</a>(h);
01314         <span class="comment">/* Binary packages with dirNames cannot be installed by legacy rpm. */</span>
01315         (void) <a class="code" href="group__rpmbuild.html#a43">rpmlibNeedsFeature</a>(h, <span class="stringliteral">"CompressedFileNames"</span>, <span class="stringliteral">"3.0.4-1"</span>);
01316     }
01317 
01318   { <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(1, <span class="keyword">sizeof</span>(*fi));
01319     <span class="keywordtype">char</span> * a, * d;
01320 
01321     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m0">type</a> = TR_ADDED;
01322     <a class="code" href="psm_8c.html#a3">loadFi</a>(h, fi);
01323     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>);
01324     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>);
01325 
01326     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>) + dpathlen);
01327     d = (<span class="keywordtype">char</span> *)(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01328     *d = <span class="charliteral">'\0'</span>;
01329 
01330     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * (<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>) + <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>)));
01331     <span class="comment">/*@-dependenttrans@*/</span> <span class="comment">/* FIX: artifact of spoofing headerGetEntry */</span>
01332     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = (<span class="keywordtype">int</span> *)(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01333     <span class="comment">/*@=dependenttrans@*/</span>
01334 
01335     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>) + apathlen);
01336     a = (<span class="keywordtype">char</span> *)(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> + fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01337     *a = <span class="charliteral">'\0'</span>;
01338 
01339     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01340     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01341     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = 0;
01342     <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>)
01343         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = strlen(fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>);
01344     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = 0;
01345     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = NULL;
01346     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01347     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = NULL;
01348     fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>);
01349 
01350     <span class="comment">/* Make the cpio list */</span>
01351     <span class="keywordflow">for</span> (i = 0, flp = fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++, flp++) {
01352         <span class="keywordtype">char</span> * b;
01353 
01354         <span class="comment">/* Skip (possible) duplicate file entries, use last entry info. */</span>
01355         <span class="keywordflow">while</span> (((flp - fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>) &lt; (fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> - 1)) &amp;&amp;
01356                 !strcmp(flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a>, flp[1].<a class="code" href="structFileListRec__s.html#m2">fileURL</a>))
01357             flp++;
01358 
01359         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a252">RPMFILE_EXCLUDE</a>) {
01360             i--;
01361             <span class="keywordflow">continue</span>;
01362         }
01363 
01364         <span class="comment">/* Create disk directory and base name. */</span>
01365         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i] = i;
01366         <span class="comment">/*@-dependenttrans@*/</span> <span class="comment">/* FIX: artifact of spoofing headerGetEntry */</span>
01367         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]] = d;
01368         <span class="comment">/*@=dependenttrans@*/</span>
01369 <span class="preprocessor">#ifdef IA64_SUCKS_ROCKS</span>
01370 <span class="preprocessor"></span>        (void) <a class="code" href="system_8h.html#a32">stpcpy</a>(d, flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a>);
01371         d += strlen(d);
01372 <span class="preprocessor">#else</span>
01373 <span class="preprocessor"></span>        d = <a class="code" href="system_8h.html#a32">stpcpy</a>(d, flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a>);
01374 <span class="preprocessor">#endif</span>
01375 <span class="preprocessor"></span>
01376         <span class="comment">/* Make room for the dirName NUL, find start of baseName. */</span>
01377         <span class="keywordflow">for</span> (b = d; b &gt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]] &amp;&amp; *b != <span class="charliteral">'/'</span>; b--)
01378             b[1] = b[0];
01379         b++;            <span class="comment">/* dirname's end in '/' */</span>
01380         *b++ = <span class="charliteral">'\0'</span>;    <span class="comment">/* terminate dirname, b points to basename */</span>
01381         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i] = b;
01382         d += 2;         <span class="comment">/* skip both dirname and basename NUL's */</span>
01383 
01384         <span class="comment">/* Create archive path, normally adding "./" */</span>
01385         <span class="comment">/*@-dependenttrans@*/</span>   <span class="comment">/* FIX: xstrdup? nah ... */</span>
01386         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>[i] = a;
01387         <span class="comment">/*@=dependenttrans@*/</span>
01388         <span class="keywordflow">if</span> (_addDotSlash) {
01389 <span class="preprocessor">#ifdef IA64_SUCKS_ROCKS</span>
01390 <span class="preprocessor"></span>            (void) <a class="code" href="system_8h.html#a32">stpcpy</a>(a, <span class="stringliteral">"./"</span>);
01391             a += strlen(a);
01392 <span class="preprocessor">#else</span>
01393 <span class="preprocessor"></span>            a = <a class="code" href="system_8h.html#a32">stpcpy</a>(a, <span class="stringliteral">"./"</span>);
01394 <span class="preprocessor">#endif</span>
01395 <span class="preprocessor"></span>        }
01396 <span class="preprocessor">#ifdef IA64_SUCKS_ROCKS</span>
01397 <span class="preprocessor"></span>        (void) <a class="code" href="system_8h.html#a32">stpcpy</a>(a, (flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a> + skipLen));
01398         a += strlen(a);
01399 <span class="preprocessor">#else</span>
01400 <span class="preprocessor"></span>        a = <a class="code" href="system_8h.html#a32">stpcpy</a>(a, (flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a> + skipLen));
01401 <span class="preprocessor">#endif</span>
01402 <span class="preprocessor"></span>        a++;            <span class="comment">/* skip apath NUL */</span>
01403 
01404         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a>) {
01405             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a307">FA_SKIP</a>;
01406             <span class="keywordflow">continue</span>;
01407         }
01408         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a304">FA_COPYOUT</a>;
01409         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = <a class="code" href="group__rpmbuild.html#a15">getUidS</a>(flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a>);
01410         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = <a class="code" href="group__rpmbuild.html#a18">getGidS</a>(flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a>);
01411         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] == (uid_t)-1) fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = 0;
01412         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] == (gid_t)-1) fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = 0;
01413         fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] = <a class="code" href="group__payload.html#a25a33">CPIO_MAP_PATH</a> |
01414                 <a class="code" href="group__payload.html#a25a41">CPIO_MAP_TYPE</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>;
01415         <span class="keywordflow">if</span> (isSrc)
01416             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] |= <a class="code" href="group__payload.html#a25a37">CPIO_FOLLOW_SYMLINKS</a>;
01417         <span class="keywordflow">if</span> (flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>)
01418             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] |= <a class="code" href="group__payload.html#a25a42">CPIO_MULTILIB</a>;
01419 
01420     }
01421     <span class="comment">/*@-branchstate@*/</span>
01422     <span class="keywordflow">if</span> (cpioList)
01423         *cpioList = fi;
01424     <span class="keywordflow">else</span>
01425         fi = <a class="code" href="poptint_8h.html#a14">_free</a>(fi);
01426     <span class="comment">/*@=branchstate@*/</span>
01427   }
01428 }
01429 
<a name="l01432"></a><a class="code" href="files_8c.html#a52">01432</a> <span class="keyword">static</span> <span class="comment">/*@null@*/</span> <a class="code" href="structFileListRec__s.html">FileListRec</a> <a class="code" href="files_8c.html#a52">freeFileList</a>(<span class="comment">/*@only@*/</span> <a class="code" href="structFileListRec__s.html">FileListRec</a> fileList,
01433                         <span class="keywordtype">int</span> count)
01434         <span class="comment">/*@*/</span>
01435 {
01436     <span class="keywordflow">while</span> (count--) {
01437         fileList[count].<a class="code" href="structFileListRec__s.html#m1">diskURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fileList[count].diskURL);
01438         fileList[count].<a class="code" href="structFileListRec__s.html#m2">fileURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fileList[count].fileURL);
01439         fileList[count].<a class="code" href="structFileListRec__s.html#m8">langs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fileList[count].langs);
01440     }
01441     fileList = <a class="code" href="poptint_8h.html#a14">_free</a>(fileList);
01442     <span class="keywordflow">return</span> NULL;
01443 }
01444 
<a name="l01448"></a><a class="code" href="files_8c.html#a53">01448</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a53">addFile</a>(<a class="code" href="structFileList__s.html">FileList</a> fl, <span class="keyword">const</span> <span class="keywordtype">char</span> * diskURL, <span class="keyword">struct</span> stat * statp)
01449         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01450 <span class="comment">                fileSystem@*/</span>
01451         <span class="comment">/*@modifies *statp, *fl, fl-&gt;processingFailed,</span>
01452 <span class="comment">                fl-&gt;fileList, fl-&gt;fileListRecsAlloced, fl-&gt;fileListRecsUsed,</span>
01453 <span class="comment">                fl-&gt;totalFileSize, fl-&gt;fileCount, fl-&gt;inFtw, fl-&gt;isDir,</span>
01454 <span class="comment">                rpmGlobalMacroContext, fileSystem @*/</span>
01455 {
01456     <span class="keyword">const</span> <span class="keywordtype">char</span> *fileURL = diskURL;
01457     <span class="keyword">struct </span>stat statbuf;
01458     mode_t fileMode;
01459     uid_t fileUid;
01460     gid_t fileGid;
01461     <span class="keyword">const</span> <span class="keywordtype">char</span> *fileUname;
01462     <span class="keyword">const</span> <span class="keywordtype">char</span> *fileGname;
01463     <span class="keywordtype">char</span> *lang;
01464     
01465     <span class="comment">/* Path may have prepended buildRootURL, so locate the original filename. */</span>
01466     <span class="comment">/*</span>
01467 <span class="comment">     * XXX There are 3 types of entry into addFile:</span>
01468 <span class="comment">     *</span>
01469 <span class="comment">     *  From                    diskUrl                 statp</span>
01470 <span class="comment">     *  =====================================================</span>
01471 <span class="comment">     *  processBinaryFile       path                    NULL</span>
01472 <span class="comment">     *  processBinaryFile       glob result path        NULL</span>
01473 <span class="comment">     *  myftw                   path                    stat</span>
01474 <span class="comment">     *</span>
01475 <span class="comment">     */</span>
01476     {   <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName;
01477         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(fileURL, &amp;fileName);
01478         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a> &amp;&amp; strcmp(fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>, <span class="stringliteral">"/"</span>))
01479             fileURL += strlen(fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>);
01480     }
01481 
01482     <span class="comment">/* XXX make sure '/' can be packaged also */</span>
01483     <span class="comment">/*@-branchstate@*/</span>
01484     <span class="keywordflow">if</span> (*fileURL == <span class="charliteral">'\0'</span>)
01485         fileURL = <span class="stringliteral">"/"</span>;
01486     <span class="comment">/*@=branchstate@*/</span>
01487 
01488     <span class="comment">/* If we are using a prefix, validate the file */</span>
01489     <span class="keywordflow">if</span> (!fl-&gt;<a class="code" href="structFileList__s.html#m12">inFtw</a> &amp;&amp; fl-&gt;<a class="code" href="structFileList__s.html#m1">prefix</a>) {
01490         <span class="keyword">const</span> <span class="keywordtype">char</span> *prefixTest;
01491         <span class="keyword">const</span> <span class="keywordtype">char</span> *prefixPtr = fl-&gt;<a class="code" href="structFileList__s.html#m1">prefix</a>;
01492 
01493         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(fileURL, &amp;prefixTest);
01494         <span class="keywordflow">while</span> (*prefixPtr &amp;&amp; *prefixTest &amp;&amp; (*prefixTest == *prefixPtr)) {
01495             prefixPtr++;
01496             prefixTest++;
01497         }
01498         <span class="keywordflow">if</span> (*prefixPtr || (*prefixTest &amp;&amp; *prefixTest != <span class="charliteral">'/'</span>)) {
01499             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File doesn't match prefix (%s): %s\n"</span>),
01500                      fl-&gt;<a class="code" href="structFileList__s.html#m1">prefix</a>, fileURL);
01501             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
01502             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
01503         }
01504     }
01505 
01506     <span class="keywordflow">if</span> (statp == NULL) {
01507         statp = &amp;statbuf;
01508         memset(statp, 0, <span class="keyword">sizeof</span>(*statp));
01509         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m8">devtype</a>) {
01510             time_t now = time(NULL);
01511 
01512             <span class="comment">/* XXX hack up a stat structure for a %dev(...) directive. */</span>
01513             statp-&gt;st_nlink = 1;
01514             statp-&gt;st_rdev =
01515                 ((fl-&gt;<a class="code" href="structFileList__s.html#m9">devmajor</a> &amp; 0xff) &lt;&lt; 8) | (fl-&gt;<a class="code" href="structFileList__s.html#m10">devminor</a> &amp; 0xff);
01516             statp-&gt;st_dev = statp-&gt;st_rdev;
01517             statp-&gt;st_mode = (fl-&gt;<a class="code" href="structFileList__s.html#m8">devtype</a> == <span class="charliteral">'b'</span> ? S_IFBLK : S_IFCHR);
01518             statp-&gt;st_mode |= (fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> &amp; 0777);
01519             statp-&gt;st_atime = now;
01520             statp-&gt;st_mtime = now;
01521             statp-&gt;st_ctime = now;
01522         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a46">Lstat</a>(diskURL, statp)) {
01523             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File not found: %s\n"</span>), diskURL);
01524             fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
01525             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
01526         }
01527     }
01528 
01529     <span class="keywordflow">if</span> ((! fl-&gt;<a class="code" href="structFileList__s.html#m11">isDir</a>) &amp;&amp; S_ISDIR(statp-&gt;st_mode)) {
01530         <span class="comment">/* We use our own ftw() call, because ftw() uses stat()    */</span>
01531         <span class="comment">/* instead of lstat(), which causes it to follow symlinks! */</span>
01532         <span class="comment">/* It also has better callback support.                    */</span>
01533         
01534         fl-&gt;<a class="code" href="structFileList__s.html#m12">inFtw</a> = 1;  <span class="comment">/* Flag to indicate file has buildRootURL prefixed */</span>
01535         fl-&gt;<a class="code" href="structFileList__s.html#m11">isDir</a> = 1;  <span class="comment">/* Keep it from following myftw() again         */</span>
01536         (void) <a class="code" href="myftw_8c.html#a3">myftw</a>(diskURL, 16, (<a class="code" href="myftw_8h.html#a4">myftwFunc</a>) <a class="code" href="files_8c.html#a53">addFile</a>, fl);
01537         fl-&gt;<a class="code" href="structFileList__s.html#m11">isDir</a> = 0;
01538         fl-&gt;<a class="code" href="structFileList__s.html#m12">inFtw</a> = 0;
01539         <span class="keywordflow">return</span> 0;
01540     }
01541 
01542     fileMode = statp-&gt;st_mode;
01543     fileUid = statp-&gt;st_uid;
01544     fileGid = statp-&gt;st_gid;
01545 
01546     <span class="keywordflow">if</span> (S_ISDIR(fileMode) &amp;&amp; fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>) {
01547         fileMode &amp;= S_IFMT;
01548         fileMode |= fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m5">ar_dmode</a>;
01549     } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> != NULL) {
01550         fileMode &amp;= S_IFMT;
01551         fileMode |= fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a>;
01552     }
01553     <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m2">ar_user</a>) {
01554         fileUname = <a class="code" href="group__rpmbuild.html#a14">getUnameS</a>(fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m2">ar_user</a>);
01555     } <span class="keywordflow">else</span> {
01556         fileUname = <a class="code" href="group__rpmbuild.html#a13">getUname</a>(fileUid);
01557     }
01558     <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m3">ar_group</a>) {
01559         fileGname = <a class="code" href="group__rpmbuild.html#a17">getGnameS</a>(fl-&gt;<a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m3">ar_group</a>);
01560     } <span class="keywordflow">else</span> {
01561         fileGname = <a class="code" href="group__rpmbuild.html#a16">getGname</a>(fileGid);
01562     }
01563         
01564 <span class="preprocessor">#if 0   </span><span class="comment">/* XXX this looks dumb to me */</span>
01565     <span class="keywordflow">if</span> (! (fileUname &amp;&amp; fileGname)) {
01566         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad owner/group: %s\n"</span>), diskName);
01567         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
01568         <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
01569     }
01570 <span class="preprocessor">#else</span>
01571 <span class="preprocessor"></span>    <span class="comment">/* Default user/group to builder's user/group */</span>
01572     <span class="keywordflow">if</span> (fileUname == NULL)
01573         fileUname = <a class="code" href="group__rpmbuild.html#a13">getUname</a>(getuid());
01574     <span class="keywordflow">if</span> (fileGname == NULL)
01575         fileGname = <a class="code" href="group__rpmbuild.html#a16">getGname</a>(getgid());
01576 <span class="preprocessor">#endif</span>
01577 <span class="preprocessor"></span>    
01578 <span class="preprocessor">#ifdef  DYING   </span><span class="comment">/* XXX duplicates with %exclude, use psm.c output instead. */</span>
01579     <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">"File%5d: %07o %s.%s\t %s\n"</span>), fl-&gt;<a class="code" href="structFileList__s.html#m2">fileCount</a>,
01580         (<span class="keywordtype">unsigned</span>)fileMode, fileUname, fileGname, fileURL);
01581 <span class="preprocessor">#endif</span>
01582 <span class="preprocessor"></span>
01583     <span class="comment">/* Add to the file list */</span>
01584     <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> == fl-&gt;<a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a>) {
01585         fl-&gt;<a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a> += 128;
01586         fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>,
01587                         fl-&gt;<a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a> * <span class="keyword">sizeof</span>(*(fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>)));
01588     }
01589             
01590     {   <a class="code" href="structFileListRec__s.html">FileListRec</a> flp = &amp;fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a>[fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>];
01591         <span class="keywordtype">int</span> i;
01592 
01593         flp-&gt;<a class="code" href="structFileListRec__s.html#m0">fl_st</a> = *statp;    <span class="comment">/* structure assignment */</span>
01594         flp-&gt;fl_mode = fileMode;
01595         flp-&gt;fl_uid = fileUid;
01596         flp-&gt;fl_gid = fileGid;
01597 
01598         flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fileURL);
01599         flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(diskURL);
01600         flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a> = fileUname;
01601         flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a> = fileGname;
01602 
01603         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a> &amp;&amp; fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a> &gt; 0) {
01604             <span class="keywordtype">char</span> * ncl;
01605             size_t nl = 0;
01606             
01607             <span class="keywordflow">for</span> (i = 0; i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++)
01608                 nl += strlen(fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]) + 1;
01609 
01610             flp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a> = ncl = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(nl);
01611             <span class="keywordflow">for</span> (i = 0; i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++) {
01612                 <span class="keyword">const</span> <span class="keywordtype">char</span> *ocl;
01613                 <span class="keywordflow">if</span> (i)  *ncl++ = <span class="charliteral">'|'</span>;
01614                 <span class="keywordflow">for</span> (ocl = fl-&gt;<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]; *ocl != <span class="charliteral">'\0'</span>; ocl++)
01615                         *ncl++ = *ocl;
01616                 *ncl = <span class="charliteral">'\0'</span>;
01617             }
01618         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (! <a class="code" href="files_8c.html#a45">parseForRegexLang</a>(fileURL, &amp;lang)) {
01619             flp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(lang);
01620         } <span class="keywordflow">else</span> {
01621             flp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">""</span>);
01622         }
01623 
01624         flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> = fl-&gt;<a class="code" href="structFileList__s.html#m13">currentFlags</a>;
01625         flp-&gt;<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> = fl-&gt;<a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a>;
01626         flp-&gt;<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> = fl-&gt;<a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a>;
01627 
01628         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a18">multiLib</a>
01629             &amp;&amp; !(flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> &amp; <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>)
01630             &amp;&amp; !<a class="code" href="files_8c.html#a46">parseForRegexMultiLib</a>(fileURL))
01631             flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> |= <a class="code" href="files_8c.html#a18">multiLib</a>;
01632 
01633 
01634         <span class="comment">/* Hard links need be counted only once. */</span>
01635         <span class="keywordflow">if</span> (S_ISREG(flp-&gt;fl_mode) &amp;&amp; flp-&gt;fl_nlink &gt; 1) {
01636             <a class="code" href="structFileListRec__s.html">FileListRec</a> ilp;
01637             <span class="keywordflow">for</span> (i = 0;  i &lt; fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; i++) {
01638                 ilp = fl-&gt;<a class="code" href="structFileList__s.html#m24">fileList</a> + i;
01639                 <span class="keywordflow">if</span> (!S_ISREG(ilp-&gt;fl_mode))
01640                     <span class="keywordflow">continue</span>;
01641                 <span class="keywordflow">if</span> (flp-&gt;fl_nlink != ilp-&gt;fl_nlink)
01642                     <span class="keywordflow">continue</span>;
01643                 <span class="keywordflow">if</span> (flp-&gt;fl_ino != ilp-&gt;fl_ino)
01644                     <span class="keywordflow">continue</span>;
01645                 <span class="keywordflow">if</span> (flp-&gt;fl_dev != ilp-&gt;fl_dev)
01646                     <span class="keywordflow">continue</span>;
01647                 <span class="keywordflow">break</span>;
01648             }
01649         } <span class="keywordflow">else</span>
01650             i = fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>;
01651 
01652         <span class="keywordflow">if</span> (S_ISREG(flp-&gt;fl_mode) &amp;&amp; i &gt;= fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>)
01653             fl-&gt;<a class="code" href="structFileList__s.html#m3">totalFileSize</a> += flp-&gt;fl_size;
01654     }
01655 
01656     fl-&gt;<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>++;
01657     fl-&gt;<a class="code" href="structFileList__s.html#m2">fileCount</a>++;
01658 
01659     <span class="keywordflow">return</span> 0;
01660 }
01661 
<a name="l01665"></a><a class="code" href="files_8c.html#a54">01665</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a54">processBinaryFile</a>(<span class="comment">/*@unused@*/</span> <a class="code" href="structPackageStruct.html">Package</a> pkg, <a class="code" href="structFileList__s.html">FileList</a> fl,
01666                 <span class="keyword">const</span> <span class="keywordtype">char</span> * fileURL)
01667         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01668 <span class="comment">                fileSystem@*/</span>
01669         <span class="comment">/*@modifies *fl, fl-&gt;processingFailed,</span>
01670 <span class="comment">                fl-&gt;fileList, fl-&gt;fileListRecsAlloced, fl-&gt;fileListRecsUsed,</span>
01671 <span class="comment">                fl-&gt;totalFileSize, fl-&gt;fileCount, fl-&gt;inFtw, fl-&gt;isDir,</span>
01672 <span class="comment">                rpmGlobalMacroContext, fileSystem @*/</span>
01673 {
01674     <span class="keywordtype">int</span> doGlob;
01675     <span class="keyword">const</span> <span class="keywordtype">char</span> *diskURL = NULL;
01676     <span class="keywordtype">int</span> rc = 0;
01677     
01678     doGlob = <a class="code" href="lib_2misc_8c.html#a16">myGlobPatternP</a>(fileURL);
01679 
01680     <span class="comment">/* Check that file starts with leading "/" */</span>
01681     {   <span class="keyword">const</span> <span class="keywordtype">char</span> * fileName;
01682         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(fileURL, &amp;fileName);
01683         <span class="keywordflow">if</span> (*fileName != <span class="charliteral">'/'</span>) {
01684             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File needs leading \"/\": %s\n"</span>),
01685                         fileName);
01686             rc = 1;
01687             <span class="keywordflow">goto</span> exit;
01688         }
01689     }
01690     
01691     <span class="comment">/* Copy file name or glob pattern removing multiple "/" chars. */</span>
01692     <span class="comment">/*</span>
01693 <span class="comment">     * Note: rpmGetPath should guarantee a "canonical" path. That means</span>
01694 <span class="comment">     * that the following pathologies should be weeded out:</span>
01695 <span class="comment">     *          //bin//sh</span>
01696 <span class="comment">     *          //usr//bin/</span>
01697 <span class="comment">     *          /.././../usr/../bin//./sh</span>
01698 <span class="comment">     */</span>
01699     diskURL = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(fl-&gt;<a class="code" href="structFileList__s.html#m0">buildRootURL</a>, NULL, fileURL);
01700 
01701     <span class="keywordflow">if</span> (doGlob) {
01702         <span class="keyword">const</span> <span class="keywordtype">char</span> ** argv = NULL;
01703         <span class="keywordtype">int</span> argc = 0;
01704         <span class="keywordtype">int</span> i;
01705 
01706         <span class="keywordflow">if</span> (fl-&gt;<a class="code" href="structFileList__s.html#m7">noGlob</a>) {
01707             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Glob not permitted: %s\n"</span>),
01708                         diskURL);
01709             rc = 1;
01710             <span class="keywordflow">goto</span> exit;
01711         }
01712 
01713         <span class="comment">/*@-branchstate@*/</span>
01714         rc = <a class="code" href="lib_2misc_8c.html#a18">rpmGlob</a>(diskURL, &amp;argc, &amp;argv);
01715         <span class="keywordflow">if</span> (rc == 0 &amp;&amp; argc &gt;= 1 &amp;&amp; !<a class="code" href="lib_2misc_8c.html#a16">myGlobPatternP</a>(argv[0])) {
01716             <span class="keywordflow">for</span> (i = 0; i &lt; argc; i++) {
01717                 rc = <a class="code" href="files_8c.html#a53">addFile</a>(fl, argv[i], NULL);
01718                 argv[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(argv[i]);
01719             }
01720             argv = <a class="code" href="poptint_8h.html#a14">_free</a>(argv);
01721         } <span class="keywordflow">else</span> {
01722             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"File not found by glob: %s\n"</span>),
01723                         diskURL);
01724             rc = 1;
01725         }
01726         <span class="comment">/*@=branchstate@*/</span>
01727     } <span class="keywordflow">else</span> {
01728         rc = <a class="code" href="files_8c.html#a53">addFile</a>(fl, diskURL, NULL);
01729     }
01730 
01731 exit:
01732     diskURL = <a class="code" href="poptint_8h.html#a14">_free</a>(diskURL);
01733     <span class="keywordflow">if</span> (rc)
01734         fl-&gt;<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
01735     <span class="keywordflow">return</span> rc;
01736 }
01737 
<a name="l01740"></a><a class="code" href="files_8c.html#a55">01740</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a55">processPackageFiles</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <a class="code" href="structPackageStruct.html">Package</a> pkg,
01741                                <span class="keywordtype">int</span> installSpecialDoc, <span class="keywordtype">int</span> test)
01742         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
01743 <span class="comment">                fileSystem, internalState@*/</span>
01744         <span class="comment">/*@modifies spec-&gt;macros,</span>
01745 <span class="comment">                pkg-&gt;cpioList, pkg-&gt;fileList, pkg-&gt;specialDoc, pkg-&gt;header,</span>
01746 <span class="comment">                rpmGlobalMacroContext, fileSystem, internalState @*/</span>
01747 {
01748     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
01749     <span class="keyword">struct </span><a class="code" href="structFileList__s.html">FileList_s</a> fl;
01750     <span class="keywordtype">char</span> *s, **files, **fp;
01751     <span class="keyword">const</span> <span class="keywordtype">char</span> *fileName;
01752     <span class="keywordtype">char</span> buf[BUFSIZ];
01753     <span class="keyword">struct </span><a class="code" href="structAttrRec__s.html">AttrRec_s</a> arbuf;
01754     <a class="code" href="structAttrRec__s.html">AttrRec</a> specialDocAttrRec = &amp;arbuf;
01755     <span class="keywordtype">char</span> *specialDoc = NULL;
01756 
01757 <span class="preprocessor">#ifdef MULTILIB</span>
01758 <span class="preprocessor"></span>    <a class="code" href="files_8c.html#a18">multiLib</a> = <a class="code" href="macro_8c.html#a51">rpmExpandNumeric</a>(<span class="stringliteral">"%{_multilibno}"</span>);
01759     <span class="keywordflow">if</span> (multiLib)
01760         <a class="code" href="files_8c.html#a18">multiLib</a> = <a class="code" href="rpmlib_8h.html#a12">RPMFILE_MULTILIB</a>(<a class="code" href="files_8c.html#a18">multiLib</a>);
01761 <span class="preprocessor">#endif </span><span class="comment">/* MULTILIB */</span>
01762     
01763     <a class="code" href="files_8c.html#a34">nullAttrRec</a>(specialDocAttrRec);
01764     pkg-&gt;<a class="code" href="structPackageStruct.html#m1">cpioList</a> = NULL;
01765 
01766     <span class="keywordflow">if</span> (pkg-&gt;<a class="code" href="structPackageStruct.html#m12">fileFile</a>) {
01767         <span class="keyword">const</span> <span class="keywordtype">char</span> *ffn;
01768         FILE * f;
01769         <a class="code" href="struct__FD__s.html">FD_t</a> fd;
01770 
01771         <span class="comment">/* XXX W2DO? urlPath might be useful here. */</span>
01772         <span class="keywordflow">if</span> (*pkg-&gt;<a class="code" href="structPackageStruct.html#m12">fileFile</a> == <span class="charliteral">'/'</span>) {
01773             ffn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m12">fileFile</a>, NULL);
01774         } <span class="keywordflow">else</span> {
01775             <span class="comment">/* XXX FIXME: add %{_buildsubdir} */</span>
01776             ffn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_builddir}/"</span>,
01777                 (spec-&gt;<a class="code" href="structSpecStruct.html#m3">buildSubdir</a> ? spec-&gt;<a class="code" href="structSpecStruct.html#m3">buildSubdir</a> : <span class="stringliteral">""</span>) ,
01778                 <span class="stringliteral">"/"</span>, pkg-&gt;<a class="code" href="structPackageStruct.html#m12">fileFile</a>, NULL);
01779         }
01780         fd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(ffn, <span class="stringliteral">"r.fpio"</span>);
01781 
01782         <span class="keywordflow">if</span> (fd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(fd)) {
01783             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a62">RPMERR_BADFILENAME</a>,
01784                 <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Could not open %%files file %s: %s\n"</span>),
01785                 ffn, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(fd));
01786             <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a62">RPMERR_BADFILENAME</a>;
01787         }
01788         ffn = <a class="code" href="poptint_8h.html#a14">_free</a>(ffn);
01789 
01790         <span class="comment">/*@+voidabstract@*/</span> f = <a class="code" href="group__rpmio.html#a27">fdGetFp</a>(fd); <span class="comment">/*@=voidabstract@*/</span>
01791         <span class="keywordflow">if</span> (f != NULL)
01792         <span class="keywordflow">while</span> (fgets(buf, <span class="keyword">sizeof</span>(buf), f)) {
01793             <a class="code" href="group__rpmbuild.html#a23">handleComments</a>(buf);
01794             <span class="keywordflow">if</span> (<a class="code" href="macro_8c.html#a42">expandMacros</a>(spec, spec-&gt;<a class="code" href="structSpecStruct.html#m30">macros</a>, buf, <span class="keyword">sizeof</span>(buf))) {
01795                 <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"line: %s\n"</span>), buf);
01796                 <span class="keywordflow">return</span> <a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>;
01797             }
01798             <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m13">fileList</a>, buf);
01799         }
01800         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(fd);
01801     }
01802     
01803     <span class="comment">/* Init the file list structure */</span>
01804     memset(&amp;fl, 0, <span class="keyword">sizeof</span>(fl));
01805 
01806     <span class="comment">/* XXX spec-&gt;buildRootURL == NULL, then xstrdup("") is returned */</span>
01807     fl.<a class="code" href="structFileList__s.html#m0">buildRootURL</a> = <a class="code" href="macro_8c.html#a54">rpmGenPath</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m4">rootURL</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m2">buildRootURL</a>, NULL);
01808 
01809     <span class="keywordflow">if</span> (hge(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, <a class="code" href="rpmlib_8h.html#a494a169">RPMTAG_DEFAULTPREFIX</a>, NULL, (<span class="keywordtype">void</span> **)&amp;fl.<a class="code" href="structFileList__s.html#m1">prefix</a>, NULL))
01810         fl.<a class="code" href="structFileList__s.html#m1">prefix</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fl.<a class="code" href="structFileList__s.html#m1">prefix</a>);
01811     <span class="keywordflow">else</span>
01812         fl.<a class="code" href="structFileList__s.html#m1">prefix</a> = NULL;
01813 
01814     fl.<a class="code" href="structFileList__s.html#m2">fileCount</a> = 0;
01815     fl.<a class="code" href="structFileList__s.html#m3">totalFileSize</a> = 0;
01816     fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 0;
01817 
01818     fl.<a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a> = 0;
01819     fl.<a class="code" href="structFileList__s.html#m6">isSpecialDoc</a> = 0;
01820 
01821     fl.<a class="code" href="structFileList__s.html#m11">isDir</a> = 0;
01822     fl.<a class="code" href="structFileList__s.html#m12">inFtw</a> = 0;
01823     fl.<a class="code" href="structFileList__s.html#m13">currentFlags</a> = 0;
01824     fl.<a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a> = 0;
01825     
01826     fl.<a class="code" href="structFileList__s.html#m7">noGlob</a> = 0;
01827     fl.<a class="code" href="structFileList__s.html#m8">devtype</a> = 0;
01828     fl.<a class="code" href="structFileList__s.html#m9">devmajor</a> = 0;
01829     fl.<a class="code" href="structFileList__s.html#m10">devminor</a> = 0;
01830 
01831     <a class="code" href="files_8c.html#a34">nullAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>);
01832     <a class="code" href="files_8c.html#a34">nullAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m17">def_ar</a>);
01833 
01834     fl.<a class="code" href="structFileList__s.html#m19">defVerifyFlags</a> = <a class="code" href="rpmlib_8h.html#a42">RPMVERIFY_ALL</a>;
01835     fl.<a class="code" href="structFileList__s.html#m20">nLangs</a> = 0;
01836     fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a> = NULL;
01837 
01838     fl.<a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a> = 0;
01839     fl.<a class="code" href="structFileList__s.html#m18">defSpecdFlags</a> = 0;
01840 
01841     fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a> = 0;
01842     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/doc"</span>);
01843     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/man"</span>);
01844     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/info"</span>);
01845     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/X11R6/man"</span>);
01846     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/share/doc"</span>);
01847     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/share/man"</span>);
01848     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">"/usr/share/info"</span>);
01849     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_docdir}"</span>, NULL);
01850     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_mandir}"</span>, NULL);
01851     fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>++] = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>(<span class="stringliteral">"%{_infodir}"</span>, NULL);
01852     
01853     fl.<a class="code" href="structFileList__s.html#m24">fileList</a> = NULL;
01854     fl.<a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a> = 0;
01855     fl.<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> = 0;
01856 
01857     s = <a class="code" href="stringbuf_8c.html#a7">getStringBuf</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m13">fileList</a>);
01858     files = <a class="code" href="lib_2misc_8c.html#a3">splitString</a>(s, strlen(s), <span class="charliteral">'\n'</span>);
01859 
01860     <span class="keywordflow">for</span> (fp = files; *fp != NULL; fp++) {
01861         s = *fp;
01862         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(s);
01863         <span class="keywordflow">if</span> (*s == <span class="charliteral">'\0'</span>)
01864             <span class="keywordflow">continue</span>;
01865         fileName = NULL;
01866         <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* LCL: buf is NULL ?!? */</span>
01867         strcpy(buf, s);
01868         <span class="comment">/*@=nullpass@*/</span>
01869         
01870         <span class="comment">/* Reset for a new line in %files */</span>
01871         fl.<a class="code" href="structFileList__s.html#m11">isDir</a> = 0;
01872         fl.<a class="code" href="structFileList__s.html#m12">inFtw</a> = 0;
01873         fl.<a class="code" href="structFileList__s.html#m13">currentFlags</a> = 0;
01874         <span class="comment">/* turn explicit flags into %def'd ones (gosh this is hacky...) */</span>
01875         fl.<a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a> = ((unsigned)fl.<a class="code" href="structFileList__s.html#m18">defSpecdFlags</a>) &gt;&gt; 8;
01876         fl.<a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a> = fl.<a class="code" href="structFileList__s.html#m19">defVerifyFlags</a>;
01877         fl.<a class="code" href="structFileList__s.html#m6">isSpecialDoc</a> = 0;
01878 
01879         fl.<a class="code" href="structFileList__s.html#m7">noGlob</a> = 0;
01880         fl.<a class="code" href="structFileList__s.html#m8">devtype</a> = 0;
01881         fl.<a class="code" href="structFileList__s.html#m9">devmajor</a> = 0;
01882         fl.<a class="code" href="structFileList__s.html#m10">devminor</a> = 0;
01883 
01884         <span class="comment">/* XXX should reset to %deflang value */</span>
01885         <span class="keywordflow">if</span> (fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>) {
01886             <span class="keywordtype">int</span> i;
01887             <span class="keywordflow">for</span> (i = 0; i &lt; fl.<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++)
01888                 <span class="comment">/*@-unqualifiedtrans@*/</span>
01889                 fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]);
01890                 <span class="comment">/*@=unqualifiedtrans@*/</span>
01891             fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>);
01892         }
01893         fl.<a class="code" href="structFileList__s.html#m20">nLangs</a> = 0;
01894 
01895         <a class="code" href="files_8c.html#a36">dupAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m17">def_ar</a>, &amp;fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>);
01896 
01897         <span class="comment">/*@-nullpass@*/</span> <span class="comment">/* LCL: buf is NULL ?!? */</span>
01898         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a39">parseForVerify</a>(buf, &amp;fl))
01899             <span class="keywordflow">continue</span>;
01900         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a41">parseForAttr</a>(buf, &amp;fl))
01901             <span class="keywordflow">continue</span>;
01902         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a40">parseForDev</a>(buf, &amp;fl))
01903             <span class="keywordflow">continue</span>;
01904         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a42">parseForConfig</a>(buf, &amp;fl))
01905             <span class="keywordflow">continue</span>;
01906         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a44">parseForLang</a>(buf, &amp;fl))
01907             <span class="keywordflow">continue</span>;
01908         <span class="comment">/*@-nullstate@*/</span>        <span class="comment">/* FIX: pkg-&gt;fileFile might be NULL */</span>
01909         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a47">parseForSimple</a>(spec, pkg, buf, &amp;fl, &amp;fileName))
01910         <span class="comment">/*@=nullstate@*/</span>
01911             <span class="keywordflow">continue</span>;
01912         <span class="comment">/*@=nullpass@*/</span>
01913         <span class="keywordflow">if</span> (fileName == NULL)
01914             <span class="keywordflow">continue</span>;
01915 
01916         <span class="comment">/*@-branchstate@*/</span>
01917         <span class="keywordflow">if</span> (fl.<a class="code" href="structFileList__s.html#m6">isSpecialDoc</a>) {
01918             <span class="comment">/* Save this stuff for last */</span>
01919             specialDoc = <a class="code" href="poptint_8h.html#a14">_free</a>(specialDoc);
01920             specialDoc = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fileName);
01921             <a class="code" href="files_8c.html#a36">dupAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>, specialDocAttrRec);
01922         } <span class="keywordflow">else</span> {
01923             <span class="comment">/*@-nullstate@*/</span>    <span class="comment">/* FIX: pkg-&gt;fileFile might be NULL */</span>
01924             (void) <a class="code" href="files_8c.html#a54">processBinaryFile</a>(pkg, &amp;fl, fileName);
01925             <span class="comment">/*@=nullstate@*/</span>
01926         }
01927         <span class="comment">/*@=branchstate@*/</span>
01928     }
01929 
01930     <span class="comment">/* Now process special doc, if there is one */</span>
01931     <span class="keywordflow">if</span> (specialDoc) {
01932         <span class="keywordflow">if</span> (installSpecialDoc) {
01933             (void) <a class="code" href="group__rpmbuild.html#a37">doScript</a>(spec, <a class="code" href="group__rpmbuild.html#a56a20">RPMBUILD_STRINGBUF</a>, <span class="stringliteral">"%doc"</span>, pkg-&gt;<a class="code" href="structPackageStruct.html#m10">specialDoc</a>, test);
01934         }
01935 
01936         <span class="comment">/* Reset for %doc */</span>
01937         fl.<a class="code" href="structFileList__s.html#m11">isDir</a> = 0;
01938         fl.<a class="code" href="structFileList__s.html#m12">inFtw</a> = 0;
01939         fl.<a class="code" href="structFileList__s.html#m13">currentFlags</a> = 0;
01940         fl.<a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a> = 0;
01941 
01942         fl.<a class="code" href="structFileList__s.html#m7">noGlob</a> = 0;
01943         fl.<a class="code" href="structFileList__s.html#m8">devtype</a> = 0;
01944         fl.<a class="code" href="structFileList__s.html#m9">devmajor</a> = 0;
01945         fl.<a class="code" href="structFileList__s.html#m10">devminor</a> = 0;
01946 
01947         <span class="comment">/* XXX should reset to %deflang value */</span>
01948         <span class="keywordflow">if</span> (fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>) {
01949             <span class="keywordtype">int</span> i;
01950             <span class="keywordflow">for</span> (i = 0; i &lt; fl.<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++)
01951                 <span class="comment">/*@-unqualifiedtrans@*/</span>
01952                 fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]);
01953                 <span class="comment">/*@=unqualifiedtrans@*/</span>
01954             fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>);
01955         }
01956         fl.<a class="code" href="structFileList__s.html#m20">nLangs</a> = 0;
01957 
01958         <a class="code" href="files_8c.html#a36">dupAttrRec</a>(specialDocAttrRec, &amp;fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>);
01959         <a class="code" href="files_8c.html#a35">freeAttrRec</a>(specialDocAttrRec);
01960 
01961         <span class="comment">/*@-nullstate@*/</span>        <span class="comment">/* FIX: pkg-&gt;fileFile might be NULL */</span>
01962         (void) <a class="code" href="files_8c.html#a54">processBinaryFile</a>(pkg, &amp;fl, specialDoc);
01963         <span class="comment">/*@=nullstate@*/</span>
01964 
01965         specialDoc = <a class="code" href="poptint_8h.html#a14">_free</a>(specialDoc);
01966     }
01967     
01968     <a class="code" href="lib_2misc_8c.html#a4">freeSplitString</a>(files);
01969 
01970     <span class="keywordflow">if</span> (fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a>)
01971         <span class="keywordflow">goto</span> exit;
01972 
01973     <span class="comment">/* Verify that file attributes scope over hardlinks correctly. */</span>
01974     <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a50">checkHardLinks</a>(&amp;fl))
01975         (void) <a class="code" href="group__rpmbuild.html#a43">rpmlibNeedsFeature</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>,
01976                         <span class="stringliteral">"PartialHardlinkSets"</span>, <span class="stringliteral">"4.0.4-1"</span>);
01977 
01978     <a class="code" href="files_8c.html#a51">genCpioListAndHeader</a>(&amp;fl, (<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> *)&amp;pkg-&gt;<a class="code" href="structPackageStruct.html#m1">cpioList</a>, pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, 0);
01979 
01980     <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m23">timeCheck</a>)
01981         <a class="code" href="files_8c.html#a38">timeCheck</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m23">timeCheck</a>, pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>);
01982     
01983 exit:
01984     fl.<a class="code" href="structFileList__s.html#m0">buildRootURL</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m0">buildRootURL</a>);
01985     fl.<a class="code" href="structFileList__s.html#m1">prefix</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m1">prefix</a>);
01986 
01987     <a class="code" href="files_8c.html#a35">freeAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>);
01988     <a class="code" href="files_8c.html#a35">freeAttrRec</a>(&amp;fl.<a class="code" href="structFileList__s.html#m17">def_ar</a>);
01989 
01990     <span class="keywordflow">if</span> (fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>) {
01991         <span class="keywordtype">int</span> i;
01992         <span class="keywordflow">for</span> (i = 0; i &lt; fl.<a class="code" href="structFileList__s.html#m20">nLangs</a>; i++)
01993             <span class="comment">/*@-unqualifiedtrans@*/</span>
01994             fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]);
01995             <span class="comment">/*@=unqualifiedtrans@*/</span>
01996         fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m21">currentLangs</a>);
01997     }
01998 
01999     fl.<a class="code" href="structFileList__s.html#m24">fileList</a> = <a class="code" href="files_8c.html#a52">freeFileList</a>(fl.<a class="code" href="structFileList__s.html#m24">fileList</a>, fl.<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>);
02000     <span class="keywordflow">while</span> (fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>--)
02001         fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>] = <a class="code" href="poptint_8h.html#a14">_free</a>(fl.<a class="code" href="structFileList__s.html#m22">docDirs</a>[fl.<a class="code" href="structFileList__s.html#m23">docDirCount</a>]);
02002     <span class="keywordflow">return</span> fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a>;
02003 }
02004 
<a name="l02005"></a><a class="code" href="group__rpmbuild.html#a45">02005</a> <span class="keywordtype">void</span> <a class="code" href="group__rpmbuild.html#a45">initSourceHeader</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec)
02006 {
02007     <a class="code" href="structheaderIteratorS.html">HeaderIterator</a> hi;
02008     <a class="code" href="header_8h.html#a9">int_32</a> tag, type, count;
02009     <span class="keyword">const</span> <span class="keywordtype">void</span> * ptr;
02010 
02011     spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a> = <a class="code" href="group__header.html#a51">headerNew</a>();
02012     <span class="comment">/* Only specific tags are added to the source package header */</span>
02013     <span class="comment">/*@-branchstate@*/</span>
02014     <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>);
02015         <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, &amp;type, &amp;ptr, &amp;count);
02016         ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type))
02017     {
02018         <span class="keywordflow">switch</span> (tag) {
02019         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a113">RPMTAG_NAME</a>:
02020         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a114">RPMTAG_VERSION</a>:
02021         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a115">RPMTAG_RELEASE</a>:
02022         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a116">RPMTAG_EPOCH</a>:
02023         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a117">RPMTAG_SUMMARY</a>:
02024         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a118">RPMTAG_DESCRIPTION</a>:
02025         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a128">RPMTAG_PACKAGER</a>:
02026         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a123">RPMTAG_DISTRIBUTION</a>:
02027         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a227">RPMTAG_DISTURL</a>:
02028         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a124">RPMTAG_VENDOR</a>:
02029         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a127">RPMTAG_LICENSE</a>:
02030         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a129">RPMTAG_GROUP</a>:
02031         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a134">RPMTAG_OS</a>:
02032         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a135">RPMTAG_ARCH</a>:
02033         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a184">RPMTAG_CHANGELOGTIME</a>:
02034         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a185">RPMTAG_CHANGELOGNAME</a>:
02035         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a186">RPMTAG_CHANGELOGTEXT</a>:
02036         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a133">RPMTAG_URL</a>:
02037         <span class="keywordflow">case</span> <a class="code" href="header_8h.html#a6">HEADER_I18NTABLE</a>:
02038             <span class="keywordflow">if</span> (ptr)
02039                 (void)<a class="code" href="group__header.html#a45">headerAddEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, tag, type, ptr, count);
02040             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02041         <span class="keywordflow">default</span>:
02042             <span class="comment">/* do not copy */</span>
02043             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02044         }
02045     }
02046     hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
02047     <span class="comment">/*@=branchstate@*/</span>
02048 
02049     <span class="comment">/* Add the build restrictions */</span>
02050     <span class="comment">/*@-branchstate@*/</span>
02051     <span class="keywordflow">for</span> (hi = <a class="code" href="group__header.html#a69">headerInitIterator</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>);
02052         <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &amp;tag, &amp;type, &amp;ptr, &amp;count);
02053         ptr = <a class="code" href="group__header.html#a83">headerFreeData</a>(ptr, type))
02054     {
02055         <span class="keywordflow">if</span> (ptr)
02056             (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, tag, type, ptr, count);
02057     }
02058     hi = <a class="code" href="group__header.html#a68">headerFreeIterator</a>(hi);
02059     <span class="comment">/*@=branchstate@*/</span>
02060 
02061     <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a> &amp;&amp; spec-&gt;<a class="code" href="structSpecStruct.html#m17">BACount</a> &gt; 0) {
02062         (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, <a class="code" href="rpmlib_8h.html#a494a193">RPMTAG_BUILDARCHS</a>,
02063                        <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>,
02064                        spec-&gt;<a class="code" href="structSpecStruct.html#m16">BANames</a>, spec-&gt;<a class="code" href="structSpecStruct.html#m17">BACount</a>);
02065     }
02066 }
02067 
<a name="l02068"></a><a class="code" href="group__rpmbuild.html#a46">02068</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmbuild.html#a46">processSourceFiles</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec)
02069 {
02070     <span class="keyword">struct </span><a class="code" href="structSource.html">Source</a> *srcPtr;
02071     <a class="code" href="structStringBufRec.html">StringBuf</a> sourceFiles;
02072     <span class="keywordtype">int</span> x, isSpec = 1;
02073     <span class="keyword">struct </span><a class="code" href="structFileList__s.html">FileList_s</a> fl;
02074     <span class="keywordtype">char</span> *s, **files, **fp;
02075     <a class="code" href="structPackageStruct.html">Package</a> pkg;
02076 
02077     sourceFiles = <a class="code" href="stringbuf_8c.html#a3">newStringBuf</a>();
02078 
02079     <span class="comment">/* XXX</span>
02080 <span class="comment">     * XXX This is where the source header for noarch packages needs</span>
02081 <span class="comment">     * XXX to be initialized.</span>
02082 <span class="comment">     */</span>
02083     <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a> == NULL)
02084         <a class="code" href="group__rpmbuild.html#a45">initSourceHeader</a>(spec);
02085 
02086     <span class="comment">/* Construct the file list and source entries */</span>
02087     <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(sourceFiles, spec-&gt;<a class="code" href="structSpecStruct.html#m0">specFile</a>);
02088     <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a> != NULL)
02089     <span class="keywordflow">for</span> (srcPtr = spec-&gt;<a class="code" href="structSpecStruct.html#m25">sources</a>; srcPtr != NULL; srcPtr = srcPtr-&gt;<a class="code" href="structSource.html#m4">next</a>) {
02090         <span class="keywordflow">if</span> (srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a0">RPMBUILD_ISSOURCE</a>) {
02091             (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, <a class="code" href="rpmlib_8h.html#a494a131">RPMTAG_SOURCE</a>,
02092                                    <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, &amp;srcPtr-&gt;<a class="code" href="structSource.html#m1">source</a>, 1);
02093             <span class="keywordflow">if</span> (srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) {
02094                 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, <a class="code" href="rpmlib_8h.html#a494a164">RPMTAG_NOSOURCE</a>,
02095                                        <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &amp;srcPtr-&gt;<a class="code" href="structSource.html#m3">num</a>, 1);
02096             }
02097         }
02098         <span class="keywordflow">if</span> (srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a1">RPMBUILD_ISPATCH</a>) {
02099             (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, <a class="code" href="rpmlib_8h.html#a494a132">RPMTAG_PATCH</a>,
02100                                    <a class="code" href="group__header.html#a93a73">RPM_STRING_ARRAY_TYPE</a>, &amp;srcPtr-&gt;<a class="code" href="structSource.html#m1">source</a>, 1);
02101             <span class="keywordflow">if</span> (srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) {
02102                 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, <a class="code" href="rpmlib_8h.html#a494a165">RPMTAG_NOPATCH</a>,
02103                                        <a class="code" href="group__header.html#a93a70">RPM_INT32_TYPE</a>, &amp;srcPtr-&gt;<a class="code" href="structSource.html#m3">num</a>, 1);
02104             }
02105         }
02106 
02107       { <span class="keyword">const</span> <span class="keywordtype">char</span> * sfn;
02108         sfn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>( ((srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) ? <span class="stringliteral">"!"</span> : <span class="stringliteral">""</span>),
02109                 <span class="stringliteral">"%{_sourcedir}/"</span>, srcPtr-&gt;<a class="code" href="structSource.html#m1">source</a>, NULL);
02110         <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(sourceFiles, sfn);
02111         sfn = <a class="code" href="poptint_8h.html#a14">_free</a>(sfn);
02112       }
02113     }
02114 
02115     <span class="keywordflow">for</span> (pkg = spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>; pkg != NULL; pkg = pkg-&gt;<a class="code" href="structPackageStruct.html#m14">next</a>) {
02116         <span class="keywordflow">for</span> (srcPtr = pkg-&gt;<a class="code" href="structPackageStruct.html#m2">icon</a>; srcPtr != NULL; srcPtr = srcPtr-&gt;<a class="code" href="structSource.html#m4">next</a>) {
02117             <span class="keyword">const</span> <span class="keywordtype">char</span> * sfn;
02118             sfn = <a class="code" href="macro_8c.html#a53">rpmGetPath</a>( ((srcPtr-&gt;<a class="code" href="structSource.html#m2">flags</a> &amp; <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) ? <span class="stringliteral">"!"</span> : <span class="stringliteral">""</span>),
02119                 <span class="stringliteral">"%{_sourcedir}/"</span>, srcPtr-&gt;<a class="code" href="structSource.html#m1">source</a>, NULL);
02120             <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(sourceFiles, sfn);
02121             sfn = <a class="code" href="poptint_8h.html#a14">_free</a>(sfn);
02122         }
02123     }
02124 
02125     spec-&gt;<a class="code" href="structSpecStruct.html#m29">sourceCpioList</a> = NULL;
02126 
02127     fl.<a class="code" href="structFileList__s.html#m24">fileList</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>((spec-&gt;<a class="code" href="structSpecStruct.html#m26">numSources</a> + 1), <span class="keyword">sizeof</span>(*fl.<a class="code" href="structFileList__s.html#m24">fileList</a>));
02128     fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 0;
02129     fl.<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> = 0;
02130     fl.<a class="code" href="structFileList__s.html#m3">totalFileSize</a> = 0;
02131     fl.<a class="code" href="structFileList__s.html#m1">prefix</a> = NULL;
02132     fl.<a class="code" href="structFileList__s.html#m0">buildRootURL</a> = NULL;
02133 
02134     s = <a class="code" href="stringbuf_8c.html#a7">getStringBuf</a>(sourceFiles);
02135     files = <a class="code" href="lib_2misc_8c.html#a3">splitString</a>(s, strlen(s), <span class="charliteral">'\n'</span>);
02136 
02137     <span class="comment">/* The first source file is the spec file */</span>
02138     x = 0;
02139     <span class="keywordflow">for</span> (fp = files; *fp != NULL; fp++) {
02140         <span class="keyword">const</span> <span class="keywordtype">char</span> * diskURL, *diskPath;
02141         <a class="code" href="structFileListRec__s.html">FileListRec</a> flp;
02142 
02143         diskURL = *fp;
02144         <a class="code" href="rpmbuild_8h.html#a0">SKIPSPACE</a>(diskURL);
02145         <span class="keywordflow">if</span> (! *diskURL)
02146             <span class="keywordflow">continue</span>;
02147 
02148         flp = &amp;fl.<a class="code" href="structFileList__s.html#m24">fileList</a>[x];
02149 
02150         flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> = isSpec ? <a class="code" href="rpmlib_8h.html#a496a248">RPMFILE_SPECFILE</a> : 0;
02151         <span class="comment">/* files with leading ! are no source files */</span>
02152         <span class="keywordflow">if</span> (*diskURL == <span class="charliteral">'!'</span>) {
02153             flp-&gt;<a class="code" href="structFileListRec__s.html#m5">flags</a> |= <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a>;
02154             diskURL++;
02155         }
02156 
02157         (void) <a class="code" href="url_8c.html#a18">urlPath</a>(diskURL, &amp;diskPath);
02158 
02159         flp-&gt;<a class="code" href="structFileListRec__s.html#m1">diskURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(diskURL);
02160         diskPath = strrchr(diskPath, <span class="charliteral">'/'</span>);
02161         <span class="keywordflow">if</span> (diskPath)
02162             diskPath++;
02163         <span class="keywordflow">else</span>
02164             diskPath = diskURL;
02165 
02166         flp-&gt;<a class="code" href="structFileListRec__s.html#m2">fileURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(diskPath);
02167         flp-&gt;<a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> = <a class="code" href="rpmlib_8h.html#a42">RPMVERIFY_ALL</a>;
02168 
02169         <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a45">Stat</a>(diskURL, &amp;flp-&gt;<a class="code" href="structFileListRec__s.html#m0">fl_st</a>)) {
02170             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad file: %s: %s\n"</span>),
02171                 diskURL, <a class="code" href="popt_8c.html#a1">strerror</a>(<a class="code" href="system_8h.html#a29">errno</a>));
02172             fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
02173         }
02174 
02175         flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a> = <a class="code" href="group__rpmbuild.html#a13">getUname</a>(flp-&gt;fl_uid);
02176         flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a> = <a class="code" href="group__rpmbuild.html#a16">getGname</a>(flp-&gt;fl_gid);
02177         flp-&gt;<a class="code" href="structFileListRec__s.html#m8">langs</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(<span class="stringliteral">""</span>);
02178         
02179         fl.<a class="code" href="structFileList__s.html#m3">totalFileSize</a> += flp-&gt;fl_size;
02180         
02181         <span class="keywordflow">if</span> (! (flp-&gt;<a class="code" href="structFileListRec__s.html#m3">uname</a> &amp;&amp; flp-&gt;<a class="code" href="structFileListRec__s.html#m4">gname</a>)) {
02182             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a60">RPMERR_BADSPEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Bad owner/group: %s\n"</span>), diskURL);
02183             fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1;
02184         }
02185 
02186         isSpec = 0;
02187         x++;
02188     }
02189     fl.<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> = x;
02190     <a class="code" href="lib_2misc_8c.html#a4">freeSplitString</a>(files);
02191 
02192     <span class="keywordflow">if</span> (! fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a>) {
02193         <span class="keywordflow">if</span> (spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a> != NULL)
02194             <a class="code" href="files_8c.html#a51">genCpioListAndHeader</a>(&amp;fl, (<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> *)&amp;spec-&gt;<a class="code" href="structSpecStruct.html#m29">sourceCpioList</a>,
02195                         spec-&gt;<a class="code" href="structSpecStruct.html#m28">sourceHeader</a>, 1);
02196     }
02197 
02198     sourceFiles = <a class="code" href="stringbuf_8c.html#a4">freeStringBuf</a>(sourceFiles);
02199     fl.<a class="code" href="structFileList__s.html#m24">fileList</a> = <a class="code" href="files_8c.html#a52">freeFileList</a>(fl.<a class="code" href="structFileList__s.html#m24">fileList</a>, fl.<a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>);
02200     <span class="keywordflow">return</span> fl.<a class="code" href="structFileList__s.html#m4">processingFailed</a>;
02201 }
02202 
<a name="l02205"></a><a class="code" href="files_8c.html#a58">02205</a> <span class="keyword">static</span> <a class="code" href="structStringBufRec.html">StringBuf</a> <a class="code" href="files_8c.html#a58">getOutputFrom</a>(<span class="keywordtype">char</span> * dir, <span class="keywordtype">char</span> * argv[],
02206                         <span class="keyword">const</span> <span class="keywordtype">char</span> * writePtr, <span class="keywordtype">int</span> writeBytesLeft,
02207                         <span class="keywordtype">int</span> failNonZero)
02208         <span class="comment">/*@globals fileSystem, internalState@*/</span>
02209         <span class="comment">/*@modifies fileSystem, internalState@*/</span>
02210 {
02211     <span class="keywordtype">int</span> progPID;
02212     <span class="keywordtype">int</span> toProg[2];
02213     <span class="keywordtype">int</span> fromProg[2];
02214     <span class="keywordtype">int</span> status;
02215     <span class="keywordtype">void</span> *oldhandler;
02216     <a class="code" href="structStringBufRec.html">StringBuf</a> readBuff;
02217     <span class="keywordtype">int</span> done;
02218 
02219     <span class="comment">/*@-type@*/</span> <span class="comment">/* FIX: cast? */</span>
02220     oldhandler = signal(SIGPIPE, SIG_IGN);
02221     <span class="comment">/*@=type@*/</span>
02222 
02223     toProg[0] = toProg[1] = 0;
02224     (void) pipe(toProg);
02225     fromProg[0] = fromProg[1] = 0;
02226     (void) pipe(fromProg);
02227     
02228     <span class="keywordflow">if</span> (!(progPID = fork())) {
02229         (void) close(toProg[1]);
02230         (void) close(fromProg[0]);
02231         
02232         (void) dup2(toProg[0], STDIN_FILENO);   <span class="comment">/* Make stdin the in pipe */</span>
02233         (void) dup2(fromProg[1], STDOUT_FILENO); <span class="comment">/* Make stdout the out pipe */</span>
02234 
02235         (void) close(toProg[0]);
02236         (void) close(fromProg[1]);
02237 
02238         <span class="keywordflow">if</span> (dir) {
02239             (void) chdir(dir);
02240         }
02241         
02242         (void) execvp(argv[0], argv);
02243         <span class="comment">/* XXX this error message is probably not seen. */</span>
02244         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a56">RPMERR_EXEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Couldn't exec %s: %s\n"</span>),
02245                 argv[0], <a class="code" href="popt_8c.html#a1">strerror</a>(<a class="code" href="system_8h.html#a29">errno</a>));
02246         _exit(<a class="code" href="rpmerr_8h.html#a91a56">RPMERR_EXEC</a>);
02247     }
02248     <span class="keywordflow">if</span> (progPID &lt; 0) {
02249         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a57">RPMERR_FORK</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Couldn't fork %s: %s\n"</span>),
02250                 argv[0], <a class="code" href="popt_8c.html#a1">strerror</a>(<a class="code" href="system_8h.html#a29">errno</a>));
02251         <span class="keywordflow">return</span> NULL;
02252     }
02253 
02254     (void) close(toProg[0]);
02255     (void) close(fromProg[1]);
02256 
02257     <span class="comment">/* Do not block reading or writing from/to prog. */</span>
02258     (void) fcntl(fromProg[0], F_SETFL, O_NONBLOCK);
02259     (void) fcntl(toProg[1], F_SETFL, O_NONBLOCK);
02260     
02261     readBuff = <a class="code" href="stringbuf_8c.html#a3">newStringBuf</a>();
02262 
02263     <span class="keywordflow">do</span> {
02264         fd_set ibits, obits;
02265         <span class="keyword">struct </span>timeval tv;
02266         <span class="keywordtype">int</span> nfd, nbw, nbr;
02267         <span class="keywordtype">int</span> rc;
02268 
02269         done = 0;
02270 top:
02271         <span class="comment">/* XXX the select is mainly a timer since all I/O is non-blocking */</span>
02272         FD_ZERO(&amp;ibits);
02273         FD_ZERO(&amp;obits);
02274         <span class="keywordflow">if</span> (fromProg[0] &gt;= 0) {
02275             FD_SET(fromProg[0], &amp;ibits);
02276         }
02277         <span class="keywordflow">if</span> (toProg[1] &gt;= 0) {
02278             FD_SET(toProg[1], &amp;obits);
02279         }
02280         tv.tv_sec = 1;
02281         tv.tv_usec = 0;
02282         nfd = ((fromProg[0] &gt; toProg[1]) ? fromProg[0] : toProg[1]);
02283         <span class="keywordflow">if</span> ((rc = select(nfd, &amp;ibits, &amp;obits, NULL, &amp;tv)) &lt; 0) {
02284             <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a29">errno</a> == EINTR)
02285                 <span class="keywordflow">goto</span> top;
02286             <span class="keywordflow">break</span>;
02287         }
02288 
02289         <span class="comment">/* Write any data to program */</span>
02290         <span class="keywordflow">if</span> (toProg[1] &gt;= 0 &amp;&amp; FD_ISSET(toProg[1], &amp;obits)) {
02291           <span class="keywordflow">if</span> (writeBytesLeft) {
02292             <span class="keywordflow">if</span> ((nbw = write(toProg[1], writePtr,
02293                     (1024&lt;writeBytesLeft) ? 1024 : writeBytesLeft)) &lt; 0) {
02294                 <span class="keywordflow">if</span> (<a class="code" href="system_8h.html#a29">errno</a> != EAGAIN) {
02295                     perror(<span class="stringliteral">"getOutputFrom()"</span>);
02296                     exit(<a class="code" href="system_8h.html#a3">EXIT_FAILURE</a>);
02297                 }
02298                 nbw = 0;
02299             }
02300             writeBytesLeft -= nbw;
02301             writePtr += nbw;
02302           } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (toProg[1] &gt;= 0) {  <span class="comment">/* close write fd */</span>
02303             (void) close(toProg[1]);
02304             toProg[1] = -1;
02305           }
02306         }
02307         
02308         <span class="comment">/* Read any data from prog */</span>
02309         {   <span class="keywordtype">char</span> buf[BUFSIZ+1];
02310             <span class="keywordflow">while</span> ((nbr = read(fromProg[0], buf, <span class="keyword">sizeof</span>(buf)-1)) &gt; 0) {
02311                 buf[nbr] = <span class="charliteral">'\0'</span>;
02312                 <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(readBuff, buf);
02313             }
02314         }
02315 
02316         <span class="comment">/* terminate on (non-blocking) EOF or error */</span>
02317         done = (nbr == 0 || (nbr &lt; 0 &amp;&amp; <a class="code" href="system_8h.html#a29">errno</a> != EAGAIN));
02318 
02319     } <span class="keywordflow">while</span> (!done);
02320 
02321     <span class="comment">/* Clean up */</span>
02322     <span class="keywordflow">if</span> (toProg[1] &gt;= 0)
02323         (void) close(toProg[1]);
02324     <span class="keywordflow">if</span> (fromProg[0] &gt;= 0)
02325         (void) close(fromProg[0]);
02326     <span class="comment">/*@-type@*/</span> <span class="comment">/* FIX: cast? */</span>
02327     (void) signal(SIGPIPE, oldhandler);
02328     <span class="comment">/*@=type@*/</span>
02329 
02330     <span class="comment">/* Collect status from prog */</span>
02331     (void)waitpid(progPID, &amp;status, 0);
02332     <span class="keywordflow">if</span> (failNonZero &amp;&amp; (!WIFEXITED(status) || WEXITSTATUS(status))) {
02333         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a56">RPMERR_EXEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"%s failed\n"</span>), argv[0]);
02334         <span class="keywordflow">return</span> NULL;
02335     }
02336     <span class="keywordflow">if</span> (writeBytesLeft) {
02337         <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(<a class="code" href="rpmerr_8h.html#a91a56">RPMERR_EXEC</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"failed to write all data to %s\n"</span>), argv[0]);
02338         <span class="keywordflow">return</span> NULL;
02339     }
02340     <span class="keywordflow">return</span> readBuff;
02341 }
02342 
<a name="l02345"></a><a class="code" href="structDepMsg__t.html">02345</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l02346"></a><a class="code" href="structDepMsg__t.html#m0">02346</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * msg;
<a name="l02347"></a><a class="code" href="structDepMsg__t.html#m1">02347</a> <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * argv[4];
<a name="l02348"></a><a class="code" href="structDepMsg__t.html#m2">02348</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> ntag;
<a name="l02349"></a><a class="code" href="structDepMsg__t.html#m3">02349</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> vtag;
<a name="l02350"></a><a class="code" href="structDepMsg__t.html#m4">02350</a>     <a class="code" href="rpmlib_8h.html#a53">rpmTag</a> ftag;
<a name="l02351"></a><a class="code" href="structDepMsg__t.html#m5">02351</a>     <span class="keywordtype">int</span> mask;
<a name="l02352"></a><a class="code" href="structDepMsg__t.html#m6">02352</a>     <span class="keywordtype">int</span> xor;
02353 } <a class="code" href="structDepMsg__t.html">DepMsg_t</a>;
02354 
02357 <span class="comment">/*@-exportlocal -exportheadervar@*/</span>
02358 <span class="comment">/*@unchecked@*/</span>
<a name="l02359"></a><a class="code" href="files_8c.html#a23">02359</a> <a class="code" href="structDepMsg__t.html">DepMsg_t</a> <a class="code" href="files_8c.html#a23">depMsgs</a>[] = {
02360   { <span class="stringliteral">"Provides"</span>,         { <span class="stringliteral">"%{__find_provides}"</span>, NULL, NULL, NULL },
02361         <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>,
02362         0, -1 },
02363   { <span class="stringliteral">"PreReq"</span>,           { NULL, NULL, NULL, NULL },
02364         <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>,
02365         <a class="code" href="rpmlib_8h.html#a497a260">RPMSENSE_PREREQ</a>, 0 },
02366   { <span class="stringliteral">"Requires(interp)"</span>, { NULL, <span class="stringliteral">"interp"</span>, NULL, NULL },
02367         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02368         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a262">RPMSENSE_INTERP</a>), 0 },
02369   { <span class="stringliteral">"Requires(rpmlib)"</span>, { NULL, <span class="stringliteral">"rpmlib"</span>, NULL, NULL },
02370         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02371         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a278">RPMSENSE_RPMLIB</a>), 0 },
02372   { <span class="stringliteral">"Requires(verify)"</span>, { NULL, <span class="stringliteral">"verify"</span>, NULL, NULL },
02373         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02374         <a class="code" href="rpmlib_8h.html#a497a267">RPMSENSE_SCRIPT_VERIFY</a>, 0 },
02375   { <span class="stringliteral">"Requires(pre)"</span>,    { NULL, <span class="stringliteral">"pre"</span>, NULL, NULL },
02376         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02377         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a263">RPMSENSE_SCRIPT_PRE</a>), 0 },
02378   { <span class="stringliteral">"Requires(post)"</span>,   { NULL, <span class="stringliteral">"post"</span>, NULL, NULL },
02379         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02380         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a264">RPMSENSE_SCRIPT_POST</a>), 0 },
02381   { <span class="stringliteral">"Requires(preun)"</span>,  { NULL, <span class="stringliteral">"preun"</span>, NULL, NULL },
02382         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02383         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a265">RPMSENSE_SCRIPT_PREUN</a>), 0 },
02384   { <span class="stringliteral">"Requires(postun)"</span>, { NULL, <span class="stringliteral">"postun"</span>, NULL, NULL },
02385         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,
02386         <a class="code" href="rpmlib_8h.html#a20">_notpre</a>(<a class="code" href="rpmlib_8h.html#a497a266">RPMSENSE_SCRIPT_POSTUN</a>), 0 },
02387   { <span class="stringliteral">"Requires"</span>,         { <span class="stringliteral">"%{__find_requires}"</span>, NULL, NULL, NULL },
02388         -1, -1, <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>,    <span class="comment">/* XXX inherit name/version arrays */</span>
02389         <a class="code" href="rpmlib_8h.html#a497a260">RPMSENSE_PREREQ</a>, <a class="code" href="rpmlib_8h.html#a497a260">RPMSENSE_PREREQ</a> },
02390   { <span class="stringliteral">"Conflicts"</span>,        { <span class="stringliteral">"%{__find_conflicts}"</span>, NULL, NULL, NULL },
02391         <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>,
02392         0, -1 },
02393   { <span class="stringliteral">"Obsoletes"</span>,        { <span class="stringliteral">"%{__find_obsoletes}"</span>, NULL, NULL, NULL },
02394         <a class="code" href="rpmlib_8h.html#a494a194">RPMTAG_OBSOLETENAME</a>, <a class="code" href="rpmlib_8h.html#a494a219">RPMTAG_OBSOLETEVERSION</a>, <a class="code" href="rpmlib_8h.html#a494a218">RPMTAG_OBSOLETEFLAGS</a>,
02395         0, -1 },
02396   { NULL,               { NULL, NULL, NULL, NULL },     0, 0, 0, 0, 0 }
02397 };
02398 <span class="comment">/*@=exportlocal =exportheadervar@*/</span>
02399 
<a name="l02402"></a><a class="code" href="files_8c.html#a59">02402</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a59">generateDepends</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <a class="code" href="structPackageStruct.html">Package</a> pkg, <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> cpioList, <span class="keywordtype">int</span> <a class="code" href="files_8c.html#a18">multiLib</a>)
02403         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
02404 <span class="comment">                fileSystem, internalState @*/</span>
02405         <span class="comment">/*@modifies cpioList, rpmGlobalMacroContext,</span>
02406 <span class="comment">                fileSystem, internalState @*/</span>
02407 {
02408     <a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> fi = cpioList;
02409     <a class="code" href="structStringBufRec.html">StringBuf</a> writeBuf;
02410     <span class="keywordtype">int</span> writeBytes;
02411     <a class="code" href="structStringBufRec.html">StringBuf</a> readBuf;
02412     <a class="code" href="structDepMsg__t.html">DepMsg_t</a> *dm;
02413     <span class="keywordtype">char</span> ** myargv;
02414     <span class="keywordtype">int</span> failnonzero = 0;
02415     <span class="keywordtype">int</span> rc = 0;
02416     <span class="keywordtype">int</span> ac;
02417     <span class="keywordtype">int</span> i;
02418 
02419     myargv = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(5, <span class="keyword">sizeof</span>(*myargv));
02420 
02421     <span class="keywordflow">if</span> (!(fi &amp;&amp; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> &gt; 0))
02422         <span class="keywordflow">return</span> 0;
02423 
02424     <span class="keywordflow">if</span> (! (pkg-&gt;<a class="code" href="structPackageStruct.html#m3">autoReq</a> || pkg-&gt;<a class="code" href="structPackageStruct.html#m4">autoProv</a>))
02425         <span class="keywordflow">return</span> 0;
02426     
02427     writeBuf = <a class="code" href="stringbuf_8c.html#a3">newStringBuf</a>();
02428     <span class="keywordflow">for</span> (i = 0, writeBytes = 0; i &lt; fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) {
02429 
02430         <span class="keywordflow">if</span> (fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> &amp;&amp; <a class="code" href="files_8c.html#a18">multiLib</a> == 2) {
02431             <span class="keywordflow">if</span> (!(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] &amp; <a class="code" href="group__payload.html#a25a42">CPIO_MULTILIB</a>))
02432                 <span class="keywordflow">continue</span>;
02433             fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] &amp;= ~<a class="code" href="group__payload.html#a25a42">CPIO_MULTILIB</a>;
02434         }
02435 
02436         <a class="code" href="stringbuf_8h.html#a0">appendStringBuf</a>(writeBuf, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]);
02437         writeBytes += strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]);
02438         <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(writeBuf, fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]);
02439         writeBytes += strlen(fi-&gt;<a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) + 1;
02440     }
02441 
02442     <span class="keywordflow">for</span> (dm = depMsgs; dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a> != NULL; dm++) {
02443         <span class="keywordtype">int</span> tag, tagflags;
02444 
02445         tag = (dm-&gt;<a class="code" href="structDepMsg__t.html#m4">ftag</a> &gt; 0) ? dm-&gt;<a class="code" href="structDepMsg__t.html#m4">ftag</a> : dm-&gt;<a class="code" href="structDepMsg__t.html#m2">ntag</a>;
02446         tagflags = 0;
02447 
02448         <span class="keywordflow">switch</span>(tag) {
02449         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a216">RPMTAG_PROVIDEFLAGS</a>:
02450             <span class="keywordflow">if</span> (!pkg-&gt;<a class="code" href="structPackageStruct.html#m4">autoProv</a>)
02451                 <span class="keywordflow">continue</span>;
02452             failnonzero = 1;
02453             tagflags = <a class="code" href="rpmlib_8h.html#a497a269">RPMSENSE_FIND_PROVIDES</a>;
02454             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02455         <span class="keywordflow">case</span> <a class="code" href="rpmlib_8h.html#a494a161">RPMTAG_REQUIREFLAGS</a>:
02456             <span class="keywordflow">if</span> (!pkg-&gt;<a class="code" href="structPackageStruct.html#m3">autoReq</a>)
02457                 <span class="keywordflow">continue</span>;
02458             failnonzero = 0;
02459             tagflags = <a class="code" href="rpmlib_8h.html#a497a268">RPMSENSE_FIND_REQUIRES</a>;
02460             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02461         <span class="keywordflow">default</span>:
02462             <span class="keywordflow">continue</span>;
02463             <span class="comment">/*@notreached@*/</span> <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02464         }
02465 
02466         <span class="comment">/* Get the script name (and possible args) to run */</span>
02467         <span class="keywordflow">if</span> (dm-&gt;<a class="code" href="structDepMsg__t.html#m1">argv</a>[0] != NULL) {
02468             <span class="keyword">const</span> <span class="keywordtype">char</span> ** av;
02469             <span class="keywordtype">char</span> * s;
02470 
02471             <span class="comment">/*@-nullderef@*/</span>    <span class="comment">/* FIX: double indirection. @*/</span>
02472             s = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(dm-&gt;<a class="code" href="structDepMsg__t.html#m1">argv</a>[0], NULL);
02473             <span class="comment">/*@=nullderef@*/</span>
02474             <span class="keywordflow">if</span> (!(s != NULL &amp;&amp; *s != <span class="charliteral">'%'</span> &amp;&amp; *s != <span class="charliteral">'\0'</span>)) {
02475                 s = <a class="code" href="poptint_8h.html#a14">_free</a>(s);
02476                 <span class="keywordflow">continue</span>;
02477             }
02478 
02479             <span class="keywordflow">if</span> (!(i = <a class="code" href="group__popt.html#a2">poptParseArgvString</a>(s, &amp;ac, (<span class="keyword">const</span> <span class="keywordtype">char</span> ***)&amp;av))
02480             &amp;&amp; ac &gt; 0 &amp;&amp; av != NULL)
02481             {
02482                 myargv = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(myargv, (ac + 5) * <span class="keyword">sizeof</span>(*myargv));
02483                 <span class="keywordflow">for</span> (i = 0; i &lt; ac; i++)
02484                     myargv[i] = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(av[i]);
02485             }
02486             av = <a class="code" href="poptint_8h.html#a14">_free</a>(av);
02487             s = <a class="code" href="poptint_8h.html#a14">_free</a>(s);
02488         }
02489 
02490         <span class="keywordflow">if</span> (myargv[0] == NULL)
02491             <span class="keywordflow">continue</span>;
02492 
02493         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Finding  %s: (using %s)...\n"</span>),
02494                 dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a>, myargv[0]);
02495 
02496 <span class="preprocessor">#if 0</span>
02497 <span class="preprocessor"></span>        <span class="keywordflow">if</span> (*myargv[0] != <span class="charliteral">'/'</span>) {        <span class="comment">/* XXX FIXME: stat script here */</span>
02498             myargv[0] = <a class="code" href="poptint_8h.html#a14">_free</a>(myargv[0]);
02499             <span class="keywordflow">continue</span>;
02500         }
02501 <span class="preprocessor">#endif</span>
02502 <span class="preprocessor"></span>
02503         <span class="comment">/* Expand rest of script arguments (if any) */</span>
02504         <span class="keywordflow">for</span> (i = 1; i &lt; 4; i++) {
02505             <span class="keywordflow">if</span> (dm-&gt;<a class="code" href="structDepMsg__t.html#m1">argv</a>[i] == NULL)
02506                 <span class="keywordflow">break</span>;
02507             <span class="comment">/*@-nullderef@*/</span>    <span class="comment">/* FIX: double indirection. @*/</span>
02508             myargv[ac++] = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(dm-&gt;<a class="code" href="structDepMsg__t.html#m1">argv</a>[i], NULL);
02509             <span class="comment">/*@=nullderef@*/</span>
02510         }
02511 
02512         myargv[ac] = NULL;
02513         readBuf = <a class="code" href="files_8c.html#a58">getOutputFrom</a>(NULL, myargv,
02514                         <a class="code" href="stringbuf_8c.html#a7">getStringBuf</a>(writeBuf), writeBytes, failnonzero);
02515 
02516         <span class="comment">/* Free expanded args */</span>
02517         <span class="keywordflow">for</span> (i = 0; i &lt; ac; i++)
02518             myargv[i] = <a class="code" href="poptint_8h.html#a14">_free</a>(myargv[i]);
02519 
02520         <span class="keywordflow">if</span> (readBuf == NULL) {
02521             rc = <a class="code" href="rpmerr_8h.html#a91a56">RPMERR_EXEC</a>;
02522             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(rc, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Failed to find %s:\n"</span>), dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a>);
02523             <span class="keywordflow">break</span>;
02524         }
02525 
02526         <span class="comment">/* Parse dependencies into header */</span>
02527         tagflags &amp;= ~<a class="code" href="rpmlib_8h.html#a497a273">RPMSENSE_MULTILIB</a>;
02528         <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a18">multiLib</a> &gt; 1)
02529             tagflags |=  <a class="code" href="rpmlib_8h.html#a497a273">RPMSENSE_MULTILIB</a>;
02530         <span class="keywordflow">else</span>
02531             tagflags &amp;= ~<a class="code" href="rpmlib_8h.html#a497a273">RPMSENSE_MULTILIB</a>;
02532         rc = <a class="code" href="group__rpmbuild.html#a33">parseRCPOT</a>(spec, pkg, <a class="code" href="stringbuf_8c.html#a7">getStringBuf</a>(readBuf), tag, 0, tagflags);
02533         readBuf = <a class="code" href="stringbuf_8c.html#a4">freeStringBuf</a>(readBuf);
02534 
02535         <span class="keywordflow">if</span> (rc) {
02536             <a class="code" href="rpmerr_8h.html#a5">rpmError</a>(rc, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Failed to find %s:\n"</span>), dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a>);
02537             <span class="keywordflow">break</span>;
02538         }
02539     }
02540 
02541     writeBuf = <a class="code" href="stringbuf_8c.html#a4">freeStringBuf</a>(writeBuf);
02542     myargv = <a class="code" href="poptint_8h.html#a14">_free</a>(myargv);
02543     <span class="keywordflow">return</span> rc;
02544 }
02545 
<a name="l02548"></a><a class="code" href="files_8c.html#a60">02548</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a60">printDepMsg</a>(<a class="code" href="structDepMsg__t.html">DepMsg_t</a> * dm, <span class="keywordtype">int</span> count, <span class="keyword">const</span> <span class="keywordtype">char</span> ** names,
02549                 <span class="keyword">const</span> <span class="keywordtype">char</span> ** versions, <span class="keywordtype">int</span> *flags)
02550         <span class="comment">/*@*/</span>
02551 {
02552     <span class="keywordtype">int</span> hasVersions = (versions != NULL);
02553     <span class="keywordtype">int</span> hasFlags = (flags != NULL);
02554     <span class="keywordtype">int</span> bingo = 0;
02555     <span class="keywordtype">int</span> i;
02556 
02557     <span class="keywordflow">for</span> (i = 0; i &lt; count; i++, names++, versions++, flags++) {
02558         <span class="keywordflow">if</span> (hasFlags &amp;&amp; !((*flags &amp; dm-&gt;<a class="code" href="structDepMsg__t.html#m5">mask</a>) ^ dm-&gt;<a class="code" href="structDepMsg__t.html#m6">xor</a>))
02559             <span class="keywordflow">continue</span>;
02560         <span class="keywordflow">if</span> (bingo == 0) {
02561             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">"%s:"</span>, (dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a> ? dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a> : <span class="stringliteral">""</span>));
02562             bingo = 1;
02563         }
02564         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">" %s"</span>, *names);
02565 
02566         <span class="keywordflow">if</span> (hasFlags &amp;&amp; <a class="code" href="rpmlib_8h.html#a18">isDependsMULTILIB</a>(*flags))
02567             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">" (multilib)"</span>);
02568 
02569         <span class="keywordflow">if</span> (hasVersions &amp;&amp; !(*versions != NULL &amp;&amp; **versions != <span class="charliteral">'\0'</span>))
02570             <span class="keywordflow">continue</span>;
02571         <span class="keywordflow">if</span> (!(hasFlags &amp;&amp; (*flags &amp;&amp; <a class="code" href="rpmlib_8h.html#a16">RPMSENSE_SENSEMASK</a>)))
02572             <span class="keywordflow">continue</span>;
02573 
02574         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">" "</span>);
02575         <span class="keywordflow">if</span> (*flags &amp; <a class="code" href="rpmlib_8h.html#a497a255">RPMSENSE_LESS</a>)
02576             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">"&lt;"</span>);
02577         <span class="keywordflow">if</span> (*flags &amp; <a class="code" href="rpmlib_8h.html#a497a256">RPMSENSE_GREATER</a>)
02578             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">"&gt;"</span>);
02579         <span class="keywordflow">if</span> (*flags &amp; <a class="code" href="rpmlib_8h.html#a497a257">RPMSENSE_EQUAL</a>)
02580             <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">"="</span>);
02581 
02582         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">" %s"</span>, *versions);
02583     }
02584     <span class="keywordflow">if</span> (bingo)
02585         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <span class="stringliteral">"\n"</span>);
02586 }
02587 
<a name="l02590"></a><a class="code" href="files_8c.html#a61">02590</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="files_8c.html#a61">printDeps</a>(<a class="code" href="structheaderToken.html">Header</a> h)
02591         <span class="comment">/*@*/</span>
02592 {
02593     <a class="code" href="rpmlib_8h.html#a69">HGE_t</a> hge = (HGE_t)headerGetEntryMinMemory;
02594     <a class="code" href="rpmlib_8h.html#a68">HFD_t</a> hfd = headerFreeData;
02595     <span class="keyword">const</span> <span class="keywordtype">char</span> ** names = NULL;
02596     <a class="code" href="group__header.html#a13">rpmTagType</a> dnt = -1;
02597     <span class="keyword">const</span> <span class="keywordtype">char</span> ** versions = NULL;
02598     <a class="code" href="group__header.html#a13">rpmTagType</a> dvt = -1;
02599     <span class="keywordtype">int</span> * flags = NULL;
02600     <a class="code" href="structDepMsg__t.html">DepMsg_t</a> * dm;
02601     <span class="keywordtype">int</span> count, xx;
02602 
02603     <span class="keywordflow">for</span> (dm = depMsgs; dm-&gt;<a class="code" href="structDepMsg__t.html#m0">msg</a> != NULL; dm++) {
02604         <span class="keywordflow">switch</span> (dm-&gt;<a class="code" href="structDepMsg__t.html#m2">ntag</a>) {
02605         <span class="keywordflow">case</span> 0:
02606             names = hfd(names, dnt);
02607             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02608         <span class="keywordflow">case</span> -1:
02609             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02610         <span class="keywordflow">default</span>:
02611             names = hfd(names, dnt);
02612             <span class="keywordflow">if</span> (!hge(h, dm-&gt;<a class="code" href="structDepMsg__t.html#m2">ntag</a>, &amp;dnt, (<span class="keywordtype">void</span> **) &amp;names, &amp;count))
02613                 <span class="keywordflow">continue</span>;
02614             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02615         }
02616         <span class="keywordflow">switch</span> (dm-&gt;<a class="code" href="structDepMsg__t.html#m3">vtag</a>) {
02617         <span class="keywordflow">case</span> 0:
02618             versions = hfd(versions, dvt);
02619             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02620         <span class="keywordflow">case</span> -1:
02621             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02622         <span class="keywordflow">default</span>:
02623             versions = hfd(versions, dvt);
02624             xx = hge(h, dm-&gt;<a class="code" href="structDepMsg__t.html#m3">vtag</a>, &amp;dvt, (<span class="keywordtype">void</span> **) &amp;versions, NULL);
02625             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02626         }
02627         <span class="keywordflow">switch</span> (dm-&gt;<a class="code" href="structDepMsg__t.html#m4">ftag</a>) {
02628         <span class="keywordflow">case</span> 0:
02629             flags = NULL;
02630             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02631         <span class="keywordflow">case</span> -1:
02632             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02633         <span class="keywordflow">default</span>:
02634             xx = hge(h, dm-&gt;<a class="code" href="structDepMsg__t.html#m4">ftag</a>, NULL, (<span class="keywordtype">void</span> **) &amp;flags, NULL);
02635             <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>;
02636         }
02637         <span class="comment">/*@-noeffect@*/</span>
02638         <a class="code" href="files_8c.html#a60">printDepMsg</a>(dm, count, names, versions, flags);
02639         <span class="comment">/*@=noeffect@*/</span>
02640     }
02641     names = hfd(names, dnt);
02642     versions = hfd(versions, dvt);
02643 }
02644 
<a name="l02645"></a><a class="code" href="group__rpmbuild.html#a44">02645</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmbuild.html#a44">processBinaryFiles</a>(<a class="code" href="structSpecStruct.html">Spec</a> spec, <span class="keywordtype">int</span> installSpecialDoc, <span class="keywordtype">int</span> test)
02646 {
02647     <a class="code" href="structPackageStruct.html">Package</a> pkg;
02648     <span class="keywordtype">int</span> res = 0;
02649     
02650     <span class="keywordflow">for</span> (pkg = spec-&gt;<a class="code" href="structSpecStruct.html#m35">packages</a>; pkg != NULL; pkg = pkg-&gt;<a class="code" href="structPackageStruct.html#m14">next</a>) {
02651         <span class="keyword">const</span> <span class="keywordtype">char</span> *n, *v, *r;
02652         <span class="keywordtype">int</span> rc;
02653 
02654         <span class="keywordflow">if</span> (pkg-&gt;<a class="code" href="structPackageStruct.html#m13">fileList</a> == NULL)
02655             <span class="keywordflow">continue</span>;
02656 
02657         (void) <a class="code" href="group__header.html#a88">headerNVR</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, &amp;n, &amp;v, &amp;r);
02658         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a2">RPMMESS_NORMAL</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Processing files: %s-%s-%s\n"</span>), n, v, r);
02659                    
02660         <span class="keywordflow">if</span> ((rc = <a class="code" href="files_8c.html#a55">processPackageFiles</a>(spec, pkg, installSpecialDoc, test)))
02661             res = rc;
02662 
02663     <span class="comment">/* XXX This should be added always so that packages look alike.</span>
02664 <span class="comment">     * XXX However, there is logic in files.c/depends.c that checks for</span>
02665 <span class="comment">     * XXX existence (rather than value) that will need to change as well.</span>
02666 <span class="comment">     */</span>
02667         <span class="keywordflow">if</span> (<a class="code" href="group__header.html#a34">headerIsEntry</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>, <a class="code" href="rpmlib_8h.html#a494a231">RPMTAG_MULTILIBS</a>)) {
02668             (void) <a class="code" href="files_8c.html#a59">generateDepends</a>(spec, pkg, pkg-&gt;<a class="code" href="structPackageStruct.html#m1">cpioList</a>, 1);
02669             (void) <a class="code" href="files_8c.html#a59">generateDepends</a>(spec, pkg, pkg-&gt;<a class="code" href="structPackageStruct.html#m1">cpioList</a>, 2);
02670         } <span class="keywordflow">else</span>
02671             (void) <a class="code" href="files_8c.html#a59">generateDepends</a>(spec, pkg, pkg-&gt;<a class="code" href="structPackageStruct.html#m1">cpioList</a>, 0);
02672         <span class="comment">/*@-noeffect@*/</span>
02673         <a class="code" href="files_8c.html#a61">printDeps</a>(pkg-&gt;<a class="code" href="structPackageStruct.html#m0">header</a>);
02674         <span class="comment">/*@=noeffect@*/</span>
02675     }
02676 
02677     <span class="keywordflow">return</span> res;
02678 }
</pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:14:55 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>