Mercurial > gftp.yaz
annotate lib/rfc959.c @ 107:982e3890e7fe
2003-2-17 Brian Masney <masneyb@gftp.org>
* lib/protocols.c lib/rfc959.c - added VMS directory listing support
* lib/config_file.c lib/protocols.c - extra checks when stripping off
carriage returns and linefeeds
author | masneyb |
---|---|
date | Mon, 17 Feb 2003 22:42:16 +0000 |
parents | ae13b18c9336 |
children | fe36ed90aedd |
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; | |
107 | 319 else if (strcmp (stpos, "VMS") == 0) |
320 request->server_type = GFTP_TYPE_VMS; | |
91 | 321 else |
322 request->server_type = GFTP_TYPE_OTHER; | |
323 | |
324 return (0); | |
325 } | |
326 | |
327 | |
328 static int | |
1 | 329 rfc959_connect (gftp_request * request) |
330 { | |
58 | 331 char tempchar, *startpos, *endpos, *tempstr; |
332 int ret, resp; | |
1 | 333 |
84 | 334 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
335 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
336 g_return_val_if_fail (request->hostname != NULL, GFTP_EFATAL); | |
1 | 337 |
58 | 338 if (request->sockfd > 0) |
339 return (0); | |
340 | |
7 | 341 if (request->username == NULL || *request->username == '\0') |
342 { | |
343 gftp_set_username (request, "anonymous"); | |
344 gftp_set_password (request, emailaddr); | |
345 } | |
346 else if (strcasecmp (request->username, "anonymous") == 0) | |
347 gftp_set_password (request, emailaddr); | |
348 | |
58 | 349 if ((request->sockfd = gftp_connect_server (request, "ftp")) < 0) |
84 | 350 return (request->sockfd); |
1 | 351 |
352 /* Get the banner */ | |
84 | 353 if ((ret = rfc959_read_response (request)) != '2') |
1 | 354 { |
355 gftp_disconnect (request); | |
84 | 356 return (ret); |
1 | 357 } |
358 | |
359 /* Login the proxy server if available */ | |
360 if (request->use_proxy) | |
361 { | |
362 resp = '3'; | |
363 startpos = endpos = tempstr = parse_ftp_proxy_string (request); | |
364 while ((resp == '3' || resp == '2') && *startpos != '\0') | |
365 { | |
366 if (*endpos == '\n' || *endpos == '\0') | |
367 { | |
368 tempchar = *(endpos + 1); | |
369 if (*endpos != '\0') | |
370 *(endpos + 1) = '\0'; | |
371 if ((resp = rfc959_send_command (request, startpos)) < 0) | |
84 | 372 return (resp); |
1 | 373 if (*endpos != '\0') |
374 *(endpos + 1) = tempchar; | |
375 else | |
376 break; | |
377 startpos = endpos + 1; | |
378 } | |
379 endpos++; | |
380 } | |
381 g_free (tempstr); | |
382 } | |
383 else | |
384 { | |
385 tempstr = g_strconcat ("USER ", request->username, "\r\n", NULL); | |
386 resp = rfc959_send_command (request, tempstr); | |
387 g_free (tempstr); | |
388 if (resp < 0) | |
84 | 389 return (GFTP_ERETRYABLE); |
1 | 390 if (resp == '3') |
391 { | |
392 tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL); | |
393 resp = rfc959_send_command (request, tempstr); | |
394 g_free (tempstr); | |
395 if (resp < 0) | |
84 | 396 return (GFTP_ERETRYABLE); |
1 | 397 } |
398 if (resp == '3' && request->account) | |
399 { | |
400 tempstr = g_strconcat ("ACCT ", request->account, "\r\n", NULL); | |
401 resp = rfc959_send_command (request, tempstr); | |
402 g_free (tempstr); | |
403 if (resp < 0) | |
84 | 404 return (GFTP_ERETRYABLE); |
1 | 405 } |
406 } | |
407 | |
408 if (resp != '2') | |
409 { | |
410 gftp_disconnect (request); | |
84 | 411 return (GFTP_EFATAL); |
1 | 412 } |
413 | |
91 | 414 if ((ret = rfc959_syst (request)) < 0 && request->sockfd < 0) |
415 return (ret); | |
416 | |
1 | 417 if (request->data_type == GFTP_TYPE_BINARY) |
418 tempstr = "TYPE I\r\n"; | |
419 else | |
420 tempstr = "TYPE A\r\n"; | |
421 | |
84 | 422 if ((ret = rfc959_send_command (request, tempstr)) < 0) |
423 return (ret); | |
1 | 424 |
425 ret = -1; | |
426 if (request->directory != NULL && *request->directory != '\0') | |
427 { | |
428 ret = rfc959_chdir (request, request->directory); | |
58 | 429 if (request->sockfd < 0) |
84 | 430 return (ret); |
1 | 431 } |
432 | |
433 if (ret != 0) | |
434 { | |
84 | 435 if ((ret = rfc959_getcwd (request)) < 0) |
436 return (ret); | |
1 | 437 } |
438 | |
58 | 439 if (request->sockfd < 0) |
84 | 440 return (GFTP_EFATAL); |
1 | 441 |
442 return (0); | |
443 } | |
444 | |
445 | |
446 static void | |
447 rfc959_disconnect (gftp_request * request) | |
448 { | |
449 g_return_if_fail (request != NULL); | |
450 g_return_if_fail (request->protonum == GFTP_FTP_NUM); | |
451 | |
58 | 452 if (request->sockfd > 0) |
1 | 453 { |
454 request->logging_function (gftp_logging_misc, request->user_data, | |
455 _("Disconnecting from site %s\n"), | |
456 request->hostname); | |
58 | 457 close (request->sockfd); |
458 request->sockfd = -1; | |
459 if (request->datafd > 0) | |
1 | 460 { |
58 | 461 close (request->datafd); |
462 request->datafd = -1; | |
1 | 463 } |
464 } | |
465 } | |
466 | |
467 | |
48 | 468 static int |
469 rfc959_data_connection_new (gftp_request * request) | |
470 { | |
471 char *pos, *pos1, resp, *command; | |
472 struct sockaddr_in data_addr; | |
473 size_t data_addr_len; | |
474 unsigned int temp[6]; | |
475 unsigned char ad[6]; | |
58 | 476 int i; |
48 | 477 |
84 | 478 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
479 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
480 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
48 | 481 |
58 | 482 if ((request->datafd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) |
48 | 483 { |
484 request->logging_function (gftp_logging_error, request->user_data, | |
485 _("Failed to create a socket: %s\n"), | |
486 g_strerror (errno)); | |
487 gftp_disconnect (request); | |
84 | 488 return (GFTP_ERETRYABLE); |
48 | 489 } |
490 | |
491 data_addr_len = sizeof (data_addr); | |
492 memset (&data_addr, 0, data_addr_len); | |
493 data_addr.sin_family = AF_INET; | |
494 | |
495 if (request->transfer_type == gftp_transfer_passive) | |
496 { | |
497 if ((resp = rfc959_send_command (request, "PASV\r\n")) != '2') | |
498 { | |
58 | 499 if (request->sockfd < 0) |
84 | 500 return (resp); |
48 | 501 |
502 request->transfer_type = gftp_transfer_active; | |
503 return (rfc959_data_connection_new (request)); | |
504 } | |
58 | 505 |
48 | 506 pos = request->last_ftp_response + 4; |
507 while (!isdigit ((int) *pos) && *pos != '\0') | |
508 pos++; | |
58 | 509 |
48 | 510 if (*pos == '\0') |
511 { | |
58 | 512 request->logging_function (gftp_logging_error, request->user_data, |
513 _("Cannot find an IP address in PASV response '%s'\n"), | |
514 request->last_ftp_response); | |
48 | 515 gftp_disconnect (request); |
84 | 516 return (GFTP_EFATAL); |
48 | 517 } |
58 | 518 |
48 | 519 if (sscanf (pos, "%u,%u,%u,%u,%u,%u", &temp[0], &temp[1], &temp[2], |
520 &temp[3], &temp[4], &temp[5]) != 6) | |
521 { | |
58 | 522 request->logging_function (gftp_logging_error, request->user_data, |
523 _("Cannot find an IP address in PASV response '%s'\n"), | |
524 request->last_ftp_response); | |
48 | 525 gftp_disconnect (request); |
84 | 526 return (GFTP_EFATAL); |
48 | 527 } |
58 | 528 |
48 | 529 for (i = 0; i < 6; i++) |
530 ad[i] = (unsigned char) (temp[i] & 0xff); | |
531 | |
532 memcpy (&data_addr.sin_addr, &ad[0], 4); | |
533 memcpy (&data_addr.sin_port, &ad[4], 2); | |
58 | 534 if (connect (request->datafd, (struct sockaddr *) &data_addr, |
535 data_addr_len) == -1) | |
48 | 536 { |
537 request->logging_function (gftp_logging_error, request->user_data, | |
538 _("Cannot create a data connection: %s\n"), | |
539 g_strerror (errno)); | |
540 gftp_disconnect (request); | |
84 | 541 return (GFTP_ERETRYABLE); |
48 | 542 } |
543 } | |
544 else | |
545 { | |
58 | 546 if (getsockname (request->sockfd, (struct sockaddr *) &data_addr, |
547 &data_addr_len) == -1) | |
548 { | |
549 request->logging_function (gftp_logging_error, request->user_data, | |
550 _("Cannot get socket name: %s\n"), | |
551 g_strerror (errno)); | |
552 gftp_disconnect (request); | |
84 | 553 return (GFTP_ERETRYABLE); |
58 | 554 } |
555 | |
48 | 556 data_addr.sin_port = 0; |
58 | 557 if (bind (request->datafd, (struct sockaddr *) &data_addr, |
558 data_addr_len) == -1) | |
48 | 559 { |
560 request->logging_function (gftp_logging_error, request->user_data, | |
561 _("Cannot bind a port: %s\n"), | |
562 g_strerror (errno)); | |
563 gftp_disconnect (request); | |
84 | 564 return (GFTP_ERETRYABLE); |
48 | 565 } |
566 | |
58 | 567 if (getsockname (request->datafd, (struct sockaddr *) &data_addr, |
568 &data_addr_len) == -1) | |
569 { | |
570 request->logging_function (gftp_logging_error, request->user_data, | |
571 _("Cannot get socket name: %s\n"), | |
572 g_strerror (errno)); | |
573 gftp_disconnect (request); | |
84 | 574 return (GFTP_ERETRYABLE); |
58 | 575 } |
576 | |
577 if (listen (request->datafd, 1) == -1) | |
48 | 578 { |
579 request->logging_function (gftp_logging_error, request->user_data, | |
580 _("Cannot listen on port %d: %s\n"), | |
581 ntohs (data_addr.sin_port), | |
582 g_strerror (errno)); | |
583 gftp_disconnect (request); | |
84 | 584 return (GFTP_ERETRYABLE); |
48 | 585 } |
58 | 586 |
48 | 587 pos = (char *) &data_addr.sin_addr; |
588 pos1 = (char *) &data_addr.sin_port; | |
589 command = g_strdup_printf ("PORT %u,%u,%u,%u,%u,%u\r\n", | |
590 pos[0] & 0xff, pos[1] & 0xff, pos[2] & 0xff, | |
591 pos[3] & 0xff, pos1[0] & 0xff, | |
592 pos1[1] & 0xff); | |
593 resp = rfc959_send_command (request, command); | |
594 g_free (command); | |
595 if (resp != '2') | |
596 { | |
597 gftp_disconnect (request); | |
84 | 598 return (GFTP_ERETRYABLE); |
48 | 599 } |
600 } | |
601 | |
602 return (0); | |
603 } | |
604 | |
605 | |
606 static int | |
607 rfc959_accept_active_connection (gftp_request * request) | |
608 { | |
609 struct sockaddr_in cli_addr; | |
610 size_t cli_addr_len; | |
84 | 611 int infd, ret; |
48 | 612 |
84 | 613 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
614 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
615 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | |
616 g_return_val_if_fail (request->transfer_type == gftp_transfer_active, GFTP_EFATAL); | |
48 | 617 |
618 cli_addr_len = sizeof (cli_addr); | |
58 | 619 |
84 | 620 if ((ret = gftp_set_sockblocking (request, request->datafd, 0)) < 0) |
621 return (ret); | |
58 | 622 |
623 if ((infd = accept (request->datafd, (struct sockaddr *) &cli_addr, | |
48 | 624 &cli_addr_len)) == -1) |
625 { | |
626 request->logging_function (gftp_logging_error, request->user_data, | |
627 _("Cannot accept connection from server: %s\n"), | |
628 g_strerror (errno)); | |
629 gftp_disconnect (request); | |
84 | 630 return (GFTP_ERETRYABLE); |
48 | 631 } |
632 | |
58 | 633 close (request->datafd); |
48 | 634 |
58 | 635 request->datafd = infd; |
84 | 636 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
637 return (ret); | |
58 | 638 |
48 | 639 return (0); |
640 } | |
641 | |
642 | |
58 | 643 static off_t |
644 rfc959_get_file (gftp_request * request, const char *filename, int fd, | |
1 | 645 off_t startsize) |
646 { | |
647 char *command, *tempstr, resp; | |
58 | 648 int ret; |
1 | 649 |
84 | 650 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
651 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
652 g_return_val_if_fail (filename != NULL, GFTP_EFATAL); | |
653 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 654 |
58 | 655 if (fd > 0) |
1 | 656 request->datafd = fd; |
657 | |
58 | 658 if (request->datafd < 0 && |
1 | 659 (ret = rfc959_data_connection_new (request)) < 0) |
660 return (ret); | |
661 | |
84 | 662 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
663 return (ret); | |
1 | 664 |
665 if (startsize > 0) | |
666 { | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
667 #if defined (_LARGEFILE_SOURCE) |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
668 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
|
669 #else |
1 | 670 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
|
671 #endif |
1 | 672 resp = rfc959_send_command (request, command); |
673 g_free (command); | |
674 | |
675 if (resp != '3') | |
676 { | |
58 | 677 close (request->datafd); |
678 request->datafd = -1; | |
84 | 679 return (GFTP_ERETRYABLE); |
1 | 680 } |
681 } | |
682 | |
683 tempstr = g_strconcat ("RETR ", filename, "\r\n", NULL); | |
684 ret = rfc959_send_command (request, tempstr); | |
685 g_free (tempstr); | |
686 | |
687 if (ret != '1') | |
58 | 688 { |
689 close (request->datafd); | |
690 request->datafd = -1; | |
84 | 691 return (GFTP_ERETRYABLE); |
58 | 692 } |
1 | 693 |
694 if (request->transfer_type == gftp_transfer_active && | |
695 (ret = rfc959_accept_active_connection (request)) < 0) | |
696 return (ret); | |
697 | |
698 if ((tempstr = strrchr (request->last_ftp_response, '(')) == NULL) | |
699 { | |
700 tempstr = request->last_ftp_response + 4; | |
701 while (!isdigit ((int) *tempstr) && *tempstr != '\0') | |
702 tempstr++; | |
703 } | |
704 else | |
705 tempstr++; | |
706 | |
707 return (strtol (tempstr, NULL, 10) + startsize); | |
708 } | |
709 | |
710 | |
711 static int | |
58 | 712 rfc959_put_file (gftp_request * request, const char *filename, int fd, |
1 | 713 off_t startsize, off_t totalsize) |
714 { | |
715 char *command, *tempstr, resp; | |
58 | 716 int ret; |
1 | 717 |
84 | 718 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
719 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
720 g_return_val_if_fail (filename != NULL, GFTP_EFATAL); | |
721 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 722 |
58 | 723 if (fd > 0) |
1 | 724 fd = request->datafd; |
725 | |
58 | 726 if (request->datafd < 0 && |
1 | 727 (ret = rfc959_data_connection_new (request)) < 0) |
728 return (ret); | |
729 | |
84 | 730 if ((ret = gftp_set_sockblocking (request, request->datafd, 1)) < 0) |
731 return (ret); | |
1 | 732 |
733 if (startsize > 0) | |
734 { | |
14
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
735 #if defined (_LARGEFILE_SOURCE) |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
736 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
|
737 #else |
83090328581e
* More largefile support. Hopefully all that is left is the configure stuff
masneyb
parents:
7
diff
changeset
|
738 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
|
739 #endif |
1 | 740 resp = rfc959_send_command (request, command); |
741 g_free (command); | |
742 if (resp != '3') | |
743 { | |
58 | 744 close (request->datafd); |
745 request->datafd = -1; | |
84 | 746 return (GFTP_ERETRYABLE); |
1 | 747 } |
748 } | |
749 | |
750 tempstr = g_strconcat ("STOR ", filename, "\r\n", NULL); | |
751 ret = rfc959_send_command (request, tempstr); | |
752 g_free (tempstr); | |
753 if (ret != '1') | |
58 | 754 { |
755 close (request->datafd); | |
756 request->datafd = -1; | |
84 | 757 return (GFTP_ERETRYABLE); |
58 | 758 } |
1 | 759 |
760 if (request->transfer_type == gftp_transfer_active && | |
761 (ret = rfc959_accept_active_connection (request)) < 0) | |
762 return (ret); | |
763 | |
764 return (0); | |
765 } | |
766 | |
58 | 767 |
1 | 768 static long |
769 rfc959_transfer_file (gftp_request *fromreq, const char *fromfile, | |
770 off_t fromsize, gftp_request *toreq, | |
771 const char *tofile, off_t tosize) | |
772 { | |
773 char *tempstr, *pos, *endpos; | |
84 | 774 int ret; |
1 | 775 |
84 | 776 g_return_val_if_fail (fromreq != NULL, GFTP_EFATAL); |
777 g_return_val_if_fail (fromfile != NULL, GFTP_EFATAL); | |
778 g_return_val_if_fail (toreq != NULL, GFTP_EFATAL); | |
779 g_return_val_if_fail (tofile != NULL, GFTP_EFATAL); | |
780 g_return_val_if_fail (fromreq->sockfd > 0, GFTP_EFATAL); | |
781 g_return_val_if_fail (toreq->sockfd > 0, GFTP_EFATAL); | |
1 | 782 |
783 fromreq->transfer_type = gftp_transfer_passive; | |
784 toreq->transfer_type = gftp_transfer_active; | |
785 | |
84 | 786 if ((ret = rfc959_send_command (fromreq, "PASV\r\n")) != '2') |
787 return (ret); | |
1 | 788 |
789 pos = fromreq->last_ftp_response + 4; | |
790 while (!isdigit ((int) *pos) && *pos != '\0') | |
791 pos++; | |
792 if (*pos == '\0') | |
84 | 793 return (GFTP_EFATAL); |
1 | 794 |
795 endpos = pos; | |
796 while (*endpos != ')' && *endpos != '\0') | |
797 endpos++; | |
798 if (*endpos == ')') | |
799 *endpos = '\0'; | |
800 | |
801 tempstr = g_strconcat ("PORT ", pos, "\r\n", NULL); | |
84 | 802 if ((ret = rfc959_send_command (toreq, tempstr)) != '2') |
15
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
803 { |
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
804 g_free (tempstr); |
84 | 805 return (ret); |
15
82fabd6ef1c4
FXP fixes (from Tobias Gruetzmacher <tobias@portfolio16.de>)
masneyb
parents:
14
diff
changeset
|
806 } |
1 | 807 g_free (tempstr); |
808 | |
809 tempstr = g_strconcat ("RETR ", fromfile, "\r\n", NULL); | |
84 | 810 if ((ret = gftp_write (fromreq, tempstr, strlen (tempstr), |
811 fromreq->sockfd)) < 0) | |
58 | 812 { |
813 g_free (tempstr); | |
84 | 814 return (ret); |
58 | 815 } |
1 | 816 g_free (tempstr); |
817 | |
818 tempstr = g_strconcat ("STOR ", tofile, "\r\n", NULL); | |
84 | 819 if ((ret = gftp_write (toreq, tempstr, strlen (tempstr), toreq->sockfd)) < 0) |
58 | 820 { |
821 g_free (tempstr); | |
84 | 822 return (ret); |
58 | 823 } |
1 | 824 g_free (tempstr); |
825 | |
84 | 826 if ((ret = rfc959_read_response (fromreq)) < 0) |
827 return (ret); | |
828 | |
829 if ((ret = rfc959_read_response (toreq)) < 0) | |
830 return (ret); | |
1 | 831 |
832 return (0); | |
833 } | |
834 | |
835 | |
836 static int | |
837 rfc959_end_transfer (gftp_request * request) | |
838 { | |
84 | 839 int ret; |
840 | |
841 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | |
842 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
843 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 844 |
58 | 845 if (request->datafd > 0) |
1 | 846 { |
58 | 847 close (request->datafd); |
848 request->datafd = -1; | |
1 | 849 } |
84 | 850 |
851 ret = rfc959_read_response (request); | |
852 | |
853 if (ret < 0) | |
854 return (ret); | |
855 else if (ret == '2') | |
856 return (0); | |
857 else | |
858 return (GFTP_ERETRYABLE); | |
1 | 859 } |
860 | |
861 | |
862 static int | |
40 | 863 rfc959_abort_transfer (gftp_request * request) |
864 { | |
865 int ret; | |
866 | |
84 | 867 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
868 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
869 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
40 | 870 |
58 | 871 if (request->datafd > 0) |
40 | 872 { |
58 | 873 close (request->datafd); |
874 request->datafd = -1; | |
40 | 875 } |
876 | |
877 /* We need to read two lines of output. The first one is acknowleging | |
878 the transfer and the second line acknowleges the ABOR command */ | |
84 | 879 if ((ret = rfc959_send_command (request, "ABOR\r\n")) < 0) |
880 return (ret); | |
40 | 881 |
58 | 882 if (request->sockfd > 0) |
40 | 883 { |
58 | 884 if ((ret = rfc959_read_response (request)) < 0) |
40 | 885 gftp_disconnect (request); |
886 } | |
887 | |
888 return (0); | |
889 } | |
890 | |
891 | |
892 static int | |
1 | 893 rfc959_list_files (gftp_request * request) |
894 { | |
895 char *tempstr, parms[3]; | |
896 int ret; | |
897 | |
84 | 898 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
899 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
900 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 901 |
902 if ((ret = rfc959_data_connection_new (request)) < 0) | |
903 return (ret); | |
904 | |
905 *parms = '\0'; | |
906 strcat (parms, show_hidden_files ? "a" : ""); | |
907 strcat (parms, resolve_symlinks ? "L" : ""); | |
908 tempstr = g_strconcat ("LIST", *parms != '\0' ? " -" : "", parms, "\r\n", | |
909 NULL); | |
910 | |
911 ret = rfc959_send_command (request, tempstr); | |
912 g_free (tempstr); | |
913 | |
914 if (ret != '1') | |
84 | 915 return (GFTP_ERETRYABLE); |
1 | 916 |
917 ret = 0; | |
918 if (request->transfer_type == gftp_transfer_active) | |
919 ret = rfc959_accept_active_connection (request); | |
920 | |
921 return (ret); | |
922 } | |
923 | |
924 | |
925 int | |
58 | 926 rfc959_get_next_file (gftp_request * request, gftp_file * fle, int fd) |
1 | 927 { |
58 | 928 rfc959_parms * parms; |
1 | 929 char tempstr[255]; |
58 | 930 ssize_t len; |
1 | 931 |
84 | 932 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
933 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
934 g_return_val_if_fail (fle != NULL, GFTP_EFATAL); | |
935 g_return_val_if_fail (fd > 0, GFTP_EFATAL); | |
1 | 936 |
937 if (request->last_dir_entry) | |
938 { | |
939 g_free (request->last_dir_entry); | |
940 request->last_dir_entry = NULL; | |
941 } | |
58 | 942 |
943 parms = request->protocol_data; | |
944 | |
1 | 945 do |
946 { | |
58 | 947 if ((len = gftp_get_line (request, &parms->datafd_rbuf, |
60 | 948 tempstr, sizeof (tempstr), fd)) <= 0) |
1 | 949 { |
950 gftp_file_destroy (fle); | |
58 | 951 return ((int) len); |
1 | 952 } |
953 | |
91 | 954 if (gftp_parse_ls (request, tempstr, fle) != 0) |
1 | 955 { |
58 | 956 if (strncmp (tempstr, "total", strlen ("total")) != 0 && |
957 strncmp (tempstr, _("total"), strlen (_("total"))) != 0) | |
958 request->logging_function (gftp_logging_error, request->user_data, | |
1 | 959 _("Warning: Cannot parse listing %s\n"), |
960 tempstr); | |
961 gftp_file_destroy (fle); | |
962 continue; | |
963 } | |
964 else | |
965 break; | |
966 } | |
967 while (1); | |
968 | |
969 len = strlen (tempstr); | |
970 if (!request->cached) | |
971 { | |
60 | 972 request->last_dir_entry = g_strdup_printf ("%s\n", tempstr); |
973 request->last_dir_entry_len = len + 1; | |
1 | 974 } |
975 return (len); | |
976 } | |
977 | |
978 | |
979 static int | |
980 rfc959_set_data_type (gftp_request * request, int data_type) | |
981 { | |
982 char *tempstr; | |
84 | 983 int ret; |
1 | 984 |
84 | 985 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
986 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1 | 987 |
58 | 988 if (request->sockfd > 0 && request->data_type != data_type) |
1 | 989 { |
990 if (data_type == GFTP_TYPE_BINARY) | |
991 tempstr = "TYPE I\r\n"; | |
992 else | |
993 tempstr = "TYPE A\r\n"; | |
994 | |
84 | 995 if ((ret = rfc959_send_command (request, tempstr)) != '2') |
996 return (ret); | |
1 | 997 } |
998 request->data_type = data_type; | |
999 return (0); | |
1000 } | |
1001 | |
1002 | |
1003 static off_t | |
1004 rfc959_get_file_size (gftp_request * request, const char *filename) | |
1005 { | |
1006 char *tempstr; | |
1007 int ret; | |
1008 | |
1009 g_return_val_if_fail (request != NULL, 0); | |
84 | 1010 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1 | 1011 g_return_val_if_fail (filename != NULL, 0); |
58 | 1012 g_return_val_if_fail (request->sockfd > 0, 0); |
1 | 1013 |
1014 tempstr = g_strconcat ("SIZE ", filename, "\r\n", NULL); | |
1015 ret = rfc959_send_command (request, tempstr); | |
1016 g_free (tempstr); | |
1017 if (ret < 0) | |
84 | 1018 return (ret); |
1 | 1019 |
1020 if (*request->last_ftp_response != '2') | |
1021 return (0); | |
1022 return (strtol (request->last_ftp_response + 4, NULL, 10)); | |
1023 } | |
1024 | |
1025 | |
1026 static int | |
1027 rfc959_rmdir (gftp_request * request, const char *directory) | |
1028 { | |
1029 char *tempstr, ret; | |
1030 | |
84 | 1031 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1032 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1033 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | |
1034 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1035 |
1036 tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL); | |
1037 ret = rfc959_send_command (request, tempstr); | |
1038 g_free (tempstr); | |
84 | 1039 |
1040 if (ret < 0) | |
1041 return (ret); | |
1042 else if (ret == '2') | |
1043 return (0); | |
1044 else | |
1045 return (GFTP_ERETRYABLE); | |
1 | 1046 } |
1047 | |
1048 | |
1049 static int | |
1050 rfc959_rmfile (gftp_request * request, const char *file) | |
1051 { | |
1052 char *tempstr, ret; | |
1053 | |
84 | 1054 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1055 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1056 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | |
1057 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1058 |
1059 tempstr = g_strconcat ("DELE ", file, "\r\n", NULL); | |
1060 ret = rfc959_send_command (request, tempstr); | |
1061 g_free (tempstr); | |
84 | 1062 |
1063 if (ret < 0) | |
1064 return (ret); | |
1065 else if (ret == '2') | |
1066 return (0); | |
1067 else | |
1068 return (GFTP_ERETRYABLE); | |
1 | 1069 } |
1070 | |
1071 | |
1072 static int | |
1073 rfc959_mkdir (gftp_request * request, const char *directory) | |
1074 { | |
1075 char *tempstr, ret; | |
1076 | |
84 | 1077 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1078 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1079 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | |
1080 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1081 |
1082 tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL); | |
1083 ret = rfc959_send_command (request, tempstr); | |
1084 g_free (tempstr); | |
84 | 1085 |
1086 if (ret < 0) | |
1087 return (ret); | |
1088 else if (ret == '2') | |
1089 return (0); | |
1090 else | |
1091 return (GFTP_ERETRYABLE); | |
1 | 1092 } |
1093 | |
1094 | |
1095 static int | |
1096 rfc959_rename (gftp_request * request, const char *oldname, | |
1097 const char *newname) | |
1098 { | |
1099 char *tempstr, ret; | |
1100 | |
84 | 1101 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1102 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1103 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL); | |
1104 g_return_val_if_fail (newname != NULL, GFTP_EFATAL); | |
1105 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1106 |
1107 tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL); | |
1108 ret = rfc959_send_command (request, tempstr); | |
1109 g_free (tempstr); | |
84 | 1110 |
1111 if (ret < 0) | |
1112 return (ret); | |
1113 else if (ret != '2') | |
1114 return (GFTP_ERETRYABLE); | |
1 | 1115 |
1116 tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL); | |
1117 ret = rfc959_send_command (request, tempstr); | |
1118 g_free (tempstr); | |
84 | 1119 |
1120 if (ret < 0) | |
1121 return (ret); | |
1122 else if (ret == '2') | |
1123 return (0); | |
1124 else | |
1125 return (GFTP_ERETRYABLE); | |
1 | 1126 } |
1127 | |
1128 | |
1129 static int | |
1130 rfc959_chmod (gftp_request * request, const char *file, int mode) | |
1131 { | |
1132 char *tempstr, ret; | |
1133 | |
84 | 1134 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1135 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1136 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | |
1137 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1138 |
1139 tempstr = g_malloc (strlen (file) + (mode / 10) + 16); | |
1140 sprintf (tempstr, "SITE CHMOD %d %s\r\n", mode, file); | |
1141 ret = rfc959_send_command (request, tempstr); | |
1142 g_free (tempstr); | |
84 | 1143 |
1144 if (ret < 0) | |
1145 return (ret); | |
1146 else if (ret == '2') | |
1147 return (0); | |
1148 else | |
1149 return (GFTP_ERETRYABLE); | |
1 | 1150 } |
1151 | |
1152 | |
1153 static int | |
1154 rfc959_site (gftp_request * request, const char *command) | |
1155 { | |
1156 char *tempstr, ret; | |
1157 | |
84 | 1158 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1159 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | |
1160 g_return_val_if_fail (command != NULL, GFTP_EFATAL); | |
1161 g_return_val_if_fail (request->sockfd > 0, GFTP_EFATAL); | |
1 | 1162 |
1163 tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); | |
1164 ret = rfc959_send_command (request, tempstr); | |
1165 g_free (tempstr); | |
84 | 1166 |
1167 if (ret < 0) | |
1168 return (ret); | |
1169 else if (ret == '2') | |
1170 return (0); | |
1171 else | |
1172 return (GFTP_ERETRYABLE); | |
58 | 1173 } |
1174 | |
1175 | |
1176 static void | |
1177 rfc959_set_config_options (gftp_request * request) | |
1178 { | |
1179 request->transfer_type = passive_transfer ? gftp_transfer_passive : gftp_transfer_active; | |
1180 | |
1181 if (strcmp (proxy_config, "http") != 0) | |
1182 { | |
1183 gftp_set_proxy_hostname (request, firewall_host); | |
1184 gftp_set_proxy_port (request, firewall_port); | |
1185 gftp_set_proxy_username (request, firewall_username); | |
1186 gftp_set_proxy_password (request, firewall_password); | |
1187 gftp_set_proxy_account (request, firewall_account); | |
1188 gftp_set_proxy_config (request, proxy_config); | |
1189 } | |
1190 else | |
1191 { | |
1192 gftp_set_proxy_hostname (request, http_proxy_host); | |
1193 gftp_set_proxy_port (request, http_proxy_port); | |
1194 gftp_set_proxy_username (request, http_proxy_username); | |
1195 gftp_set_proxy_password (request, http_proxy_password); | |
1196 | |
1197 | |
1198 if (request->proxy_config == NULL) | |
1199 { | |
1200 gftp_protocols[GFTP_HTTP_NUM].init (request); | |
1201 request->proxy_config = g_strdup ("ftp"); | |
1202 } | |
1203 } | |
1 | 1204 } |
1205 | |
1206 | |
48 | 1207 void |
1208 rfc959_init (gftp_request * request) | |
1 | 1209 { |
48 | 1210 g_return_if_fail (request != NULL); |
1 | 1211 |
48 | 1212 request->protonum = GFTP_FTP_NUM; |
1213 request->init = rfc959_init; | |
1214 request->destroy = NULL; | |
1215 request->connect = rfc959_connect; | |
1216 request->disconnect = rfc959_disconnect; | |
1217 request->get_file = rfc959_get_file; | |
1218 request->put_file = rfc959_put_file; | |
1219 request->transfer_file = rfc959_transfer_file; | |
1220 request->get_next_file_chunk = NULL; | |
1221 request->put_next_file_chunk = NULL; | |
1222 request->end_transfer = rfc959_end_transfer; | |
1223 request->abort_transfer = rfc959_abort_transfer; | |
1224 request->list_files = rfc959_list_files; | |
1225 request->get_next_file = rfc959_get_next_file; | |
1226 request->set_data_type = rfc959_set_data_type; | |
1227 request->get_file_size = rfc959_get_file_size; | |
1228 request->chdir = rfc959_chdir; | |
1229 request->rmdir = rfc959_rmdir; | |
1230 request->rmfile = rfc959_rmfile; | |
1231 request->mkdir = rfc959_mkdir; | |
1232 request->rename = rfc959_rename; | |
1233 request->chmod = rfc959_chmod; | |
1234 request->set_file_time = NULL; | |
1235 request->site = rfc959_site; | |
1236 request->parse_url = NULL; | |
63 | 1237 request->swap_socks = NULL; |
58 | 1238 request->set_config_options = rfc959_set_config_options; |
48 | 1239 request->url_prefix = "ftp"; |
1240 request->protocol_name = "FTP"; | |
1241 request->need_hostport = 1; | |
1242 request->need_userpass = 1; | |
1243 request->use_cache = 1; | |
1244 request->use_threads = 1; | |
1245 request->always_connected = 0; | |
58 | 1246 request->protocol_data = g_malloc0 (sizeof (rfc959_parms)); |
48 | 1247 gftp_set_config_options (request); |
1 | 1248 } |
1249 |