Sophie

Sophie

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

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/url.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/url.c</h1><a href="url_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 
00008 <span class="preprocessor">#include &lt;netinet/in.h&gt;</span>
00009 
00010 <span class="preprocessor">#include &lt;<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>&gt;</span>
00011 <span class="preprocessor">#include &lt;<a class="code" href="rpmmessages_8h.html">rpmmessages.h</a>&gt;</span>
00012 <span class="preprocessor">#include &lt;<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>&gt;</span>
00013 
00014 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00015 
00016 <span class="comment">/*@access FD_t@*/</span>               <span class="comment">/* XXX compared with NULL */</span>
00017 <span class="comment">/*@access urlinfo@*/</span>
00018 
00019 <span class="preprocessor">#ifndef IPPORT_FTP</span>
<a name="l00020"></a><a class="code" href="url_8c.html#a0">00020</a> <span class="preprocessor"></span><span class="preprocessor">#define IPPORT_FTP      21</span>
00021 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00022 <span class="preprocessor"></span><span class="preprocessor">#ifndef IPPORT_HTTP</span>
<a name="l00023"></a><a class="code" href="url_8c.html#a1">00023</a> <span class="preprocessor"></span><span class="preprocessor">#define IPPORT_HTTP     80</span>
00024 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00025 <span class="preprocessor"></span>
00028 <span class="comment">/*@unchecked@*/</span>
<a name="l00029"></a><a class="code" href="url_8c.html#a5">00029</a> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a5">_url_iobuf_size</a> = <a class="code" href="rpmurl_8h.html#a2">RPMURL_IOBUF_SIZE</a>;
00030 
00033 <span class="comment">/*@unchecked@*/</span>
<a name="l00034"></a><a class="code" href="url_8c.html#a6">00034</a> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a6">_url_debug</a> = 0;
00035 
<a name="l00036"></a><a class="code" href="url_8c.html#a2">00036</a> <span class="preprocessor">#define URLDBG(_f, _m, _x)      if ((_url_debug | (_f)) &amp; (_m)) fprintf _x</span>
00037 <span class="preprocessor"></span>
<a name="l00038"></a><a class="code" href="url_8c.html#a3">00038</a> <span class="preprocessor">#define URLDBGIO(_f, _x)        URLDBG((_f), RPMURL_DEBUG_IO, _x)</span>
<a name="l00039"></a><a class="code" href="url_8c.html#a4">00039</a> <span class="preprocessor"></span><span class="preprocessor">#define URLDBGREFS(_f, _x)      URLDBG((_f), RPMURL_DEBUG_REFS, _x)</span>
00040 <span class="preprocessor"></span>
00043 <span class="comment">/*@unchecked@*/</span>
00044 <span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span>
<a name="l00045"></a><a class="code" href="url_8c.html#a7">00045</a> <a class="code" href="structurlinfo__s.html">urlinfo</a> *<a class="code" href="url_8c.html#a7">_url_cache</a> = NULL;
00046 
00049 <span class="comment">/*@unchecked@*/</span>
<a name="l00050"></a><a class="code" href="url_8c.html#a8">00050</a> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a8">_url_count</a> = 0;
00051 
00057 <span class="comment">/*@unused@*/</span> <span class="keyword">static</span> <span class="keyword">inline</span> <span class="comment">/*@null@*/</span> <span class="keywordtype">void</span> *
<a name="l00058"></a><a class="code" href="url_8c.html#a10">00058</a> <a class="code" href="poptint_8h.html#a14">_free</a>(<span class="comment">/*@only@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * p) <span class="comment">/*@modifies p@*/</span>
00059 {
00060     <span class="keywordflow">if</span> (p != NULL)      free((<span class="keywordtype">void</span> *)p);
00061     <span class="keywordflow">return</span> NULL;
00062 }
00063 
<a name="l00064"></a><a class="code" href="url_8c.html#a11">00064</a> <a class="code" href="structurlinfo__s.html">urlinfo</a> <a class="code" href="url_8c.html#a11">XurlLink</a>(<a class="code" href="structurlinfo__s.html">urlinfo</a> u, <span class="keyword">const</span> <span class="keywordtype">char</span> *msg, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keywordtype">unsigned</span> line)
00065 {
00066     <a class="code" href="rpmurl_8h.html#a1">URLSANE</a>(u);
00067     u-&gt;<a class="code" href="structurlinfo__s.html#m0">nrefs</a>++;
00068 <span class="comment">/*@-modfilesys@*/</span>
00069 <a class="code" href="url_8c.html#a4">URLDBGREFS</a>(0, (stderr, <span class="stringliteral">"--&gt; url %p ++ %d %s at %s:%u\n"</span>, u, u-&gt;<a class="code" href="structurlinfo__s.html#m0">nrefs</a>, msg, file, line));
00070 <span class="comment">/*@=modfilesys@*/</span>
00071     <span class="comment">/*@-refcounttrans@*/</span> <span class="keywordflow">return</span> u; <span class="comment">/*@=refcounttrans@*/</span>
00072 }
00073 
<a name="l00074"></a><a class="code" href="url_8c.html#a12">00074</a> <a class="code" href="structurlinfo__s.html">urlinfo</a> <a class="code" href="url_8c.html#a12">XurlNew</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *msg, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keywordtype">unsigned</span> line)
00075 {
00076     <a class="code" href="structurlinfo__s.html">urlinfo</a> u;
00077     <span class="keywordflow">if</span> ((u = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(<span class="keyword">sizeof</span>(*u))) == NULL)
00078         <span class="keywordflow">return</span> NULL;
00079     memset(u, 0, <span class="keyword">sizeof</span>(*u));
00080     u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> = -1;
00081     u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> = -1;
00082     u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> = <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>;
00083     u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a> = NULL;
00084     u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a> = NULL;
00085     u-&gt;<a class="code" href="structurlinfo__s.html#m14">bufAlloced</a> = 0;
00086     u-&gt;<a class="code" href="structurlinfo__s.html#m15">buf</a> = NULL;
00087     u-&gt;<a class="code" href="structurlinfo__s.html#m18">httpHasRange</a> = 1;
00088     u-&gt;<a class="code" href="structurlinfo__s.html#m17">httpVersion</a> = 0;
00089     u-&gt;<a class="code" href="structurlinfo__s.html#m0">nrefs</a> = 0;
00090     u-&gt;<a class="code" href="structurlinfo__s.html#m19">magic</a> = <a class="code" href="rpmurl_8h.html#a0">URLMAGIC</a>;
00091     <span class="keywordflow">return</span> <a class="code" href="url_8c.html#a11">XurlLink</a>(u, msg, file, line);
00092 }
00093 
<a name="l00094"></a><a class="code" href="url_8c.html#a13">00094</a> <a class="code" href="structurlinfo__s.html">urlinfo</a> <a class="code" href="url_8c.html#a13">XurlFree</a>(<a class="code" href="structurlinfo__s.html">urlinfo</a> u, <span class="keyword">const</span> <span class="keywordtype">char</span> *msg, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keywordtype">unsigned</span> line)
00095 {
00096     <span class="keywordtype">int</span> xx;
00097 
00098     <a class="code" href="rpmurl_8h.html#a1">URLSANE</a>(u);
00099 <a class="code" href="url_8c.html#a4">URLDBGREFS</a>(0, (stderr, <span class="stringliteral">"--&gt; url %p -- %d %s at %s:%u\n"</span>, u, u-&gt;<a class="code" href="structurlinfo__s.html#m0">nrefs</a>, msg, file, line));
00100     <span class="keywordflow">if</span> (--u-&gt;<a class="code" href="structurlinfo__s.html#m0">nrefs</a> &gt; 0)
00101         <span class="comment">/*@-refcounttrans -retalias@*/</span> <span class="keywordflow">return</span> u; <span class="comment">/*@=refcounttrans =retalias@*/</span>
00102     <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>) {
00103 <span class="preprocessor">#ifndef NOTYET</span>
00104 <span class="preprocessor"></span>        <span class="keywordtype">void</span> * fp = <a class="code" href="group__rpmio.html#a27">fdGetFp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>);
00105         <span class="comment">/*@-branchstate@*/</span>
00106         <span class="keywordflow">if</span> (fp) {
00107             <a class="code" href="group__rpmio.html#a32">fdPush</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>, fpio, fp, -1);   <span class="comment">/* Push fpio onto stack */</span>
00108             (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>);
00109         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fdio-&gt;_fileno(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>) &gt;= 0)
00110             xx = fdio-&gt;close(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>);
00111         <span class="comment">/*@=branchstate@*/</span>
00112 <span class="preprocessor">#else</span>
00113 <span class="preprocessor"></span>        (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>);
00114 <span class="preprocessor">#endif</span>
00115 <span class="preprocessor"></span>
00116         u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a> = fdio-&gt;_fdderef(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>, <span class="stringliteral">"persist ctrl (urlFree)"</span>, file, line);
00117         <span class="comment">/*@-usereleased@*/</span>
00118         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>)
00119             fprintf(stderr, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"warning: u %p ctrl %p nrefs != 0 (%s %s)\n"</span>),
00120                         u, u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>, (u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>),
00121                         (u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>));
00122         <span class="comment">/*@=usereleased@*/</span>
00123     }
00124     <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>) {
00125 <span class="preprocessor">#ifndef NOTYET</span>
00126 <span class="preprocessor"></span>        <span class="keywordtype">void</span> * fp = <a class="code" href="group__rpmio.html#a27">fdGetFp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>);
00127         <span class="keywordflow">if</span> (fp) {
00128             <a class="code" href="group__rpmio.html#a32">fdPush</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>, fpio, fp, -1);   <span class="comment">/* Push fpio onto stack */</span>
00129             (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>);
00130         } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fdio-&gt;_fileno(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>) &gt;= 0)
00131             xx = fdio-&gt;close(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>);
00132 <span class="preprocessor">#else</span>
00133 <span class="preprocessor"></span>        (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m12">ctrl</a>);
00134 <span class="preprocessor">#endif</span>
00135 <span class="preprocessor"></span>
00136         u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a> = fdio-&gt;_fdderef(u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>, <span class="stringliteral">"persist data (urlFree)"</span>, file, line);
00137         <span class="comment">/*@-usereleased@*/</span>
00138         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>)
00139             fprintf(stderr, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"warning: u %p data %p nrefs != 0 (%s %s)\n"</span>),
00140                         u, u-&gt;<a class="code" href="structurlinfo__s.html#m13">data</a>, (u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>),
00141                         (u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>));
00142         <span class="comment">/*@=usereleased@*/</span>
00143     }
00144     u-&gt;<a class="code" href="structurlinfo__s.html#m15">buf</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m15">buf</a>);
00145     u-&gt;<a class="code" href="structurlinfo__s.html#m1">url</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m1">url</a>);
00146     u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a>);
00147     u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a>);
00148     u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a>);
00149     u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a>);
00150     u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a>);
00151     u-&gt;<a class="code" href="structurlinfo__s.html#m7">proxyu</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m7">proxyu</a>);
00152     u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> = <a class="code" href="poptint_8h.html#a14">_free</a>((<span class="keywordtype">void</span> *)u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a>);
00153 
00154     <span class="comment">/*@-refcounttrans@*/</span> u = <a class="code" href="poptint_8h.html#a14">_free</a>(u); <span class="comment">/*@-refcounttrans@*/</span>
00155     <span class="keywordflow">return</span> NULL;
00156 }
00157 
<a name="l00158"></a><a class="code" href="url_8c.html#a14">00158</a> <span class="keywordtype">void</span> <a class="code" href="url_8c.html#a25">urlFreeCache</a>(<span class="keywordtype">void</span>)
00159 {
00160     <span class="keywordflow">if</span> (_url_cache) {
00161         <span class="keywordtype">int</span> i;
00162         <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="url_8c.html#a8">_url_count</a>; i++) {
00163             <span class="keywordflow">if</span> (_url_cache[i] == NULL) <span class="keywordflow">continue</span>;
00164             _url_cache[i] = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(_url_cache[i], <span class="stringliteral">"_url_cache"</span>);
00165             <span class="keywordflow">if</span> (_url_cache[i])
00166                 fprintf(stderr,
00167                         <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"warning: _url_cache[%d] %p nrefs(%d) != 1 (%s %s)\n"</span>),
00168                         i, _url_cache[i], _url_cache[i]-&gt;nrefs,
00169                         (_url_cache[i]-&gt;host ? _url_cache[i]-&gt;host : <span class="stringliteral">""</span>),
00170                         (_url_cache[i]-&gt;service ? _url_cache[i]-&gt;service : <span class="stringliteral">""</span>));
00171         }
00172     }
00173     _url_cache = <a class="code" href="poptint_8h.html#a14">_free</a>(_url_cache);
00174     <a class="code" href="url_8c.html#a8">_url_count</a> = 0;
00175 }
00176 
<a name="l00177"></a><a class="code" href="url_8c.html#a15">00177</a> <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a15">urlStrcmp</a>(<span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str1, <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * str2)
00178         <span class="comment">/*@*/</span>
00179 {
00180     <span class="keywordflow">if</span> (str1 &amp;&amp; str2)
00181         <span class="comment">/*@-nullpass@*/</span>         <span class="comment">/* LCL: 2nd arg claims to be NULL */</span>
00182         <span class="keywordflow">return</span> strcmp(str1, str2);
00183         <span class="comment">/*@=nullpass@*/</span>
00184     <span class="keywordflow">if</span> (str1 != str2)
00185         <span class="keywordflow">return</span> -1;
00186     <span class="keywordflow">return</span> 0;
00187 }
00188 
00189 <span class="comment">/*@-mods@*/</span>
<a name="l00190"></a><a class="code" href="url_8c.html#a16">00190</a> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="url_8c.html#a16">urlFind</a>(<span class="comment">/*@null@*/</span> <span class="comment">/*@in@*/</span> <span class="comment">/*@out@*/</span> <a class="code" href="structurlinfo__s.html">urlinfo</a> * uret, <span class="keywordtype">int</span> mustAsk)
00191         <span class="comment">/*@globals rpmGlobalMacroContext,</span>
00192 <span class="comment">                fileSystem@*/</span>
00193         <span class="comment">/*@modifies *uret, rpmGlobalMacroContext,</span>
00194 <span class="comment">                fileSystem @*/</span>
00195 {
00196     <a class="code" href="structurlinfo__s.html">urlinfo</a> u;
00197     <span class="keywordtype">int</span> ucx;
00198     <span class="keywordtype">int</span> i = 0;
00199 
00200     <span class="keywordflow">if</span> (uret == NULL)
00201         <span class="keywordflow">return</span>;
00202 
00203     u = *uret;
00204     <a class="code" href="rpmurl_8h.html#a1">URLSANE</a>(u);
00205 
00206     ucx = -1;
00207     <span class="keywordflow">for</span> (i = 0; i &lt; <a class="code" href="url_8c.html#a8">_url_count</a>; i++) {
00208         <a class="code" href="structurlinfo__s.html">urlinfo</a> ou = NULL;
00209         <span class="keywordflow">if</span> (_url_cache == NULL || (ou = _url_cache[i]) == NULL) {
00210             <span class="keywordflow">if</span> (ucx &lt; 0)
00211                 ucx = i;
00212             <span class="keywordflow">continue</span>;
00213         }
00214 
00215         <span class="comment">/* Check for cache-miss condition. A cache miss is</span>
00216 <span class="comment">         *    a) both items are not NULL and don't compare.</span>
00217 <span class="comment">         *    b) either of the items is not NULL.</span>
00218 <span class="comment">         */</span>
00219         <span class="keywordflow">if</span> (<a class="code" href="url_8c.html#a15">urlStrcmp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a>, ou-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a>))
00220             <span class="keywordflow">continue</span>;
00221         <span class="keywordflow">if</span> (<a class="code" href="url_8c.html#a15">urlStrcmp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a>, ou-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a>))
00222             <span class="keywordflow">continue</span>;
00223         <span class="keywordflow">if</span> (<a class="code" href="url_8c.html#a15">urlStrcmp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a>, ou-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a>))
00224             <span class="keywordflow">continue</span>;
00225         <span class="keywordflow">if</span> (<a class="code" href="url_8c.html#a15">urlStrcmp</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a>, ou-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a>))
00226             <span class="keywordflow">continue</span>;
00227         <span class="keywordflow">break</span>;  <span class="comment">/* Found item in cache */</span>
00228     }
00229 
00230     <span class="keywordflow">if</span> (i == <a class="code" href="url_8c.html#a8">_url_count</a>) {
00231         <span class="keywordflow">if</span> (ucx &lt; 0) {
00232             ucx = <a class="code" href="url_8c.html#a8">_url_count</a>++;
00233             _url_cache = <a class="code" href="rpmmalloc_8c.html#a3">xrealloc</a>(_url_cache, <span class="keyword">sizeof</span>(*_url_cache) * <a class="code" href="url_8c.html#a8">_url_count</a>);
00234         }
00235         <span class="keywordflow">if</span> (_url_cache)         <span class="comment">/* XXX always true */</span>
00236             _url_cache[ucx] = <a class="code" href="rpmurl_8h.html#a6">urlLink</a>(u, <span class="stringliteral">"_url_cache (miss)"</span>);
00237         u = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(u, <span class="stringliteral">"urlSplit (urlFind miss)"</span>);
00238     } <span class="keywordflow">else</span> {
00239         ucx = i;
00240         u = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(u, <span class="stringliteral">"urlSplit (urlFind hit)"</span>);
00241     }
00242 
00243     <span class="comment">/* This URL is now cached. */</span>
00244 
00245     <span class="keywordflow">if</span> (_url_cache)             <span class="comment">/* XXX always true */</span>
00246         u = <a class="code" href="rpmurl_8h.html#a6">urlLink</a>(_url_cache[ucx], <span class="stringliteral">"_url_cache"</span>);
00247     *uret = u;
00248     <span class="comment">/*@-usereleased@*/</span>
00249     u = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(u, <span class="stringliteral">"_url_cache (urlFind)"</span>);
00250     <span class="comment">/*@=usereleased@*/</span>
00251 
00252     <span class="comment">/* Zap proxy host and port in case they have been reset */</span>
00253     u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> = -1;
00254     u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a>);
00255 
00256     <span class="comment">/* Perform one-time FTP initialization */</span>
00257     <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>) {
00258 
00259         <span class="keywordflow">if</span> (mustAsk || (u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> != NULL &amp;&amp; u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> == NULL)) {
00260             <span class="keyword">const</span> <span class="keywordtype">char</span> * host = (u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>);
00261             <span class="keyword">const</span> <span class="keywordtype">char</span> * user = (u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> : <span class="stringliteral">""</span>);
00262             <span class="keywordtype">char</span> * prompt;
00263             prompt = <a class="code" href="system_8h.html#a36">alloca</a>(strlen(host) + strlen(user) + 256);
00264             sprintf(prompt, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"Password for %s@%s: "</span>), user, host);
00265             u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a>);
00266             u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> = <span class="comment">/*@-unrecog@*/</span> getpass(prompt) <span class="comment">/*@=unrecog@*/</span>;
00267             u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a>); <span class="comment">/* XXX xstrdup has side effects. */</span>
00268         }
00269 
00270         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> == NULL) {
00271             <span class="keyword">const</span> <span class="keywordtype">char</span> *proxy = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_ftpproxy}"</span>, NULL);
00272             <span class="keywordflow">if</span> (proxy &amp;&amp; *proxy != <span class="charliteral">'%'</span>) {
00273                 <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * host = (u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>);
00274                 <span class="keyword">const</span> <span class="keywordtype">char</span> *uu = (u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> : <span class="stringliteral">"anonymous"</span>);
00275                 <span class="keywordtype">char</span> *nu = <a class="code" href="rpmmalloc_8c.html#a1">xmalloc</a>(strlen(uu) + <span class="keyword">sizeof</span>(<span class="stringliteral">"@"</span>) + strlen(host));
00276                 (void) <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>( <a class="code" href="system_8h.html#a32">stpcpy</a>(nu, uu), <span class="stringliteral">"@"</span>), host);
00277                 u-&gt;<a class="code" href="structurlinfo__s.html#m7">proxyu</a> = nu;
00278                 u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(proxy);
00279             }
00280             proxy = <a class="code" href="poptint_8h.html#a14">_free</a>(proxy);
00281         }
00282 
00283         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> &lt; 0) {
00284             <span class="keyword">const</span> <span class="keywordtype">char</span> *proxy = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_ftpport}"</span>, NULL);
00285             <span class="keywordflow">if</span> (proxy &amp;&amp; *proxy != <span class="charliteral">'%'</span>) {
00286                 <span class="keywordtype">char</span> *end;
00287                 <span class="keywordtype">int</span> port = strtol(proxy, &amp;end, 0);
00288                 <span class="keywordflow">if</span> (!(end &amp;&amp; *end == <span class="charliteral">'\0'</span>)) {
00289                     fprintf(stderr, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"error: %sport must be a number\n"</span>),
00290                         (u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>));
00291                     <span class="keywordflow">return</span>;
00292                 }
00293                 u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> = port;
00294             }
00295             proxy = <a class="code" href="poptint_8h.html#a14">_free</a>(proxy);
00296         }
00297     }
00298 
00299     <span class="comment">/* Perform one-time HTTP initialization */</span>
00300     <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>) {
00301 
00302         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> == NULL) {
00303             <span class="keyword">const</span> <span class="keywordtype">char</span> *proxy = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_httpproxy}"</span>, NULL);
00304             <span class="keywordflow">if</span> (proxy &amp;&amp; *proxy != <span class="charliteral">'%'</span>)
00305                 u-&gt;<a class="code" href="structurlinfo__s.html#m8">proxyh</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(proxy);
00306             proxy = <a class="code" href="poptint_8h.html#a14">_free</a>(proxy);
00307         }
00308 
00309         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> &lt; 0) {
00310             <span class="keyword">const</span> <span class="keywordtype">char</span> *proxy = <a class="code" href="macro_8c.html#a50">rpmExpand</a>(<span class="stringliteral">"%{_httpport}"</span>, NULL);
00311             <span class="keywordflow">if</span> (proxy &amp;&amp; *proxy != <span class="charliteral">'%'</span>) {
00312                 <span class="keywordtype">char</span> *end;
00313                 <span class="keywordtype">int</span> port = strtol(proxy, &amp;end, 0);
00314                 <span class="keywordflow">if</span> (!(end &amp;&amp; *end == <span class="charliteral">'\0'</span>)) {
00315                     fprintf(stderr, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"error: %sport must be a number\n"</span>),
00316                         (u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> ? u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>));
00317                     <span class="keywordflow">return</span>;
00318                 }
00319                 u-&gt;<a class="code" href="structurlinfo__s.html#m9">proxyp</a> = port;
00320             }
00321             proxy = <a class="code" href="poptint_8h.html#a14">_free</a>(proxy);
00322         }
00323 
00324     }
00325 
00326     <span class="keywordflow">return</span>;
00327 }
00328 <span class="comment">/*@=mods@*/</span>
00329 
00332 <span class="comment">/*@observer@*/</span> <span class="comment">/*@unchecked@*/</span>
<a name="l00333"></a><a class="code" href="structurlstring.html">00333</a> <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="structurlstring.html">urlstring</a> {
<a name="l00334"></a><a class="code" href="structurlstring.html#m0">00334</a> <span class="comment">/*@observer@*/</span> <span class="comment">/*@null@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="structurlstring.html#m0">leadin</a>;
<a name="l00335"></a><a class="code" href="structurlstring.html#m1">00335</a>     <a class="code" href="rpmurl_8h.html#a8">urltype</a>     <a class="code" href="structurlstring.html#m1">ret</a>;
00336 } <a class="code" href="url_8c.html#a9">urlstrings</a>[] = {
00337     { <span class="stringliteral">"file://"</span>,        <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a> },
00338     { <span class="stringliteral">"ftp://"</span>,         <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a> },
00339     { <span class="stringliteral">"http://"</span>,        <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a> },
00340     { <span class="stringliteral">"-"</span>,              <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a> },
00341     { NULL,             <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a> }
00342 };
00343 
<a name="l00344"></a><a class="code" href="url_8c.html#a17">00344</a> <a class="code" href="rpmurl_8h.html#a8">urltype</a> <a class="code" href="url_8c.html#a17">urlIsURL</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * url)
00345 {
00346     <span class="keyword">struct </span><a class="code" href="structurlstring.html">urlstring</a> *us;
00347 
00348     <span class="keywordflow">if</span> (url &amp;&amp; *url) {
00349         <span class="keywordflow">for</span> (us = <a class="code" href="url_8c.html#a9">urlstrings</a>; us-&gt;<a class="code" href="structurlstring.html#m0">leadin</a> != NULL; us++) {
00350             <span class="keywordflow">if</span> (strncmp(url, us-&gt;<a class="code" href="structurlstring.html#m0">leadin</a>, strlen(us-&gt;<a class="code" href="structurlstring.html#m0">leadin</a>)))
00351                 <span class="keywordflow">continue</span>;
00352             <span class="keywordflow">return</span> us-&gt;<a class="code" href="structurlstring.html#m1">ret</a>;
00353         }
00354     }
00355 
00356     <span class="keywordflow">return</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>;
00357 }
00358 
00359 <span class="comment">/* Return path portion of url (or pointer to NUL if url == NULL) */</span>
<a name="l00360"></a><a class="code" href="url_8c.html#a18">00360</a> <a class="code" href="rpmurl_8h.html#a8">urltype</a> <a class="code" href="url_8c.html#a18">urlPath</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * url, <span class="keyword">const</span> <span class="keywordtype">char</span> ** pathp)
00361 {
00362     <span class="keyword">const</span> <span class="keywordtype">char</span> *path;
00363     <span class="keywordtype">int</span> <a class="code" href="rpmurl_8h.html#a8">urltype</a>;
00364 
00365     path = url;
00366     <a class="code" href="rpmurl_8h.html#a8">urltype</a> = <a class="code" href="url_8c.html#a17">urlIsURL</a>(url);
00367     <span class="comment">/*@-branchstate@*/</span>
00368     <span class="keywordflow">switch</span> (urltype) {
00369     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>:
00370         url += <span class="keyword">sizeof</span>(<span class="stringliteral">"ftp://"</span>) - 1;
00371         path = strchr(url, <span class="charliteral">'/'</span>);
00372         <span class="keywordflow">if</span> (path == NULL) path = url + strlen(url);
00373         <span class="keywordflow">break</span>;
00374     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>:
00375     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>:
00376         url += <span class="keyword">sizeof</span>(<span class="stringliteral">"file://"</span>) - 1;
00377         path = strchr(url, <span class="charliteral">'/'</span>);
00378         <span class="keywordflow">if</span> (path == NULL) path = url + strlen(url);
00379         <span class="keywordflow">break</span>;
00380     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>:
00381         <span class="keywordflow">if</span> (path == NULL) path = <span class="stringliteral">""</span>;
00382         <span class="keywordflow">break</span>;
00383     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>:
00384         path = <span class="stringliteral">""</span>;
00385         <span class="keywordflow">break</span>;
00386     }
00387     <span class="comment">/*@=branchstate@*/</span>
00388     <span class="keywordflow">if</span> (pathp)
00389         <span class="comment">/*@-observertrans@*/</span>
00390         *pathp = path;
00391         <span class="comment">/*@=observertrans@*/</span>
00392     <span class="keywordflow">return</span> <a class="code" href="rpmurl_8h.html#a8">urltype</a>;
00393 }
00394 
00395 <span class="comment">/*</span>
00396 <span class="comment"> * Split URL into components. The URL can look like</span>
00397 <span class="comment"> *      service://user:password@host:port/path</span>
00398 <span class="comment"> */</span>
00399 <span class="comment">/*@-modfilesys@*/</span>
<a name="l00400"></a><a class="code" href="url_8c.html#a19">00400</a> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a19">urlSplit</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * url, <a class="code" href="structurlinfo__s.html">urlinfo</a> *uret)
00401 {
00402     <a class="code" href="structurlinfo__s.html">urlinfo</a> u;
00403     <span class="keywordtype">char</span> *myurl;
00404     <span class="keywordtype">char</span> *s, *se, *f, *fe;
00405 
00406     <span class="keywordflow">if</span> (uret == NULL)
00407         <span class="keywordflow">return</span> -1;
00408     <span class="keywordflow">if</span> ((u = <a class="code" href="rpmurl_8h.html#a5">urlNew</a>(<span class="stringliteral">"urlSplit"</span>)) == NULL)
00409         <span class="keywordflow">return</span> -1;
00410 
00411     <span class="keywordflow">if</span> ((se = s = myurl = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(url)) == NULL) {
00412         u = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(u, <span class="stringliteral">"urlSplit (error #1)"</span>);
00413         <span class="keywordflow">return</span> -1;
00414     }
00415 
00416     u-&gt;<a class="code" href="structurlinfo__s.html#m1">url</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(url);
00417     u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> = <a class="code" href="url_8c.html#a17">urlIsURL</a>(url);
00418 
00419     <span class="keywordflow">while</span> (1) {
00420         <span class="comment">/* Point to end of next item */</span>
00421         <span class="keywordflow">while</span> (*se &amp;&amp; *se != <span class="charliteral">'/'</span>) se++;
00422         <span class="comment">/* Item was service. Save service and go for the rest ...*/</span>
00423         <span class="keywordflow">if</span> (*se &amp;&amp; (se != s) &amp;&amp; se[-1] == <span class="charliteral">':'</span> &amp;&amp; se[0] == <span class="charliteral">'/'</span> &amp;&amp; se[1] == <span class="charliteral">'/'</span>) {
00424                 se[-1] = <span class="charliteral">'\0'</span>;
00425             u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(s);
00426             se += 2;    <span class="comment">/* skip over "//" */</span>
00427             s = se++;
00428             <span class="keywordflow">continue</span>;
00429         }
00430         
00431         <span class="comment">/* Item was everything-but-path. Continue parse on rest */</span>
00432         *se = <span class="charliteral">'\0'</span>;
00433         <span class="keywordflow">break</span>;
00434     }
00435 
00436     <span class="comment">/* Look for ...@host... */</span>
00437     fe = f = s;
00438     <span class="keywordflow">while</span> (*fe &amp;&amp; *fe != <span class="charliteral">'@'</span>) fe++;
00439     <span class="comment">/*@-branchstate@*/</span>
00440     <span class="keywordflow">if</span> (*fe == <span class="charliteral">'@'</span>) {
00441         s = fe + 1;
00442         *fe = <span class="charliteral">'\0'</span>;
00443         <span class="comment">/* Look for user:password@host... */</span>
00444         <span class="keywordflow">while</span> (fe &gt; f &amp;&amp; *fe != <span class="charliteral">':'</span>) fe--;
00445         <span class="keywordflow">if</span> (*fe == <span class="charliteral">':'</span>) {
00446             *fe++ = <span class="charliteral">'\0'</span>;
00447             u-&gt;<a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fe);
00448         }
00449         u-&gt;<a class="code" href="structurlinfo__s.html#m3">user</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(f);
00450     }
00451     <span class="comment">/*@=branchstate@*/</span>
00452 
00453     <span class="comment">/* Look for ...host:port */</span>
00454     fe = f = s;
00455     <span class="keywordflow">while</span> (*fe &amp;&amp; *fe != <span class="charliteral">':'</span>) fe++;
00456     <span class="keywordflow">if</span> (*fe == <span class="charliteral">':'</span>) {
00457         *fe++ = <span class="charliteral">'\0'</span>;
00458         u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fe);
00459         <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a> != NULL &amp;&amp; u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a>[0] != <span class="charliteral">'\0'</span>) {
00460             <span class="keywordtype">char</span> *end;
00461             u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> = strtol(u-&gt;<a class="code" href="structurlinfo__s.html#m6">portstr</a>, &amp;end, 0);
00462             <span class="keywordflow">if</span> (!(end &amp;&amp; *end == <span class="charliteral">'\0'</span>)) {
00463                 <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a4">RPMMESS_ERROR</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"url port must be a number\n"</span>));
00464                 myurl = <a class="code" href="poptint_8h.html#a14">_free</a>(myurl);
00465                 u = <a class="code" href="rpmurl_8h.html#a7">urlFree</a>(u, <span class="stringliteral">"urlSplit (error #3)"</span>);
00466                 <span class="keywordflow">return</span> -1;
00467             }
00468         }
00469     }
00470     u-&gt;<a class="code" href="structurlinfo__s.html#m5">host</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(f);
00471 
00472     <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> &lt; 0 &amp;&amp; u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a> != NULL) {
00473         <span class="keyword">struct </span>servent *serv;
00474         <span class="comment">/*@-unrecog -multithreaded -moduncon @*/</span>
00475         serv = getservbyname(u-&gt;<a class="code" href="structurlinfo__s.html#m2">service</a>, <span class="stringliteral">"tcp"</span>);
00476         <span class="comment">/*@=unrecog =multithreaded =moduncon @*/</span>
00477         <span class="keywordflow">if</span> (serv != NULL)
00478             u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> = ntohs(serv-&gt;s_port);
00479         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>)
00480             u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> = <a class="code" href="url_8c.html#a0">IPPORT_FTP</a>;
00481         <span class="keywordflow">else</span> <span class="keywordflow">if</span> (u-&gt;<a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>)
00482             u-&gt;<a class="code" href="structurlinfo__s.html#m10">port</a> = <a class="code" href="url_8c.html#a1">IPPORT_HTTP</a>;
00483     }
00484 
00485     myurl = <a class="code" href="poptint_8h.html#a14">_free</a>(myurl);
00486     <span class="keywordflow">if</span> (uret) {
00487         *uret = u;
00488 <span class="comment">/*@-globs -mods @*/</span> <span class="comment">/* FIX: rpmGlobalMacroContext not in &lt;rpmlib.h&gt; */</span>
00489         <a class="code" href="url_8c.html#a16">urlFind</a>(uret, 0);
00490 <span class="comment">/*@=globs =mods @*/</span>
00491     }
00492     <span class="keywordflow">return</span> 0;
00493 }
00494 <span class="comment">/*@=modfilesys@*/</span>
00495 
<a name="l00496"></a><a class="code" href="url_8c.html#a20">00496</a> <span class="keywordtype">int</span> <a class="code" href="url_8c.html#a20">urlGetFile</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * url, <span class="keyword">const</span> <span class="keywordtype">char</span> * dest)
00497 {
00498     <span class="keywordtype">int</span> rc;
00499     <a class="code" href="struct__FD__s.html">FD_t</a> sfd = NULL;
00500     <a class="code" href="struct__FD__s.html">FD_t</a> tfd = NULL;
00501     <span class="keyword">const</span> <span class="keywordtype">char</span> * sfuPath = NULL;
00502     <span class="keywordtype">int</span> urlType = <a class="code" href="url_8c.html#a18">urlPath</a>(url, &amp;sfuPath);
00503 
00504     <span class="keywordflow">if</span> (*sfuPath == <span class="charliteral">'\0'</span>)
00505         <span class="keywordflow">return</span> <a class="code" href="rpmio_8h.html#a107a51">FTPERR_UNKNOWN</a>;
00506         
00507     sfd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(url, <span class="stringliteral">"r.ufdio"</span>);
00508     <span class="keywordflow">if</span> (sfd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(sfd)) {
00509         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"failed to open %s: %s\n"</span>), url, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(sfd));
00510         rc = <a class="code" href="rpmio_8h.html#a107a51">FTPERR_UNKNOWN</a>;
00511         <span class="keywordflow">goto</span> exit;
00512     }
00513 
00514     <span class="keywordflow">if</span> (dest == NULL) {
00515         <span class="keywordflow">if</span> ((dest = strrchr(sfuPath, <span class="charliteral">'/'</span>)) != NULL)
00516             dest++;
00517         <span class="keywordflow">else</span>
00518             dest = sfuPath;
00519     }
00520 
00521     <span class="keywordflow">if</span> (dest == NULL)
00522         <span class="keywordflow">return</span> <a class="code" href="rpmio_8h.html#a107a51">FTPERR_UNKNOWN</a>;
00523 
00524     tfd = <a class="code" href="group__rpmio.html#a83">Fopen</a>(dest, <span class="stringliteral">"w.ufdio"</span>);
00525 <span class="keywordflow">if</span> (_url_debug)
00526 fprintf(stderr, <span class="stringliteral">"*** urlGetFile sfd %p %s tfd %p %s\n"</span>, sfd, url, (tfd ? tfd : NULL), dest);
00527     <span class="keywordflow">if</span> (tfd == NULL || <a class="code" href="group__rpmio.html#a85">Ferror</a>(tfd)) {
00528         <span class="comment">/* XXX Fstrerror */</span>
00529         <a class="code" href="rpmmessages_8h.html#a7">rpmMessage</a>(<a class="code" href="rpmmessages_8h.html#a0">RPMMESS_DEBUG</a>, <a class="code" href="system_8h.html#a18">_</a>(<span class="stringliteral">"failed to create %s: %s\n"</span>), dest, <a class="code" href="group__rpmio.html#a11">Fstrerror</a>(tfd));
00530         rc = <a class="code" href="rpmio_8h.html#a107a51">FTPERR_UNKNOWN</a>;
00531         <span class="keywordflow">goto</span> exit;
00532     }
00533 
00534     <span class="keywordflow">switch</span> (urlType) {
00535     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>:
00536     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>:
00537     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a16">URL_IS_PATH</a>:
00538     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a15">URL_IS_DASH</a>:
00539     <span class="keywordflow">case</span> <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>:
00540         <span class="keywordflow">if</span> ((rc = <a class="code" href="rpmio_8c.html#a61">ufdGetFile</a>(sfd, tfd))) {
00541             (void) <a class="code" href="rpmrpc_8c.html#a27">Unlink</a>(dest);
00542             <span class="comment">/* XXX FIXME: sfd possibly closed by copyData */</span>
00543             <span class="comment">/*@-usereleased@*/</span> (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(sfd) <span class="comment">/*@=usereleased@*/</span> ;
00544         }
00545         sfd = NULL;     <span class="comment">/* XXX Fclose(sfd) done by ufdGetFile */</span>
00546         <span class="keywordflow">break</span>;
00547     <span class="keywordflow">default</span>:
00548         rc = <a class="code" href="rpmio_8h.html#a107a51">FTPERR_UNKNOWN</a>;
00549         <span class="keywordflow">break</span>;
00550     }
00551 
00552 exit:
00553     <span class="keywordflow">if</span> (tfd)
00554         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(tfd);
00555     <span class="keywordflow">if</span> (sfd)
00556         (void) <a class="code" href="group__rpmio.html#a80">Fclose</a>(sfd);
00557 
00558     <span class="keywordflow">return</span> rc;
00559 }
00560 <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>