<!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> <a class="qindex" href="modules.html">Modules</a> <a class="qindex" href="annotated.html">Data Structures</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Data Fields</a> <a class="qindex" href="globals.html">Globals</a> <a class="qindex" href="pages.html">Related Pages</a> </center> <hr><h1>rpmio/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 <netinet/in.h></span> 00009 00010 <span class="preprocessor">#include <<a class="code" href="rpmmacro_8h.html">rpmmacro.h</a>></span> 00011 <span class="preprocessor">#include <<a class="code" href="rpmmessages_8h.html">rpmmessages.h</a>></span> 00012 <span class="preprocessor">#include <<a class="code" href="rpmio__internal_8h.html">rpmio_internal.h</a>></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)) & (_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-><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">"--> url %p ++ %d %s at %s:%u\n"</span>, u, u-><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-><a class="code" href="structurlinfo__s.html#m9">proxyp</a> = -1; 00081 u-><a class="code" href="structurlinfo__s.html#m10">port</a> = -1; 00082 u-><a class="code" href="structurlinfo__s.html#m11">urltype</a> = <a class="code" href="rpmurl_8h.html#a30a14">URL_IS_UNKNOWN</a>; 00083 u-><a class="code" href="structurlinfo__s.html#m12">ctrl</a> = NULL; 00084 u-><a class="code" href="structurlinfo__s.html#m13">data</a> = NULL; 00085 u-><a class="code" href="structurlinfo__s.html#m14">bufAlloced</a> = 0; 00086 u-><a class="code" href="structurlinfo__s.html#m15">buf</a> = NULL; 00087 u-><a class="code" href="structurlinfo__s.html#m18">httpHasRange</a> = 1; 00088 u-><a class="code" href="structurlinfo__s.html#m17">httpVersion</a> = 0; 00089 u-><a class="code" href="structurlinfo__s.html#m0">nrefs</a> = 0; 00090 u-><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">"--> url %p -- %d %s at %s:%u\n"</span>, u, u-><a class="code" href="structurlinfo__s.html#m0">nrefs</a>, msg, file, line)); 00100 <span class="keywordflow">if</span> (--u-><a class="code" href="structurlinfo__s.html#m0">nrefs</a> > 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-><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-><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-><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-><a class="code" href="structurlinfo__s.html#m12">ctrl</a>); 00109 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fdio->_fileno(u-><a class="code" href="structurlinfo__s.html#m12">ctrl</a>) >= 0) 00110 xx = fdio->close(u-><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-><a class="code" href="structurlinfo__s.html#m12">ctrl</a>); 00114 <span class="preprocessor">#endif</span> 00115 <span class="preprocessor"></span> 00116 u-><a class="code" href="structurlinfo__s.html#m12">ctrl</a> = fdio->_fdderef(u-><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-><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-><a class="code" href="structurlinfo__s.html#m12">ctrl</a>, (u-><a class="code" href="structurlinfo__s.html#m5">host</a> ? u-><a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>), 00121 (u-><a class="code" href="structurlinfo__s.html#m2">service</a> ? u-><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-><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-><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-><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-><a class="code" href="structurlinfo__s.html#m13">data</a>); 00130 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fdio->_fileno(u-><a class="code" href="structurlinfo__s.html#m13">data</a>) >= 0) 00131 xx = fdio->close(u-><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-><a class="code" href="structurlinfo__s.html#m12">ctrl</a>); 00134 <span class="preprocessor">#endif</span> 00135 <span class="preprocessor"></span> 00136 u-><a class="code" href="structurlinfo__s.html#m13">data</a> = fdio->_fdderef(u-><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-><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-><a class="code" href="structurlinfo__s.html#m13">data</a>, (u-><a class="code" href="structurlinfo__s.html#m5">host</a> ? u-><a class="code" href="structurlinfo__s.html#m5">host</a> : <span class="stringliteral">""</span>), 00141 (u-><a class="code" href="structurlinfo__s.html#m2">service</a> ? u-><a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>)); 00142 <span class="comment">/*@=usereleased@*/</span> 00143 } 00144 u-><a class="code" href="structurlinfo__s.html#m15">buf</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-><a class="code" href="structurlinfo__s.html#m15">buf</a>); 00145 u-><a class="code" href="structurlinfo__s.html#m1">url</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-><a class="code" href="structurlinfo__s.html#m1">url</a>); 00146 u-><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-><a class="code" href="structurlinfo__s.html#m2">service</a>); 00147 u-><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-><a class="code" href="structurlinfo__s.html#m3">user</a>); 00148 u-><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-><a class="code" href="structurlinfo__s.html#m4">password</a>); 00149 u-><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-><a class="code" href="structurlinfo__s.html#m5">host</a>); 00150 u-><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-><a class="code" href="structurlinfo__s.html#m6">portstr</a>); 00151 u-><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-><a class="code" href="structurlinfo__s.html#m7">proxyu</a>); 00152 u-><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-><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 < <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]->nrefs, 00169 (_url_cache[i]->host ? _url_cache[i]->host : <span class="stringliteral">""</span>), 00170 (_url_cache[i]->service ? _url_cache[i]->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 && 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 < <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 < 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-><a class="code" href="structurlinfo__s.html#m2">service</a>, ou-><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-><a class="code" href="structurlinfo__s.html#m5">host</a>, ou-><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-><a class="code" href="structurlinfo__s.html#m3">user</a>, ou-><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-><a class="code" href="structurlinfo__s.html#m6">portstr</a>, ou-><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 < 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-><a class="code" href="structurlinfo__s.html#m9">proxyp</a> = -1; 00254 u-><a class="code" href="structurlinfo__s.html#m8">proxyh</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-><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-><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-><a class="code" href="structurlinfo__s.html#m3">user</a> != NULL && u-><a class="code" href="structurlinfo__s.html#m4">password</a> == NULL)) { 00260 <span class="keyword">const</span> <span class="keywordtype">char</span> * host = (u-><a class="code" href="structurlinfo__s.html#m5">host</a> ? u-><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-><a class="code" href="structurlinfo__s.html#m3">user</a> ? u-><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-><a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="poptint_8h.html#a14">_free</a>(u-><a class="code" href="structurlinfo__s.html#m4">password</a>); 00266 u-><a class="code" href="structurlinfo__s.html#m4">password</a> = <span class="comment">/*@-unrecog@*/</span> getpass(prompt) <span class="comment">/*@=unrecog@*/</span>; 00267 u-><a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(u-><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-><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 && *proxy != <span class="charliteral">'%'</span>) { 00273 <span class="comment">/*@observer@*/</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * host = (u-><a class="code" href="structurlinfo__s.html#m5">host</a> ? u-><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-><a class="code" href="structurlinfo__s.html#m3">user</a> ? u-><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-><a class="code" href="structurlinfo__s.html#m7">proxyu</a> = nu; 00278 u-><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-><a class="code" href="structurlinfo__s.html#m9">proxyp</a> < 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 && *proxy != <span class="charliteral">'%'</span>) { 00286 <span class="keywordtype">char</span> *end; 00287 <span class="keywordtype">int</span> port = strtol(proxy, &end, 0); 00288 <span class="keywordflow">if</span> (!(end && *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-><a class="code" href="structurlinfo__s.html#m2">service</a> ? u-><a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>)); 00291 <span class="keywordflow">return</span>; 00292 } 00293 u-><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-><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-><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 && *proxy != <span class="charliteral">'%'</span>) 00305 u-><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-><a class="code" href="structurlinfo__s.html#m9">proxyp</a> < 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 && *proxy != <span class="charliteral">'%'</span>) { 00312 <span class="keywordtype">char</span> *end; 00313 <span class="keywordtype">int</span> port = strtol(proxy, &end, 0); 00314 <span class="keywordflow">if</span> (!(end && *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-><a class="code" href="structurlinfo__s.html#m2">service</a> ? u-><a class="code" href="structurlinfo__s.html#m2">service</a> : <span class="stringliteral">""</span>)); 00317 <span class="keywordflow">return</span>; 00318 } 00319 u-><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 && *url) { 00349 <span class="keywordflow">for</span> (us = <a class="code" href="url_8c.html#a9">urlstrings</a>; us-><a class="code" href="structurlstring.html#m0">leadin</a> != NULL; us++) { 00350 <span class="keywordflow">if</span> (strncmp(url, us-><a class="code" href="structurlstring.html#m0">leadin</a>, strlen(us-><a class="code" href="structurlstring.html#m0">leadin</a>))) 00351 <span class="keywordflow">continue</span>; 00352 <span class="keywordflow">return</span> us-><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-><a class="code" href="structurlinfo__s.html#m1">url</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(url); 00417 u-><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 && *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 && (se != s) && se[-1] == <span class="charliteral">':'</span> && se[0] == <span class="charliteral">'/'</span> && se[1] == <span class="charliteral">'/'</span>) { 00424 se[-1] = <span class="charliteral">'\0'</span>; 00425 u-><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 && *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 > f && *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-><a class="code" href="structurlinfo__s.html#m4">password</a> = <a class="code" href="rpmmalloc_8c.html#a4">xstrdup</a>(fe); 00448 } 00449 u-><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 && *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-><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-><a class="code" href="structurlinfo__s.html#m6">portstr</a> != NULL && u-><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-><a class="code" href="structurlinfo__s.html#m10">port</a> = strtol(u-><a class="code" href="structurlinfo__s.html#m6">portstr</a>, &end, 0); 00462 <span class="keywordflow">if</span> (!(end && *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-><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-><a class="code" href="structurlinfo__s.html#m10">port</a> < 0 && u-><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-><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-><a class="code" href="structurlinfo__s.html#m10">port</a> = ntohs(serv->s_port); 00479 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (u-><a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a17">URL_IS_FTP</a>) 00480 u-><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-><a class="code" href="structurlinfo__s.html#m11">urltype</a> == <a class="code" href="rpmurl_8h.html#a30a18">URL_IS_HTTP</a>) 00482 u-><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 <rpmlib.h> */</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, &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>