Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>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> &nbsp; <a class="qindex" href="modules.html">Modules</a> &nbsp; <a class="qindex" href="annotated.html">Data Structures</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Data Fields</a> &nbsp; <a class="qindex" href="globals.html">Globals</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; </center>
<hr><h1>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 &lt;<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>&gt;</span>
00008 <span class="preprocessor">#include &lt;<a class="code" href="popt_8h.html">popt.h</a>&gt;</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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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 &amp;&amp; oe &amp;&amp; ne &amp;&amp; (oe - oldpath) == (ne - newpath) &amp;&amp;
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, &amp;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, &amp;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 &amp;&amp; oe &amp;&amp; ne &amp;&amp; (oe - oldpath) == (ne - newpath) &amp;&amp;
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, &amp;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 &amp;&amp; numcols &lt; <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 &amp;&amp; *p != <span class="charliteral">' '</span> &amp;&amp; *p != <span class="charliteral">'\r'</span> &amp;&amp; *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] &lt; <span class="charliteral">'0'</span> || <a class="code" href="rpmrpc_8c.html#a8">columns</a> [idx][0] &gt; <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 &amp;&amp; strlen(str) == 8 &amp;&amp;
00312                 str[2] == str[5] &amp;&amp; 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 &amp;&amp; (pos=strstr(week, str)) != NULL) {
00326     <span class="comment">/*@=observertrans =mayaliasunique@*/</span>
00327         <span class="keywordflow">if</span> (tim != NULL)
00328             tim-&gt;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 &amp;&amp; (pos = strstr(month, str)) != NULL) {
00343     <span class="comment">/*@=observertrans -mayaliasunique@*/</span>
00344         <span class="keywordflow">if</span> (tim != NULL)
00345             tim-&gt;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 &amp;&amp; (p = strchr(str, <span class="charliteral">':'</span>)) &amp;&amp; (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>, &amp;tim-&gt;tm_hour, &amp;tim-&gt;tm_min, &amp;tim-&gt;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>, &amp;tim-&gt;tm_hour, &amp;tim-&gt;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>, &amp;year) != 1)
00386         <span class="keywordflow">return</span> 0;
00387 
00388     <span class="keywordflow">if</span> (year &lt; 1900 || year &gt; 3000)
00389         <span class="keywordflow">return</span> 0;
00390 
00391     tim-&gt;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, &amp;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, &amp;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>, &amp;d[0], &amp;d[1], &amp;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] &lt; 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], &amp;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], &amp;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) &amp;&amp; 
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], &amp;tim)) || <a class="code" href="rpmrpc_8c.html#a33">is_time</a>(<a class="code" href="rpmrpc_8c.html#a8">columns</a>[idx], &amp;tim)))
00566                 idx++; <span class="comment">/* time &amp; 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 &amp;&amp;
00579         <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> &lt; 6 &amp;&amp; <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> &lt; tim.tm_mon &amp;&amp; 
00580         tim.tm_mon - <a class="code" href="rpmrpc_8c.html#a6">current_mon</a> &gt;= 6)
00581 
00582         tim.tm_year--;
00583 
00584     <span class="keywordflow">if</span> ((*t = mktime(&amp;tim)) &lt; 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-&gt;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) &lt;= 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-&gt;st_mode))
00618             st-&gt;st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH);
00619         <span class="keywordflow">else</span>
00620             st-&gt;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-&gt;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-&gt;st_nlink = atol (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [0]);
00639     <span class="keywordflow">if</span> (st-&gt;st_nlink &lt; 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-&gt;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], &amp;st-&gt;st_uid);
00647 <span class="preprocessor">#endif</span>
00648 <span class="preprocessor"></span>    <span class="keywordflow">else</span>
00649         st-&gt;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 &lt;= 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 &amp;&amp; !S_ISCHR (st-&gt;st_mode) &amp;&amp; !S_ISBLK (st-&gt;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 &amp;&amp; (S_ISCHR(st-&gt;st_mode) || S_ISBLK (st-&gt;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-&gt;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-&gt;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], &amp;st-&gt;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-&gt;st_mode) || S_ISBLK (st-&gt;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>, &amp;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>, &amp;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-&gt;st_rdev = ((maj &amp; 0xff) &lt;&lt; 8) | (min &amp; 0xffff00ff);
00687 <span class="preprocessor">#endif</span>
00688 <span class="preprocessor"></span>        st-&gt;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-&gt;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-&gt;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, &amp;st-&gt;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-&gt;st_atime = st-&gt;st_ctime = st-&gt;st_mtime;
00706     st-&gt;st_dev = 0;
00707     st-&gt;st_ino = 0;
00708 <span class="preprocessor">#ifdef HAVE_ST_BLKSIZE</span>
00709 <span class="preprocessor"></span>    st-&gt;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-&gt;st_blocks = (st-&gt;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 &lt; num_cols; i++ ) 
00716         <span class="keywordflow">if</span> (strcmp (<a class="code" href="rpmrpc_8c.html#a8">columns</a> [i], <span class="stringliteral">"-&gt;"</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-&gt;st_mode) || 
00722         (num_cols == idx + 3 &amp;&amp; st-&gt;st_nlink &gt; 1))) <span class="comment">/* Maybe a hardlink? (in extfs) */</span>
00723         &amp;&amp; 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 &lt; 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, &amp;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, &amp;u);
00840         <span class="keywordflow">if</span> (fd == NULL || u == NULL)
00841             <span class="keywordflow">return</span> -1;
00842 
00843         u-&gt;<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 &lt; 0)
00859             <span class="keywordflow">return</span> rc;
00860 
00861         fd = <a class="code" href="group__rpmio.html#a20">ftpOpen</a>(url, 0, 0, &amp;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-&gt;<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 &lt;= 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-&gt;<a class="code" href="structurlinfo__s.html#m16">openError</a> &lt; 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 &lt; ~128 chars remain */</span>
00893         <span class="keywordflow">if</span> ((<a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> - bufLength) &lt; (1024+80)) {
00894             <a class="code" href="rpmrpc_8c.html#a10">ftpBufAlloced</a> &lt;&lt;= 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 &lt;= 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 &amp;&amp; *se != <span class="charliteral">'\n'</span>) se++;
00914             <span class="keywordflow">if</span> (se &gt; s &amp;&amp; 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 &gt;= 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> &amp;&amp; n[-2] == <span class="charliteral">'-'</span> &amp;&amp; n[-1] == <span class="charliteral">'&gt;'</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 &amp;&amp; se &gt; 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 &amp;&amp; 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 &amp;&amp; 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) &gt; 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 &amp;&amp; oe)) {
00980             rc = -1;
00981         } <span class="keywordflow">else</span> {
00982             rc = oe - o;
00983             <span class="keywordflow">if</span> (rc &gt; rlbufsiz)
00984                 rc = rlbufsiz;
00985             memcpy(rlbuf, o, rc);
00986             <span class="keywordflow">if</span> (rc &lt; 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>, &amp;pglob-&gt;gl_pathc, (<span class="keyword">const</span> <span class="keywordtype">char</span> ***)&amp;pglob-&gt;gl_pathv);
01047     pglob-&gt;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-&gt;gl_offs == -1) { <span class="comment">/* XXX HACK HACK HACK */</span>
01059         free((<span class="keywordtype">void</span> *)pglob-&gt;gl_pathv);
01060         pglob-&gt;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, &amp;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, &amp;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, &amp;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, &amp;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, &amp;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-&gt;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, &amp;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>