<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>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 <regex.h></span> 00012 <span class="preprocessor">#include <signal.h></span> <span class="comment">/* getOutputFrom() */</span> 00013 00014 <span class="preprocessor">#include <<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>></span> 00015 <span class="preprocessor">#include <<a class="code" href="rpmbuild_8h.html">rpmbuild.h</a>></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) && (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) &&!(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 << 0), 00041 <a class="code" href="files_8c.html#a63a25">SPECD_DEFDIRMODE</a> = (1 << 1), 00042 <a class="code" href="files_8c.html#a63a26">SPECD_DEFUID</a> = (1 << 2), 00043 <a class="code" href="files_8c.html#a63a27">SPECD_DEFGID</a> = (1 << 3), 00044 <a class="code" href="files_8c.html#a63a28">SPECD_DEFVERIFY</a> = (1 << 4), 00045 00046 <a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a> = (1 << 8), 00047 <a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a> = (1 << 9), 00048 <a class="code" href="files_8c.html#a63a31">SPECD_UID</a> = (1 << 10), 00049 <a class="code" href="files_8c.html#a63a32">SPECD_GID</a> = (1 << 11), 00050 <a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a> = (1 << 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-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = NULL; 00139 ar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = NULL; 00140 ar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a> = NULL; 00141 ar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a> = NULL; 00142 ar-><a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> = 0; 00143 ar-><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-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>); 00151 ar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>); 00152 ar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a>); 00153 ar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(ar-><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-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> = (oar-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>) : NULL); 00169 nar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> = (oar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-><a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>) : NULL); 00170 nar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a> = (oar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a>) : NULL); 00171 nar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a> = (oar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a> ? <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(oar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a>) : NULL); 00172 nar-><a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> = oar-><a class="code" href="structAttrRec__s.html#m4">ar_fmode</a>; 00173 nar-><a class="code" href="structAttrRec__s.html#m5">ar_dmode</a> = oar-><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-><a class="code" href="structAttrRec__s.html#m0">ar_fmodestr</a>, 00187 ar-><a class="code" href="structAttrRec__s.html#m2">ar_user</a>, 00188 ar-><a class="code" href="structAttrRec__s.html#m3">ar_group</a>, 00189 ar-><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>, &fnt, (<span class="keywordtype">void</span> **) &files, &count); 00270 x = hge(h, <a class="code" href="rpmlib_8h.html#a494a147">RPMTAG_FILEMTIMES</a>, NULL, (<span class="keywordtype">void</span> **) &mtime, NULL); 00271 00272 <span class="keywordflow">for</span> (x = 0; x < count; x++) { 00273 <span class="keywordflow">if</span> ((currentTime - mtime[x]) > 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->processingFailed,</span> 00308 <span class="comment"> fl->currentVerifyFlags, fl->defVerifyFlags,</span> 00309 <span class="comment"> fl->currentSpecdFlags, fl->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 = &(fl-><a class="code" href="structFileList__s.html#m15">currentVerifyFlags</a>); 00320 <a class="code" href="files_8c.html#a15">specdFlags</a> = &fl-><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 = &(fl-><a class="code" href="structFileList__s.html#m19">defVerifyFlags</a>); 00323 <a class="code" href="files_8c.html#a15">specdFlags</a> = &fl-><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) < 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-><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 && *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-><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 <= 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-><a class="code" href="structVFA.html#m0">attribute</a> != NULL; vfa++) { 00370 <span class="keywordflow">if</span> (strcmp(p, vfa-><a class="code" href="structVFA.html#m0">attribute</a>)) 00371 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 00372 verifyFlags |= vfa-><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-><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-><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] == '-' && (_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->processingFailed,</span> 00402 <span class="comment"> fl->noGlob, fl->devtype, fl->devmajor, fl->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) < 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 && *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 <= 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-><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-><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 && <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-><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-><a class="code" href="structFileList__s.html#m9">devmajor</a> >= 0 && fl-><a class="code" href="structFileList__s.html#m9">devmajor</a> < 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 && <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-><a class="code" href="structFileList__s.html#m10">devminor</a> = atoi(p); 00472 <span class="keywordflow">if</span> (!(fl-><a class="code" href="structFileList__s.html#m10">devminor</a> >= 0 && fl-><a class="code" href="structFileList__s.html#m10">devminor</a> < 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-><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-><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->processingFailed,</span> 00500 <span class="comment"> fl->cur_ar, fl->def_ar,</span> 00501 <span class="comment"> fl->currentSpecdFlags, fl->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 = &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 = &(fl-><a class="code" href="structFileList__s.html#m16">cur_ar</a>); 00512 <a class="code" href="files_8c.html#a15">specdFlags</a> = &fl-><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 = &(fl-><a class="code" href="structFileList__s.html#m17">def_ar</a>); 00515 <a class="code" href="files_8c.html#a15">specdFlags</a> = &fl-><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) < 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-><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 && *pe != <span class="charliteral">')'</span>; pe++) 00533 {}; 00534 00535 <span class="keywordflow">if</span> (ret_ar == &(fl-><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-><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 <= 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->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->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->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> && ret_ar == &(fl-><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->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->ar_fmodestr && ar->ar_user && ar->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-><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->ar_fmodestr && !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar->ar_fmodestr)) { 00586 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ui; 00587 x = sscanf(ar->ar_fmodestr, <span class="stringliteral">"%o"</span>, &ui); 00588 <span class="keywordflow">if</span> ((x == 0) || (ar->ar_fmode & ~<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-><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->ar_fmode = ui; 00594 } <span class="keywordflow">else</span> 00595 ar->ar_fmodestr = NULL; 00596 00597 <span class="keywordflow">if</span> (ar->ar_dmodestr && !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar->ar_dmodestr)) { 00598 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ui; 00599 x = sscanf(ar->ar_dmodestr, <span class="stringliteral">"%o"</span>, &ui); 00600 <span class="keywordflow">if</span> ((x == 0) || (ar->ar_dmode & ~<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-><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->ar_dmode = ui; 00606 } <span class="keywordflow">else</span> 00607 ar->ar_dmodestr = NULL; 00608 00609 <span class="keywordflow">if</span> (!(ar->ar_user && !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar->ar_user))) 00610 ar->ar_user = NULL; 00611 00612 <span class="keywordflow">if</span> (!(ar->ar_group && !<a class="code" href="files_8c.html#a13">isAttrDefault</a>(ar->ar_group))) 00613 ar->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->processingFailed,</span> 00628 <span class="comment"> fl->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-><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) < 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 && *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-><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 <= 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-><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-><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-><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->processingFailed,</span> 00696 <span class="comment"> fl->currentLangs, fl->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) < 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-><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 && *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-><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 <= 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 < 1 || (np == 1 && *p != 'C') || np >= 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-><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-><a class="code" href="structFileList__s.html#m21">currentLangs</a> != NULL) 00754 <span class="keywordflow">for</span> (i = 0; i < fl-><a class="code" href="structFileList__s.html#m20">nLangs</a>; i++) { 00755 <span class="keywordflow">if</span> (strncmp(fl-><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-><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-><a class="code" href="structFileList__s.html#m21">currentLangs</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fl-><a class="code" href="structFileList__s.html#m21">currentLangs</a>, 00765 (fl-><a class="code" href="structFileList__s.html#m20">nLangs</a> + 1) * <span class="keyword">sizeof</span>(*fl-><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-><a class="code" href="structFileList__s.html#m21">currentLangs</a>[fl-><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-><a class="code" href="structFileList__s.html#m21">currentLangs</a>) 00776 qsort(fl-><a class="code" href="structFileList__s.html#m21">currentLangs</a>, fl-><a class="code" href="structFileList__s.html#m20">nLangs</a>, <span class="keyword">sizeof</span>(*fl-><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 && *patt != <span class="charliteral">'%'</span>)) 00799 rc = 1; 00800 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (regcomp(&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(&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 && *patt != <span class="charliteral">'%'</span>)) 00842 rc = 1; 00843 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (regcomp(&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(&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->processingFailed, *fileName,</span> 00889 <span class="comment"> fl->currentFlags,</span> 00890 <span class="comment"> fl->docDirs, fl->docDirCount, fl->isDir,</span> 00891 <span class="comment"> fl->passedSpecialDoc, fl->isSpecialDoc,</span> 00892 <span class="comment"> pkg->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-><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-><a class="code" href="structFileList__s.html#m4">processingFailed</a> = 1; 00910 res = 1; 00911 } 00912 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>(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-><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-><a class="code" href="structVFA.html#m0">attribute</a> != NULL; vfa++) { 00924 <span class="keywordflow">if</span> (strcmp(s, vfa-><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-><a class="code" href="structVFA.html#m1">flag</a>) { 00927 <span class="keywordflow">if</span> (!strcmp(s, <span class="stringliteral">"%dir"</span>)) 00928 fl-><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-><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-><a class="code" href="structFileList__s.html#m13">currentFlags</a> |= vfa-><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-><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-><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-><a class="code" href="structFileList__s.html#m13">currentFlags</a> & <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-><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-><a class="code" href="structFileList__s.html#m13">currentFlags</a> & ~(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-><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-><a class="code" href="structPackageStruct.html#m0">header</a>, &n, &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-><a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a>) { 00988 pkg-><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-><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-><a class="code" href="structPackageStruct.html#m10">specialDoc</a>, buf); 00991 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-><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-><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-><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-><a class="code" href="structFileList__s.html#m5">passedSpecialDoc</a> = 1; 00999 fl-><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-><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-><a class="code" href="structPackageStruct.html#m10">specialDoc</a>, specialDocBuf); 01004 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(pkg-><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)->fileURL; 01016 <span class="keyword">const</span> <span class="keywordtype">char</span> *b = ((FileListRec)bp)->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-><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-><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 < fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; i++) { 01048 01049 ilp = fl-><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->fl_mode) && ilp->fl_nlink > 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 < fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; j++) { 01057 jlp = fl-><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->fl_mode)) 01061 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 01062 <span class="keywordflow">if</span> (ilp->fl_nlink != jlp->fl_nlink) 01063 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 01064 <span class="keywordflow">if</span> (ilp->fl_ino != jlp->fl_ino) 01065 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 01066 <span class="keywordflow">if</span> (ilp->fl_dev != jlp->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-><a class="code" href="structFileListRec__s.html#m8">langs</a>, jlp-><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->processingFailed, fl->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-><a class="code" href="structFileList__s.html#m24">fileList</a>, fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>, 01101 <span class="keyword">sizeof</span>(*(fl-><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-><a class="code" href="structFileList__s.html#m1">prefix</a>) 01107 skipLen += strlen(fl-><a class="code" href="structFileList__s.html#m1">prefix</a>); 01108 } 01109 01110 <span class="keywordflow">for</span> (i = 0, flp = fl-><a class="code" href="structFileList__s.html#m24">fileList</a>; i < fl-><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 < (fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> - 1) && 01115 !strcmp(flp-><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-><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> & <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-><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->fl_mode)) { 01129 <span class="keywordflow">if</span> ((flp[1].<a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<a class="code" href="files_8c.html#a63a30">SPECD_DIRMODE</a> | <a class="code" href="files_8c.html#a63a25">SPECD_DEFDIRMODE</a>)) < 01130 (flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<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->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> & (<a class="code" href="files_8c.html#a63a29">SPECD_FILEMODE</a> | <a class="code" href="files_8c.html#a63a24">SPECD_DEFFILEMODE</a>)) < 01134 (flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<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->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> & (<a class="code" href="files_8c.html#a63a31">SPECD_UID</a> | <a class="code" href="files_8c.html#a63a26">SPECD_DEFUID</a>)) < 01140 (flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<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->fl_uid; 01143 flp[1].<a class="code" href="structFileListRec__s.html#m3">uname</a> = flp-><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> & (<a class="code" href="files_8c.html#a63a32">SPECD_GID</a> | <a class="code" href="files_8c.html#a63a27">SPECD_DEFGID</a>)) < 01148 (flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<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->fl_gid; 01151 flp[1].<a class="code" href="structFileListRec__s.html#m4">gname</a> = flp-><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> & (<a class="code" href="files_8c.html#a63a33">SPECD_VERIFY</a> | <a class="code" href="files_8c.html#a63a28">SPECD_DEFVERIFY</a>)) < 01156 (flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> & (<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-><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-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <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-><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-><a class="code" href="structFileListRec__s.html#m1">diskURL</a>) + 2); 01172 01173 <span class="keywordflow">if</span> (flp-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>) 01174 multiLibMask |= 01175 (1u << ((flp-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>)) 01176 >> <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 &(flp-><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->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->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 &(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 &(flp->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 &(flp-><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 &(flp-><a class="code" href="structFileListRec__s.html#m4">gname</a>), 1); 01199 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp->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->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 &(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 &(flp->fl_mtime), 1); 01206 } 01207 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp->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->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 &(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 &(flp->fl_mode), 1); 01214 } 01215 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp->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->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 &(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 &(flp->fl_rdev), 1); 01222 } 01223 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp->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->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 &(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 &(flp->fl_dev), 1); 01230 } 01231 <span class="keywordflow">if</span> (<span class="keyword">sizeof</span>(flp->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->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 &(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 &(flp->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 &(flp-><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, &(flp->fl_uid), 1);</span> 01247 <span class="comment"> * (void) headerAddOrAppendEntry(h, RPMTAG_FILEGIDS,</span> 01248 <span class="comment"> * RPM_INT32_TYPE, &(flp->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->fl_mode)) 01253 (void) <a class="code" href="lib_2misc_8c.html#a22">domd5</a>(flp-><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 &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->fl_mode)) { 01260 buf[<a class="code" href="rpmrpc_8c.html#a47">Readlink</a>(flp-><a class="code" href="structFileListRec__s.html#m1">diskURL</a>, buf, BUFSIZ)] = <span class="charliteral">'\0'</span>; 01261 <span class="keywordflow">if</span> (fl-><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-><a class="code" href="structFileList__s.html#m0">buildRootURL</a>, &buildRoot); 01264 01265 <span class="keywordflow">if</span> (buf[0] == <span class="charliteral">'/'</span> && strcmp(buildRoot, <span class="stringliteral">"/"</span>) && 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 -> %s\n"</span>), 01269 flp-><a class="code" href="structFileListRec__s.html#m2">fileURL</a>, buf); 01270 fl-><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 &s, 1); 01277 01278 <span class="keywordflow">if</span> (flp-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a>) { 01279 flp-><a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> &= ~(<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 &(flp-><a class="code" href="structFileListRec__s.html#m7">verifyFlags</a>), 1); 01284 01285 <span class="keywordflow">if</span> (!isSrc && <a class="code" href="files_8c.html#a49">isDoc</a>(fl, flp-><a class="code" href="structFileListRec__s.html#m2">fileURL</a>)) 01286 flp-><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->fl_mode)) 01289 flp-><a class="code" href="structFileListRec__s.html#m5">flags</a> &= ~(<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 &(flp-><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 &(fl-><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 &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-><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-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>); 01324 fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>); 01325 01326 fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>) + dpathlen); 01327 d = (<span class="keywordtype">char</span> *)(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a> + fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01328 *d = <span class="charliteral">'\0'</span>; 01329 01330 fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * (<span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>) + <span class="keyword">sizeof</span>(*fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a> = (<span class="keywordtype">int</span> *)(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a> + fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01333 <span class="comment">/*@=dependenttrans@*/</span> 01334 01335 fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> * <span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a>) + apathlen); 01336 a = (<span class="keywordtype">char</span> *)(fi-><a class="code" href="structtransactionFileInfo__s.html#m41">apath</a> + fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01337 *a = <span class="charliteral">'\0'</span>; 01338 01339 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01340 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01341 fi-><a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = 0; 01342 <span class="keywordflow">if</span> (fl-><a class="code" href="structFileList__s.html#m0">buildRootURL</a>) 01343 fi-><a class="code" href="structtransactionFileInfo__s.html#m36">astriplen</a> = strlen(fl-><a class="code" href="structFileList__s.html#m0">buildRootURL</a>); 01344 fi-><a class="code" href="structtransactionFileInfo__s.html#m37">striplen</a> = 0; 01345 fi-><a class="code" href="structtransactionFileInfo__s.html#m29">fuser</a> = NULL; 01346 fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01347 fi-><a class="code" href="structtransactionFileInfo__s.html#m30">fgroup</a> = NULL; 01348 fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<span class="keyword">sizeof</span>(*fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>), fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>); 01349 01350 <span class="comment">/* Make the cpio list */</span> 01351 <span class="keywordflow">for</span> (i = 0, flp = fl-><a class="code" href="structFileList__s.html#m24">fileList</a>; i < fi-><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-><a class="code" href="structFileList__s.html#m24">fileList</a>) < (fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> - 1)) && 01356 !strcmp(flp-><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-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <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-><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-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><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-><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-><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 > fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]] && *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-><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-><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-><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-><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-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a496a249">RPMFILE_GHOST</a>) { 01405 fi-><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-><a class="code" href="structtransactionFileInfo__s.html#m2">actions</a>[i] = <a class="code" href="rpmlib_8h.html#a501a304">FA_COPYOUT</a>; 01409 fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = <a class="code" href="group__rpmbuild.html#a15">getUidS</a>(flp-><a class="code" href="structFileListRec__s.html#m3">uname</a>); 01410 fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = <a class="code" href="group__rpmbuild.html#a18">getGidS</a>(flp-><a class="code" href="structFileListRec__s.html#m4">gname</a>); 01411 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] == (uid_t)-1) fi-><a class="code" href="structtransactionFileInfo__s.html#m45">fuids</a>[i] = 0; 01412 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] == (gid_t)-1) fi-><a class="code" href="structtransactionFileInfo__s.html#m47">fgids</a>[i] = 0; 01413 fi-><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-><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-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>) 01418 fi-><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->processingFailed,</span> 01452 <span class="comment"> fl->fileList, fl->fileListRecsAlloced, fl->fileListRecsUsed,</span> 01453 <span class="comment"> fl->totalFileSize, fl->fileCount, fl->inFtw, fl->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, &fileName); 01478 <span class="keywordflow">if</span> (fl-><a class="code" href="structFileList__s.html#m0">buildRootURL</a> && strcmp(fl-><a class="code" href="structFileList__s.html#m0">buildRootURL</a>, <span class="stringliteral">"/"</span>)) 01479 fileURL += strlen(fl-><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-><a class="code" href="structFileList__s.html#m12">inFtw</a> && fl-><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-><a class="code" href="structFileList__s.html#m1">prefix</a>; 01492 01493 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(fileURL, &prefixTest); 01494 <span class="keywordflow">while</span> (*prefixPtr && *prefixTest && (*prefixTest == *prefixPtr)) { 01495 prefixPtr++; 01496 prefixTest++; 01497 } 01498 <span class="keywordflow">if</span> (*prefixPtr || (*prefixTest && *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-><a class="code" href="structFileList__s.html#m1">prefix</a>, fileURL); 01501 fl-><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 = &statbuf; 01508 memset(statp, 0, <span class="keyword">sizeof</span>(*statp)); 01509 <span class="keywordflow">if</span> (fl-><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->st_nlink = 1; 01514 statp->st_rdev = 01515 ((fl-><a class="code" href="structFileList__s.html#m9">devmajor</a> & 0xff) << 8) | (fl-><a class="code" href="structFileList__s.html#m10">devminor</a> & 0xff); 01516 statp->st_dev = statp->st_rdev; 01517 statp->st_mode = (fl-><a class="code" href="structFileList__s.html#m8">devtype</a> == <span class="charliteral">'b'</span> ? S_IFBLK : S_IFCHR); 01518 statp->st_mode |= (fl-><a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m4">ar_fmode</a> & 0777); 01519 statp->st_atime = now; 01520 statp->st_mtime = now; 01521 statp->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-><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-><a class="code" href="structFileList__s.html#m11">isDir</a>) && S_ISDIR(statp->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-><a class="code" href="structFileList__s.html#m12">inFtw</a> = 1; <span class="comment">/* Flag to indicate file has buildRootURL prefixed */</span> 01535 fl-><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-><a class="code" href="structFileList__s.html#m11">isDir</a> = 0; 01538 fl-><a class="code" href="structFileList__s.html#m12">inFtw</a> = 0; 01539 <span class="keywordflow">return</span> 0; 01540 } 01541 01542 fileMode = statp->st_mode; 01543 fileUid = statp->st_uid; 01544 fileGid = statp->st_gid; 01545 01546 <span class="keywordflow">if</span> (S_ISDIR(fileMode) && fl-><a class="code" href="structFileList__s.html#m16">cur_ar</a>.<a class="code" href="structAttrRec__s.html#m1">ar_dmodestr</a>) { 01547 fileMode &= S_IFMT; 01548 fileMode |= fl-><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-><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 &= S_IFMT; 01551 fileMode |= fl-><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-><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-><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-><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-><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 && 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-><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-><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-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a> == fl-><a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a>) { 01585 fl-><a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a> += 128; 01586 fl-><a class="code" href="structFileList__s.html#m24">fileList</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(fl-><a class="code" href="structFileList__s.html#m24">fileList</a>, 01587 fl-><a class="code" href="structFileList__s.html#m25">fileListRecsAlloced</a> * <span class="keyword">sizeof</span>(*(fl-><a class="code" href="structFileList__s.html#m24">fileList</a>))); 01588 } 01589 01590 { <a class="code" href="structFileListRec__s.html">FileListRec</a> flp = &fl-><a class="code" href="structFileList__s.html#m24">fileList</a>[fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>]; 01591 <span class="keywordtype">int</span> i; 01592 01593 flp-><a class="code" href="structFileListRec__s.html#m0">fl_st</a> = *statp; <span class="comment">/* structure assignment */</span> 01594 flp->fl_mode = fileMode; 01595 flp->fl_uid = fileUid; 01596 flp->fl_gid = fileGid; 01597 01598 flp-><a class="code" href="structFileListRec__s.html#m2">fileURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fileURL); 01599 flp-><a class="code" href="structFileListRec__s.html#m1">diskURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(diskURL); 01600 flp-><a class="code" href="structFileListRec__s.html#m3">uname</a> = fileUname; 01601 flp-><a class="code" href="structFileListRec__s.html#m4">gname</a> = fileGname; 01602 01603 <span class="keywordflow">if</span> (fl-><a class="code" href="structFileList__s.html#m21">currentLangs</a> && fl-><a class="code" href="structFileList__s.html#m20">nLangs</a> > 0) { 01604 <span class="keywordtype">char</span> * ncl; 01605 size_t nl = 0; 01606 01607 <span class="keywordflow">for</span> (i = 0; i < fl-><a class="code" href="structFileList__s.html#m20">nLangs</a>; i++) 01608 nl += strlen(fl-><a class="code" href="structFileList__s.html#m21">currentLangs</a>[i]) + 1; 01609 01610 flp-><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 < fl-><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-><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, &lang)) { 01619 flp-><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-><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-><a class="code" href="structFileListRec__s.html#m5">flags</a> = fl-><a class="code" href="structFileList__s.html#m13">currentFlags</a>; 01625 flp-><a class="code" href="structFileListRec__s.html#m6">specdFlags</a> = fl-><a class="code" href="structFileList__s.html#m14">currentSpecdFlags</a>; 01626 flp-><a class="code" href="structFileListRec__s.html#m7">verifyFlags</a> = fl-><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 && !(flp-><a class="code" href="structFileListRec__s.html#m5">flags</a> & <a class="code" href="rpmlib_8h.html#a13">RPMFILE_MULTILIB_MASK</a>) 01630 && !<a class="code" href="files_8c.html#a46">parseForRegexMultiLib</a>(fileURL)) 01631 flp-><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->fl_mode) && flp->fl_nlink > 1) { 01636 <a class="code" href="structFileListRec__s.html">FileListRec</a> ilp; 01637 <span class="keywordflow">for</span> (i = 0; i < fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; i++) { 01638 ilp = fl-><a class="code" href="structFileList__s.html#m24">fileList</a> + i; 01639 <span class="keywordflow">if</span> (!S_ISREG(ilp->fl_mode)) 01640 <span class="keywordflow">continue</span>; 01641 <span class="keywordflow">if</span> (flp->fl_nlink != ilp->fl_nlink) 01642 <span class="keywordflow">continue</span>; 01643 <span class="keywordflow">if</span> (flp->fl_ino != ilp->fl_ino) 01644 <span class="keywordflow">continue</span>; 01645 <span class="keywordflow">if</span> (flp->fl_dev != ilp->fl_dev) 01646 <span class="keywordflow">continue</span>; 01647 <span class="keywordflow">break</span>; 01648 } 01649 } <span class="keywordflow">else</span> 01650 i = fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>; 01651 01652 <span class="keywordflow">if</span> (S_ISREG(flp->fl_mode) && i >= fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>) 01653 fl-><a class="code" href="structFileList__s.html#m3">totalFileSize</a> += flp->fl_size; 01654 } 01655 01656 fl-><a class="code" href="structFileList__s.html#m26">fileListRecsUsed</a>++; 01657 fl-><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->processingFailed,</span> 01670 <span class="comment"> fl->fileList, fl->fileListRecsAlloced, fl->fileListRecsUsed,</span> 01671 <span class="comment"> fl->totalFileSize, fl->fileCount, fl->inFtw, fl->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, &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-><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-><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, &argc, &argv); 01715 <span class="keywordflow">if</span> (rc == 0 && argc >= 1 && !<a class="code" href="lib_2misc_8c.html#a16">myGlobPatternP</a>(argv[0])) { 01716 <span class="keywordflow">for</span> (i = 0; i < 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-><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->macros,</span> 01745 <span class="comment"> pkg->cpioList, pkg->fileList, pkg->specialDoc, pkg->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 = &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-><a class="code" href="structPackageStruct.html#m1">cpioList</a> = NULL; 01765 01766 <span class="keywordflow">if</span> (pkg-><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-><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-><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-><a class="code" href="structSpecStruct.html#m3">buildSubdir</a> ? spec-><a class="code" href="structSpecStruct.html#m3">buildSubdir</a> : <span class="stringliteral">""</span>) , 01778 <span class="stringliteral">"/"</span>, pkg-><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-><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-><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(&fl, 0, <span class="keyword">sizeof</span>(fl)); 01805 01806 <span class="comment">/* XXX spec->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-><a class="code" href="structSpecStruct.html#m4">rootURL</a>, spec-><a class="code" href="structSpecStruct.html#m2">buildRootURL</a>, NULL); 01808 01809 <span class="keywordflow">if</span> (hge(pkg-><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> **)&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>(&fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>); 01832 <a class="code" href="files_8c.html#a34">nullAttrRec</a>(&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-><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>) >> 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 < 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>(&fl.<a class="code" href="structFileList__s.html#m17">def_ar</a>, &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, &fl)) 01899 <span class="keywordflow">continue</span>; 01900 <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a41">parseForAttr</a>(buf, &fl)) 01901 <span class="keywordflow">continue</span>; 01902 <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a40">parseForDev</a>(buf, &fl)) 01903 <span class="keywordflow">continue</span>; 01904 <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a42">parseForConfig</a>(buf, &fl)) 01905 <span class="keywordflow">continue</span>; 01906 <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a44">parseForLang</a>(buf, &fl)) 01907 <span class="keywordflow">continue</span>; 01908 <span class="comment">/*@-nullstate@*/</span> <span class="comment">/* FIX: pkg->fileFile might be NULL */</span> 01909 <span class="keywordflow">if</span> (<a class="code" href="files_8c.html#a47">parseForSimple</a>(spec, pkg, buf, &fl, &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>(&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->fileFile might be NULL */</span> 01924 (void) <a class="code" href="files_8c.html#a54">processBinaryFile</a>(pkg, &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-><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 < 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, &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->fileFile might be NULL */</span> 01962 (void) <a class="code" href="files_8c.html#a54">processBinaryFile</a>(pkg, &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>(&fl)) 01975 (void) <a class="code" href="group__rpmbuild.html#a43">rpmlibNeedsFeature</a>(pkg-><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>(&fl, (<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> *)&pkg-><a class="code" href="structPackageStruct.html#m1">cpioList</a>, pkg-><a class="code" href="structPackageStruct.html#m0">header</a>, 0); 01979 01980 <span class="keywordflow">if</span> (spec-><a class="code" href="structSpecStruct.html#m23">timeCheck</a>) 01981 <a class="code" href="files_8c.html#a38">timeCheck</a>(spec-><a class="code" href="structSpecStruct.html#m23">timeCheck</a>, pkg-><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>(&fl.<a class="code" href="structFileList__s.html#m16">cur_ar</a>); 01988 <a class="code" href="files_8c.html#a35">freeAttrRec</a>(&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 < 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-><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-><a class="code" href="structSpecStruct.html#m35">packages</a>-><a class="code" href="structPackageStruct.html#m0">header</a>); 02015 <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &tag, &type, &ptr, &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-><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-><a class="code" href="structSpecStruct.html#m14">buildRestrictions</a>); 02052 <a class="code" href="group__header.html#a70">headerNextIterator</a>(hi, &tag, &type, &ptr, &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-><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-><a class="code" href="structSpecStruct.html#m16">BANames</a> && spec-><a class="code" href="structSpecStruct.html#m17">BACount</a> > 0) { 02062 (void) <a class="code" href="group__header.html#a45">headerAddEntry</a>(spec-><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-><a class="code" href="structSpecStruct.html#m16">BANames</a>, spec-><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-><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-><a class="code" href="structSpecStruct.html#m0">specFile</a>); 02088 <span class="keywordflow">if</span> (spec-><a class="code" href="structSpecStruct.html#m28">sourceHeader</a> != NULL) 02089 <span class="keywordflow">for</span> (srcPtr = spec-><a class="code" href="structSpecStruct.html#m25">sources</a>; srcPtr != NULL; srcPtr = srcPtr-><a class="code" href="structSource.html#m4">next</a>) { 02090 <span class="keywordflow">if</span> (srcPtr-><a class="code" href="structSource.html#m2">flags</a> & <a class="code" href="rpmspec_8h.html#a0">RPMBUILD_ISSOURCE</a>) { 02091 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-><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>, &srcPtr-><a class="code" href="structSource.html#m1">source</a>, 1); 02093 <span class="keywordflow">if</span> (srcPtr-><a class="code" href="structSource.html#m2">flags</a> & <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) { 02094 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-><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>, &srcPtr-><a class="code" href="structSource.html#m3">num</a>, 1); 02096 } 02097 } 02098 <span class="keywordflow">if</span> (srcPtr-><a class="code" href="structSource.html#m2">flags</a> & <a class="code" href="rpmspec_8h.html#a1">RPMBUILD_ISPATCH</a>) { 02099 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-><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>, &srcPtr-><a class="code" href="structSource.html#m1">source</a>, 1); 02101 <span class="keywordflow">if</span> (srcPtr-><a class="code" href="structSource.html#m2">flags</a> & <a class="code" href="rpmspec_8h.html#a3">RPMBUILD_ISNO</a>) { 02102 (void) <a class="code" href="group__header.html#a47">headerAddOrAppendEntry</a>(spec-><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>, &srcPtr-><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-><a class="code" href="structSource.html#m2">flags</a> & <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-><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-><a class="code" href="structSpecStruct.html#m35">packages</a>; pkg != NULL; pkg = pkg-><a class="code" href="structPackageStruct.html#m14">next</a>) { 02116 <span class="keywordflow">for</span> (srcPtr = pkg-><a class="code" href="structPackageStruct.html#m2">icon</a>; srcPtr != NULL; srcPtr = srcPtr-><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-><a class="code" href="structSource.html#m2">flags</a> & <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-><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-><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-><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 = &fl.<a class="code" href="structFileList__s.html#m24">fileList</a>[x]; 02149 02150 flp-><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-><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, &diskPath); 02158 02159 flp-><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-><a class="code" href="structFileListRec__s.html#m2">fileURL</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(diskPath); 02167 flp-><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, &flp-><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-><a class="code" href="structFileListRec__s.html#m3">uname</a> = <a class="code" href="group__rpmbuild.html#a13">getUname</a>(flp->fl_uid); 02176 flp-><a class="code" href="structFileListRec__s.html#m4">gname</a> = <a class="code" href="group__rpmbuild.html#a16">getGname</a>(flp->fl_gid); 02177 flp-><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->fl_size; 02180 02181 <span class="keywordflow">if</span> (! (flp-><a class="code" href="structFileListRec__s.html#m3">uname</a> && flp-><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-><a class="code" href="structSpecStruct.html#m28">sourceHeader</a> != NULL) 02194 <a class="code" href="files_8c.html#a51">genCpioListAndHeader</a>(&fl, (<a class="code" href="structtransactionFileInfo__s.html">TFI_t</a> *)&spec-><a class="code" href="structSpecStruct.html#m29">sourceCpioList</a>, 02195 spec-><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 < 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(&ibits); 02273 FD_ZERO(&obits); 02274 <span class="keywordflow">if</span> (fromProg[0] >= 0) { 02275 FD_SET(fromProg[0], &ibits); 02276 } 02277 <span class="keywordflow">if</span> (toProg[1] >= 0) { 02278 FD_SET(toProg[1], &obits); 02279 } 02280 tv.tv_sec = 1; 02281 tv.tv_usec = 0; 02282 nfd = ((fromProg[0] > toProg[1]) ? fromProg[0] : toProg[1]); 02283 <span class="keywordflow">if</span> ((rc = select(nfd, &ibits, &obits, NULL, &tv)) < 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] >= 0 && FD_ISSET(toProg[1], &obits)) { 02291 <span class="keywordflow">if</span> (writeBytesLeft) { 02292 <span class="keywordflow">if</span> ((nbw = write(toProg[1], writePtr, 02293 (1024<writeBytesLeft) ? 1024 : writeBytesLeft)) < 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] >= 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)) > 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 < 0 && <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] >= 0) 02323 (void) close(toProg[1]); 02324 <span class="keywordflow">if</span> (fromProg[0] >= 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, &status, 0); 02332 <span class="keywordflow">if</span> (failNonZero && (!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 && fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a> > 0)) 02422 <span class="keywordflow">return</span> 0; 02423 02424 <span class="keywordflow">if</span> (! (pkg-><a class="code" href="structPackageStruct.html#m3">autoReq</a> || pkg-><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 < fi-><a class="code" href="structtransactionFileInfo__s.html#m32">fc</a>; i++) { 02429 02430 <span class="keywordflow">if</span> (fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a> && <a class="code" href="files_8c.html#a18">multiLib</a> == 2) { 02431 <span class="keywordflow">if</span> (!(fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] & <a class="code" href="group__payload.html#a25a42">CPIO_MULTILIB</a>)) 02432 <span class="keywordflow">continue</span>; 02433 fi-><a class="code" href="structtransactionFileInfo__s.html#m43">fmapflags</a>[i] &= ~<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-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]); 02437 writeBytes += strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m19">dnl</a>[fi-><a class="code" href="structtransactionFileInfo__s.html#m20">dil</a>[i]]); 02438 <a class="code" href="stringbuf_8h.html#a1">appendLineStringBuf</a>(writeBuf, fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]); 02439 writeBytes += strlen(fi-><a class="code" href="structtransactionFileInfo__s.html#m18">bnl</a>[i]) + 1; 02440 } 02441 02442 <span class="keywordflow">for</span> (dm = depMsgs; dm-><a class="code" href="structDepMsg__t.html#m0">msg</a> != NULL; dm++) { 02443 <span class="keywordtype">int</span> tag, tagflags; 02444 02445 tag = (dm-><a class="code" href="structDepMsg__t.html#m4">ftag</a> > 0) ? dm-><a class="code" href="structDepMsg__t.html#m4">ftag</a> : dm-><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-><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-><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-><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-><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 && *s != <span class="charliteral">'%'</span> && *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, &ac, (<span class="keyword">const</span> <span class="keywordtype">char</span> ***)&av)) 02480 && ac > 0 && 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 < 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-><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 < 4; i++) { 02505 <span class="keywordflow">if</span> (dm-><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-><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 < 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-><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 &= ~<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> > 1) 02529 tagflags |= <a class="code" href="rpmlib_8h.html#a497a273">RPMSENSE_MULTILIB</a>; 02530 <span class="keywordflow">else</span> 02531 tagflags &= ~<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-><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 < count; i++, names++, versions++, flags++) { 02558 <span class="keywordflow">if</span> (hasFlags && !((*flags & dm-><a class="code" href="structDepMsg__t.html#m5">mask</a>) ^ dm-><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-><a class="code" href="structDepMsg__t.html#m0">msg</a> ? dm-><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 && <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 && !(*versions != NULL && **versions != <span class="charliteral">'\0'</span>)) 02570 <span class="keywordflow">continue</span>; 02571 <span class="keywordflow">if</span> (!(hasFlags && (*flags && <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 & <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">"<"</span>); 02577 <span class="keywordflow">if</span> (*flags & <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">">"</span>); 02579 <span class="keywordflow">if</span> (*flags & <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-><a class="code" href="structDepMsg__t.html#m0">msg</a> != NULL; dm++) { 02604 <span class="keywordflow">switch</span> (dm-><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-><a class="code" href="structDepMsg__t.html#m2">ntag</a>, &dnt, (<span class="keywordtype">void</span> **) &names, &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-><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-><a class="code" href="structDepMsg__t.html#m3">vtag</a>, &dvt, (<span class="keywordtype">void</span> **) &versions, NULL); 02625 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 02626 } 02627 <span class="keywordflow">switch</span> (dm-><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-><a class="code" href="structDepMsg__t.html#m4">ftag</a>, NULL, (<span class="keywordtype">void</span> **) &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-><a class="code" href="structSpecStruct.html#m35">packages</a>; pkg != NULL; pkg = pkg-><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-><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-><a class="code" href="structPackageStruct.html#m0">header</a>, &n, &v, &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-><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-><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-><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-><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-><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>