Mercurial > pidgin.yaz
comparison libpurple/protocols/bonjour/jabber.c @ 17738: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
17737:85440932397b | 17738: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 */ |