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')