<!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>rpmio/rpmrpc.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>rpmio/rpmrpc.c</h1><a href="rpmrpc_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="comment">/*@-type@*/</span> <span class="comment">/* LCL: function typedefs */</span> 00006 <span class="preprocessor">#include "<a class="code" href="system_8h.html">system.h</a>"</span> 00007 <span class="preprocessor">#include <<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>></span> 00008 <span class="preprocessor">#include <<a class="code" href="popt_8h.html">popt.h</a>></span> 00009 <span class="preprocessor">#include "<a class="code" href="ugid_8h.html">ugid.h</a>"</span> 00010 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span> 00011 00012 <span class="comment">/*@access FD_t@*/</span> 00013 <span class="comment">/*@access urlinfo@*/</span> 00014 00015 <span class="comment">/*@-redecl@*/</span> <a name="l00016"></a><a class="code" href="rpmrpc_8c.html#a4">00016</a> <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a4">_rpmio_debug</a>; 00017 <span class="comment">/*@=redecl@*/</span> 00018 00019 <span class="comment">/* =============================================================== */</span> <a name="l00020"></a><a class="code" href="rpmrpc_8c.html#a17">00020</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a17">ftpMkdir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="comment">/*@unused@*/</span> mode_t mode) 00021 <span class="comment">/*@globals fileSystem @*/</span> 00022 <span class="comment">/*@modifies fileSystem @*/</span> 00023 { 00024 <span class="keywordtype">int</span> rc; 00025 <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"MKD"</span>, path, NULL)) != 0) 00026 <span class="keywordflow">return</span> rc; 00027 <span class="preprocessor">#if NOTYET</span> 00028 <span class="preprocessor"></span> { <span class="keywordtype">char</span> buf[20]; 00029 sprintf(buf, <span class="stringliteral">" 0%o"</span>, mode); 00030 (void) <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"SITE CHMOD"</span>, path, buf); 00031 } 00032 <span class="preprocessor">#endif</span> 00033 <span class="preprocessor"></span> <span class="keywordflow">return</span> rc; 00034 } 00035 <a name="l00036"></a><a class="code" href="rpmrpc_8c.html#a18">00036</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a18">ftpChdir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 00037 <span class="comment">/*@globals fileSystem @*/</span> 00038 <span class="comment">/*@modifies fileSystem @*/</span> 00039 { 00040 <span class="keywordflow">return</span> <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"CWD"</span>, path, NULL); 00041 } 00042 <a name="l00043"></a><a class="code" href="rpmrpc_8c.html#a19">00043</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a19">ftpRmdir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 00044 <span class="comment">/*@globals fileSystem @*/</span> 00045 <span class="comment">/*@modifies fileSystem @*/</span> 00046 { 00047 <span class="keywordflow">return</span> <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"RMD"</span>, path, NULL); 00048 } 00049 <a name="l00050"></a><a class="code" href="rpmrpc_8c.html#a20">00050</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a20">ftpRename</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * oldpath, <span class="keyword">const</span> <span class="keywordtype">char</span> * newpath) 00051 <span class="comment">/*@globals fileSystem @*/</span> 00052 <span class="comment">/*@modifies fileSystem @*/</span> 00053 { 00054 <span class="keywordtype">int</span> rc; 00055 <span class="keywordflow">if</span> ((rc = <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"RNFR"</span>, oldpath, NULL)) != 0) 00056 <span class="keywordflow">return</span> rc; 00057 <span class="keywordflow">return</span> <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"RNTO"</span>, newpath, NULL); 00058 } 00059 <a name="l00060"></a><a class="code" href="rpmrpc_8c.html#a21">00060</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a21">ftpUnlink</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 00061 <span class="comment">/*@globals fileSystem @*/</span> 00062 <span class="comment">/*@modifies fileSystem @*/</span> 00063 { 00064 <span class="keywordflow">return</span> <a class="code" href="group__rpmio.html#a22">ftpCmd</a>(<span class="stringliteral">"DELE"</span>, path, NULL); 00065 } 00066 00067 <span class="comment">/* =============================================================== */</span> 00068 <span class="comment">/* XXX rebuilddb.c: analogues to mkdir(2)/rmdir(2). */</span> <a name="l00069"></a><a class="code" href="group__rpmrpc.html#a22">00069</a> <span class="keywordtype">int</span> <a class="code" href="group__rpmrpc.html#a22">Mkdir</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * path, mode_t mode) 00070 { 00071 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 00072 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 00073 00074 <span class="keywordflow">switch</span> (ut) { 00075 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 00076 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a17">ftpMkdir</a>(path, mode); 00077 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00078 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00079 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00080 path = lpath; 00081 <span class="comment">/*@fallthrough@*/</span> 00082 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00083 <span class="keywordflow">break</span>; 00084 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00085 <span class="keywordflow">default</span>: 00086 <span class="keywordflow">return</span> -2; 00087 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00088 } 00089 <span class="keywordflow">return</span> mkdir(path, mode); 00090 } 00091 <a name="l00092"></a><a class="code" href="rpmrpc_8c.html#a23">00092</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a23">Chdir</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 00093 { 00094 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 00095 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 00096 00097 <span class="keywordflow">switch</span> (ut) { 00098 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 00099 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a18">ftpChdir</a>(path); 00100 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00101 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00102 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00103 path = lpath; 00104 <span class="comment">/*@fallthrough@*/</span> 00105 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00106 <span class="keywordflow">break</span>; 00107 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00108 <span class="keywordflow">default</span>: 00109 <span class="keywordflow">return</span> -2; 00110 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00111 } 00112 <span class="keywordflow">return</span> chdir(path); 00113 } 00114 <a name="l00115"></a><a class="code" href="rpmrpc_8c.html#a24">00115</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a24">Rmdir</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 00116 { 00117 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 00118 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 00119 00120 <span class="keywordflow">switch</span> (ut) { 00121 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 00122 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a19">ftpRmdir</a>(path); 00123 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00124 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00125 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00126 path = lpath; 00127 <span class="comment">/*@fallthrough@*/</span> 00128 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00129 <span class="keywordflow">break</span>; 00130 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00131 <span class="keywordflow">default</span>: 00132 <span class="keywordflow">return</span> -2; 00133 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00134 } 00135 <span class="keywordflow">return</span> rmdir(path); 00136 } 00137 00138 <span class="comment">/* XXX rpmdb.c: analogue to rename(2). */</span> 00139 <a name="l00140"></a><a class="code" href="rpmrpc_8c.html#a25">00140</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a25">Rename</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * oldpath, <span class="keyword">const</span> <span class="keywordtype">char</span> * newpath) 00141 { 00142 <span class="keyword">const</span> <span class="keywordtype">char</span> *oe = NULL; 00143 <span class="keyword">const</span> <span class="keywordtype">char</span> *ne = NULL; 00144 <span class="keywordtype">int</span> oldut, newut; 00145 00146 <span class="comment">/* XXX lib/install.c used to rely on this behavior. */</span> 00147 <span class="keywordflow">if</span> (!strcmp(oldpath, newpath)) <span class="keywordflow">return</span> 0; 00148 00149 oldut = <a class="code" href="url_8c.html#a18">urlPath</a>(oldpath, &oe); 00150 <span class="keywordflow">switch</span> (oldut) { 00151 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00152 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00153 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00154 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00155 <span class="keywordflow">break</span>; 00156 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00157 <span class="keywordflow">default</span>: 00158 <span class="keywordflow">return</span> -2; 00159 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00160 } 00161 00162 newut = <a class="code" href="url_8c.html#a18">urlPath</a>(newpath, &ne); 00163 <span class="keywordflow">switch</span> (newut) { 00164 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 00165 <span class="keywordflow">if</span> (_rpmio_debug) 00166 fprintf(stderr, <span class="stringliteral">"*** rename old %*s new %*s\n"</span>, (<span class="keywordtype">int</span>)(oe - oldpath), oldpath, (<span class="keywordtype">int</span>)(ne - newpath), newpath); 00167 <span class="keywordflow">if</span> (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) && 00168 !<a class="code" href="group__rpmio.html#a1">xstrncasecmp</a>(oldpath, newpath, (oe - oldpath)))) 00169 <span class="keywordflow">return</span> -2; 00170 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a20">ftpRename</a>(oldpath, newpath); 00171 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00172 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00173 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00174 oldpath = oe; 00175 newpath = ne; 00176 <span class="keywordflow">break</span>; 00177 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00178 <span class="keywordflow">break</span>; 00179 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00180 <span class="keywordflow">default</span>: 00181 <span class="keywordflow">return</span> -2; 00182 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00183 } 00184 <span class="keywordflow">return</span> rename(oldpath, newpath); 00185 } 00186 <a name="l00187"></a><a class="code" href="rpmrpc_8c.html#a26">00187</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a26">Link</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> * oldpath, <span class="keyword">const</span> <span class="keywordtype">char</span> * newpath) 00188 { 00189 <span class="keyword">const</span> <span class="keywordtype">char</span> *oe = NULL; 00190 <span class="keyword">const</span> <span class="keywordtype">char</span> *ne = NULL; 00191 <span class="keywordtype">int</span> oldut, newut; 00192 00193 oldut = <a class="code" href="url_8c.html#a18">urlPath</a>(oldpath, &oe); 00194 <span class="keywordflow">switch</span> (oldut) { 00195 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00196 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00197 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00198 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00199 <span class="keywordflow">break</span>; 00200 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00201 <span class="keywordflow">default</span>: 00202 <span class="keywordflow">return</span> -2; 00203 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00204 } 00205 00206 newut = <a class="code" href="url_8c.html#a18">urlPath</a>(newpath, &ne); 00207 <span class="keywordflow">switch</span> (newut) { 00208 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00209 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00210 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00211 <span class="keywordflow">if</span> (_rpmio_debug) 00212 fprintf(stderr, <span class="stringliteral">"*** link old %*s new %*s\n"</span>, (<span class="keywordtype">int</span>)(oe - oldpath), oldpath, (<span class="keywordtype">int</span>)(ne - newpath), newpath); 00213 <span class="keywordflow">if</span> (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) && 00214 !<a class="code" href="group__rpmio.html#a1">xstrncasecmp</a>(oldpath, newpath, (oe - oldpath)))) 00215 <span class="keywordflow">return</span> -2; 00216 oldpath = oe; 00217 newpath = ne; 00218 <span class="keywordflow">break</span>; 00219 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00220 <span class="keywordflow">break</span>; 00221 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00222 <span class="keywordflow">default</span>: 00223 <span class="keywordflow">return</span> -2; 00224 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00225 } 00226 <span class="keywordflow">return</span> link(oldpath, newpath); 00227 } 00228 00229 <span class="comment">/* XXX build/build.c: analogue to unlink(2). */</span> 00230 <a name="l00231"></a><a class="code" href="rpmrpc_8c.html#a27">00231</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a27">Unlink</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path) { 00232 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 00233 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 00234 00235 <span class="keywordflow">switch</span> (ut) { 00236 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 00237 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a21">ftpUnlink</a>(path); 00238 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00239 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00240 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 00241 path = lpath; 00242 <span class="comment">/*@fallthrough@*/</span> 00243 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 00244 <span class="keywordflow">break</span>; 00245 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 00246 <span class="keywordflow">default</span>: 00247 <span class="keywordflow">return</span> -2; 00248 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 00249 } 00250 <span class="keywordflow">return</span> unlink(path); 00251 } 00252 00253 <span class="comment">/* XXX swiped from mc-4.5.39-pre9 vfs/ftpfs.c */</span> 00254 <a name="l00255"></a><a class="code" href="rpmrpc_8c.html#a0">00255</a> <span class="preprocessor">#define g_strdup xstrdup</span> <a name="l00256"></a><a class="code" href="rpmrpc_8c.html#a1">00256</a> <span class="preprocessor"></span><span class="preprocessor">#define g_free free</span> 00257 <span class="preprocessor"></span> 00258 <span class="comment">/*</span> 00259 <span class="comment"> * FIXME: this is broken. It depends on mc not crossing border on month!</span> 00260 <span class="comment"> */</span> 00261 <span class="comment">/*@unchecked@*/</span> <a name="l00262"></a><a class="code" href="rpmrpc_8c.html#a5">00262</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a5">current_mday</a>; 00263 <span class="comment">/*@unchecked@*/</span> <a name="l00264"></a><a class="code" href="rpmrpc_8c.html#a6">00264</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a6">current_mon</a>; 00265 <span class="comment">/*@unchecked@*/</span> <a name="l00266"></a><a class="code" href="rpmrpc_8c.html#a7">00266</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a7">current_year</a>; 00267 00268 <span class="comment">/* Following stuff (parse_ls_lga) is used by ftpfs and extfs */</span> <a name="l00269"></a><a class="code" href="rpmrpc_8c.html#a2">00269</a> <span class="preprocessor">#define MAXCOLS 30</span> 00270 <span class="preprocessor"></span> 00271 <span class="comment">/*@unchecked@*/</span> <a name="l00272"></a><a class="code" href="rpmrpc_8c.html#a8">00272</a> <span class="keyword">static</span> <span class="keywordtype">char</span> *<a class="code" href="rpmrpc_8c.html#a8">columns</a> [<a class="code" href="rpmrpc_8c.html#a2">MAXCOLS</a>]; <span class="comment">/* Points to the string in column n */</span> 00273 <span class="comment">/*@unchecked@*/</span> <a name="l00274"></a><a class="code" href="rpmrpc_8c.html#a9">00274</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [<a class="code" href="rpmrpc_8c.html#a2">MAXCOLS</a>]; <span class="comment">/* Index from 0 to the starting positions of the columns */</span> 00275 00276 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00277"></a><a class="code" href="rpmrpc_8c.html#a28">00277</a> <a class="code" href="rpmrpc_8c.html#a28">vfs_split_text</a> (<span class="keywordtype">char</span> *p) 00278 <span class="comment">/*@globals columns, column_ptr @*/</span> 00279 <span class="comment">/*@modifies *p, columns, column_ptr @*/</span> 00280 { 00281 <span class="keywordtype">char</span> *original = p; 00282 <span class="keywordtype">int</span> numcols; 00283 00284 00285 <span class="keywordflow">for</span> (numcols = 0; *p && numcols < <a class="code" href="rpmrpc_8c.html#a2">MAXCOLS</a>; numcols++){ 00286 <span class="keywordflow">while</span> (*p == <span class="charliteral">' '</span> || *p == <span class="charliteral">'\r'</span> || *p == <span class="charliteral">'\n'</span>){ 00287 *p = 0; 00288 p++; 00289 } 00290 <a class="code" href="rpmrpc_8c.html#a8">columns</a> [numcols] = p; 00291 <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [numcols] = p - original; 00292 <span class="keywordflow">while</span> (*p && *p != <span class="charliteral">' '</span> && *p != <span class="charliteral">'\r'</span> && *p != <span class="charliteral">'\n'</span>) 00293 p++; 00294 } 00295 <span class="keywordflow">return</span> numcols; 00296 } 00297 00298 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00299"></a><a class="code" href="rpmrpc_8c.html#a29">00299</a> <a class="code" href="rpmrpc_8c.html#a29">is_num</a> (<span class="keywordtype">int</span> idx) 00300 <span class="comment">/*@*/</span> 00301 { 00302 <span class="keywordflow">if</span> (!<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx] || <a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx][0] < <span class="charliteral">'0'</span> || <a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx][0] > <span class="charliteral">'9'</span>) 00303 <span class="keywordflow">return</span> 0; 00304 <span class="keywordflow">return</span> 1; 00305 } 00306 00307 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00308"></a><a class="code" href="rpmrpc_8c.html#a30">00308</a> <a class="code" href="rpmrpc_8c.html#a30">is_dos_date</a>(<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *str) 00309 <span class="comment">/*@*/</span> 00310 { 00311 <span class="keywordflow">if</span> (str != NULL && strlen(str) == 8 && 00312 str[2] == str[5] && strchr(<span class="stringliteral">"\\-/"</span>, (<span class="keywordtype">int</span>)str[2]) != NULL) 00313 <span class="keywordflow">return</span> 1; 00314 <span class="keywordflow">return</span> 0; 00315 } 00316 00317 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00318"></a><a class="code" href="rpmrpc_8c.html#a31">00318</a> <a class="code" href="rpmrpc_8c.html#a31">is_week</a> (<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> tm * tim) 00319 <span class="comment">/*@modifies *tim @*/</span> 00320 { 00321 <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * week = <span class="stringliteral">"SunMonTueWedThuFriSat"</span>; 00322 <span class="keyword">const</span> <span class="keywordtype">char</span> * pos; 00323 00324 <span class="comment">/*@-observertrans -mayaliasunique@*/</span> 00325 <span class="keywordflow">if</span> (str != NULL && (pos=strstr(week, str)) != NULL) { 00326 <span class="comment">/*@=observertrans =mayaliasunique@*/</span> 00327 <span class="keywordflow">if</span> (tim != NULL) 00328 tim->tm_wday = (pos - week)/3; 00329 <span class="keywordflow">return</span> 1; 00330 } 00331 <span class="keywordflow">return</span> 0; 00332 } 00333 00334 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00335"></a><a class="code" href="rpmrpc_8c.html#a32">00335</a> <a class="code" href="rpmrpc_8c.html#a32">is_month</a> (<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> tm * tim) 00336 <span class="comment">/*@modifies *tim @*/</span> 00337 { 00338 <span class="comment">/*@observer@*/</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * month = <span class="stringliteral">"JanFebMarAprMayJunJulAugSepOctNovDec"</span>; 00339 <span class="keyword">const</span> <span class="keywordtype">char</span> * pos; 00340 00341 <span class="comment">/*@-observertrans -mayaliasunique@*/</span> 00342 <span class="keywordflow">if</span> (str != NULL && (pos = strstr(month, str)) != NULL) { 00343 <span class="comment">/*@=observertrans -mayaliasunique@*/</span> 00344 <span class="keywordflow">if</span> (tim != NULL) 00345 tim->tm_mon = (pos - month)/3; 00346 <span class="keywordflow">return</span> 1; 00347 } 00348 <span class="keywordflow">return</span> 0; 00349 } 00350 00351 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00352"></a><a class="code" href="rpmrpc_8c.html#a33">00352</a> <a class="code" href="rpmrpc_8c.html#a33">is_time</a> (<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> tm * tim) 00353 <span class="comment">/*@modifies *tim @*/</span> 00354 { 00355 <span class="keyword">const</span> <span class="keywordtype">char</span> * p, * p2; 00356 00357 <span class="keywordflow">if</span> (str != NULL && (p = strchr(str, <span class="charliteral">':'</span>)) && (p2 = strrchr(str, <span class="charliteral">':'</span>))) { 00358 <span class="keywordflow">if</span> (p != p2) { 00359 <span class="keywordflow">if</span> (sscanf (str, <span class="stringliteral">"%2d:%2d:%2d"</span>, &tim->tm_hour, &tim->tm_min, &tim->tm_sec) != 3) 00360 <span class="keywordflow">return</span> 0; 00361 } <span class="keywordflow">else</span> { 00362 <span class="keywordflow">if</span> (sscanf (str, <span class="stringliteral">"%2d:%2d"</span>, &tim->tm_hour, &tim->tm_min) != 2) 00363 <span class="keywordflow">return</span> 0; 00364 } 00365 } <span class="keywordflow">else</span> 00366 <span class="keywordflow">return</span> 0; 00367 00368 <span class="keywordflow">return</span> 1; 00369 } 00370 <a name="l00371"></a><a class="code" href="rpmrpc_8c.html#a34">00371</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a34">is_year</a>(<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> tm * tim) 00372 <span class="comment">/*@modifies *tim @*/</span> 00373 { 00374 <span class="keywordtype">long</span> year; 00375 00376 <span class="keywordflow">if</span> (str == NULL) 00377 <span class="keywordflow">return</span> 0; 00378 00379 <span class="keywordflow">if</span> (strchr(str,<span class="charliteral">':'</span>)) 00380 <span class="keywordflow">return</span> 0; 00381 00382 <span class="keywordflow">if</span> (strlen(str) != 4) 00383 <span class="keywordflow">return</span> 0; 00384 00385 <span class="keywordflow">if</span> (sscanf(str, <span class="stringliteral">"%ld"</span>, &year) != 1) 00386 <span class="keywordflow">return</span> 0; 00387 00388 <span class="keywordflow">if</span> (year < 1900 || year > 3000) 00389 <span class="keywordflow">return</span> 0; 00390 00391 tim->tm_year = (int) (year - 1900); 00392 00393 <span class="keywordflow">return</span> 1; 00394 } 00395 00396 <span class="comment">/*</span> 00397 <span class="comment"> * FIXME: this is broken. Consider following entry:</span> 00398 <span class="comment"> * -rwx------ 1 root root 1 Aug 31 10:04 2904 1234</span> 00399 <span class="comment"> * where "2904 1234" is filename. Well, this code decodes it as year :-(.</span> 00400 <span class="comment"> */</span> 00401 00402 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00403"></a><a class="code" href="rpmrpc_8c.html#a35">00403</a> <a class="code" href="rpmrpc_8c.html#a35">vfs_parse_filetype</a> (<span class="keywordtype">char</span> c) 00404 <span class="comment">/*@*/</span> 00405 { 00406 <span class="keywordflow">switch</span> (c) { 00407 <span class="keywordflow">case</span> <span class="charliteral">'d'</span>: <span class="keywordflow">return</span> S_IFDIR; 00408 <span class="keywordflow">case</span> <span class="charliteral">'b'</span>: <span class="keywordflow">return</span> S_IFBLK; 00409 <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: <span class="keywordflow">return</span> S_IFCHR; 00410 <span class="keywordflow">case</span> <span class="charliteral">'l'</span>: <span class="keywordflow">return</span> S_IFLNK; 00411 <span class="keywordflow">case</span> <span class="charliteral">'s'</span>: 00412 <span class="preprocessor">#ifdef IS_IFSOCK </span><span class="comment">/* And if not, we fall through to IFIFO, which is pretty close */</span> 00413 <span class="keywordflow">return</span> <a class="code" href="system_8h.html#a21">S_IFSOCK</a>; 00414 <span class="preprocessor">#endif</span> 00415 <span class="preprocessor"></span> <span class="keywordflow">case</span> <span class="charliteral">'p'</span>: <span class="keywordflow">return</span> S_IFIFO; 00416 <span class="keywordflow">case</span> <span class="charliteral">'m'</span>: <span class="keywordflow">case</span> <span class="charliteral">'n'</span>: <span class="comment">/* Don't know what these are :-) */</span> 00417 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">case</span> <span class="charliteral">'?'</span>: <span class="keywordflow">return</span> S_IFREG; 00418 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00419 } 00420 } 00421 <a name="l00422"></a><a class="code" href="rpmrpc_8c.html#a36">00422</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a36">vfs_parse_filemode</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *p) 00423 <span class="comment">/*@*/</span> 00424 { <span class="comment">/* converts rw-rw-rw- into 0666 */</span> 00425 <span class="keywordtype">int</span> res = 0; 00426 <span class="keywordflow">switch</span> (*(p++)) { 00427 <span class="keywordflow">case</span> <span class="charliteral">'r'</span>: res |= 0400; <span class="keywordflow">break</span>; 00428 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00429 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00430 } 00431 <span class="keywordflow">switch</span> (*(p++)) { 00432 <span class="keywordflow">case</span> <span class="charliteral">'w'</span>: res |= 0200; <span class="keywordflow">break</span>; 00433 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00434 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00435 } 00436 <span class="keywordflow">switch</span> (*(p++)) { 00437 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: res |= 0100; <span class="keywordflow">break</span>; 00438 <span class="keywordflow">case</span> <span class="charliteral">'s'</span>: res |= 0100 | S_ISUID; <span class="keywordflow">break</span>; 00439 <span class="keywordflow">case</span> <span class="charliteral">'S'</span>: res |= S_ISUID; <span class="keywordflow">break</span>; 00440 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00441 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00442 } 00443 <span class="keywordflow">switch</span> (*(p++)) { 00444 <span class="keywordflow">case</span> <span class="charliteral">'r'</span>: res |= 0040; <span class="keywordflow">break</span>; 00445 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00446 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00447 } 00448 <span class="keywordflow">switch</span> (*(p++)) { 00449 <span class="keywordflow">case</span> <span class="charliteral">'w'</span>: res |= 0020; <span class="keywordflow">break</span>; 00450 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00451 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00452 } 00453 <span class="keywordflow">switch</span> (*(p++)) { 00454 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: res |= 0010; <span class="keywordflow">break</span>; 00455 <span class="keywordflow">case</span> <span class="charliteral">'s'</span>: res |= 0010 | S_ISGID; <span class="keywordflow">break</span>; 00456 <span class="keywordflow">case</span> <span class="charliteral">'l'</span>: <span class="comment">/* Solaris produces these */</span> 00457 <span class="keywordflow">case</span> <span class="charliteral">'S'</span>: res |= S_ISGID; <span class="keywordflow">break</span>; 00458 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00459 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00460 } 00461 <span class="keywordflow">switch</span> (*(p++)) { 00462 <span class="keywordflow">case</span> <span class="charliteral">'r'</span>: res |= 0004; <span class="keywordflow">break</span>; 00463 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00464 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00465 } 00466 <span class="keywordflow">switch</span> (*(p++)) { 00467 <span class="keywordflow">case</span> <span class="charliteral">'w'</span>: res |= 0002; <span class="keywordflow">break</span>; 00468 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00469 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00470 } 00471 <span class="keywordflow">switch</span> (*(p++)) { 00472 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: res |= 0001; <span class="keywordflow">break</span>; 00473 <span class="keywordflow">case</span> <span class="charliteral">'t'</span>: res |= 0001 | S_ISVTX; <span class="keywordflow">break</span>; 00474 <span class="keywordflow">case</span> <span class="charliteral">'T'</span>: res |= S_ISVTX; <span class="keywordflow">break</span>; 00475 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>: <span class="keywordflow">break</span>; 00476 <span class="keywordflow">default</span>: <span class="keywordflow">return</span> -1; 00477 } 00478 <span class="keywordflow">return</span> res; 00479 } 00480 <a name="l00481"></a><a class="code" href="rpmrpc_8c.html#a37">00481</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a37">vfs_parse_filedate</a>(<span class="keywordtype">int</span> idx, <span class="comment">/*@out@*/</span> time_t *t) 00482 <span class="comment">/*@modifies *t @*/</span> 00483 { <span class="comment">/* This thing parses from idx in columns[] array */</span> 00484 00485 <span class="keywordtype">char</span> *p; 00486 <span class="keyword">struct </span>tm tim; 00487 <span class="keywordtype">int</span> d[3]; 00488 <span class="keywordtype">int</span> got_year = 0; 00489 00490 <span class="comment">/* Let's setup default time values */</span> 00491 tim.tm_year = <a class="code" href="rpmrpc_8c.html#a7">current_year</a>; 00492 tim.tm_mon = <a class="code" href="rpmrpc_8c.html#a6">current_mon</a>; 00493 tim.tm_mday = <a class="code" href="rpmrpc_8c.html#a5">current_mday</a>; 00494 tim.tm_hour = 0; 00495 tim.tm_min = 0; 00496 tim.tm_sec = 0; 00497 tim.tm_isdst = -1; <span class="comment">/* Let mktime() try to guess correct dst offset */</span> 00498 00499 p = <a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx++]; 00500 00501 <span class="comment">/* We eat weekday name in case of extfs */</span> 00502 <span class="keywordflow">if</span>(<a class="code" href="rpmrpc_8c.html#a31">is_week</a>(p, &tim)) 00503 p = <a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx++]; 00504 00505 <span class="comment">/* Month name */</span> 00506 <span class="keywordflow">if</span>(<a class="code" href="rpmrpc_8c.html#a32">is_month</a>(p, &tim)){ 00507 <span class="comment">/* And we expect, it followed by day number */</span> 00508 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (idx)) 00509 tim.tm_mday = (int)atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx++]); 00510 <span class="keywordflow">else</span> 00511 <span class="keywordflow">return</span> 0; <span class="comment">/* No day */</span> 00512 00513 } <span class="keywordflow">else</span> { 00514 <span class="comment">/* We usually expect:</span> 00515 <span class="comment"> Mon DD hh:mm</span> 00516 <span class="comment"> Mon DD YYYY</span> 00517 <span class="comment"> But in case of extfs we allow these date formats:</span> 00518 <span class="comment"> Mon DD YYYY hh:mm</span> 00519 <span class="comment"> Mon DD hh:mm YYYY</span> 00520 <span class="comment"> Wek Mon DD hh:mm:ss YYYY</span> 00521 <span class="comment"> MM-DD-YY hh:mm</span> 00522 <span class="comment"> where Mon is Jan-Dec, DD, MM, YY two digit day, month, year,</span> 00523 <span class="comment"> YYYY four digit year, hh, mm, ss two digit hour, minute or second. */</span> 00524 00525 <span class="comment">/* Here just this special case with MM-DD-YY */</span> 00526 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a30">is_dos_date</a>(p)){ 00527 <span class="comment">/*@-mods@*/</span> 00528 p[2] = p[5] = <span class="charliteral">'-'</span>; 00529 <span class="comment">/*@=mods@*/</span> 00530 00531 memset(d, 0, <span class="keyword">sizeof</span>(d)); 00532 <span class="keywordflow">if</span> (sscanf(p, <span class="stringliteral">"%2d-%2d-%2d"</span>, &d[0], &d[1], &d[2]) == 3){ 00533 <span class="comment">/* We expect to get:</span> 00534 <span class="comment"> 1. MM-DD-YY</span> 00535 <span class="comment"> 2. DD-MM-YY</span> 00536 <span class="comment"> 3. YY-MM-DD</span> 00537 <span class="comment"> 4. YY-DD-MM */</span> 00538 00539 <span class="comment">/* Hmm... maybe, next time :)*/</span> 00540 00541 <span class="comment">/* At last, MM-DD-YY */</span> 00542 d[0]--; <span class="comment">/* Months are zerobased */</span> 00543 <span class="comment">/* Y2K madness */</span> 00544 <span class="keywordflow">if</span>(d[2] < 70) 00545 d[2] += 100; 00546 00547 tim.tm_mon = d[0]; 00548 tim.tm_mday = d[1]; 00549 tim.tm_year = d[2]; 00550 got_year = 1; 00551 } <span class="keywordflow">else</span> 00552 <span class="keywordflow">return</span> 0; <span class="comment">/* sscanf failed */</span> 00553 } <span class="keywordflow">else</span> 00554 <span class="keywordflow">return</span> 0; <span class="comment">/* unsupported format */</span> 00555 } 00556 00557 <span class="comment">/* Here we expect to find time and/or year */</span> 00558 00559 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (idx)) { 00560 <span class="keywordflow">if</span>(<a class="code" href="rpmrpc_8c.html#a33">is_time</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx], &tim) || (got_year = <a class="code" href="rpmrpc_8c.html#a34">is_year</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx], &tim))) { 00561 idx++; 00562 00563 <span class="comment">/* This is a special case for ctime() or Mon DD YYYY hh:mm */</span> 00564 <span class="keywordflow">if</span>(<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (idx) && 00565 ((got_year = <a class="code" href="rpmrpc_8c.html#a34">is_year</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx], &tim)) || <a class="code" href="rpmrpc_8c.html#a33">is_time</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx], &tim))) 00566 idx++; <span class="comment">/* time & year or reverse */</span> 00567 } <span class="comment">/* only time or date */</span> 00568 } 00569 <span class="keywordflow">else</span> 00570 <span class="keywordflow">return</span> 0; <span class="comment">/* Nor time or date */</span> 00571 00572 <span class="comment">/*</span> 00573 <span class="comment"> * If the date is less than 6 months in the past, it is shown without year</span> 00574 <span class="comment"> * other dates in the past or future are shown with year but without time</span> 00575 <span class="comment"> * This does not check for years before 1900 ... I don't know, how</span> 00576 <span class="comment"> * to represent them at all</span> 00577 <span class="comment"> */</span> 00578 <span class="keywordflow">if</span> (!got_year && 00579 <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> < 6 && <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> < tim.tm_mon && 00580 tim.tm_mon - <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> >= 6) 00581 00582 tim.tm_year--; 00583 00584 <span class="keywordflow">if</span> ((*t = mktime(&tim)) < 0) 00585 *t = 0; 00586 <span class="keywordflow">return</span> idx; 00587 } 00588 00589 <span class="keyword">static</span> <span class="keywordtype">int</span> <a name="l00590"></a><a class="code" href="rpmrpc_8c.html#a38">00590</a> <a class="code" href="rpmrpc_8c.html#a38">vfs_parse_ls_lga</a> (<span class="keywordtype">char</span> * p, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> stat * st, 00591 <span class="comment">/*@out@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** filename, 00592 <span class="comment">/*@out@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> ** linkname) 00593 <span class="comment">/*@modifies *p, *st, *filename, *linkname @*/</span> 00594 { 00595 <span class="keywordtype">int</span> idx, idx2, num_cols; 00596 <span class="keywordtype">int</span> i; 00597 <span class="keywordtype">char</span> *p_copy; 00598 00599 <span class="keywordflow">if</span> (strncmp (p, <span class="stringliteral">"total"</span>, 5) == 0) 00600 <span class="keywordflow">return</span> 0; 00601 00602 p_copy = <a class="code" href="rpmrpc_8c.html#a0">g_strdup</a>(p); 00603 <span class="comment">/* XXX FIXME: parse out inode number from "NLST -lai ." */</span> 00604 <span class="comment">/* XXX FIXME: parse out sizein blocks from "NLST -lais ." */</span> 00605 00606 <span class="keywordflow">if</span> ((i = <a class="code" href="rpmrpc_8c.html#a35">vfs_parse_filetype</a>(*(p++))) == -1) 00607 <span class="keywordflow">goto</span> error; 00608 00609 st->st_mode = i; 00610 <span class="keywordflow">if</span> (*p == <span class="charliteral">' '</span>) <span class="comment">/* Notwell 4 */</span> 00611 p++; 00612 <span class="keywordflow">if</span> (*p == <span class="charliteral">'['</span>){ 00613 <span class="keywordflow">if</span> (strlen (p) <= 8 || p [8] != <span class="charliteral">']'</span>) 00614 <span class="keywordflow">goto</span> error; 00615 <span class="comment">/* Should parse here the Notwell permissions :) */</span> 00616 <span class="comment">/*@-unrecog@*/</span> 00617 <span class="keywordflow">if</span> (S_ISDIR (st->st_mode)) 00618 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH); 00619 <span class="keywordflow">else</span> 00620 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR); 00621 p += 9; 00622 <span class="comment">/*@=unrecog@*/</span> 00623 } <span class="keywordflow">else</span> { 00624 <span class="keywordflow">if</span> ((i = <a class="code" href="rpmrpc_8c.html#a36">vfs_parse_filemode</a>(p)) == -1) 00625 <span class="keywordflow">goto</span> error; 00626 st->st_mode |= i; 00627 p += 9; 00628 00629 <span class="comment">/* This is for an extra ACL attribute (HP-UX) */</span> 00630 <span class="keywordflow">if</span> (*p == <span class="charliteral">'+'</span>) 00631 p++; 00632 } 00633 00634 <a class="code" href="rpmrpc_8c.html#a1">g_free</a>(p_copy); 00635 p_copy = <a class="code" href="rpmrpc_8c.html#a0">g_strdup</a>(p); 00636 num_cols = <a class="code" href="rpmrpc_8c.html#a28">vfs_split_text</a> (p); 00637 00638 st->st_nlink = atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [0]); 00639 <span class="keywordflow">if</span> (st->st_nlink < 0) 00640 <span class="keywordflow">goto</span> error; 00641 00642 <span class="keywordflow">if</span> (!<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (1)) 00643 <span class="preprocessor">#ifdef HACK</span> 00644 <span class="preprocessor"></span> st->st_uid = finduid (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [1]); 00645 <span class="preprocessor">#else</span> 00646 <span class="preprocessor"></span> (void) <a class="code" href="ugid_8c.html#a0">unameToUid</a> (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [1], &st->st_uid); 00647 <span class="preprocessor">#endif</span> 00648 <span class="preprocessor"></span> <span class="keywordflow">else</span> 00649 st->st_uid = (uid_t) atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [1]); 00650 00651 <span class="comment">/* Mhm, the ls -lg did not produce a group field */</span> 00652 <span class="keywordflow">for</span> (idx = 3; idx <= 5; idx++) 00653 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a32">is_month</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx], NULL) || <a class="code" href="rpmrpc_8c.html#a31">is_week</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx], NULL) || <a class="code" href="rpmrpc_8c.html#a30">is_dos_date</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx])) 00654 <span class="keywordflow">break</span>; 00655 00656 <span class="keywordflow">if</span> (idx == 6 || (idx == 5 && !S_ISCHR (st->st_mode) && !S_ISBLK (st->st_mode))) 00657 <span class="keywordflow">goto</span> error; 00658 00659 <span class="comment">/* We don't have gid */</span> 00660 <span class="keywordflow">if</span> (idx == 3 || (idx == 4 && (S_ISCHR(st->st_mode) || S_ISBLK (st->st_mode)))) 00661 idx2 = 2; 00662 <span class="keywordflow">else</span> { 00663 <span class="comment">/* We have gid field */</span> 00664 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (2)) 00665 st->st_gid = (gid_t) atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [2]); 00666 <span class="keywordflow">else</span> 00667 <span class="preprocessor">#ifdef HACK</span> 00668 <span class="preprocessor"></span> st->st_gid = findgid (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [2]); 00669 <span class="preprocessor">#else</span> 00670 <span class="preprocessor"></span> (void) <a class="code" href="ugid_8c.html#a1">gnameToGid</a> (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [1], &st->st_gid); 00671 <span class="preprocessor">#endif</span> 00672 <span class="preprocessor"></span> idx2 = 3; 00673 } 00674 00675 <span class="comment">/* This is device */</span> 00676 <span class="keywordflow">if</span> (S_ISCHR (st->st_mode) || S_ISBLK (st->st_mode)){ 00677 <span class="keywordtype">int</span> maj, min; 00678 00679 <span class="keywordflow">if</span> (!<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (idx2) || sscanf(<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx2], <span class="stringliteral">" %d,"</span>, &maj) != 1) 00680 <span class="keywordflow">goto</span> error; 00681 00682 <span class="keywordflow">if</span> (!<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (++idx2) || sscanf(<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx2], <span class="stringliteral">" %d"</span>, &min) != 1) 00683 <span class="keywordflow">goto</span> error; 00684 00685 <span class="preprocessor">#ifdef HAVE_ST_RDEV</span> 00686 <span class="preprocessor"></span> st->st_rdev = ((maj & 0xff) << 8) | (min & 0xffff00ff); 00687 <span class="preprocessor">#endif</span> 00688 <span class="preprocessor"></span> st->st_size = 0; 00689 00690 } <span class="keywordflow">else</span> { 00691 <span class="comment">/* Common file size */</span> 00692 <span class="keywordflow">if</span> (!<a class="code" href="rpmrpc_8c.html#a29">is_num</a> (idx2)) 00693 <span class="keywordflow">goto</span> error; 00694 00695 st->st_size = (size_t) atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx2]); 00696 <span class="preprocessor">#ifdef HAVE_ST_RDEV</span> 00697 <span class="preprocessor"></span> st->st_rdev = 0; 00698 <span class="preprocessor">#endif</span> 00699 <span class="preprocessor"></span> } 00700 00701 idx = <a class="code" href="rpmrpc_8c.html#a37">vfs_parse_filedate</a>(idx, &st->st_mtime); 00702 <span class="keywordflow">if</span> (!idx) 00703 <span class="keywordflow">goto</span> error; 00704 <span class="comment">/* Use resulting time value */</span> 00705 st->st_atime = st->st_ctime = st->st_mtime; 00706 st->st_dev = 0; 00707 st->st_ino = 0; 00708 <span class="preprocessor">#ifdef HAVE_ST_BLKSIZE</span> 00709 <span class="preprocessor"></span> st->st_blksize = 512; 00710 <span class="preprocessor">#endif</span> 00711 <span class="preprocessor"></span><span class="preprocessor">#ifdef HAVE_ST_BLOCKS</span> 00712 <span class="preprocessor"></span> st->st_blocks = (st->st_size + 511) / 512; 00713 <span class="preprocessor">#endif</span> 00714 <span class="preprocessor"></span> 00715 <span class="keywordflow">for</span> (i = idx + 1, idx2 = 0; i < num_cols; i++ ) 00716 <span class="keywordflow">if</span> (strcmp (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [i], <span class="stringliteral">"->"</span>) == 0){ 00717 idx2 = i; 00718 <span class="keywordflow">break</span>; 00719 } 00720 00721 <span class="keywordflow">if</span> (((<a class="code" href="system_8h.html#a22">S_ISLNK</a> (st->st_mode) || 00722 (num_cols == idx + 3 && st->st_nlink > 1))) <span class="comment">/* Maybe a hardlink? (in extfs) */</span> 00723 && idx2){ 00724 <span class="keywordtype">int</span> tlen; 00725 <span class="keywordtype">char</span> *t; 00726 00727 <span class="keywordflow">if</span> (filename){ 00728 <span class="preprocessor">#ifdef HACK</span> 00729 <span class="preprocessor"></span> t = g_strndup (p_copy + <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx], <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx2] - <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx] - 1); 00730 <span class="preprocessor">#else</span> 00731 <span class="preprocessor"></span> <span class="keywordtype">int</span> nb = <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx2] - <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx] - 1; 00732 t = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(nb+1); 00733 strncpy(t, p_copy + <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx], nb); 00734 <span class="preprocessor">#endif</span> 00735 <span class="preprocessor"></span> *filename = t; 00736 } 00737 <span class="keywordflow">if</span> (linkname){ 00738 t = <a class="code" href="rpmrpc_8c.html#a0">g_strdup</a> (p_copy + <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx2+1]); 00739 tlen = strlen (t); 00740 <span class="keywordflow">if</span> (t [tlen-1] == <span class="charliteral">'\r'</span> || t [tlen-1] == <span class="charliteral">'\n'</span>) 00741 t [tlen-1] = 0; 00742 <span class="keywordflow">if</span> (t [tlen-2] == <span class="charliteral">'\r'</span> || t [tlen-2] == <span class="charliteral">'\n'</span>) 00743 t [tlen-2] = 0; 00744 00745 *linkname = t; 00746 } 00747 } <span class="keywordflow">else</span> { 00748 <span class="comment">/* Extract the filename from the string copy, not from the columns</span> 00749 <span class="comment"> * this way we have a chance of entering hidden directories like ". ."</span> 00750 <span class="comment"> */</span> 00751 <span class="keywordflow">if</span> (filename){ 00752 <span class="comment">/* </span> 00753 <span class="comment"> *filename = g_strdup (columns [idx++]);</span> 00754 <span class="comment"> */</span> 00755 <span class="keywordtype">int</span> tlen; 00756 <span class="keywordtype">char</span> *t; 00757 00758 t = <a class="code" href="rpmrpc_8c.html#a0">g_strdup</a> (p_copy + <a class="code" href="rpmrpc_8c.html#a9">column_ptr</a> [idx++]); 00759 tlen = strlen (t); 00760 <span class="comment">/* g_strchomp(); */</span> 00761 <span class="keywordflow">if</span> (t [tlen-1] == <span class="charliteral">'\r'</span> || t [tlen-1] == <span class="charliteral">'\n'</span>) 00762 t [tlen-1] = 0; 00763 <span class="keywordflow">if</span> (t [tlen-2] == <span class="charliteral">'\r'</span> || t [tlen-2] == <span class="charliteral">'\n'</span>) 00764 t [tlen-2] = 0; 00765 00766 *filename = t; 00767 } 00768 <span class="keywordflow">if</span> (linkname) 00769 *linkname = NULL; 00770 } 00771 <a class="code" href="rpmrpc_8c.html#a1">g_free</a> (p_copy); 00772 <span class="keywordflow">return</span> 1; 00773 00774 error: 00775 <span class="preprocessor">#ifdef HACK</span> 00776 <span class="preprocessor"></span> { 00777 <span class="keyword">static</span> <span class="keywordtype">int</span> errorcount = 0; 00778 00779 <span class="keywordflow">if</span> (++errorcount < 5) { 00780 message_1s (1, <span class="stringliteral">"Could not parse:"</span>, p_copy); 00781 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (errorcount == 5) 00782 message_1s (1, <span class="stringliteral">"More parsing errors will be ignored."</span>, <span class="stringliteral">"(sorry)"</span> ); 00783 } 00784 <span class="preprocessor">#endif</span> 00785 <span class="preprocessor"></span> 00786 <span class="comment">/*@-usereleased@*/</span> 00787 <span class="keywordflow">if</span> (p_copy != p) <span class="comment">/* Carefull! */</span> 00788 <span class="comment">/*@=usereleased@*/</span> 00789 <a class="code" href="rpmrpc_8c.html#a1">g_free</a> (p_copy); 00790 <span class="keywordflow">return</span> 0; 00791 } 00792 <a name="l00793"></a><a class="code" href="rpmrpc_8c.html#a54">00793</a> <span class="keyword">typedef</span> <span class="keyword">enum</span> { 00794 <a class="code" href="rpmrpc_8c.html#a54a12">DO_FTP_STAT</a> = 1, 00795 <a class="code" href="rpmrpc_8c.html#a54a13">DO_FTP_LSTAT</a> = 2, 00796 <a class="code" href="rpmrpc_8c.html#a54a14">DO_FTP_READLINK</a> = 3, 00797 <a class="code" href="rpmrpc_8c.html#a54a15">DO_FTP_ACCESS</a> = 4, 00798 <a class="code" href="rpmrpc_8c.html#a54a16">DO_FTP_GLOB</a> = 5 00799 } <a class="code" href="rpmrpc_8c.html#a54">ftpSysCall_t</a>; 00800 00803 <span class="comment">/*@unchecked@*/</span> <a name="l00804"></a><a class="code" href="rpmrpc_8c.html#a10">00804</a> <span class="keyword">static</span> size_t <a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> = 0; 00805 00808 <span class="comment">/*@unchecked@*/</span> <a name="l00809"></a><a class="code" href="rpmrpc_8c.html#a11">00809</a> <span class="keyword">static</span> <span class="comment">/*@only@*/</span> <span class="keywordtype">char</span> * <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> = NULL; 00810 <a name="l00811"></a><a class="code" href="rpmrpc_8c.html#a3">00811</a> <span class="preprocessor">#define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))</span> 00812 <span class="preprocessor"></span> 00813 <span class="comment">/*@-mods@*/</span> <a name="l00814"></a><a class="code" href="rpmrpc_8c.html#a39">00814</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a39">ftpNLST</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * url, <a class="code" href="rpmrpc_8c.html#a54">ftpSysCall_t</a> ftpSysCall, 00815 <span class="comment">/*@out@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">struct</span> stat * st, 00816 <span class="comment">/*@out@*/</span> <span class="comment">/*@null@*/</span> <span class="keywordtype">char</span> * rlbuf, size_t rlbufsiz) 00817 <span class="comment">/*@globals fileSystem @*/</span> 00818 <span class="comment">/*@modifies *st, *rlbuf, fileSystem @*/</span> 00819 { 00820 <a class="code" href="struct__FD__s.html">FD_t</a> fd; 00821 <span class="keyword">const</span> <span class="keywordtype">char</span> * path; 00822 <span class="keywordtype">int</span> bufLength, moretodo; 00823 <span class="keyword">const</span> <span class="keywordtype">char</span> *n, *ne, *o, *oe; 00824 <span class="keywordtype">char</span> * s; 00825 <span class="keywordtype">char</span> * se; 00826 <span class="keyword">const</span> <span class="keywordtype">char</span> * urldn; 00827 <span class="keywordtype">char</span> * bn = NULL; 00828 <span class="keywordtype">int</span> nbn = 0; 00829 <a class="code" href="structurlinfo__s.html">urlinfo</a> u; 00830 <span class="keywordtype">int</span> rc; 00831 00832 n = ne = o = oe = NULL; 00833 (void) <a class="code" href="url_8c.html#a18">urlPath</a>(url, &path); 00834 <span class="keywordflow">if</span> (*path == <span class="charliteral">'\0'</span>) 00835 <span class="keywordflow">return</span> -2; 00836 00837 <span class="keywordflow">switch</span> (ftpSysCall) { 00838 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a16">DO_FTP_GLOB</a>: 00839 fd = <a class="code" href="group__rpmio.html#a20">ftpOpen</a>(url, 0, 0, &u); 00840 <span class="keywordflow">if</span> (fd == NULL || u == NULL) 00841 <span class="keywordflow">return</span> -1; 00842 00843 u-><a class="code" href="structurlinfo__s.html#m16">openError</a> = <a class="code" href="group__rpmio.html#a21">ftpReq</a>(fd, <span class="stringliteral">"NLST"</span>, path); 00844 <span class="keywordflow">break</span>; 00845 <span class="keywordflow">default</span>: 00846 urldn = <a class="code" href="fsm_8c.html#a0">alloca_strdup</a>(url); 00847 <span class="comment">/*@-branchstate@*/</span> 00848 <span class="keywordflow">if</span> ((bn = strrchr(urldn, <span class="charliteral">'/'</span>)) == NULL) 00849 <span class="keywordflow">return</span> -2; 00850 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (bn == path) 00851 bn = <span class="stringliteral">"."</span>; 00852 <span class="keywordflow">else</span> 00853 *bn++ = <span class="charliteral">'\0'</span>; 00854 <span class="comment">/*@=branchstate@*/</span> 00855 nbn = strlen(bn); 00856 00857 rc = <a class="code" href="rpmrpc_8c.html#a18">ftpChdir</a>(urldn); <span class="comment">/* XXX don't care about CWD */</span> 00858 <span class="keywordflow">if</span> (rc < 0) 00859 <span class="keywordflow">return</span> rc; 00860 00861 fd = <a class="code" href="group__rpmio.html#a20">ftpOpen</a>(url, 0, 0, &u); 00862 <span class="keywordflow">if</span> (fd == NULL || u == NULL) 00863 <span class="keywordflow">return</span> -1; 00864 00865 <span class="comment">/* XXX possibly should do "NLST -lais" to get st_ino/st_blocks also */</span> 00866 u-><a class="code" href="structurlinfo__s.html#m16">openError</a> = <a class="code" href="group__rpmio.html#a21">ftpReq</a>(fd, <span class="stringliteral">"NLST"</span>, <span class="stringliteral">"-la"</span>); 00867 00868 <span class="keywordflow">if</span> (bn == NULL || nbn <= 0) { 00869 rc = -2; 00870 <span class="keywordflow">goto</span> exit; 00871 } 00872 <span class="keywordflow">break</span>; 00873 } 00874 00875 <span class="keywordflow">if</span> (u-><a class="code" href="structurlinfo__s.html#m16">openError</a> < 0) { 00876 fd = <a class="code" href="rpmio_8h.html#a5">fdLink</a>(fd, <span class="stringliteral">"error data (ftpStat)"</span>); 00877 rc = -2; 00878 <span class="keywordflow">goto</span> exit; 00879 } 00880 00881 <span class="keywordflow">if</span> (<a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> == 0 || <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> == NULL) { 00882 <a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> = _url_iobuf_size; 00883 <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> = <a class="code" href="rpmmalloc_8c.html#a2">xcalloc</a>(<a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a>, <span class="keyword">sizeof</span>(<a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a>[0])); 00884 } 00885 *<a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> = <span class="charliteral">'\0'</span>; 00886 00887 bufLength = 0; 00888 moretodo = 1; 00889 00890 <span class="keywordflow">do</span> { 00891 00892 <span class="comment">/* XXX FIXME: realloc ftpBuf if < ~128 chars remain */</span> 00893 <span class="keywordflow">if</span> ((<a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> - bufLength) < (1024+80)) { 00894 <a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> <<= 2; 00895 <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(<a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a>, <a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a>); 00896 } 00897 s = se = <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a> + bufLength; 00898 *se = <span class="charliteral">'\0'</span>; 00899 00900 rc = <a class="code" href="group__rpmio.html#a19">fdFgets</a>(fd, se, (<a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> - bufLength)); 00901 <span class="keywordflow">if</span> (rc <= 0) { 00902 moretodo = 0; 00903 <span class="keywordflow">break</span>; 00904 } 00905 <span class="keywordflow">if</span> (ftpSysCall == <a class="code" href="rpmrpc_8c.html#a54a16">DO_FTP_GLOB</a>) { <span class="comment">/* XXX HACK */</span> 00906 bufLength += strlen(se); 00907 <span class="keywordflow">continue</span>; 00908 } 00909 00910 <span class="keywordflow">for</span> (s = se; *s != <span class="charliteral">'\0'</span>; s = se) { 00911 <span class="keywordtype">int</span> bingo; 00912 00913 <span class="keywordflow">while</span> (*se && *se != <span class="charliteral">'\n'</span>) se++; 00914 <span class="keywordflow">if</span> (se > s && se[-1] == <span class="charliteral">'\r'</span>) se[-1] = <span class="charliteral">'\0'</span>; 00915 <span class="keywordflow">if</span> (*se == <span class="charliteral">'\0'</span>) 00916 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00917 *se++ = <span class="charliteral">'\0'</span>; 00918 00919 <span class="keywordflow">if</span> (!strncmp(s, <span class="stringliteral">"total "</span>, <span class="keyword">sizeof</span>(<span class="stringliteral">"total "</span>)-1)) 00920 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 00921 00922 o = NULL; 00923 <span class="keywordflow">for</span> (bingo = 0, n = se; n >= s; n--) { 00924 <span class="keywordflow">switch</span> (*n) { 00925 <span class="keywordflow">case</span> <span class="charliteral">'\0'</span>: 00926 oe = ne = n; 00927 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 00928 <span class="keywordflow">case</span> <span class="charliteral">' '</span>: 00929 <span class="keywordflow">if</span> (o || !(n[-3] == <span class="charliteral">' '</span> && n[-2] == <span class="charliteral">'-'</span> && n[-1] == <span class="charliteral">'>'</span>)) { 00930 <span class="keywordflow">while</span> (*(++n) == <span class="charliteral">' '</span>) 00931 {}; 00932 bingo++; 00933 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 00934 } 00935 <span class="keywordflow">for</span> (o = n + 1; *o == <span class="charliteral">' '</span>; o++) 00936 {}; 00937 n -= 3; 00938 ne = n; 00939 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 00940 <span class="keywordflow">default</span>: 00941 <span class="comment">/*@switchbreak@*/</span> <span class="keywordflow">break</span>; 00942 } 00943 <span class="keywordflow">if</span> (bingo) 00944 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00945 } 00946 00947 <span class="keywordflow">if</span> (nbn != (ne - n)) <span class="comment">/* Same name length? */</span> 00948 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 00949 <span class="keywordflow">if</span> (strncmp(n, bn, nbn)) <span class="comment">/* Same name? */</span> 00950 <span class="comment">/*@innercontinue@*/</span> <span class="keywordflow">continue</span>; 00951 00952 moretodo = 0; 00953 <span class="comment">/*@innerbreak@*/</span> <span class="keywordflow">break</span>; 00954 } 00955 00956 <span class="keywordflow">if</span> (moretodo && se > s) { 00957 bufLength = se - s - 1; 00958 <span class="keywordflow">if</span> (s != <a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a>) 00959 memmove(<a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a>, s, bufLength); 00960 } <span class="keywordflow">else</span> { 00961 bufLength = 0; 00962 } 00963 } <span class="keywordflow">while</span> (moretodo); 00964 00965 <span class="keywordflow">switch</span> (ftpSysCall) { 00966 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a12">DO_FTP_STAT</a>: 00967 <span class="keywordflow">if</span> (o && oe) { 00968 <span class="comment">/* XXX FIXME: symlink, replace urldn/bn from [o,oe) and restart */</span> 00969 } 00970 <span class="comment">/*@fallthrough@*/</span> 00971 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a13">DO_FTP_LSTAT</a>: 00972 <span class="keywordflow">if</span> (st == NULL || !(n && ne)) { 00973 rc = -1; 00974 } <span class="keywordflow">else</span> { 00975 rc = ((<a class="code" href="rpmrpc_8c.html#a38">vfs_parse_ls_lga</a>(s, st, NULL, NULL) > 0) ? 0 : -1); 00976 } 00977 <span class="keywordflow">break</span>; 00978 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a14">DO_FTP_READLINK</a>: 00979 <span class="keywordflow">if</span> (rlbuf == NULL || !(o && oe)) { 00980 rc = -1; 00981 } <span class="keywordflow">else</span> { 00982 rc = oe - o; 00983 <span class="keywordflow">if</span> (rc > rlbufsiz) 00984 rc = rlbufsiz; 00985 memcpy(rlbuf, o, rc); 00986 <span class="keywordflow">if</span> (rc < rlbufsiz) 00987 rlbuf[rc] = <span class="charliteral">'\0'</span>; 00988 } 00989 <span class="keywordflow">break</span>; 00990 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a15">DO_FTP_ACCESS</a>: 00991 rc = 0; <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00992 <span class="keywordflow">break</span>; 00993 <span class="keywordflow">case</span> <a class="code" href="rpmrpc_8c.html#a54a16">DO_FTP_GLOB</a>: 00994 rc = 0; <span class="comment">/* XXX WRONG WRONG WRONG */</span> 00995 <span class="keywordflow">break</span>; 00996 } 00997 00998 exit: 00999 (void) <a class="code" href="group__rpmio.html#a23">ufdClose</a>(fd); 01000 <span class="keywordflow">return</span> rc; 01001 } 01002 <span class="comment">/*@=mods@*/</span> 01003 <a name="l01004"></a><a class="code" href="rpmrpc_8c.html#a40">01004</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a40">ftpStat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> stat *st) 01005 <span class="comment">/*@globals fileSystem @*/</span> 01006 <span class="comment">/*@modifies *st, fileSystem @*/</span> 01007 { 01008 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a39">ftpNLST</a>(path, <a class="code" href="rpmrpc_8c.html#a54a12">DO_FTP_STAT</a>, st, NULL, 0); 01009 } 01010 <a name="l01011"></a><a class="code" href="rpmrpc_8c.html#a41">01011</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a41">ftpLstat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="comment">/*@out@*/</span> <span class="keyword">struct</span> stat *st) 01012 <span class="comment">/*@globals fileSystem @*/</span> 01013 <span class="comment">/*@modifies *st, fileSystem @*/</span> 01014 { 01015 <span class="keywordtype">int</span> rc; 01016 rc = <a class="code" href="rpmrpc_8c.html#a39">ftpNLST</a>(path, <a class="code" href="rpmrpc_8c.html#a54a13">DO_FTP_LSTAT</a>, st, NULL, 0); 01017 <span class="keywordflow">if</span> (_rpmio_debug) 01018 fprintf(stderr, <span class="stringliteral">"*** ftpLstat(%s) rc %d\n"</span>, path, rc); 01019 <span class="keywordflow">return</span> rc; 01020 } 01021 <a name="l01022"></a><a class="code" href="rpmrpc_8c.html#a42">01022</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a42">ftpReadlink</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="comment">/*@out@*/</span> <span class="keywordtype">char</span> * buf, size_t bufsiz) 01023 <span class="comment">/*@globals fileSystem @*/</span> 01024 <span class="comment">/*@modifies *buf, fileSystem @*/</span> 01025 { 01026 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a39">ftpNLST</a>(path, <a class="code" href="rpmrpc_8c.html#a54a14">DO_FTP_READLINK</a>, NULL, buf, bufsiz); 01027 } 01028 <a name="l01029"></a><a class="code" href="rpmrpc_8c.html#a43">01029</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a43">ftpGlob</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="keywordtype">int</span> flags, 01030 <span class="keywordtype">int</span> errfunc(<span class="keyword">const</span> <span class="keywordtype">char</span> * epath, <span class="keywordtype">int</span> eerno), 01031 <span class="comment">/*@out@*/</span> glob_t * pglob) 01032 <span class="comment">/*@globals fileSystem @*/</span> 01033 <span class="comment">/*@modifies *pglob, fileSystem @*/</span> 01034 { 01035 <span class="keywordtype">int</span> rc; 01036 01037 <span class="keywordflow">if</span> (pglob == NULL) 01038 <span class="keywordflow">return</span> -2; 01039 rc = <a class="code" href="rpmrpc_8c.html#a39">ftpNLST</a>(path, <a class="code" href="rpmrpc_8c.html#a54a16">DO_FTP_GLOB</a>, NULL, NULL, 0); 01040 <span class="comment">/*@-castfcnptr@*/</span> 01041 <span class="keywordflow">if</span> (_rpmio_debug) 01042 fprintf(stderr, <span class="stringliteral">"*** ftpGlob(%s,0x%x,%p,%p) ftpNLST rc %d\n"</span>, path, (<span class="keywordtype">unsigned</span>)flags, (<span class="keywordtype">void</span> *)errfunc, pglob, rc); 01043 <span class="comment">/*@=castfcnptr@*/</span> 01044 <span class="keywordflow">if</span> (rc) 01045 <span class="keywordflow">return</span> rc; 01046 rc = <a class="code" href="group__popt.html#a2">poptParseArgvString</a>(<a class="code" href="rpmrpc_8c.html#a11">ftpBuf</a>, &pglob->gl_pathc, (<span class="keyword">const</span> <span class="keywordtype">char</span> ***)&pglob->gl_pathv); 01047 pglob->gl_offs = -1; <span class="comment">/* XXX HACK HACK HACK */</span> 01048 <span class="keywordflow">return</span> rc; 01049 } 01050 <a name="l01051"></a><a class="code" href="rpmrpc_8c.html#a44">01051</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="rpmrpc_8c.html#a44">ftpGlobfree</a>(glob_t * pglob) 01052 <span class="comment">/*@modifies *pglob @*/</span> 01053 { 01054 <span class="comment">/*@-modfilesys@*/</span> 01055 <span class="keywordflow">if</span> (_rpmio_debug) 01056 fprintf(stderr, <span class="stringliteral">"*** ftpGlobfree(%p)\n"</span>, pglob); 01057 <span class="comment">/*@=modfilesys@*/</span> 01058 <span class="keywordflow">if</span> (pglob->gl_offs == -1) { <span class="comment">/* XXX HACK HACK HACK */</span> 01059 free((<span class="keywordtype">void</span> *)pglob->gl_pathv); 01060 pglob->gl_pathv = NULL; 01061 } 01062 } 01063 <a name="l01064"></a><a class="code" href="rpmrpc_8c.html#a45">01064</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a45">Stat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="keyword">struct</span> stat * st) 01065 { 01066 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01067 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 01068 01069 <span class="keywordflow">if</span> (_rpmio_debug) 01070 fprintf(stderr, <span class="stringliteral">"*** Stat(%s,%p)\n"</span>, path, st); 01071 <span class="keywordflow">switch</span> (ut) { 01072 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 01073 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a40">ftpStat</a>(path, st); 01074 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01075 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01076 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01077 path = lpath; 01078 <span class="comment">/*@fallthrough@*/</span> 01079 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01080 <span class="keywordflow">break</span>; 01081 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01082 <span class="keywordflow">default</span>: 01083 <span class="keywordflow">return</span> -2; 01084 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01085 } 01086 <span class="keywordflow">return</span> stat(path, st); 01087 } 01088 <a name="l01089"></a><a class="code" href="rpmrpc_8c.html#a46">01089</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a46">Lstat</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="keyword">struct</span> stat * st) 01090 { 01091 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01092 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 01093 01094 <span class="keywordflow">if</span> (_rpmio_debug) 01095 fprintf(stderr, <span class="stringliteral">"*** Lstat(%s,%p)\n"</span>, path, st); 01096 <span class="keywordflow">switch</span> (ut) { 01097 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 01098 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a41">ftpLstat</a>(path, st); 01099 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01100 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01101 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01102 path = lpath; 01103 <span class="comment">/*@fallthrough@*/</span> 01104 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01105 <span class="keywordflow">break</span>; 01106 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01107 <span class="keywordflow">default</span>: 01108 <span class="keywordflow">return</span> -2; 01109 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01110 } 01111 <span class="keywordflow">return</span> lstat(path, st); 01112 } 01113 <a name="l01114"></a><a class="code" href="rpmrpc_8c.html#a47">01114</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a47">Readlink</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="keywordtype">char</span> * buf, size_t bufsiz) 01115 { 01116 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01117 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 01118 01119 <span class="keywordflow">switch</span> (ut) { 01120 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: 01121 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a42">ftpReadlink</a>(path, buf, bufsiz); 01122 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01123 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01124 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01125 path = lpath; 01126 <span class="comment">/*@fallthrough@*/</span> 01127 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01128 <span class="keywordflow">break</span>; 01129 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01130 <span class="keywordflow">default</span>: 01131 <span class="keywordflow">return</span> -2; 01132 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01133 } 01134 <span class="keywordflow">return</span> readlink(path, buf, bufsiz); 01135 } 01136 <a name="l01137"></a><a class="code" href="rpmrpc_8c.html#a48">01137</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a48">Access</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path, <span class="keywordtype">int</span> amode) 01138 { 01139 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01140 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 01141 01142 <span class="keywordflow">if</span> (_rpmio_debug) 01143 fprintf(stderr, <span class="stringliteral">"*** Access(%s,%d)\n"</span>, path, amode); 01144 <span class="keywordflow">switch</span> (ut) { 01145 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01146 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01147 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01148 path = lpath; 01149 <span class="comment">/*@fallthrough@*/</span> 01150 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01151 <span class="keywordflow">break</span>; 01152 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01153 <span class="keywordflow">default</span>: 01154 <span class="keywordflow">return</span> -2; 01155 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01156 } 01157 <span class="keywordflow">return</span> access(path, amode); 01158 } 01159 <a name="l01160"></a><a class="code" href="rpmrpc_8c.html#a49">01160</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a49">Glob</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *pattern, <span class="keywordtype">int</span> flags, 01161 <span class="keywordtype">int</span> errfunc(<span class="keyword">const</span> <span class="keywordtype">char</span> * epath, <span class="keywordtype">int</span> eerrno), glob_t *pglob) 01162 { 01163 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01164 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(pattern, &lpath); 01165 01166 <span class="comment">/*@-castfcnptr@*/</span> 01167 <span class="keywordflow">if</span> (_rpmio_debug) 01168 fprintf(stderr, <span class="stringliteral">"*** Glob(%s,0x%x,%p,%p)\n"</span>, pattern, (<span class="keywordtype">unsigned</span>)flags, (<span class="keywordtype">void</span> *)errfunc, pglob); 01169 <span class="comment">/*@=castfcnptr@*/</span> 01170 <span class="keywordflow">switch</span> (ut) { 01171 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01172 <span class="keywordflow">return</span> <a class="code" href="rpmrpc_8c.html#a43">ftpGlob</a>(pattern, flags, errfunc, pglob); 01173 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01174 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01175 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01176 pattern = lpath; 01177 <span class="comment">/*@fallthrough@*/</span> 01178 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01179 <span class="keywordflow">break</span>; 01180 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01181 <span class="keywordflow">default</span>: 01182 <span class="keywordflow">return</span> -2; 01183 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01184 } 01185 <span class="keywordflow">return</span> glob(pattern, flags, errfunc, pglob); 01186 } 01187 <a name="l01188"></a><a class="code" href="rpmrpc_8c.html#a50">01188</a> <span class="keywordtype">void</span> <a class="code" href="rpmrpc_8c.html#a50">Globfree</a>(glob_t *pglob) 01189 { 01190 <span class="keywordflow">if</span> (_rpmio_debug) 01191 fprintf(stderr, <span class="stringliteral">"*** Globfree(%p)\n"</span>, pglob); 01192 <span class="comment">/*@-branchstate@*/</span> 01193 <span class="keywordflow">if</span> (pglob->gl_offs == -1) <span class="comment">/* XXX HACK HACK HACK */</span> 01194 <a class="code" href="rpmrpc_8c.html#a44">ftpGlobfree</a>(pglob); 01195 <span class="keywordflow">else</span> 01196 globfree(pglob); 01197 <span class="comment">/*@=branchstate@*/</span> 01198 } 01199 <a name="l01200"></a><a class="code" href="rpmrpc_8c.html#a51">01200</a> DIR * <a class="code" href="rpmrpc_8c.html#a51">Opendir</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * path) 01201 { 01202 <span class="keyword">const</span> <span class="keywordtype">char</span> * lpath; 01203 <span class="keywordtype">int</span> ut = <a class="code" href="url_8c.html#a18">urlPath</a>(path, &lpath); 01204 01205 <span class="keywordflow">if</span> (_rpmio_debug) 01206 fprintf(stderr, <span class="stringliteral">"*** Opendir(%s)\n"</span>, path); 01207 <span class="keywordflow">switch</span> (ut) { 01208 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01209 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>: <span class="comment">/* XXX WRONG WRONG WRONG */</span> 01210 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>: 01211 path = lpath; 01212 <span class="comment">/*@fallthrough@*/</span> 01213 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>: 01214 <span class="keywordflow">break</span>; 01215 <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>: 01216 <span class="keywordflow">default</span>: 01217 <span class="keywordflow">return</span> NULL; 01218 <span class="comment">/*@notreached@*/</span> <span class="keywordflow">break</span>; 01219 } 01220 <span class="comment">/*@-dependenttrans@*/</span> 01221 <span class="keywordflow">return</span> opendir(path); 01222 <span class="comment">/*@=dependenttrans@*/</span> 01223 } 01224 01225 <span class="comment">/*@+voidabstract@*/</span> <a name="l01226"></a><a class="code" href="rpmrpc_8c.html#a52">01226</a> <span class="keyword">struct </span><a class="code" href="system_8h.html#a11">dirent</a> * <a class="code" href="group__rpmrpc.html#a21">Readdir</a>(DIR * dir) 01227 { 01228 <span class="keywordflow">if</span> (_rpmio_debug) 01229 fprintf(stderr, <span class="stringliteral">"*** Readdir(%p)\n"</span>, (<span class="keywordtype">void</span> *)dir); 01230 <span class="keywordflow">return</span> readdir(dir); 01231 } 01232 <a name="l01233"></a><a class="code" href="rpmrpc_8c.html#a53">01233</a> <span class="keywordtype">int</span> <a class="code" href="rpmrpc_8c.html#a53">Closedir</a>(DIR * dir) 01234 { 01235 <span class="keywordflow">if</span> (_rpmio_debug) 01236 fprintf(stderr, <span class="stringliteral">"*** Closedir(%p)\n"</span>, (<span class="keywordtype">void</span> *)dir); 01237 <span class="keywordflow">return</span> closedir(dir); 01238 } 01239 <span class="comment">/*@=voidabstract@*/</span> 01240 <span class="comment">/*@=type@*/</span> </pre></div><hr><address style="align: right;"><small>Generated on Thu Sep 12 22:15:02 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>