Mercurial > gftp.yaz
comparison lib/rfc959.c @ 292:e5ce6f15290f
2003-10-19 Brian Masney <masneyb@gftp.org>
* lib/rfc959.c - abort a file transfer properly. When a transfer is
aborted, you will not be disconnected from the remote site.
author | masneyb |
---|---|
date | Sun, 19 Oct 2003 13:31:25 +0000 |
parents | c8627e70adb5 |
children | 6e0b9ca541e2 |
comparison
equal
deleted
inserted
replaced
291:265244924868 | 292:e5ce6f15290f |
---|---|
87 typedef struct rfc959_params_tag | 87 typedef struct rfc959_params_tag |
88 { | 88 { |
89 gftp_getline_buffer * datafd_rbuf, | 89 gftp_getline_buffer * datafd_rbuf, |
90 * dataconn_rbuf; | 90 * dataconn_rbuf; |
91 int data_connection; | 91 int data_connection; |
92 unsigned int is_ascii_transfer : 1; | 92 unsigned int is_ascii_transfer : 1, |
93 sent_retr : 1; | |
93 } rfc959_parms; | 94 } rfc959_parms; |
94 | 95 |
95 | 96 |
96 static int | 97 static int |
97 rfc959_read_response (gftp_request * request) | 98 rfc959_read_response (gftp_request * request, int disconnect_on_42x) |
98 { | 99 { |
99 char tempstr[255], code[4]; | 100 char tempstr[255], code[4]; |
100 rfc959_parms * parms; | 101 rfc959_parms * parms; |
101 ssize_t num_read; | 102 ssize_t num_read; |
102 | 103 |
134 return ((int) num_read); | 135 return ((int) num_read); |
135 | 136 |
136 request->last_ftp_response = g_strdup (tempstr); | 137 request->last_ftp_response = g_strdup (tempstr); |
137 | 138 |
138 if (request->last_ftp_response[0] == '4' && | 139 if (request->last_ftp_response[0] == '4' && |
139 request->last_ftp_response[1] == '2') | 140 request->last_ftp_response[1] == '2' && |
141 disconnect_on_42x) | |
140 gftp_disconnect (request); | 142 gftp_disconnect (request); |
141 | 143 |
142 return (*request->last_ftp_response); | 144 return (*request->last_ftp_response); |
143 } | 145 } |
144 | 146 |
145 | 147 |
146 static int | 148 static int |
147 rfc959_send_command (gftp_request * request, const char *command) | 149 rfc959_send_command (gftp_request * request, const char *command, |
150 int read_response) | |
148 { | 151 { |
149 int ret; | 152 int ret; |
150 | 153 |
151 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 154 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
152 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 155 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
171 | 174 |
172 if ((ret = gftp_fd_write (request, command, strlen (command), | 175 if ((ret = gftp_fd_write (request, command, strlen (command), |
173 request->datafd)) < 0) | 176 request->datafd)) < 0) |
174 return (ret); | 177 return (ret); |
175 | 178 |
176 return (rfc959_read_response (request)); | 179 if (read_response) |
180 return (rfc959_read_response (request, 1)); | |
181 else | |
182 return (0); | |
177 } | 183 } |
178 | 184 |
179 | 185 |
180 static char * | 186 static char * |
181 parse_ftp_proxy_string (gftp_request * request) | 187 parse_ftp_proxy_string (gftp_request * request) |
296 rfc959_getcwd (gftp_request * request) | 302 rfc959_getcwd (gftp_request * request) |
297 { | 303 { |
298 char *pos, *dir; | 304 char *pos, *dir; |
299 int ret; | 305 int ret; |
300 | 306 |
301 ret = rfc959_send_command (request, "PWD\r\n"); | 307 ret = rfc959_send_command (request, "PWD\r\n", 1); |
302 if (ret < 0) | 308 if (ret < 0) |
303 return (ret); | 309 return (ret); |
304 else if (ret != '2') | 310 else if (ret != '2') |
305 { | 311 { |
306 request->logging_function (gftp_logging_error, request, | 312 request->logging_function (gftp_logging_error, request, |
349 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 355 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
350 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 356 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
351 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | 357 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); |
352 | 358 |
353 if (strcmp (directory, "..") == 0) | 359 if (strcmp (directory, "..") == 0) |
354 ret = rfc959_send_command (request, "CDUP\r\n"); | 360 ret = rfc959_send_command (request, "CDUP\r\n", 1); |
355 else | 361 else |
356 { | 362 { |
357 tempstr = g_strconcat ("CWD ", directory, "\r\n", NULL); | 363 tempstr = g_strconcat ("CWD ", directory, "\r\n", NULL); |
358 ret = rfc959_send_command (request, tempstr); | 364 ret = rfc959_send_command (request, tempstr, 1); |
359 g_free (tempstr); | 365 g_free (tempstr); |
360 } | 366 } |
361 | 367 |
362 if (ret != '2') | 368 if (ret != '2') |
363 return (GFTP_ERETRYABLE); | 369 return (GFTP_ERETRYABLE); |
380 | 386 |
381 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 387 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
382 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 388 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
383 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 389 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
384 | 390 |
385 ret = rfc959_send_command (request, "SYST\r\n"); | 391 ret = rfc959_send_command (request, "SYST\r\n", 1); |
386 | 392 |
387 if (ret < 0) | 393 if (ret < 0) |
388 return (ret); | 394 return (ret); |
389 else if (ret != '2') | 395 else if (ret != '2') |
390 return (GFTP_ERETRYABLE); | 396 return (GFTP_ERETRYABLE); |
441 | 447 |
442 if ((ret = gftp_connect_server (request, "ftp", proxy_hostname, proxy_port)) < 0) | 448 if ((ret = gftp_connect_server (request, "ftp", proxy_hostname, proxy_port)) < 0) |
443 return (ret); | 449 return (ret); |
444 | 450 |
445 /* Get the banner */ | 451 /* Get the banner */ |
446 if ((ret = rfc959_read_response (request)) != '2') | 452 if ((ret = rfc959_read_response (request, 1)) != '2') |
447 { | 453 { |
448 gftp_disconnect (request); | 454 gftp_disconnect (request); |
449 return (ret); | 455 return (ret); |
450 } | 456 } |
451 | 457 |
459 if (*endpos == '\n' || *endpos == '\0') | 465 if (*endpos == '\n' || *endpos == '\0') |
460 { | 466 { |
461 tempchar = *(endpos + 1); | 467 tempchar = *(endpos + 1); |
462 if (*endpos != '\0') | 468 if (*endpos != '\0') |
463 *(endpos + 1) = '\0'; | 469 *(endpos + 1) = '\0'; |
464 if ((resp = rfc959_send_command (request, startpos)) < 0) | 470 if ((resp = rfc959_send_command (request, startpos, 1)) < 0) |
465 return (resp); | 471 return (resp); |
466 if (*endpos != '\0') | 472 if (*endpos != '\0') |
467 *(endpos + 1) = tempchar; | 473 *(endpos + 1) = tempchar; |
468 else | 474 else |
469 break; | 475 break; |
474 g_free (tempstr); | 480 g_free (tempstr); |
475 } | 481 } |
476 else | 482 else |
477 { | 483 { |
478 tempstr = g_strconcat ("USER ", request->username, "\r\n", NULL); | 484 tempstr = g_strconcat ("USER ", request->username, "\r\n", NULL); |
479 resp = rfc959_send_command (request, tempstr); | 485 resp = rfc959_send_command (request, tempstr, 1); |
480 g_free (tempstr); | 486 g_free (tempstr); |
481 if (resp < 0) | 487 if (resp < 0) |
482 return (GFTP_ERETRYABLE); | 488 return (GFTP_ERETRYABLE); |
483 | 489 |
484 if (resp == '3') | 490 if (resp == '3') |
485 { | 491 { |
486 tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL); | 492 tempstr = g_strconcat ("PASS ", request->password, "\r\n", NULL); |
487 resp = rfc959_send_command (request, tempstr); | 493 resp = rfc959_send_command (request, tempstr, 1); |
488 g_free (tempstr); | 494 g_free (tempstr); |
489 if (resp < 0) | 495 if (resp < 0) |
490 return (GFTP_ERETRYABLE); | 496 return (GFTP_ERETRYABLE); |
491 } | 497 } |
492 | 498 |
493 if (resp == '3' && request->account) | 499 if (resp == '3' && request->account) |
494 { | 500 { |
495 tempstr = g_strconcat ("ACCT ", request->account, "\r\n", NULL); | 501 tempstr = g_strconcat ("ACCT ", request->account, "\r\n", NULL); |
496 resp = rfc959_send_command (request, tempstr); | 502 resp = rfc959_send_command (request, tempstr, 1); |
497 g_free (tempstr); | 503 g_free (tempstr); |
498 if (resp < 0) | 504 if (resp < 0) |
499 return (GFTP_ERETRYABLE); | 505 return (GFTP_ERETRYABLE); |
500 } | 506 } |
501 } | 507 } |
523 { | 529 { |
524 tempstr = "TYPE I\r\n"; | 530 tempstr = "TYPE I\r\n"; |
525 parms->is_ascii_transfer = 0; | 531 parms->is_ascii_transfer = 0; |
526 } | 532 } |
527 | 533 |
528 if ((ret = rfc959_send_command (request, tempstr)) < 0) | 534 if ((ret = rfc959_send_command (request, tempstr, 1)) < 0) |
529 return (ret); | 535 return (ret); |
530 | 536 |
531 ret = -1; | 537 ret = -1; |
532 if (request->directory != NULL && *request->directory != '\0') | 538 if (request->directory != NULL && *request->directory != '\0') |
533 { | 539 { |
612 data_addr.sin_family = AF_INET; | 618 data_addr.sin_family = AF_INET; |
613 | 619 |
614 gftp_lookup_request_option (request, "passive_transfer", &passive_transfer); | 620 gftp_lookup_request_option (request, "passive_transfer", &passive_transfer); |
615 if (passive_transfer) | 621 if (passive_transfer) |
616 { | 622 { |
617 if ((resp = rfc959_send_command (request, "PASV\r\n")) != '2') | 623 if ((resp = rfc959_send_command (request, "PASV\r\n", 1)) != '2') |
618 { | 624 { |
619 if (request->datafd < 0) | 625 if (request->datafd < 0) |
620 return (GFTP_ERETRYABLE); | 626 return (GFTP_ERETRYABLE); |
621 | 627 |
622 gftp_set_request_option (request, "passive_transfer", GINT_TO_POINTER(0)); | 628 gftp_set_request_option (request, "passive_transfer", GINT_TO_POINTER(0)); |
708 pos1 = (char *) &data_addr.sin_port; | 714 pos1 = (char *) &data_addr.sin_port; |
709 command = g_strdup_printf ("PORT %u,%u,%u,%u,%u,%u\r\n", | 715 command = g_strdup_printf ("PORT %u,%u,%u,%u,%u,%u\r\n", |
710 pos[0] & 0xff, pos[1] & 0xff, pos[2] & 0xff, | 716 pos[0] & 0xff, pos[1] & 0xff, pos[2] & 0xff, |
711 pos[3] & 0xff, pos1[0] & 0xff, | 717 pos[3] & 0xff, pos1[0] & 0xff, |
712 pos1[1] & 0xff); | 718 pos1[1] & 0xff); |
713 resp = rfc959_send_command (request, command); | 719 resp = rfc959_send_command (request, command, 1); |
714 g_free (command); | 720 g_free (command); |
715 if (resp != '2') | 721 if (resp != '2') |
716 { | 722 { |
717 gftp_disconnect (request); | 723 gftp_disconnect (request); |
718 return (GFTP_ERETRYABLE); | 724 return (GFTP_ERETRYABLE); |
768 data_addr.sin6_family = AF_INET6; | 774 data_addr.sin6_family = AF_INET6; |
769 | 775 |
770 gftp_lookup_request_option (request, "passive_transfer", &passive_transfer); | 776 gftp_lookup_request_option (request, "passive_transfer", &passive_transfer); |
771 if (passive_transfer) | 777 if (passive_transfer) |
772 { | 778 { |
773 if ((resp = rfc959_send_command (request, "EPSV\r\n")) != '2') | 779 if ((resp = rfc959_send_command (request, "EPSV\r\n", 1)) != '2') |
774 { | 780 { |
775 if (request->datafd < 0) | 781 if (request->datafd < 0) |
776 return (GFTP_ERETRYABLE); | 782 return (GFTP_ERETRYABLE); |
777 | 783 |
778 gftp_set_request_option (request, "passive_transfer", | 784 gftp_set_request_option (request, "passive_transfer", |
861 } | 867 } |
862 | 868 |
863 command = g_strdup_printf ("EPRT |2|%s|%d|\n", buf, | 869 command = g_strdup_printf ("EPRT |2|%s|%d|\n", buf, |
864 ntohs (data_addr.sin6_port)); | 870 ntohs (data_addr.sin6_port)); |
865 | 871 |
866 resp = rfc959_send_command (request, command); | 872 resp = rfc959_send_command (request, command, 1); |
867 g_free (command); | 873 g_free (command); |
868 if (resp != '2') | 874 if (resp != '2') |
869 { | 875 { |
870 gftp_disconnect (request); | 876 gftp_disconnect (request); |
871 return (GFTP_ERETRYABLE); | 877 return (GFTP_ERETRYABLE); |
997 { | 1003 { |
998 tempstr = "TYPE I\r\n"; | 1004 tempstr = "TYPE I\r\n"; |
999 parms->is_ascii_transfer = 0; | 1005 parms->is_ascii_transfer = 0; |
1000 } | 1006 } |
1001 | 1007 |
1002 rfc959_send_command (request, tempstr); | 1008 rfc959_send_command (request, tempstr, 1); |
1003 } | 1009 } |
1004 | 1010 |
1005 return; | 1011 return; |
1006 } | 1012 } |
1007 | 1013 |
1037 #if defined (_LARGEFILE_SOURCE) | 1043 #if defined (_LARGEFILE_SOURCE) |
1038 command = g_strdup_printf ("REST %lld\r\n", startsize); | 1044 command = g_strdup_printf ("REST %lld\r\n", startsize); |
1039 #else | 1045 #else |
1040 command = g_strdup_printf ("REST %ld\r\n", startsize); | 1046 command = g_strdup_printf ("REST %ld\r\n", startsize); |
1041 #endif | 1047 #endif |
1042 resp = rfc959_send_command (request, command); | 1048 resp = rfc959_send_command (request, command, 1); |
1043 g_free (command); | 1049 g_free (command); |
1044 | 1050 |
1045 if (resp != '3') | 1051 if (resp != '3') |
1046 { | 1052 { |
1047 close (parms->data_connection); | 1053 close (parms->data_connection); |
1049 return (GFTP_ERETRYABLE); | 1055 return (GFTP_ERETRYABLE); |
1050 } | 1056 } |
1051 } | 1057 } |
1052 | 1058 |
1053 tempstr = g_strconcat ("RETR ", filename, "\r\n", NULL); | 1059 tempstr = g_strconcat ("RETR ", filename, "\r\n", NULL); |
1054 ret = rfc959_send_command (request, tempstr); | 1060 ret = rfc959_send_command (request, tempstr, 1); |
1055 g_free (tempstr); | 1061 g_free (tempstr); |
1056 | 1062 |
1057 if (ret != '1') | 1063 if (ret != '1') |
1058 { | 1064 { |
1059 close (parms->data_connection); | 1065 close (parms->data_connection); |
1073 tempstr++; | 1079 tempstr++; |
1074 } | 1080 } |
1075 else | 1081 else |
1076 tempstr++; | 1082 tempstr++; |
1077 | 1083 |
1084 parms->sent_retr = 1; | |
1078 return (gftp_parse_file_size (tempstr) + startsize); | 1085 return (gftp_parse_file_size (tempstr) + startsize); |
1079 } | 1086 } |
1080 | 1087 |
1081 | 1088 |
1082 static int | 1089 static int |
1110 #if defined (_LARGEFILE_SOURCE) | 1117 #if defined (_LARGEFILE_SOURCE) |
1111 command = g_strdup_printf ("REST %lld\r\n", startsize); | 1118 command = g_strdup_printf ("REST %lld\r\n", startsize); |
1112 #else | 1119 #else |
1113 command = g_strdup_printf ("REST %ld\r\n", startsize); | 1120 command = g_strdup_printf ("REST %ld\r\n", startsize); |
1114 #endif | 1121 #endif |
1115 resp = rfc959_send_command (request, command); | 1122 resp = rfc959_send_command (request, command, 1); |
1116 g_free (command); | 1123 g_free (command); |
1117 if (resp != '3') | 1124 if (resp != '3') |
1118 { | 1125 { |
1119 close (parms->data_connection); | 1126 close (parms->data_connection); |
1120 parms->data_connection = -1; | 1127 parms->data_connection = -1; |
1121 return (GFTP_ERETRYABLE); | 1128 return (GFTP_ERETRYABLE); |
1122 } | 1129 } |
1123 } | 1130 } |
1124 | 1131 |
1125 tempstr = g_strconcat ("STOR ", filename, "\r\n", NULL); | 1132 tempstr = g_strconcat ("STOR ", filename, "\r\n", NULL); |
1126 ret = rfc959_send_command (request, tempstr); | 1133 ret = rfc959_send_command (request, tempstr, 1); |
1127 g_free (tempstr); | 1134 g_free (tempstr); |
1128 if (ret != '1') | 1135 if (ret != '1') |
1129 { | 1136 { |
1130 close (parms->data_connection); | 1137 close (parms->data_connection); |
1131 parms->data_connection = -1; | 1138 parms->data_connection = -1; |
1157 g_return_val_if_fail (toreq->datafd > 0, GFTP_EFATAL); | 1164 g_return_val_if_fail (toreq->datafd > 0, GFTP_EFATAL); |
1158 | 1165 |
1159 gftp_set_request_option (fromreq, "passive_transfer", GINT_TO_POINTER(1)); | 1166 gftp_set_request_option (fromreq, "passive_transfer", GINT_TO_POINTER(1)); |
1160 gftp_set_request_option (toreq, "passive_transfer", GINT_TO_POINTER(0)); | 1167 gftp_set_request_option (toreq, "passive_transfer", GINT_TO_POINTER(0)); |
1161 | 1168 |
1162 if ((ret = rfc959_send_command (fromreq, "PASV\r\n")) != '2') | 1169 if ((ret = rfc959_send_command (fromreq, "PASV\r\n", 1)) != '2') |
1163 return (ret); | 1170 return (ret); |
1164 | 1171 |
1165 pos = fromreq->last_ftp_response + 4; | 1172 pos = fromreq->last_ftp_response + 4; |
1166 while (!isdigit ((int) *pos) && *pos != '\0') | 1173 while (!isdigit ((int) *pos) && *pos != '\0') |
1167 pos++; | 1174 pos++; |
1173 endpos++; | 1180 endpos++; |
1174 if (*endpos == ')') | 1181 if (*endpos == ')') |
1175 *endpos = '\0'; | 1182 *endpos = '\0'; |
1176 | 1183 |
1177 tempstr = g_strconcat ("PORT ", pos, "\r\n", NULL); | 1184 tempstr = g_strconcat ("PORT ", pos, "\r\n", NULL); |
1178 if ((ret = rfc959_send_command (toreq, tempstr)) != '2') | 1185 if ((ret = rfc959_send_command (toreq, tempstr, 1)) != '2') |
1179 { | 1186 { |
1180 g_free (tempstr); | 1187 g_free (tempstr); |
1181 return (ret); | 1188 return (ret); |
1182 } | 1189 } |
1183 g_free (tempstr); | 1190 g_free (tempstr); |
1198 g_free (tempstr); | 1205 g_free (tempstr); |
1199 return (ret); | 1206 return (ret); |
1200 } | 1207 } |
1201 g_free (tempstr); | 1208 g_free (tempstr); |
1202 | 1209 |
1203 if ((ret = rfc959_read_response (fromreq)) < 0) | 1210 if ((ret = rfc959_read_response (fromreq, 1)) < 0) |
1204 return (ret); | 1211 return (ret); |
1205 | 1212 |
1206 if ((ret = rfc959_read_response (toreq)) < 0) | 1213 if ((ret = rfc959_read_response (toreq, 1)) < 0) |
1207 return (ret); | 1214 return (ret); |
1208 | 1215 |
1209 return (0); | 1216 return (0); |
1210 } | 1217 } |
1211 | 1218 |
1219 g_return_val_if_fail (request != NULL, GFTP_EFATAL); | 1226 g_return_val_if_fail (request != NULL, GFTP_EFATAL); |
1220 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1227 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1221 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1228 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1222 | 1229 |
1223 parms = request->protocol_data; | 1230 parms = request->protocol_data; |
1231 parms->sent_retr = 0; | |
1232 | |
1224 if (parms->data_connection > 0) | 1233 if (parms->data_connection > 0) |
1225 { | 1234 { |
1226 close (parms->data_connection); | 1235 close (parms->data_connection); |
1227 parms->data_connection = -1; | 1236 parms->data_connection = -1; |
1228 } | 1237 } |
1229 | 1238 |
1230 ret = rfc959_read_response (request); | 1239 ret = rfc959_read_response (request, 1); |
1231 | 1240 |
1232 if (ret < 0) | 1241 if (ret < 0) |
1233 return (ret); | 1242 return (ret); |
1234 else if (ret == '2') | 1243 else if (ret == '2') |
1235 return (0); | 1244 return (0); |
1248 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1257 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1249 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1258 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1250 | 1259 |
1251 parms = request->protocol_data; | 1260 parms = request->protocol_data; |
1252 | 1261 |
1262 if ((ret = rfc959_send_command (request, "ABOR\r\n", 0)) < 0) | |
1263 return (ret); | |
1264 | |
1253 if (parms->data_connection > 0) | 1265 if (parms->data_connection > 0) |
1254 { | 1266 { |
1255 close (parms->data_connection); | 1267 close (parms->data_connection); |
1256 parms->data_connection = -1; | 1268 parms->data_connection = -1; |
1257 } | 1269 } |
1258 | 1270 |
1259 /* We need to read two lines of output. The first one is acknowleging | |
1260 the transfer and the second line acknowleges the ABOR command */ | |
1261 if ((ret = rfc959_send_command (request, "ABOR\r\n")) < 0) | |
1262 return (ret); | |
1263 | |
1264 if (request->datafd > 0) | 1271 if (request->datafd > 0) |
1265 { | 1272 { |
1266 if ((ret = rfc959_read_response (request)) < 0) | 1273 if ((ret = rfc959_read_response (request, 0)) < 0) |
1267 gftp_disconnect (request); | 1274 gftp_disconnect (request); |
1268 } | 1275 } |
1269 | 1276 |
1270 return (0); | 1277 return (0); |
1271 } | 1278 } |
1272 | 1279 |
1273 | 1280 |
1274 static int | 1281 static int |
1292 strcat (parms, show_hidden_files ? "a" : ""); | 1299 strcat (parms, show_hidden_files ? "a" : ""); |
1293 strcat (parms, resolve_symlinks ? "L" : ""); | 1300 strcat (parms, resolve_symlinks ? "L" : ""); |
1294 tempstr = g_strconcat ("LIST", *parms != '\0' ? " -" : "", parms, "\r\n", | 1301 tempstr = g_strconcat ("LIST", *parms != '\0' ? " -" : "", parms, "\r\n", |
1295 NULL); | 1302 NULL); |
1296 | 1303 |
1297 ret = rfc959_send_command (request, tempstr); | 1304 ret = rfc959_send_command (request, tempstr, 1); |
1298 g_free (tempstr); | 1305 g_free (tempstr); |
1299 | 1306 |
1300 if (ret != '1') | 1307 if (ret != '1') |
1301 return (GFTP_ERETRYABLE); | 1308 return (GFTP_ERETRYABLE); |
1302 | 1309 |
1457 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1464 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1458 g_return_val_if_fail (filename != NULL, 0); | 1465 g_return_val_if_fail (filename != NULL, 0); |
1459 g_return_val_if_fail (request->datafd > 0, 0); | 1466 g_return_val_if_fail (request->datafd > 0, 0); |
1460 | 1467 |
1461 tempstr = g_strconcat ("SIZE ", filename, "\r\n", NULL); | 1468 tempstr = g_strconcat ("SIZE ", filename, "\r\n", NULL); |
1462 ret = rfc959_send_command (request, tempstr); | 1469 ret = rfc959_send_command (request, tempstr, 1); |
1463 g_free (tempstr); | 1470 g_free (tempstr); |
1464 if (ret < 0) | 1471 if (ret < 0) |
1465 return (ret); | 1472 return (ret); |
1466 | 1473 |
1467 if (*request->last_ftp_response != '2') | 1474 if (*request->last_ftp_response != '2') |
1479 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1486 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1480 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | 1487 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); |
1481 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1488 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1482 | 1489 |
1483 tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL); | 1490 tempstr = g_strconcat ("RMD ", directory, "\r\n", NULL); |
1484 ret = rfc959_send_command (request, tempstr); | 1491 ret = rfc959_send_command (request, tempstr, 1); |
1485 g_free (tempstr); | 1492 g_free (tempstr); |
1486 | 1493 |
1487 if (ret < 0) | 1494 if (ret < 0) |
1488 return (ret); | 1495 return (ret); |
1489 else if (ret == '2') | 1496 else if (ret == '2') |
1502 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1509 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1503 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | 1510 g_return_val_if_fail (file != NULL, GFTP_EFATAL); |
1504 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1511 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1505 | 1512 |
1506 tempstr = g_strconcat ("DELE ", file, "\r\n", NULL); | 1513 tempstr = g_strconcat ("DELE ", file, "\r\n", NULL); |
1507 ret = rfc959_send_command (request, tempstr); | 1514 ret = rfc959_send_command (request, tempstr, 1); |
1508 g_free (tempstr); | 1515 g_free (tempstr); |
1509 | 1516 |
1510 if (ret < 0) | 1517 if (ret < 0) |
1511 return (ret); | 1518 return (ret); |
1512 else if (ret == '2') | 1519 else if (ret == '2') |
1525 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1532 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1526 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); | 1533 g_return_val_if_fail (directory != NULL, GFTP_EFATAL); |
1527 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1534 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1528 | 1535 |
1529 tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL); | 1536 tempstr = g_strconcat ("MKD ", directory, "\r\n", NULL); |
1530 ret = rfc959_send_command (request, tempstr); | 1537 ret = rfc959_send_command (request, tempstr, 1); |
1531 g_free (tempstr); | 1538 g_free (tempstr); |
1532 | 1539 |
1533 if (ret < 0) | 1540 if (ret < 0) |
1534 return (ret); | 1541 return (ret); |
1535 else if (ret == '2') | 1542 else if (ret == '2') |
1550 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL); | 1557 g_return_val_if_fail (oldname != NULL, GFTP_EFATAL); |
1551 g_return_val_if_fail (newname != NULL, GFTP_EFATAL); | 1558 g_return_val_if_fail (newname != NULL, GFTP_EFATAL); |
1552 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1559 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1553 | 1560 |
1554 tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL); | 1561 tempstr = g_strconcat ("RNFR ", oldname, "\r\n", NULL); |
1555 ret = rfc959_send_command (request, tempstr); | 1562 ret = rfc959_send_command (request, tempstr, 1); |
1556 g_free (tempstr); | 1563 g_free (tempstr); |
1557 | 1564 |
1558 if (ret < 0) | 1565 if (ret < 0) |
1559 return (ret); | 1566 return (ret); |
1560 else if (ret != '3') | 1567 else if (ret != '3') |
1561 return (GFTP_ERETRYABLE); | 1568 return (GFTP_ERETRYABLE); |
1562 | 1569 |
1563 tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL); | 1570 tempstr = g_strconcat ("RNTO ", newname, "\r\n", NULL); |
1564 ret = rfc959_send_command (request, tempstr); | 1571 ret = rfc959_send_command (request, tempstr, 1); |
1565 g_free (tempstr); | 1572 g_free (tempstr); |
1566 | 1573 |
1567 if (ret < 0) | 1574 if (ret < 0) |
1568 return (ret); | 1575 return (ret); |
1569 else if (ret == '2') | 1576 else if (ret == '2') |
1583 g_return_val_if_fail (file != NULL, GFTP_EFATAL); | 1590 g_return_val_if_fail (file != NULL, GFTP_EFATAL); |
1584 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1591 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1585 | 1592 |
1586 tempstr = g_malloc (strlen (file) + (mode / 10) + 16); | 1593 tempstr = g_malloc (strlen (file) + (mode / 10) + 16); |
1587 sprintf (tempstr, "SITE CHMOD %d %s\r\n", mode, file); | 1594 sprintf (tempstr, "SITE CHMOD %d %s\r\n", mode, file); |
1588 ret = rfc959_send_command (request, tempstr); | 1595 ret = rfc959_send_command (request, tempstr, 1); |
1589 g_free (tempstr); | 1596 g_free (tempstr); |
1590 | 1597 |
1591 if (ret < 0) | 1598 if (ret < 0) |
1592 return (ret); | 1599 return (ret); |
1593 else if (ret == '2') | 1600 else if (ret == '2') |
1606 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); | 1613 g_return_val_if_fail (request->protonum == GFTP_FTP_NUM, GFTP_EFATAL); |
1607 g_return_val_if_fail (command != NULL, GFTP_EFATAL); | 1614 g_return_val_if_fail (command != NULL, GFTP_EFATAL); |
1608 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); | 1615 g_return_val_if_fail (request->datafd > 0, GFTP_EFATAL); |
1609 | 1616 |
1610 tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); | 1617 tempstr = g_strconcat ("SITE ", command, "\r\n", NULL); |
1611 ret = rfc959_send_command (request, tempstr); | 1618 ret = rfc959_send_command (request, tempstr, 1); |
1612 g_free (tempstr); | 1619 g_free (tempstr); |
1613 | 1620 |
1614 if (ret < 0) | 1621 if (ret < 0) |
1615 return (ret); | 1622 return (ret); |
1616 else if (ret == '2') | 1623 else if (ret == '2') |