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