| 167 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
167 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
| 168 purple_xfer_cancel_remote(xfer); |
168 purple_xfer_cancel_remote(xfer); |
| 169 return; |
169 return; |
| 170 } |
170 } |
| 171 |
171 |
| 172 xfer->fd = source; |
172 purple_xfer_set_fd(xfer, source); |
| 173 |
173 |
| 174 /* The first time we get here, assemble the tx buffer */ |
174 /* The first time we get here, assemble the tx buffer */ |
| 175 if (xd->txbuflen == 0) { |
175 if (xd->txbuflen == 0) { |
| 176 gchar *header = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", |
176 gchar *header = g_strdup_printf("GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", |
| 177 xd->path, xd->host); |
177 xd->path, xd->host); |
| 248 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
248 purple_xfer_get_remote_user(xfer), _("Unable to connect.")); |
| 249 purple_xfer_cancel_remote(xfer); |
249 purple_xfer_cancel_remote(xfer); |
| 250 return; |
250 return; |
| 251 } |
251 } |
| 252 |
252 |
| 253 xfer->fd = source; |
253 purple_xfer_set_fd(xfer, source); |
| 254 |
254 |
| 255 /* Assemble the tx buffer */ |
255 /* Assemble the tx buffer */ |
| 256 gc = xd->gc; |
256 gc = xd->gc; |
| 257 account = purple_connection_get_account(gc); |
257 account = purple_connection_get_account(gc); |
| 258 yd = purple_connection_get_protocol_data(gc); |
258 yd = purple_connection_get_protocol_data(gc); |
| 338 _("Unable to establish file descriptor.")); |
338 _("Unable to establish file descriptor.")); |
| 339 purple_xfer_cancel_remote(xfer); |
339 purple_xfer_cancel_remote(xfer); |
| 340 } |
340 } |
| 341 } |
341 } |
| 342 } else { |
342 } else { |
| 343 xfer->fd = -1; |
343 purple_xfer_set_fd(xfer, -1); |
| 344 if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port, |
344 if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port, |
| 345 yahoo_receivefile_connected, xfer) == NULL) { |
345 yahoo_receivefile_connected, xfer) == NULL) { |
| 346 purple_notify_error(gc, NULL, _("File Transfer Failed"), |
346 purple_notify_error(gc, NULL, _("File Transfer Failed"), |
| 347 _("Unable to establish file descriptor.")); |
347 _("Unable to establish file descriptor.")); |
| 348 purple_xfer_cancel_remote(xfer); |
348 purple_xfer_cancel_remote(xfer); |
| 435 |
435 |
| 436 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { |
436 if (purple_xfer_get_type(xfer) != PURPLE_XFER_RECEIVE) { |
| 437 return 0; |
437 return 0; |
| 438 } |
438 } |
| 439 |
439 |
| 440 len = read(xfer->fd, buf, sizeof(buf)); |
440 len = read(purple_xfer_get_fd(xfer), buf, sizeof(buf)); |
| 441 |
441 |
| 442 if (len <= 0) { |
442 if (len <= 0) { |
| 443 if ((purple_xfer_get_size(xfer) > 0) && |
443 if ((purple_xfer_get_size(xfer) > 0) && |
| 444 (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { |
444 (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer))) { |
| 445 purple_xfer_set_completed(xfer, TRUE); |
445 purple_xfer_set_completed(xfer, TRUE); |
| 498 |
498 |
| 499 if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) { |
499 if (purple_xfer_get_type(xfer) != PURPLE_XFER_SEND) { |
| 500 return -1; |
500 return -1; |
| 501 } |
501 } |
| 502 |
502 |
| 503 len = write(xfer->fd, buffer, size); |
503 len = write(purple_xfer_get_fd(xfer), buffer, size); |
| 504 |
504 |
| 505 if (len == -1) { |
505 if (len == -1) { |
| 506 if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) |
506 if (purple_xfer_get_bytes_sent(xfer) >= purple_xfer_get_size(xfer)) |
| 507 purple_xfer_set_completed(xfer, TRUE); |
507 purple_xfer_set_completed(xfer, TRUE); |
| 508 if ((errno != EAGAIN) && (errno != EINTR)) |
508 if ((errno != EAGAIN) && (errno != EINTR)) |
| 610 /* Send HTTP OK after receiving file */ |
610 /* Send HTTP OK after receiving file */ |
| 611 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) |
611 static void yahoo_p2p_ft_server_send_OK(PurpleXfer *xfer) |
| 612 { |
612 { |
| 613 char *tx = NULL; |
613 char *tx = NULL; |
| 614 int written; |
614 int written; |
| |
615 int fd = purple_xfer_get_fd(xfer); |
| 615 |
616 |
| 616 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"; |
617 tx = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: application/octet-stream\r\nConnection: close\r\n\r\n"; |
| 617 written = write(xfer->fd, tx, strlen(tx)); |
618 written = write(fd, tx, strlen(tx)); |
| 618 |
619 |
| 619 if (written < 0 && errno == EAGAIN) |
620 if (written < 0 && errno == EAGAIN) |
| 620 written = 0; |
621 written = 0; |
| 621 else if (written <= 0) |
622 else if (written <= 0) |
| 622 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); |
623 purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK"); |
| 623 |
624 |
| 624 /* close connection */ |
625 /* close connection */ |
| 625 close(xfer->fd); |
626 close(fd); |
| 626 xfer->fd = -1; |
627 purple_xfer_set_fd(xfer, -1); |
| 627 } |
628 } |
| 628 |
629 |
| 629 static void yahoo_xfer_end(PurpleXfer *xfer_old) |
630 static void yahoo_xfer_end(PurpleXfer *xfer_old) |
| 630 { |
631 { |
| 631 struct yahoo_xfer_data *xfer_data; |
632 struct yahoo_xfer_data *xfer_data; |
| 637 if(xfer_data && xfer_data->version == 15 |
638 if(xfer_data && xfer_data->version == 15 |
| 638 && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE |
639 && purple_xfer_get_type(xfer_old) == PURPLE_XFER_RECEIVE |
| 639 && xfer_data->filename_list) { |
640 && xfer_data->filename_list) { |
| 640 |
641 |
| 641 /* Send HTTP OK in case of p2p transfer, when we act as server */ |
642 /* Send HTTP OK in case of p2p transfer, when we act as server */ |
| 642 if((xfer_data->xfer_url != NULL) && (xfer_old->fd >=0) && (purple_xfer_get_status(xfer_old) == PURPLE_XFER_STATUS_DONE)) |
643 if((xfer_data->xfer_url != NULL) && (purple_xfer_get_fd(xfer_old) >=0) && (purple_xfer_get_status(xfer_old) == PURPLE_XFER_STATUS_DONE)) |
| 643 yahoo_p2p_ft_server_send_OK(xfer_old); |
644 yahoo_p2p_ft_server_send_OK(xfer_old); |
| 644 |
645 |
| 645 /* removing top of filename & size list completely */ |
646 /* removing top of filename & size list completely */ |
| 646 g_free( xfer_data->filename_list->data ); |
647 g_free( xfer_data->filename_list->data ); |
| 647 g_free( xfer_data->size_list->data ); |
648 g_free( xfer_data->size_list->data ); |
| 1193 yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ); |
1194 yahoo_xfer_recv_cb_15(xfer, source, PURPLE_INPUT_READ); |
| 1194 } |
1195 } |
| 1195 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) |
1196 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == HEAD_REPLY_RECEIVED) |
| 1196 { |
1197 { |
| 1197 xd->status_15 = TRANSFER_PHASE; |
1198 xd->status_15 = TRANSFER_PHASE; |
| 1198 xfer->fd = source; |
1199 purple_xfer_set_fd(xfer, source); |
| 1199 purple_xfer_start(xfer, source, NULL, 0); |
1200 purple_xfer_start(xfer, source, NULL, 0); |
| 1200 } |
1201 } |
| 1201 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && (xd->status_15 == ACCEPTED || xd->status_15 == P2P_GET_REQUESTED) ) |
1202 else if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND && (xd->status_15 == ACCEPTED || xd->status_15 == P2P_GET_REQUESTED) ) |
| 1202 { |
1203 { |
| 1203 xd->status_15 = TRANSFER_PHASE; |
1204 xd->status_15 = TRANSFER_PHASE; |
| 1204 xfer->fd = source; |
1205 purple_xfer_set_fd(xfer, source); |
| 1205 /* Remove Read event */ |
1206 /* Remove Read event */ |
| 1206 purple_input_remove(xd->input_event); |
1207 purple_input_remove(xd->input_event); |
| 1207 xd->input_event = 0; |
1208 xd->input_event = 0; |
| 1208 purple_xfer_start(xfer, source, NULL, 0); |
1209 purple_xfer_start(xfer, source, NULL, 0); |
| 1209 } |
1210 } |
| 1212 xd->status_15 = P2P_HEAD_REPLIED; |
1213 xd->status_15 = P2P_HEAD_REPLIED; |
| 1213 /* Remove Read event and close descriptor */ |
1214 /* Remove Read event and close descriptor */ |
| 1214 purple_input_remove(xd->input_event); |
1215 purple_input_remove(xd->input_event); |
| 1215 xd->input_event = 0; |
1216 xd->input_event = 0; |
| 1216 close(source); |
1217 close(source); |
| 1217 xfer->fd = -1; |
1218 purple_xfer_set_fd(xfer, -1); |
| 1218 /* start local server, listen for connections */ |
1219 /* start local server, listen for connections */ |
| 1219 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer); |
1220 purple_network_listen(xd->yahoo_local_p2p_ft_server_port, AF_UNSPEC, SOCK_STREAM, TRUE, yahoo_p2p_ft_server_listen_cb, xfer); |
| 1220 } |
1221 } |
| 1221 else |
1222 else |
| 1222 { |
1223 { |
| 1375 return; |
1376 return; |
| 1376 } |
1377 } |
| 1377 |
1378 |
| 1378 purple_input_remove(xd->input_event); |
1379 purple_input_remove(xd->input_event); |
| 1379 xd->status_15 = TRANSFER_PHASE; |
1380 xd->status_15 = TRANSFER_PHASE; |
| 1380 xfer->fd = source; |
1381 purple_xfer_set_fd(xfer, source); |
| 1381 purple_xfer_start(xfer, source, NULL, 0); |
1382 purple_xfer_start(xfer, source, NULL, 0); |
| 1382 } |
1383 } |
| 1383 |
1384 |
| 1384 static void yahoo_p2p_ft_HEAD_GET_cb(gpointer data, gint source, PurpleInputCondition cond) |
1385 static void yahoo_p2p_ft_HEAD_GET_cb(gpointer data, gint source, PurpleInputCondition cond) |
| 1385 { |
1386 { |
| 1476 /* remove watcher and close p2p ft server */ |
1477 /* remove watcher and close p2p ft server */ |
| 1477 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); |
1478 purple_input_remove(xd->yahoo_p2p_ft_server_watcher); |
| 1478 close(xd->yahoo_local_p2p_ft_server_fd); |
1479 close(xd->yahoo_local_p2p_ft_server_fd); |
| 1479 |
1480 |
| 1480 /* Add an Input Read event to the file descriptor */ |
1481 /* Add an Input Read event to the file descriptor */ |
| 1481 xfer->fd = acceptfd; |
1482 purple_xfer_set_fd(xfer, acceptfd); |
| 1482 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) |
1483 if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE) |
| 1483 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); |
1484 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_POST_cb, data); |
| 1484 else |
1485 else |
| 1485 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); |
1486 xd->input_event = purple_input_add(acceptfd, PURPLE_INPUT_READ, yahoo_p2p_ft_HEAD_GET_cb, data); |
| 1486 } |
1487 } |