Mercurial > gftp.yaz
annotate lib/rfc959.c @ 105:ae13b18c9336
2003-2-9 Brian Masney <masneyb@gftp.org>
* lib/protocols.c (parse_time) - parse more time formats. Better
error checking. If there was an error parsing this time,
skip ahead to the next token
* lib/rfc2068.c - this was completely broken. This was broken whenever
I did the conversion over to use the gftp_get_line() function.
* lib/rfc959.c - use g_strdup instead of g_malloc/strcpy
author | masneyb |
---|---|
date | Sun, 09 Feb 2003 20:05:35 +0000 |
parents | 8c37d73d3f1f |
children | 982e3890e7fe |
rev | line source |
---|---|
1 | 1 /*****************************************************************************/ |
2 /* rfc959.c - General purpose routines for the FTP protocol (RFC 959) */ | |
3 /* Copyright (C) 1998-2002 Brian Masney <masneyb@gftp.org> */ | |
4 /* */ | |
5 /* This program is free software; you can redistribute it and/or modify */ | |
6 /* it under the terms of the GNU General Public License as published by */ | |
7 /* the Free Software Foundation; either version 2 of the License, or */ | |
8 /* (at your option) any later version. */ | |
9 /* */ | |
10 /* This program is distributed in the hope that it will be useful, */ | |
11 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ | |
12 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ | |
13 /* GNU General Public License for more details. */ | |
14 /* */ | |
15 /* You should have received a copy of the GNU General Public License */ | |
16 /* along with this program; if not, write to the Free Software */ | |
17 /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA */ | |
18 /*****************************************************************************/ | |
19 | |
20 #include "gftp.h" | |
33 | 21 static const char cvsid[] = "$Id$"; |
1 | 22 |
58 | 23 typedef struct rfc959_params_tag |
24 { | |
25 gftp_getline_buffer * sockfd_rbuf, | |
26 * datafd_rbuf; | |
27 } rfc959_parms; | |
28 | |
29 | |
48 | 30 static int |
31 rfc959_read_response (gftp_request * request) | |
32 { | |
33 char tempstr[255], code[4]; | |
58 | 34 rfc959_parms * parms; |
35 ssize_t num_read; | |
48 | 36 |
84 | 37 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
38 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
39 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
48 | 40 |
41 *code = '\0'; | |
42 if (request->last_ftp_response) | |
43 { | |
44 g_free (request->last_ftp_response); | |
45 request->last_ftp_response = NULL; | |
46 } | |
47 | |
58 | 48 parms = request->protocol_data; |
49 | |
48 | 50 do |
51 { | |
58 | 52 if ((num_read = gftp_get_line (request, &parms->sockfd_rbuf, tempstr, |
60 | 53 sizeof (tempstr), request->sockfd)) <= 0) |
48 | 54 break; |
58 | 55 |
48 | 56 if (isdigit ((int) *tempstr) && isdigit ((int) *(tempstr + 1)) |
57 && isdigit ((int) *(tempstr + 2))) | |
58 { | |
59 strncpy (code, tempstr, 3); | |
60 code[3] = ' '; | |
61 } | |
62 request->logging_function (gftp_logging_recv, request->user_data, | |
63 "%s\n", tempstr); | |
64 } | |
65 while (strncmp (code, tempstr, 4) != 0); | |
66 | |
58 | 67 if (num_read < 0) |
84 | 68 return ((int) num_read); |
48 | 69 |
105 | 70 request->last_ftp_response = g_strdup (tempstr); |
48 | 71 |
72 if (request->last_ftp_response[0] == '4' && | |
73 request->last_ftp_response[1] == '2') | |
74 gftp_disconnect (request); | |
75 | |
76 return (*request->last_ftp_response); | |
77 } | |
78 | |
79 | |
80 static int | |
81 rfc959_send_command (gftp_request * request, const char *command) | |
82 { | |
84 | 83 int ret; |
84 | |
85 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | |
86 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
87 g_return_val_if_fail (command != NULL, GFTP_EFATAL); | |
88 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
48 | 89 |
90 if (strncmp (command, "PASS", 4) == 0) | |
91 { | |
92 request->logging_function (gftp_logging_send, request->user_data, | |
93 "PASS xxxx\n"); | |
94 } | |
95 else if (strncmp (command, "ACCT", 4) == 0) | |
96 { | |
97 request->logging_function (gftp_logging_send, request->user_data, | |
98 "ACCT xxxx\n"); | |
99 } | |
100 else | |
101 { | |
102 request->logging_function (gftp_logging_send, request->user_data, "%s", | |
103 command); | |
104 } | |
105 | |
84 | 106 if ((ret = gftp_write (request, command, strlen (command), |
107 request->sockfd)) < 0) | |
108 return (ret); | |
48 | 109 |
110 return (rfc959_read_response (request)); | |
111 } | |
112 | |
113 | |
114 static char * | |
115 parse_ftp_proxy_string (gftp_request * request) | |
116 { | |
117 char *startpos, *endpos, *oldstr, *newstr, *newval, *tempport; | |
118 | |
119 g_return_val_if_fail (request != NULL, NULL); | |
120 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, NULL); | |
1 | 121 |
48 | 122 newstr = g_malloc (1); |
123 *newstr = '\0'; | |
124 startpos = endpos = request->proxy_config; | |
125 while (*endpos != '\0') | |
126 { | |
127 tempport = NULL; | |
128 if (*endpos == '%' && tolower ((int) *(endpos + 1)) == 'p') | |
129 { | |
130 switch (tolower ((int) *(endpos + 2))) | |
131 { | |
132 case 'u': | |
133 newval = request->proxy_username; | |
134 break; | |
135 case 'p': | |
136 newval = request->proxy_password; | |
137 break; | |
138 case 'h': | |
139 newval = request->proxy_hostname; | |
140 break; | |
141 case 'o': | |
142 tempport = g_strdup_printf ("%d", request->proxy_port); | |
143 newval = tempport; | |
144 break; | |
145 case 'a': | |
146 newval = request->proxy_account; | |
147 break; | |
148 default: | |
149 endpos++; | |
150 continue; | |
151 } | |
152 } | |
153 else if (*endpos == '%' && tolower ((int) *(endpos + 1)) == 'h') | |
154 { | |
155 switch (tolower ((int) *(endpos + 2))) | |
156 { | |
157 case 'u': | |
158 newval = request->username; | |
159 break; | |
160 case 'p': | |
161 newval = request->password; | |
162 break; | |
163 case 'h': | |
164 newval = request->hostname; | |
165 break; | |
166 case 'o': | |
167 tempport = g_strdup_printf ("%d", request->port); | |
168 newval = tempport; | |
169 break; | |
170 case 'a': | |
171 newval = request->account; | |
172 break; | |
173 default: | |
174 endpos++; | |
175 continue; | |
176 } | |
177 } | |
178 else if (*endpos == '%' && tolower ((int) *(endpos + 1)) == 'n') | |
179 { | |
180 *endpos = '\0'; | |
181 oldstr = newstr; | |
182 newstr = g_strconcat (oldstr, startpos, "\r\n", NULL); | |
183 g_free (oldstr); | |
184 endpos += 2; | |
185 startpos = endpos; | |
186 continue; | |
187 } | |
188 else | |
189 { | |
190 endpos++; | |
191 continue; | |
192 } | |
1 | 193 |
48 | 194 *endpos = '\0'; |
195 oldstr = newstr; | |
196 if (!newval) | |
197 newstr = g_strconcat (oldstr, startpos, NULL); | |
198 else | |
199 newstr = g_strconcat (oldstr, startpos, newval, NULL); | |
200 if (tempport) | |
201 { | |
202 g_free (tempport); | |
203 tempport = NULL; | |
204 } | |
205 g_free (oldstr); | |
206 endpos += 3; | |
207 startpos = endpos; | |
208 } | |
209 return (newstr); | |
210 } | |
211 | |
212 | |
213 static int | |
58 | 214 rfc959_getcwd (gftp_request * request) |
215 { | |
216 char *pos, *dir; | |
217 int ret; | |
218 | |
219 ret = rfc959_send_command (request, "PWD\r\n"); | |
220 if (ret < 0) | |
84 | 221 return (ret); |
58 | 222 else if (ret != '2') |
223 { | |
224 request->logging_function (gftp_logging_error, request->user_data, | |
225 _("Received invalid response to PWD command: '%s'\n"), | |
226 request->last_ftp_response); | |
227 gftp_disconnect (request); | |
84 | 228 return (GFTP_ERETRYABLE); |
58 | 229 } |
230 | |
231 if ((pos = strchr (request->last_ftp_response, '"')) == NULL) | |
232 { | |
233 request->logging_function (gftp_logging_error, request->user_data, | |
234 _("Received invalid response to PWD command: '%s'\n"), | |
235 request->last_ftp_response); | |
236 gftp_disconnect (request); | |
84 | 237 return (GFTP_EFATAL); |
58 | 238 } |
239 | |
240 dir = pos + 1; | |
241 | |
242 if ((pos = strchr (dir, '"')) == NULL) | |
243 { | |
244 request->logging_function (gftp_logging_error, request->user_data, | |
245 _("Received invalid response to PWD command: '%s'\n"), | |
246 request->last_ftp_response); | |
247 gftp_disconnect (request); | |
84 | 248 return (GFTP_EFATAL); |
58 | 249 } |
250 | |
251 *pos = '\0'; | |
252 | |
253 if (request->directory) | |
254 g_free (request->directory); | |
255 | |
105 | 256 request->directory = g_strdup (dir); |
58 | 257 return (0); |
258 } | |
259 | |
260 | |
261 static int | |
48 | 262 rfc959_chdir (gftp_request * request, const char *directory) |
263 { | |
58 | 264 char ret, *tempstr; |
84 | 265 int r; |
48 | 266 |
84 | 267 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
268 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
269 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | |
48 | 270 |
271 if (strcmp (directory, "..") == 0) | |
272 ret = rfc959_send_command (request, "CDUP\r\n"); | |
273 else | |
274 { | |
275 tempstr = g_strconcat ("CWD ", directory, "\r\n", NULL); | |
276 ret = rfc959_send_command (request, tempstr); | |
277 g_free (tempstr); | |
278 } | |
279 | |
280 if (ret != '2') | |
84 | 281 return (GFTP_ERETRYABLE); |
48 | 282 |
283 if (directory != request->directory) | |
284 { | |
84 | 285 if ((r = rfc959_getcwd (request)) < 0) |
286 return (r); | |
48 | 287 } |
288 | |
289 return (0); | |
1 | 290 } |
291 | |
292 | |
293 static int | |
91 | 294 rfc959_syst (gftp_request * request) |
295 { | |
296 char *stpos, *endpos; | |
297 int ret; | |
298 | |
299 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | |
300 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
301 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
302 | |
303 ret = rfc959_send_command (request, "SYST\r\n"); | |
304 | |
305 if (ret < 0) | |
306 return (ret); | |
307 else if (ret != '2') | |
308 return (GFTP_ERETRYABLE); | |
309 | |
310 if ((stpos = strchr (request->last_ftp_response, ' ')) == NULL) | |
311 return (GFTP_ERETRYABLE); | |
312 | |
313 if ((endpos = strchr (stpos, ' ')) == NULL) | |
314 return (GFTP_ERETRYABLE); | |
315 | |
316 *endpos = '\0'; | |
317 if (strcmp (stpos, "UNIX") == 0) | |
318 request->server_type = GFTP_TYPE_UNIX; | |
319 else | |
320 request->server_type = GFTP_TYPE_OTHER; | |
321 | |
322 return (0); | |
323 } | |
324 | |
325 | |
326 static int | |
1 | 327 rfc959_connect (gftp_request * request) |
328 { | |
58 | 329 char tempchar, *startpos, *endpos, *tempstr; |
330 int ret, resp; | |
1 | 331 |
84 | 332 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
333 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
334 g_return_val_if_fail (request->hostname != NULL, GFTP_EFATAL); | |
1 | 335 |
58 | 336 if (request->sockfd > 0) |
337 return (0); | |
338 | |
7 | 339 if (request->username == NULL || *request->username == '\0') |
340 { | |
341 gftp_set_username (request, "anonymous"); | |
342 gftp_set_password (request, emailaddr); | |
343 } | |
344 else if (strcasecmp (request->username, "anonymous") == 0) | |
345 gftp_set_password (request, emailaddr); | |
346 | |
58 | 347 if ((request->sockfd = gftp_connect_server (request, "ftp")) < 0) |
84 | 348 return (request->sockfd); |
1 | 349 |
350 /* Get the banner */ | |
84 | 351 if ((ret = rfc959_read_response (request)) != '2') |
1 | 352 { |
353 gftp_disconnect (request); | |
84 | 354 return (ret); |
1 | 355 } |
356 | |
357 /* Login the proxy server if available */ | |
358 if (request->use_proxy) | |
359 { | |
360 resp = '3'; | |
361 startpos = endpos = tempstr = parse_ftp_proxy_string (request); | |
362 while ((resp == '3' || resp == '2') && *startpos != '\0') | |
363 { | |
364 if (*endpos == '\n' || *endpos == '\0') | |
365 { | |
366 tempchar = *(endpos + 1); | |
367 if (*endpos != '\0') | |
368 *(endpos + 1) = '\0'; | |
369 if ((resp = rfc959_send_command (request, startpos)) < 0) | |
84 | 370 return (resp); |
1 | 371 if (*endpos != '\0') |
372 *(endpos + 1) = tempchar; | |
373 else | |
374 break; | |
375 startpos = endpos + 1; | |
376 } | |
377 endpos++; | |
378 } | |
379 g_free (tempstr); | |
380 } | |
381 else | |
382 { | |
383 tempstr = g_strconcat ("USER ", request->username, "\r\n", NULL); | |
384 resp = rfc959_send_command (request, tempstr); | |
385 g_free (tempstr); | |
386 if (resp < 0) | |
84 | 387 return (GFTP_ERETRYABLE); |
1 | 388 if (resp == '3') |
389 { | |
390 tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL); | |
391 resp = rfc959_send_command (request, tempstr); | |
392 g_free (tempstr); | |
393 if (resp < 0) | |
84 | 394 return (GFTP_ERETRYABLE); |
1 | 395 } |
396 if (resp == '3' && request->account) | |
397 { | |
398 tempstr = g_strconcat ("ACCT ", request->account, "\r\n", NULL); | |
399 resp = rfc959_send_command (request, tempstr); | |
400 g_free (tempstr); | |
401 if (resp < 0) | |
84 | 402 return (GFTP_ERETRYABLE); |
1 | 403 } |
404 } | |
405 | |
406 if (resp != '2') | |
407 { | |
408 gftp_disconnect (request); | |
84 | 409 return (GFTP_EFATAL); |
1 | 410 } |
411 | |
91 | 412 if ((ret = rfc959_syst (request)) < 0 && request->sockfd < 0) |
413 return (ret); | |
414 | |
1 | 415 if (request->data_type == GFTP_TYPE_BINARY) |
416 tempstr = "TYPE I\r\n"; | |
417 else | |
418 tempstr = "TYPE A\r\n"; | |
419 | |
84 | 420 if ((ret = rfc959_send_command (request, tempstr)) < 0) |
421 return (ret); | |
1 | 422 |
423 ret = -1; | |
424 if (request->directory != NULL && *request->directory != '\0') | |
425 { | |
426 ret = rfc959_chdir (request, request->directory); | |
58 | 427 if (request->sockfd < 0) |
84 | 428 return (ret); |
1 | 429 } |
430 | |
431 if (ret != 0) | |
432 { | |
84 | 433 if ((ret = rfc959_getcwd (request)) < 0) |
434 return (ret); | |
1 | 435 } |
436 | |
58 | 437 if (request->sockfd < 0) |
84 | 438 return (GFTP_EFATAL); |
1 | 439 |
440 return (0); | |
441 } | |
442 | |
443 | |
444 static void | |
445 rfc959_disconnect (gftp_request * request) | |
446 { | |
447 g_return_if_fail (request != NULL); | |
448 g_return_if_fail (request->protonum == GFTP_FTP_NUM); | |
449 | |
58 | 450 if (request->sockfd > 0) |
1 | 451 { |
452 request->logging_function (gftp_logging_misc, request->user_data, | |
453 _("Disconnecting from site %s\n"), | |
454 request->hostname); | |
58 | 455 close (request->sockfd); |
456 request->sockfd = -1; | |
457 if (request->datafd > 0) | |
1 | 458 { |
58 | 459 close (request->datafd); |
460 request->datafd = -1; | |
1 | 461 } |
462 } | |
463 } | |
464 | |
465 | |
48 | 466 static int |
467 rfc959_data_connection_new (gftp_request * request) | |
468 { | |
469 char *pos, *pos1, resp, *command; | |
470 struct sockaddr_in data_addr; | |
471 size_t data_addr_len; | |
472 unsigned int temp[6]; | |
473 unsigned char ad[6]; | |
58 | 474 int i; |
48 | 475 |
84 | 476 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
477 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
478 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
48 | 479 |
58 | 480 if ((request->datafd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) |
48 | 481 { |
482 request->logging_function (gftp_logging_error, request->user_data, | |
483 _("Failed to create a socket: %s\n"), | |
484 g_strerror (errno)); | |
485 gftp_disconnect (request); | |
84 | 486 return (GFTP_ERETRYABLE); |
48 | 487 } |
488 | |
489 data_addr_len = sizeof (data_addr); | |
490 memset (&data_addr, 0, data_addr_len); | |
491 data_addr.sin_family = AF_INET; | |
492 | |
493 if (request->transfer_type == gftp_transfer_passive) | |
494 { | |
495 if ((resp = rfc959_send_command (request, "PASV\r\n")) != '2') | |
496 { | |
58 | 497 if (request->sockfd < 0) |
84 | 498 return (resp); |
48 | 499 |
500 request->transfer_type = gftp_transfer_active; | |
501 return (rfc959_data_connection_new (request)); | |
502 } | |
58 | 503 |
48 | 504 pos = request->last_ftp_response + 4; |
505 while (!isdigit ((int) *pos) && *pos != '\0') | |
506 pos++; | |
58 | 507 |
48 | 508 if (*pos == '\0') |
509 { | |
58 | 510 request->logging_function (gftp_logging_error, request->user_data, |
511 _("Cannot find an IP address in PASV response '%s'\n"), | |
512 request->last_ftp_response); | |
48 | 513 gftp_disconnect (request); |
84 | 514 return (GFTP_EFATAL); |
48 | 515 } |
58 | 516 |
48 | 517 if (sscanf (pos, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], |
518 &temp[3], &temp[4], &temp[5]) != 6) | |
519 { | |
58 | 520 request->logging_function (gftp_logging_error, request->user_data, |
521 _("Cannot find an IP address in PASV response '%s'\n"), | |
522 request->last_ftp_response); | |
48 | 523 gftp_disconnect (request); |
84 | 524 return (GFTP_EFATAL); |
48 | 525 } |
58 | 526 |
48 | 527 for (i = 0; i < 6; i++) |
528 ad[i] = (unsigned char) (temp[i] & 0xff); | |
529 | |
530 memcpy (&data_addr.sin_addr, &ad[0], 4); | |
531 memcpy (&data_addr.sin_port, &ad[4], 2); | |
58 | 532 if (connect (request->datafd, (struct sockaddr *) &data_addr, |
533 data_addr_len) == -1) | |
48 | 534 { |
535 request->logging_function (gftp_logging_error, request->user_data, | |
536 _("Cannot create a data connection: %s\n"), | |
537 g_strerror (errno)); | |
538 gftp_disconnect (request); | |
84 | 539 return (GFTP_ERETRYABLE); |
48 | 540 } |
541 } | |
542 else | |
543 { | |
58 | 544 if (getsockname (request->sockfd, (struct sockaddr *) &data_addr, |
545 &data_addr_len) == -1) | |
546 { | |
547 request->logging_function (gftp_logging_error, request->user_data, | |
548 _("Cannot get socket name: %s\n"), | |
549 g_strerror (errno)); | |
550 gftp_disconnect (request); | |
84 | 551 return (GFTP_ERETRYABLE); |
58 | 552 } |
553 | |
48 | 554 data_addr.sin_port = 0; |
58 | 555 if (bind (request->datafd, (struct sockaddr *) &data_addr, |
556 data_addr_len) == -1) | |
48 | 557 { |
558 request->logging_function (gftp_logging_error, request->user_data, | |
559 _("Cannot bind a port: %s\n"), | |
560 g_strerror (errno)); | |
561 gftp_disconnect (request); | |
84 | 562 return (GFTP_ERETRYABLE); |
48 | 563 } |
564 | |
58 | 565 if (getsockname (request->datafd, (struct sockaddr *) &data_addr, |
566 &data_addr_len) == -1) | |
567 { | |
568 request->logging_function (gftp_logging_error, request->user_data, | |
569 _("Cannot get socket name: %s\n"), | |
570 g_strerror (errno)); | |
571 gftp_disconnect (request); | |
84 | 572 return (GFTP_ERETRYABLE); |
58 | 573 } |
574 | |
575 if (listen (request->datafd, 1) == -1) | |
48 | 576 { |
577 request->logging_function (gftp_logging_error, request->user_data, | |
578 _("Cannot listen on port %d: %s\n"), | |
579 ntohs (data_addr.sin_port), | |
580 g_strerror (errno)); | |
581 gftp_disconnect (request); | |
84 | 582 return (GFTP_ERETRYABLE); |
48 | 583 } |
58 | 584 |
48 | 585 pos = (char *) &data_addr.sin_addr; |
586 pos1 = (char *) &data_addr.sin_port; | |
587 command = g_strdup_printf ("PORT %u,%u,%u,%u,%u,%u\r\n", | |
588 pos[0] & 0xff, pos[1] & 0xff, pos[2] & 0xff, | |
589 pos[3] & 0xff, pos1[0] & 0xff, | |
590 pos1[1] & 0xff); | |
591 resp = rfc959_send_command (request, command); | |
592 g_free (command); | |
593 if (resp != '2') | |
594 { | |
595 gftp_disconnect (request); | |
84 | 596 return (GFTP_ERETRYABLE); |
48 | 597 } |
598 } | |
599 | |
600 return (0); | |
601 } | |
602 | |
603 | |
604 static int | |
605 rfc959_accept_active_connection (gftp_request * request) | |
606 { | |
607 struct sockaddr_in cli_addr; | |
608 size_t cli_addr_len; | |
84 | 609 int infd, ret; |
48 | 610 |
84 | 611 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
612 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
613 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | |
614 g_return_val_if_fail (request->transfer_type == gftp_transfer_active, GFTP_EFATAL); | |
48 | 615 |
616 cli_addr_len = sizeof (cli_addr); | |
58 | 617 |
84 | 618 if ((ret = gftp_set_sockblocking (request, request->datafd, 0)) < 0) |
619 return (ret); | |
58 | 620 |
621 if ((infd = accept (request->datafd, (struct sockaddr *) &cli_addr, | |
48 | 622 &cli_addr_len)) == -1) |
623 { | |
624 request->logging_function (gftp_logging_error, request->user_data, | |
625 _("Cannot accept connection from server: %s\n"), | |
626 g_strerror (errno)); | |
627 gftp_disconnect (request); | |
84 | 628 return (GFTP_ERETRYABLE); |
48 | 629 } |
630 | |
58 | 631 close (request->datafd); |
48 | 632 |
58 | 633 request->datafd = infd; |
84 | 634 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
635 return (ret); | |
58 | 636 |
48 | 637 return (0); |
638 } | |
639 | |
640 | |
58 | 641 static off_t |
642 rfc959_get_file (gftp_request * request, const char *filename, int fd, | |
1 | 643 off_t startsize) |
644 { | |
645 char *command, *tempstr, resp; | |
58 | 646 int ret; |
1 | 647 |
84 | 648 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
649 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
650 g_return_val_if_fail (filename != NULL, GFTP_EFATAL); | |
651 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 652 |
58 | 653 if (fd > 0) |
1 | 654 request->datafd = fd; |
655 | |
58 | 656 if (request->datafd < 0 && |
1 | 657 (ret = rfc959_data_connection_new (request)) < 0) |
658 return (ret); | |
659 | |
84 | 660 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
661 return (ret); | |
1 | 662 |
663 if (startsize > 0) | |
664 { | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
665 #if defined (_LARGEFILE_SOURCE) |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
666 command = g_strdup_printf ("REST %lld\r\n", startsize); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
667 #else |
1 | 668 command = g_strdup_printf ("REST %ld\r\n", startsize); |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
669 #endif |
1 | 670 resp = rfc959_send_command (request, command); |
671 g_free (command); | |
672 | |
673 if (resp != '3') | |
674 { | |
58 | 675 close (request->datafd); |
676 request->datafd = -1; | |
84 | 677 return (GFTP_ERETRYABLE); |
1 | 678 } |
679 } | |
680 | |
681 tempstr = g_strconcat ("RETR ", filename, "\r\n", NULL); | |
682 ret = rfc959_send_command (request, tempstr); | |
683 g_free (tempstr); | |
684 | |
685 if (ret != '1') | |
58 | 686 { |
687 close (request->datafd); | |
688 request->datafd = -1; | |
84 | 689 return (GFTP_ERETRYABLE); |
58 | 690 } |
1 | 691 |
692 if (request->transfer_type == gftp_transfer_active && | |
693 (ret = rfc959_accept_active_connection (request)) < 0) | |
694 return (ret); | |
695 | |
696 if ((tempstr = strrchr (request->last_ftp_response, '(')) == NULL) | |
697 { | |
698 tempstr = request->last_ftp_response + 4; | |
699 while (!isdigit ((int) *tempstr) && *tempstr != '\0') | |
700 tempstr++; | |
701 } | |
702 else | |
703 tempstr++; | |
704 | |
705 return (strtol (tempstr, NULL, 10) + startsize); | |
706 } | |
707 | |
708 | |
709 static int | |
58 | 710 rfc959_put_file (gftp_request * request, const char *filename, int fd, |
1 | 711 off_t startsize, off_t totalsize) |
712 { | |
713 char *command, *tempstr, resp; | |
58 | 714 int ret; |
1 | 715 |
84 | 716 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
717 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
718 g_return_val_if_fail (filename != NULL, GFTP_EFATAL); | |
719 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 720 |
58 | 721 if (fd > 0) |
1 | 722 fd = request->datafd; |
723 | |
58 | 724 if (request->datafd < 0 && |
1 | 725 (ret = rfc959_data_connection_new (request)) < 0) |
726 return (ret); | |
727 | |
84 | 728 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
729 return (ret); | |
1 | 730 |
731 if (startsize > 0) | |
732 { | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
733 #if defined (_LARGEFILE_SOURCE) |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
734 command = g_strdup_printf ("REST %lld\r\n", startsize); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
735 #else |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
736 command = g_strdup_printf ("REST %ld\r\n", startsize); |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
737 #endif |
1 | 738 resp = rfc959_send_command (request, command); |
739 g_free (command); | |
740 if (resp != '3') | |
741 { | |
58 | 742 close (request->datafd); |
743 request->datafd = -1; | |
84 | 744 return (GFTP_ERETRYABLE); |
1 | 745 } |
746 } | |
747 | |
748 tempstr = g_strconcat ("STOR ", filename, "\r\n", NULL); | |
749 ret = rfc959_send_command (request, tempstr); | |
750 g_free (tempstr); | |
751 if (ret != '1') | |
58 | 752 { |
753 close (request->datafd); | |
754 request->datafd = -1; | |
84 | 755 return (GFTP_ERETRYABLE); |
58 | 756 } |
1 | 757 |
758 if (request->transfer_type == gftp_transfer_active && | |
759 (ret = rfc959_accept_active_connection (request)) < 0) | |
760 return (ret); | |
761 | |
762 return (0); | |
763 } | |
764 | |
58 | 765 |
1 | 766 static long |
767 rfc959_transfer_file (gftp_request *fromreq, const char *fromfile, | |
768 off_t fromsize, gftp_request *toreq, | |
769 const char *tofile, off_t tosize) | |
770 { | |
771 char *tempstr, *pos, *endpos; | |
84 | 772 int ret; |
1 | 773 |
84 | 774 g_return_val_if_fail (fromreq != NULL, GFTP_EFATAL); |
775 g_return_val_if_fail (fromfile != NULL, GFTP_EFATAL); | |
776 g_return_val_if_fail (toreq != NULL, GFTP_EFATAL); | |
777 g_return_val_if_fail (tofile != NULL, GFTP_EFATAL); | |
778 g_return_val_if_fail (fromreq->sockfd > 0, GFTP_EFATAL); | |
779 g_return_val_if_fail (toreq->sockfd > 0, GFTP_EFATAL); | |
1 | 780 |
781 fromreq->transfer_type = gftp_transfer_passive; | |
782 toreq->transfer_type = gftp_transfer_active; | |
783 | |
84 | 784 if ((ret = rfc959_send_command (fromreq, "PASV\r\n")) != '2') |
785 return (ret); | |
1 | 786 |
787 pos = fromreq->last_ftp_response + 4; | |
788 while (!isdigit ((int) *pos) && *pos != '\0') | |
789 pos++; | |
790 if (*pos == '\0') | |
84 | 791 return (GFTP_EFATAL); |
1 | 792 |
793 endpos = pos; | |
794 while (*endpos != ')' && *endpos != '\0') | |
795 endpos++; | |
796 if (*endpos == ')') | |
797 *endpos = '\0'; | |
798 | |
799 tempstr = g_strconcat ("PORT ", pos, "\r\n", NULL); | |
84 | 800 if ((ret = rfc959_send_command (toreq, tempstr)) != '2') |
15
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
801 { |
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
802 g_free (tempstr); |
84 | 803 return (ret); |
15
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
804 } |
1 | 805 g_free (tempstr); |
806 | |
807 tempstr = g_strconcat ("RETR ", fromfile, "\r\n", NULL); | |
84 | 808 if ((ret = gftp_write (fromreq, tempstr, strlen (tempstr), |
809 fromreq->sockfd)) < 0) | |
58 | 810 { |
811 g_free (tempstr); | |
84 | 812 return (ret); |
58 | 813 } |
1 | 814 g_free (tempstr); |
815 | |
816 tempstr = g_strconcat ("STOR ", tofile, "\r\n", NULL); | |
84 | 817 if ((ret = gftp_write (toreq, tempstr, strlen (tempstr), toreq->sockfd)) < 0) |
58 | 818 { |
819 g_free (tempstr); | |
84 | 820 return (ret); |
58 | 821 } |
1 | 822 g_free (tempstr); |
823 | |
84 | 824 if ((ret = rfc959_read_response (fromreq)) < 0) |
825 return (ret); | |
826 | |
827 if ((ret = rfc959_read_response (toreq)) < 0) | |
828 return (ret); | |
1 | 829 |
830 return (0); | |
831 } | |
832 | |
833 | |
834 static int | |
835 rfc959_end_transfer (gftp_request * request) | |
836 { | |
84 | 837 int ret; |
838 | |
839 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | |
840 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
841 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 842 |
58 | 843 if (request->datafd > 0) |
1 | 844 { |
58 | 845 close (request->datafd); |
846 request->datafd = -1; | |
1 | 847 } |
84 | 848 |
849 ret = rfc959_read_response (request); | |
850 | |
851 if (ret < 0) | |
852 return (ret); | |
853 else if (ret == '2') | |
854 return (0); | |
855 else | |
856 return (GFTP_ERETRYABLE); | |
1 | 857 } |
858 | |
859 | |
860 static int | |
40 | 861 rfc959_abort_transfer (gftp_request * request) |
862 { | |
863 int ret; | |
864 | |
84 | 865 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
866 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
867 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
40 | 868 |
58 | 869 if (request->datafd > 0) |
40 | 870 { |
58 | 871 close (request->datafd); |
872 request->datafd = -1; | |
40 | 873 } |
874 | |
875 /* We need to read two lines of output. The first one is acknowleging | |
876 the transfer and the second line acknowleges the ABOR command */ | |
84 | 877 if ((ret = rfc959_send_command (request, "ABOR\r\n")) < 0) |
878 return (ret); | |
40 | 879 |
58 | 880 if (request->sockfd > 0) |
40 | 881 { |
58 | 882 if ((ret = rfc959_read_response (request)) < 0) |
40 | 883 gftp_disconnect (request); |
884 } | |
885 | |
886 return (0); | |
887 } | |
888 | |
889 | |
890 static int | |
1 | 891 rfc959_list_files (gftp_request * request) |
892 { | |
893 char *tempstr, parms[3]; | |
894 int ret; | |
895 | |
84 | 896 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
897 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
898 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 899 |
900 if ((ret = rfc959_data_connection_new (request)) < 0) | |
901 return (ret); | |
902 | |
903 *parms = '\0'; | |
904 strcat (parms, show_hidden_files ? "a" : ""); | |
905 strcat (parms, resolve_symlinks ? "L" : ""); | |
906 tempstr = g_strconcat ("LIST", *parms != '\0' ? " -" : "", parms, "\r\n", | |
907 NULL); | |
908 | |
909 ret = rfc959_send_command (request, tempstr); | |
910 g_free (tempstr); | |
911 | |
912 if (ret != '1') | |
84 | 913 return (GFTP_ERETRYABLE); |
1 | 914 |
915 ret = 0; | |
916 if (request->transfer_type == gftp_transfer_active) | |
917 ret = rfc959_accept_active_connection (request); | |
918 | |
919 return (ret); | |
920 } | |
921 | |
922 | |
923 int | |
58 | 924 rfc959_get_next_file (gftp_request * request, gftp_file * fle, int fd) |
1 | 925 { |
58 | 926 rfc959_parms * parms; |
1 | 927 char tempstr[255]; |
58 | 928 ssize_t len; |
1 | 929 |
84 | 930 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
931 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
932 g_return_val_if_fail (fle != NULL, GFTP_EFATAL); | |
933 g_return_val_if_fail (fd > 0, GFTP_EFATAL); | |
1 | 934 |
935 if (request->last_dir_entry) | |
936 { | |
937 g_free (request->last_dir_entry); | |
938 request->last_dir_entry = NULL; | |
939 } | |
58 | 940 |
941 parms = request->protocol_data; | |
942 | |
1 | 943 do |
944 { | |
58 | 945 if ((len = gftp_get_line (request, &parms->datafd_rbuf, |
60 | 946 tempstr, sizeof (tempstr), fd)) <= 0) |
1 | 947 { |
948 gftp_file_destroy (fle); | |
58 | 949 return ((int) len); |
1 | 950 } |
951 | |
91 | 952 if (gftp_parse_ls (request, tempstr, fle) != 0) |
1 | 953 { |
58 | 954 if (strncmp (tempstr, "total", strlen ("total")) != 0 && |
955 strncmp (tempstr, _("total"), strlen (_("total"))) != 0) | |
956 request->logging_function (gftp_logging_error, request->user_data, | |
1 | 957 _("Warning: Cannot parse listing %s\n"), |
958 tempstr); | |
959 gftp_file_destroy (fle); | |
960 continue; | |
961 } | |
962 else | |
963 break; | |
964 } | |
965 while (1); | |
966 | |
967 len = strlen (tempstr); | |
968 if (!request->cached) | |
969 { | |
60 | 970 request->last_dir_entry = g_strdup_printf ("%s\n", tempstr); |
971 request->last_dir_entry_len = len + 1; | |
1 | 972 } |
973 return (len); | |
974 } | |
975 | |
976 | |
977 static int | |
978 rfc959_set_data_type (gftp_request * request, int data_type) | |
979 { | |
980 char *tempstr; | |
84 | 981 int ret; |
1 | 982 |
84 | 983 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
984 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1 | 985 |
58 | 986 if (request->sockfd > 0 && request->data_type != data_type) |
1 | 987 { |
988 if (data_type == GFTP_TYPE_BINARY) | |
989 tempstr = "TYPE I\r\n"; | |
990 else | |
991 tempstr = "TYPE A\r\n"; | |
992 | |
84 | 993 if ((ret = rfc959_send_command (request, tempstr)) != '2') |
994 return (ret); | |
1 | 995 } |
996 request->data_type = data_type; | |
997 return (0); | |
998 } | |
999 | |
1000 | |
1001 static off_t | |
1002 rfc959_get_file_size (gftp_request * request, const char *filename) | |
1003 { | |
1004 char *tempstr; | |
1005 int ret; | |
1006 | |
1007 g_return_val_if_fail (request != NULL, 0); | |
84 | 1008 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1 | 1009 g_return_val_if_fail (filename != NULL, 0); |
58 | 1010 g_return_val_if_fail (request->sockfd > 0, 0); |
1 | 1011 |
1012 tempstr = g_strconcat ("SIZE ", filename, "\r\n", NULL); | |
1013 ret = rfc959_send_command (request, tempstr); | |
1014 g_free (tempstr); | |
1015 if (ret < 0) | |
84 | 1016 return (ret); |
1 | 1017 |
1018 if (*request->last_ftp_response != '2') | |
1019 return (0); | |
1020 return (strtol (request->last_ftp_response + 4, NULL, 10)); | |
1021 } | |
1022 | |
1023 | |
1024 static int | |
1025 rfc959_rmdir (gftp_request * request, const char *directory) | |
1026 { | |
1027 char *tempstr, ret; | |
1028 | |
84 | 1029 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1030 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1031 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | |
1032 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1033 |
1034 tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL); | |
1035 ret = rfc959_send_command (request, tempstr); | |
1036 g_free (tempstr); | |
84 | 1037 |
1038 if (ret < 0) | |
1039 return (ret); | |
1040 else if (ret == '2') | |
1041 return (0); | |
1042 else | |
1043 return (GFTP_ERETRYABLE); | |
1 | 1044 } |
1045 | |
1046 | |
1047 static int | |
1048 rfc959_rmfile (gftp_request * request, const char *file) | |
1049 { | |
1050 char *tempstr, ret; | |
1051 | |
84 | 1052 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1053 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1054 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | |
1055 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1056 |
1057 tempstr = g_strconcat ("DELE ", file, "\r\n", NULL); | |
1058 ret = rfc959_send_command (request, tempstr); | |
1059 g_free (tempstr); | |
84 | 1060 |
1061 if (ret < 0) | |
1062 return (ret); | |
1063 else if (ret == '2') | |
1064 return (0); | |
1065 else | |
1066 return (GFTP_ERETRYABLE); | |
1 | 1067 } |
1068 | |
1069 | |
1070 static int | |
1071 rfc959_mkdir (gftp_request * request, const char *directory) | |
1072 { | |
1073 char *tempstr, ret; | |
1074 | |
84 | 1075 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1076 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1077 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | |
1078 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1079 |
1080 tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL); | |
1081 ret = rfc959_send_command (request, tempstr); | |
1082 g_free (tempstr); | |
84 | 1083 |
1084 if (ret < 0) | |
1085 return (ret); | |
1086 else if (ret == '2') | |
1087 return (0); | |
1088 else | |
1089 return (GFTP_ERETRYABLE); | |
1 | 1090 } |
1091 | |
1092 | |
1093 static int | |
1094 rfc959_rename (gftp_request * request, const char *oldname, | |
1095 const char *newname) | |
1096 { | |
1097 char *tempstr, ret; | |
1098 | |
84 | 1099 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1100 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1101 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL); | |
1102 g_return_val_if_fail (newname != NULL, GFTP_EFATAL); | |
1103 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1104 |
1105 tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL); | |
1106 ret = rfc959_send_command (request, tempstr); | |
1107 g_free (tempstr); | |
84 | 1108 |
1109 if (ret < 0) | |
1110 return (ret); | |
1111 else if (ret != '2') | |
1112 return (GFTP_ERETRYABLE); | |
1 | 1113 |
1114 tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL); | |
1115 ret = rfc959_send_command (request, tempstr); | |
1116 g_free (tempstr); | |
84 | 1117 |
1118 if (ret < 0) | |
1119 return (ret); | |
1120 else if (ret == '2') | |
1121 return (0); | |
1122 else | |
1123 return (GFTP_ERETRYABLE); | |
1 | 1124 } |
1125 | |
1126 | |
1127 static int | |
1128 rfc959_chmod (gftp_request * request, const char *file, int mode) | |
1129 { | |
1130 char *tempstr, ret; | |
1131 | |
84 | 1132 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1133 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1134 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | |
1135 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1136 |
1137 tempstr = g_malloc (strlen (file) + (mode / 10) + 16); | |
1138 sprintf (tempstr, "SITE CHMOD %d %s\r\n", mode, file); | |
1139 ret = rfc959_send_command (request, tempstr); | |
1140 g_free (tempstr); | |
84 | 1141 |
1142 if (ret < 0) | |
1143 return (ret); | |
1144 else if (ret == '2') | |
1145 return (0); | |
1146 else | |
1147 return (GFTP_ERETRYABLE); | |
1 | 1148 } |
1149 | |
1150 | |
1151 static int | |
1152 rfc959_site (gftp_request * request, const char *command) | |
1153 { | |
1154 char *tempstr, ret; | |
1155 | |
84 | 1156 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1157 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1158 g_return_val_if_fail (command != NULL, GFTP_EFATAL); | |
1159 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1160 |
1161 tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); | |
1162 ret = rfc959_send_command (request, tempstr); | |
1163 g_free (tempstr); | |
84 | 1164 |
1165 if (ret < 0) | |
1166 return (ret); | |
1167 else if (ret == '2') | |
1168 return (0); | |
1169 else | |
1170 return (GFTP_ERETRYABLE); | |
58 | 1171 } |
1172 | |
1173 | |
1174 static void | |
1175 rfc959_set_config_options (gftp_request * request) | |
1176 { | |
1177 request->transfer_type = passive_transfer ? gftp_transfer_passive : gftp_transfer_active; | |
1178 | |
1179 if (strcmp (proxy_config, "http") != 0) | |
1180 { | |
1181 gftp_set_proxy_hostname (request, firewall_host); | |
1182 gftp_set_proxy_port (request, firewall_port); | |
1183 gftp_set_proxy_username (request, firewall_username); | |
1184 gftp_set_proxy_password (request, firewall_password); | |
1185 gftp_set_proxy_account (request, firewall_account); | |
1186 gftp_set_proxy_config (request, proxy_config); | |
1187 } | |
1188 else | |
1189 { | |
1190 gftp_set_proxy_hostname (request, http_proxy_host); | |
1191 gftp_set_proxy_port (request, http_proxy_port); | |
1192 gftp_set_proxy_username (request, http_proxy_username); | |
1193 gftp_set_proxy_password (request, http_proxy_password); | |
1194 | |
1195 | |
1196 if (request->proxy_config == NULL) | |
1197 { | |
1198 gftp_protocols[GFTP_HTTP_NUM].init (request); | |
1199 request->proxy_config = g_strdup ("ftp"); | |
1200 } | |
1201 } | |
1 | 1202 } |
1203 | |
1204 | |
48 | 1205 void |
1206 rfc959_init (gftp_request * request) | |
1 | 1207 { |
48 | 1208 g_return_if_fail (request != NULL); |
1 | 1209 |
48 | 1210 request->protonum = GFTP_FTP_NUM; |
1211 request->init = rfc959_init; | |
1212 request->destroy = NULL; | |
1213 request->connect = rfc959_connect; | |
1214 request->disconnect = rfc959_disconnect; | |
1215 request->get_file = rfc959_get_file; | |
1216 request->put_file = rfc959_put_file; | |
1217 request->transfer_file = rfc959_transfer_file; | |
1218 request->get_next_file_chunk = NULL; | |
1219 request->put_next_file_chunk = NULL; | |
1220 request->end_transfer = rfc959_end_transfer; | |
1221 request->abort_transfer = rfc959_abort_transfer; | |
1222 request->list_files = rfc959_list_files; | |
1223 request->get_next_file = rfc959_get_next_file; | |
1224 request->set_data_type = rfc959_set_data_type; | |
1225 request->get_file_size = rfc959_get_file_size; | |
1226 request->chdir = rfc959_chdir; | |
1227 request->rmdir = rfc959_rmdir; | |
1228 request->rmfile = rfc959_rmfile; | |
1229 request->mkdir = rfc959_mkdir; | |
1230 request->rename = rfc959_rename; | |
1231 request->chmod = rfc959_chmod; | |
1232 request->set_file_time = NULL; | |
1233 request->site = rfc959_site; | |
1234 request->parse_url = NULL; | |
63 | 1235 request->swap_socks = NULL; |
58 | 1236 request->set_config_options = rfc959_set_config_options; |
48 | 1237 request->url_prefix = "ftp"; |
1238 request->protocol_name = "FTP"; | |
1239 request->need_hostport = 1; | |
1240 request->need_userpass = 1; | |
1241 request->use_cache = 1; | |
1242 request->use_threads = 1; | |
1243 request->always_connected = 0; | |
58 | 1244 request->protocol_data = g_malloc0 (sizeof (rfc959_parms)); |
48 | 1245 gftp_set_config_options (request); |
1 | 1246 } |
1247 |