xref: /aosp_15_r20/external/curl/lib/dict.c (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker /***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker  *                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker  *  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker  *                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker  *                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker  *                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker  *
8*6236dae4SAndroid Build Coastguard Worker  * Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker  *
10*6236dae4SAndroid Build Coastguard Worker  * This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker  * you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker  * are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker  *
14*6236dae4SAndroid Build Coastguard Worker  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker  * copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker  * furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker  *
18*6236dae4SAndroid Build Coastguard Worker  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker  * KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker  *
21*6236dae4SAndroid Build Coastguard Worker  * SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker  *
23*6236dae4SAndroid Build Coastguard Worker  ***************************************************************************/
24*6236dae4SAndroid Build Coastguard Worker 
25*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h"
26*6236dae4SAndroid Build Coastguard Worker 
27*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DICT
28*6236dae4SAndroid Build Coastguard Worker 
29*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN_H
30*6236dae4SAndroid Build Coastguard Worker #include <netinet/in.h>
31*6236dae4SAndroid Build Coastguard Worker #endif
32*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETDB_H
33*6236dae4SAndroid Build Coastguard Worker #include <netdb.h>
34*6236dae4SAndroid Build Coastguard Worker #endif
35*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_ARPA_INET_H
36*6236dae4SAndroid Build Coastguard Worker #include <arpa/inet.h>
37*6236dae4SAndroid Build Coastguard Worker #endif
38*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NET_IF_H
39*6236dae4SAndroid Build Coastguard Worker #include <net/if.h>
40*6236dae4SAndroid Build Coastguard Worker #endif
41*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SYS_IOCTL_H
42*6236dae4SAndroid Build Coastguard Worker #include <sys/ioctl.h>
43*6236dae4SAndroid Build Coastguard Worker #endif
44*6236dae4SAndroid Build Coastguard Worker 
45*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SYS_PARAM_H
46*6236dae4SAndroid Build Coastguard Worker #include <sys/param.h>
47*6236dae4SAndroid Build Coastguard Worker #endif
48*6236dae4SAndroid Build Coastguard Worker 
49*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SYS_SELECT_H
50*6236dae4SAndroid Build Coastguard Worker #include <sys/select.h>
51*6236dae4SAndroid Build Coastguard Worker #elif defined(HAVE_UNISTD_H)
52*6236dae4SAndroid Build Coastguard Worker #include <unistd.h>
53*6236dae4SAndroid Build Coastguard Worker #endif
54*6236dae4SAndroid Build Coastguard Worker 
55*6236dae4SAndroid Build Coastguard Worker #include "urldata.h"
56*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h>
57*6236dae4SAndroid Build Coastguard Worker #include "transfer.h"
58*6236dae4SAndroid Build Coastguard Worker #include "sendf.h"
59*6236dae4SAndroid Build Coastguard Worker #include "escape.h"
60*6236dae4SAndroid Build Coastguard Worker #include "progress.h"
61*6236dae4SAndroid Build Coastguard Worker #include "dict.h"
62*6236dae4SAndroid Build Coastguard Worker #include "curl_printf.h"
63*6236dae4SAndroid Build Coastguard Worker #include "strcase.h"
64*6236dae4SAndroid Build Coastguard Worker #include "curl_memory.h"
65*6236dae4SAndroid Build Coastguard Worker /* The last #include file should be: */
66*6236dae4SAndroid Build Coastguard Worker #include "memdebug.h"
67*6236dae4SAndroid Build Coastguard Worker 
68*6236dae4SAndroid Build Coastguard Worker /*
69*6236dae4SAndroid Build Coastguard Worker  * Forward declarations.
70*6236dae4SAndroid Build Coastguard Worker  */
71*6236dae4SAndroid Build Coastguard Worker 
72*6236dae4SAndroid Build Coastguard Worker static CURLcode dict_do(struct Curl_easy *data, bool *done);
73*6236dae4SAndroid Build Coastguard Worker 
74*6236dae4SAndroid Build Coastguard Worker /*
75*6236dae4SAndroid Build Coastguard Worker  * DICT protocol handler.
76*6236dae4SAndroid Build Coastguard Worker  */
77*6236dae4SAndroid Build Coastguard Worker 
78*6236dae4SAndroid Build Coastguard Worker const struct Curl_handler Curl_handler_dict = {
79*6236dae4SAndroid Build Coastguard Worker   "dict",                               /* scheme */
80*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* setup_connection */
81*6236dae4SAndroid Build Coastguard Worker   dict_do,                              /* do_it */
82*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* done */
83*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* do_more */
84*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* connect_it */
85*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* connecting */
86*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* doing */
87*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* proto_getsock */
88*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* doing_getsock */
89*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* domore_getsock */
90*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* perform_getsock */
91*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* disconnect */
92*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* write_resp */
93*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* write_resp_hd */
94*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* connection_check */
95*6236dae4SAndroid Build Coastguard Worker   ZERO_NULL,                            /* attach connection */
96*6236dae4SAndroid Build Coastguard Worker   PORT_DICT,                            /* defport */
97*6236dae4SAndroid Build Coastguard Worker   CURLPROTO_DICT,                       /* protocol */
98*6236dae4SAndroid Build Coastguard Worker   CURLPROTO_DICT,                       /* family */
99*6236dae4SAndroid Build Coastguard Worker   PROTOPT_NONE | PROTOPT_NOURLQUERY     /* flags */
100*6236dae4SAndroid Build Coastguard Worker };
101*6236dae4SAndroid Build Coastguard Worker 
102*6236dae4SAndroid Build Coastguard Worker #define DYN_DICT_WORD 10000
unescape_word(const char * input)103*6236dae4SAndroid Build Coastguard Worker static char *unescape_word(const char *input)
104*6236dae4SAndroid Build Coastguard Worker {
105*6236dae4SAndroid Build Coastguard Worker   struct dynbuf out;
106*6236dae4SAndroid Build Coastguard Worker   const char *ptr;
107*6236dae4SAndroid Build Coastguard Worker   CURLcode result = CURLE_OK;
108*6236dae4SAndroid Build Coastguard Worker   Curl_dyn_init(&out, DYN_DICT_WORD);
109*6236dae4SAndroid Build Coastguard Worker 
110*6236dae4SAndroid Build Coastguard Worker   /* According to RFC2229 section 2.2, these letters need to be escaped with
111*6236dae4SAndroid Build Coastguard Worker      \[letter] */
112*6236dae4SAndroid Build Coastguard Worker   for(ptr = input; *ptr; ptr++) {
113*6236dae4SAndroid Build Coastguard Worker     char ch = *ptr;
114*6236dae4SAndroid Build Coastguard Worker     if((ch <= 32) || (ch == 127) ||
115*6236dae4SAndroid Build Coastguard Worker        (ch == '\'') || (ch == '\"') || (ch == '\\'))
116*6236dae4SAndroid Build Coastguard Worker       result = Curl_dyn_addn(&out, "\\", 1);
117*6236dae4SAndroid Build Coastguard Worker     if(!result)
118*6236dae4SAndroid Build Coastguard Worker       result = Curl_dyn_addn(&out, ptr, 1);
119*6236dae4SAndroid Build Coastguard Worker     if(result)
120*6236dae4SAndroid Build Coastguard Worker       return NULL;
121*6236dae4SAndroid Build Coastguard Worker   }
122*6236dae4SAndroid Build Coastguard Worker   return Curl_dyn_ptr(&out);
123*6236dae4SAndroid Build Coastguard Worker }
124*6236dae4SAndroid Build Coastguard Worker 
125*6236dae4SAndroid Build Coastguard Worker /* sendf() sends formatted data to the server */
126*6236dae4SAndroid Build Coastguard Worker static CURLcode sendf(struct Curl_easy *data,
127*6236dae4SAndroid Build Coastguard Worker                       const char *fmt, ...) CURL_PRINTF(2, 3);
128*6236dae4SAndroid Build Coastguard Worker 
sendf(struct Curl_easy * data,const char * fmt,...)129*6236dae4SAndroid Build Coastguard Worker static CURLcode sendf(struct Curl_easy *data, const char *fmt, ...)
130*6236dae4SAndroid Build Coastguard Worker {
131*6236dae4SAndroid Build Coastguard Worker   size_t bytes_written;
132*6236dae4SAndroid Build Coastguard Worker   size_t write_len;
133*6236dae4SAndroid Build Coastguard Worker   CURLcode result = CURLE_OK;
134*6236dae4SAndroid Build Coastguard Worker   char *s;
135*6236dae4SAndroid Build Coastguard Worker   char *sptr;
136*6236dae4SAndroid Build Coastguard Worker   va_list ap;
137*6236dae4SAndroid Build Coastguard Worker   va_start(ap, fmt);
138*6236dae4SAndroid Build Coastguard Worker   s = vaprintf(fmt, ap); /* returns an allocated string */
139*6236dae4SAndroid Build Coastguard Worker   va_end(ap);
140*6236dae4SAndroid Build Coastguard Worker   if(!s)
141*6236dae4SAndroid Build Coastguard Worker     return CURLE_OUT_OF_MEMORY; /* failure */
142*6236dae4SAndroid Build Coastguard Worker 
143*6236dae4SAndroid Build Coastguard Worker   bytes_written = 0;
144*6236dae4SAndroid Build Coastguard Worker   write_len = strlen(s);
145*6236dae4SAndroid Build Coastguard Worker   sptr = s;
146*6236dae4SAndroid Build Coastguard Worker 
147*6236dae4SAndroid Build Coastguard Worker   for(;;) {
148*6236dae4SAndroid Build Coastguard Worker     /* Write the buffer to the socket */
149*6236dae4SAndroid Build Coastguard Worker     result = Curl_xfer_send(data, sptr, write_len, FALSE, &bytes_written);
150*6236dae4SAndroid Build Coastguard Worker 
151*6236dae4SAndroid Build Coastguard Worker     if(result)
152*6236dae4SAndroid Build Coastguard Worker       break;
153*6236dae4SAndroid Build Coastguard Worker 
154*6236dae4SAndroid Build Coastguard Worker     Curl_debug(data, CURLINFO_DATA_OUT, sptr, (size_t)bytes_written);
155*6236dae4SAndroid Build Coastguard Worker 
156*6236dae4SAndroid Build Coastguard Worker     if((size_t)bytes_written != write_len) {
157*6236dae4SAndroid Build Coastguard Worker       /* if not all was written at once, we must advance the pointer, decrease
158*6236dae4SAndroid Build Coastguard Worker          the size left and try again! */
159*6236dae4SAndroid Build Coastguard Worker       write_len -= bytes_written;
160*6236dae4SAndroid Build Coastguard Worker       sptr += bytes_written;
161*6236dae4SAndroid Build Coastguard Worker     }
162*6236dae4SAndroid Build Coastguard Worker     else
163*6236dae4SAndroid Build Coastguard Worker       break;
164*6236dae4SAndroid Build Coastguard Worker   }
165*6236dae4SAndroid Build Coastguard Worker 
166*6236dae4SAndroid Build Coastguard Worker   free(s); /* free the output string */
167*6236dae4SAndroid Build Coastguard Worker 
168*6236dae4SAndroid Build Coastguard Worker   return result;
169*6236dae4SAndroid Build Coastguard Worker }
170*6236dae4SAndroid Build Coastguard Worker 
dict_do(struct Curl_easy * data,bool * done)171*6236dae4SAndroid Build Coastguard Worker static CURLcode dict_do(struct Curl_easy *data, bool *done)
172*6236dae4SAndroid Build Coastguard Worker {
173*6236dae4SAndroid Build Coastguard Worker   char *word;
174*6236dae4SAndroid Build Coastguard Worker   char *eword = NULL;
175*6236dae4SAndroid Build Coastguard Worker   char *ppath;
176*6236dae4SAndroid Build Coastguard Worker   char *database = NULL;
177*6236dae4SAndroid Build Coastguard Worker   char *strategy = NULL;
178*6236dae4SAndroid Build Coastguard Worker   char *nthdef = NULL; /* This is not part of the protocol, but required
179*6236dae4SAndroid Build Coastguard Worker                           by RFC 2229 */
180*6236dae4SAndroid Build Coastguard Worker   CURLcode result;
181*6236dae4SAndroid Build Coastguard Worker 
182*6236dae4SAndroid Build Coastguard Worker   char *path;
183*6236dae4SAndroid Build Coastguard Worker 
184*6236dae4SAndroid Build Coastguard Worker   *done = TRUE; /* unconditionally */
185*6236dae4SAndroid Build Coastguard Worker 
186*6236dae4SAndroid Build Coastguard Worker   /* url-decode path before further evaluation */
187*6236dae4SAndroid Build Coastguard Worker   result = Curl_urldecode(data->state.up.path, 0, &path, NULL, REJECT_CTRL);
188*6236dae4SAndroid Build Coastguard Worker   if(result)
189*6236dae4SAndroid Build Coastguard Worker     return result;
190*6236dae4SAndroid Build Coastguard Worker 
191*6236dae4SAndroid Build Coastguard Worker   if(strncasecompare(path, DICT_MATCH, sizeof(DICT_MATCH)-1) ||
192*6236dae4SAndroid Build Coastguard Worker      strncasecompare(path, DICT_MATCH2, sizeof(DICT_MATCH2)-1) ||
193*6236dae4SAndroid Build Coastguard Worker      strncasecompare(path, DICT_MATCH3, sizeof(DICT_MATCH3)-1)) {
194*6236dae4SAndroid Build Coastguard Worker 
195*6236dae4SAndroid Build Coastguard Worker     word = strchr(path, ':');
196*6236dae4SAndroid Build Coastguard Worker     if(word) {
197*6236dae4SAndroid Build Coastguard Worker       word++;
198*6236dae4SAndroid Build Coastguard Worker       database = strchr(word, ':');
199*6236dae4SAndroid Build Coastguard Worker       if(database) {
200*6236dae4SAndroid Build Coastguard Worker         *database++ = (char)0;
201*6236dae4SAndroid Build Coastguard Worker         strategy = strchr(database, ':');
202*6236dae4SAndroid Build Coastguard Worker         if(strategy) {
203*6236dae4SAndroid Build Coastguard Worker           *strategy++ = (char)0;
204*6236dae4SAndroid Build Coastguard Worker           nthdef = strchr(strategy, ':');
205*6236dae4SAndroid Build Coastguard Worker           if(nthdef) {
206*6236dae4SAndroid Build Coastguard Worker             *nthdef = (char)0;
207*6236dae4SAndroid Build Coastguard Worker           }
208*6236dae4SAndroid Build Coastguard Worker         }
209*6236dae4SAndroid Build Coastguard Worker       }
210*6236dae4SAndroid Build Coastguard Worker     }
211*6236dae4SAndroid Build Coastguard Worker 
212*6236dae4SAndroid Build Coastguard Worker     if(!word || (*word == (char)0)) {
213*6236dae4SAndroid Build Coastguard Worker       infof(data, "lookup word is missing");
214*6236dae4SAndroid Build Coastguard Worker       word = (char *)"default";
215*6236dae4SAndroid Build Coastguard Worker     }
216*6236dae4SAndroid Build Coastguard Worker     if(!database || (*database == (char)0)) {
217*6236dae4SAndroid Build Coastguard Worker       database = (char *)"!";
218*6236dae4SAndroid Build Coastguard Worker     }
219*6236dae4SAndroid Build Coastguard Worker     if(!strategy || (*strategy == (char)0)) {
220*6236dae4SAndroid Build Coastguard Worker       strategy = (char *)".";
221*6236dae4SAndroid Build Coastguard Worker     }
222*6236dae4SAndroid Build Coastguard Worker 
223*6236dae4SAndroid Build Coastguard Worker     eword = unescape_word(word);
224*6236dae4SAndroid Build Coastguard Worker     if(!eword) {
225*6236dae4SAndroid Build Coastguard Worker       result = CURLE_OUT_OF_MEMORY;
226*6236dae4SAndroid Build Coastguard Worker       goto error;
227*6236dae4SAndroid Build Coastguard Worker     }
228*6236dae4SAndroid Build Coastguard Worker 
229*6236dae4SAndroid Build Coastguard Worker     result = sendf(data,
230*6236dae4SAndroid Build Coastguard Worker                    "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
231*6236dae4SAndroid Build Coastguard Worker                    "MATCH "
232*6236dae4SAndroid Build Coastguard Worker                    "%s "    /* database */
233*6236dae4SAndroid Build Coastguard Worker                    "%s "    /* strategy */
234*6236dae4SAndroid Build Coastguard Worker                    "%s\r\n" /* word */
235*6236dae4SAndroid Build Coastguard Worker                    "QUIT\r\n",
236*6236dae4SAndroid Build Coastguard Worker                    database,
237*6236dae4SAndroid Build Coastguard Worker                    strategy,
238*6236dae4SAndroid Build Coastguard Worker                    eword);
239*6236dae4SAndroid Build Coastguard Worker 
240*6236dae4SAndroid Build Coastguard Worker     if(result) {
241*6236dae4SAndroid Build Coastguard Worker       failf(data, "Failed sending DICT request");
242*6236dae4SAndroid Build Coastguard Worker       goto error;
243*6236dae4SAndroid Build Coastguard Worker     }
244*6236dae4SAndroid Build Coastguard Worker     Curl_xfer_setup1(data, CURL_XFER_RECV, -1, FALSE); /* no upload */
245*6236dae4SAndroid Build Coastguard Worker   }
246*6236dae4SAndroid Build Coastguard Worker   else if(strncasecompare(path, DICT_DEFINE, sizeof(DICT_DEFINE)-1) ||
247*6236dae4SAndroid Build Coastguard Worker           strncasecompare(path, DICT_DEFINE2, sizeof(DICT_DEFINE2)-1) ||
248*6236dae4SAndroid Build Coastguard Worker           strncasecompare(path, DICT_DEFINE3, sizeof(DICT_DEFINE3)-1)) {
249*6236dae4SAndroid Build Coastguard Worker 
250*6236dae4SAndroid Build Coastguard Worker     word = strchr(path, ':');
251*6236dae4SAndroid Build Coastguard Worker     if(word) {
252*6236dae4SAndroid Build Coastguard Worker       word++;
253*6236dae4SAndroid Build Coastguard Worker       database = strchr(word, ':');
254*6236dae4SAndroid Build Coastguard Worker       if(database) {
255*6236dae4SAndroid Build Coastguard Worker         *database++ = (char)0;
256*6236dae4SAndroid Build Coastguard Worker         nthdef = strchr(database, ':');
257*6236dae4SAndroid Build Coastguard Worker         if(nthdef) {
258*6236dae4SAndroid Build Coastguard Worker           *nthdef = (char)0;
259*6236dae4SAndroid Build Coastguard Worker         }
260*6236dae4SAndroid Build Coastguard Worker       }
261*6236dae4SAndroid Build Coastguard Worker     }
262*6236dae4SAndroid Build Coastguard Worker 
263*6236dae4SAndroid Build Coastguard Worker     if(!word || (*word == (char)0)) {
264*6236dae4SAndroid Build Coastguard Worker       infof(data, "lookup word is missing");
265*6236dae4SAndroid Build Coastguard Worker       word = (char *)"default";
266*6236dae4SAndroid Build Coastguard Worker     }
267*6236dae4SAndroid Build Coastguard Worker     if(!database || (*database == (char)0)) {
268*6236dae4SAndroid Build Coastguard Worker       database = (char *)"!";
269*6236dae4SAndroid Build Coastguard Worker     }
270*6236dae4SAndroid Build Coastguard Worker 
271*6236dae4SAndroid Build Coastguard Worker     eword = unescape_word(word);
272*6236dae4SAndroid Build Coastguard Worker     if(!eword) {
273*6236dae4SAndroid Build Coastguard Worker       result = CURLE_OUT_OF_MEMORY;
274*6236dae4SAndroid Build Coastguard Worker       goto error;
275*6236dae4SAndroid Build Coastguard Worker     }
276*6236dae4SAndroid Build Coastguard Worker 
277*6236dae4SAndroid Build Coastguard Worker     result = sendf(data,
278*6236dae4SAndroid Build Coastguard Worker                    "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
279*6236dae4SAndroid Build Coastguard Worker                    "DEFINE "
280*6236dae4SAndroid Build Coastguard Worker                    "%s "     /* database */
281*6236dae4SAndroid Build Coastguard Worker                    "%s\r\n"  /* word */
282*6236dae4SAndroid Build Coastguard Worker                    "QUIT\r\n",
283*6236dae4SAndroid Build Coastguard Worker                    database,
284*6236dae4SAndroid Build Coastguard Worker                    eword);
285*6236dae4SAndroid Build Coastguard Worker 
286*6236dae4SAndroid Build Coastguard Worker     if(result) {
287*6236dae4SAndroid Build Coastguard Worker       failf(data, "Failed sending DICT request");
288*6236dae4SAndroid Build Coastguard Worker       goto error;
289*6236dae4SAndroid Build Coastguard Worker     }
290*6236dae4SAndroid Build Coastguard Worker     Curl_xfer_setup1(data, CURL_XFER_RECV, -1, FALSE);
291*6236dae4SAndroid Build Coastguard Worker   }
292*6236dae4SAndroid Build Coastguard Worker   else {
293*6236dae4SAndroid Build Coastguard Worker 
294*6236dae4SAndroid Build Coastguard Worker     ppath = strchr(path, '/');
295*6236dae4SAndroid Build Coastguard Worker     if(ppath) {
296*6236dae4SAndroid Build Coastguard Worker       int i;
297*6236dae4SAndroid Build Coastguard Worker 
298*6236dae4SAndroid Build Coastguard Worker       ppath++;
299*6236dae4SAndroid Build Coastguard Worker       for(i = 0; ppath[i]; i++) {
300*6236dae4SAndroid Build Coastguard Worker         if(ppath[i] == ':')
301*6236dae4SAndroid Build Coastguard Worker           ppath[i] = ' ';
302*6236dae4SAndroid Build Coastguard Worker       }
303*6236dae4SAndroid Build Coastguard Worker       result = sendf(data,
304*6236dae4SAndroid Build Coastguard Worker                      "CLIENT " LIBCURL_NAME " " LIBCURL_VERSION "\r\n"
305*6236dae4SAndroid Build Coastguard Worker                      "%s\r\n"
306*6236dae4SAndroid Build Coastguard Worker                      "QUIT\r\n", ppath);
307*6236dae4SAndroid Build Coastguard Worker       if(result) {
308*6236dae4SAndroid Build Coastguard Worker         failf(data, "Failed sending DICT request");
309*6236dae4SAndroid Build Coastguard Worker         goto error;
310*6236dae4SAndroid Build Coastguard Worker       }
311*6236dae4SAndroid Build Coastguard Worker 
312*6236dae4SAndroid Build Coastguard Worker       Curl_xfer_setup1(data, CURL_XFER_RECV, -1, FALSE);
313*6236dae4SAndroid Build Coastguard Worker     }
314*6236dae4SAndroid Build Coastguard Worker   }
315*6236dae4SAndroid Build Coastguard Worker 
316*6236dae4SAndroid Build Coastguard Worker error:
317*6236dae4SAndroid Build Coastguard Worker   free(eword);
318*6236dae4SAndroid Build Coastguard Worker   free(path);
319*6236dae4SAndroid Build Coastguard Worker   return result;
320*6236dae4SAndroid Build Coastguard Worker }
321*6236dae4SAndroid Build Coastguard Worker #endif /* CURL_DISABLE_DICT */
322