comparison libpurple/protocols/bonjour/jabber.c @ 17500:bca2780f7669

Improve error handling while connecting to a bonjour buddy.
author Daniel Atallah <daniel.atallah@gmail.com>
date Tue, 05 Jun 2007 21:32:28 +0000
parents d7b50cac1c7a
children a62a695ccfb5
comparison
equal deleted inserted replaced
17499:85440932397b 17500:bca2780f7669
47 47
48 static gint 48 static gint
49 _connect_to_buddy(PurpleBuddy *gb) 49 _connect_to_buddy(PurpleBuddy *gb)
50 { 50 {
51 gint socket_fd; 51 gint socket_fd;
52 gint retorno = 0;
53 struct sockaddr_in buddy_address; 52 struct sockaddr_in buddy_address;
54 BonjourBuddy *bb = gb->proto_data; 53 BonjourBuddy *bb = gb->proto_data;
55 54
55 purple_debug_info("bonjour", "Connecting to buddy %s at %s:%d.\n",
56 purple_buddy_get_name(gb), bb->ip ? bb->ip : "(null)", bb->port_p2pj);
57
56 /* Create a socket and make it non-blocking */ 58 /* Create a socket and make it non-blocking */
57 socket_fd = socket(PF_INET, SOCK_STREAM, 0); 59 socket_fd = socket(PF_INET, SOCK_STREAM, 0);
60 if (socket_fd < 0) {
61 purple_debug_warning("bonjour", "Error opening socket: %s\n", strerror(errno));
62 return -1;
63 }
58 64
59 buddy_address.sin_family = PF_INET; 65 buddy_address.sin_family = PF_INET;
60 buddy_address.sin_port = htons(bb->port_p2pj); 66 buddy_address.sin_port = htons(bb->port_p2pj);
61 inet_aton(bb->ip, &(buddy_address.sin_addr)); 67 inet_aton(bb->ip, &(buddy_address.sin_addr));
62 memset(&(buddy_address.sin_zero), '\0', 8); 68 memset(&(buddy_address.sin_zero), '\0', 8);
63 69
64 retorno = connect(socket_fd, (struct sockaddr*)&buddy_address, sizeof(struct sockaddr)); 70 /* TODO: make this nonblocking before connecting */
65 if (retorno == -1) { 71 if (connect(socket_fd, (struct sockaddr*)&buddy_address, sizeof(struct sockaddr)) == 0)
66 purple_debug_warning("bonjour", "Error connecting to buddy %s at %s:%d error: %s\n", purple_buddy_get_name(gb), bb->ip ? bb->ip : "(null)", buddy_address.sin_port, strerror(errno)); 72 fcntl(socket_fd, F_SETFL, O_NONBLOCK);
67 } 73 else {
68 fcntl(socket_fd, F_SETFL, O_NONBLOCK); 74 purple_debug_warning("bonjour", "Error connecting to buddy %s at %s:%d error: %s\n", purple_buddy_get_name(gb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, strerror(errno));
75 close(socket_fd);
76 socket_fd = -1;
77 }
69 78
70 return socket_fd; 79 return socket_fd;
71 } 80 }
72 81
73 #if 0 /* this isn't used anywhere... */ 82 #if 0 /* this isn't used anywhere... */
257 gint partial_message_length = 0; 266 gint partial_message_length = 0;
258 267
259 /* Read chunks of 512 bytes till the end of the data */ 268 /* Read chunks of 512 bytes till the end of the data */
260 while ((partial_message_length = recv(socket, partial_data, 512, 0)) > 0) 269 while ((partial_message_length = recv(socket, partial_data, 512, 0)) > 0)
261 { 270 {
262 g_string_append_len(data, partial_data, partial_message_length); 271 g_string_append_len(data, partial_data, partial_message_length);
263 total_message_length += partial_message_length; 272 total_message_length += partial_message_length;
264 } 273 }
265 274
266 if (partial_message_length == -1) 275 if (partial_message_length == -1)
267 { 276 {
268 purple_debug_warning("bonjour", "receive error: %s\n", strerror(errno)); 277 purple_debug_warning("bonjour", "receive error: %s\n", strerror(errno));
439 bb->conversation->stream_started = TRUE; 448 bb->conversation->stream_started = TRUE;
440 } 449 }
441 450
442 /* Open a watcher for the client socket */ 451 /* Open a watcher for the client socket */
443 bb->conversation->watcher_id = purple_input_add(client_socket, PURPLE_INPUT_READ, 452 bb->conversation->watcher_id = purple_input_add(client_socket, PURPLE_INPUT_READ,
444 _client_socket_handler, gb); 453 _client_socket_handler, gb);
445 } else { 454 } else {
446 close(client_socket); 455 close(client_socket);
447 } 456 }
448 } 457 }
449 458
536 char *message_from_ui = NULL; 545 char *message_from_ui = NULL;
537 char *stripped_message = NULL; 546 char *stripped_message = NULL;
538 gint ret; 547 gint ret;
539 548
540 gb = purple_find_buddy(data->account, to); 549 gb = purple_find_buddy(data->account, to);
541 if (gb == NULL) 550 if (gb == NULL) {
551 purple_debug_info("bonjour", "Can't send a message to an offline buddy (%s).\n", to);
542 /* You can not send a message to an offline buddy */ 552 /* You can not send a message to an offline buddy */
543 return -10000; 553 return -10000;
554 }
544 555
545 bb = (BonjourBuddy *)gb->proto_data; 556 bb = (BonjourBuddy *)gb->proto_data;
557
558 /* Check if there is a previously open conversation */
559 if (bb->conversation == NULL)
560 {
561 int socket = _connect_to_buddy(gb);
562 if (socket < 0)
563 return -10001;
564
565 bb->conversation = g_new(BonjourJabberConversation, 1);
566 bb->conversation->socket = socket;
567 bb->conversation->stream_started = FALSE;
568 bb->conversation->buddy_name = g_strdup(gb->name);
569 bb->conversation->watcher_id = purple_input_add(bb->conversation->socket,
570 PURPLE_INPUT_READ, _client_socket_handler, gb);
571 }
546 572
547 /* Enclose the message from the UI within a "font" node */ 573 /* Enclose the message from the UI within a "font" node */
548 message_body_node = xmlnode_new("body"); 574 message_body_node = xmlnode_new("body");
549 stripped_message = purple_markup_strip_html(body); 575 stripped_message = purple_markup_strip_html(body);
550 xmlnode_insert_data(message_body_node, stripped_message, strlen(stripped_message)); 576 xmlnode_insert_data(message_body_node, stripped_message, strlen(stripped_message));
573 xmlnode_insert_child(message_node, message_html_node); 599 xmlnode_insert_child(message_node, message_html_node);
574 xmlnode_insert_child(message_node, message_x_node); 600 xmlnode_insert_child(message_node, message_x_node);
575 601
576 message = xmlnode_to_str(message_node, &message_length); 602 message = xmlnode_to_str(message_node, &message_length);
577 xmlnode_free(message_node); 603 xmlnode_free(message_node);
578
579 /* Check if there is a previously open conversation */
580 if (bb->conversation == NULL)
581 {
582 bb->conversation = g_new(BonjourJabberConversation, 1);
583 bb->conversation->socket = _connect_to_buddy(gb);
584 bb->conversation->stream_started = FALSE;
585 bb->conversation->buddy_name = g_strdup(gb->name);
586 bb->conversation->watcher_id = purple_input_add(bb->conversation->socket,
587 PURPLE_INPUT_READ, _client_socket_handler, gb);
588 }
589 604
590 /* Check if the stream for the conversation has been started */ 605 /* Check if the stream for the conversation has been started */
591 if (bb->conversation->stream_started == FALSE) 606 if (bb->conversation->stream_started == FALSE)
592 { 607 {
593 /* Start the stream */ 608 /* Start the stream */