comparison libpurple/protocols/bonjour/jabber.c @ 21418:38cc722159ff

propagate from branch 'im.pidgin.pidgin' (head d8103be97302efb404e2f6922925f661c807ad23) to branch 'im.pidgin.cpw.resiak.disconnectreason' (head 0ac25a1f38ae28654c967caa143f1c0d12ef2e1c)
author Will Thompson <will.thompson@collabora.co.uk>
date Sat, 10 Nov 2007 12:10:04 +0000
parents ba41f2a60253 35b4f1dc4c8d
children db7fa42845f6
comparison
equal deleted inserted replaced
21417:21bea7c72a80 21418:38cc722159ff
242 242
243 if (ret < 0 && errno == EAGAIN) 243 if (ret < 0 && errno == EAGAIN)
244 return; 244 return;
245 else if (ret <= 0) { 245 else if (ret <= 0) {
246 PurpleConversation *conv; 246 PurpleConversation *conv;
247 const char *error = strerror(errno); 247 const char *error = g_strerror(errno);
248 248
249 purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n", 249 purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n",
250 purple_buddy_get_name(pb), error ? error : "(null)"); 250 purple_buddy_get_name(pb), error ? error : "(null)");
251 251
252 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, pb->account); 252 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, pb->account);
285 285
286 if (ret == -1 && errno == EAGAIN) 286 if (ret == -1 && errno == EAGAIN)
287 ret = 0; 287 ret = 0;
288 else if (ret <= 0) { 288 else if (ret <= 0) {
289 PurpleConversation *conv; 289 PurpleConversation *conv;
290 const char *error = strerror(errno); 290 const char *error = g_strerror(errno);
291 291
292 purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n", 292 purple_debug_error("bonjour", "Error sending message to buddy %s error: %s\n",
293 purple_buddy_get_name(pb), error ? error : "(null)"); 293 purple_buddy_get_name(pb), error ? error : "(null)");
294 294
295 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, pb->account); 295 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, bb->name, pb->account);
335 if ((len = recv(socket, message, sizeof(message) - 1, 0)) == -1) { 335 if ((len = recv(socket, message, sizeof(message) - 1, 0)) == -1) {
336 /* There have been an error reading from the socket */ 336 /* There have been an error reading from the socket */
337 if (errno != EAGAIN) { 337 if (errno != EAGAIN) {
338 BonjourBuddy *bb = pb->proto_data; 338 BonjourBuddy *bb = pb->proto_data;
339 339
340 purple_debug_warning("bonjour", "receive error: %s\n", strerror(errno)); 340 purple_debug_warning("bonjour", "receive error: %s\n", g_strerror(errno));
341 341
342 bonjour_jabber_close_conversation(bb->conversation); 342 bonjour_jabber_close_conversation(bb->conversation);
343 bb->conversation = NULL; 343 bb->conversation = NULL;
344 344
345 /* I guess we really don't need to notify the user. 345 /* I guess we really don't need to notify the user.
365 bonjour_parser_process(pb, message, message_length); 365 bonjour_parser_process(pb, message, message_length);
366 } 366 }
367 367
368 void bonjour_jabber_stream_ended(PurpleBuddy *pb) { 368 void bonjour_jabber_stream_ended(PurpleBuddy *pb) {
369 BonjourBuddy *bb = pb->proto_data; 369 BonjourBuddy *bb = pb->proto_data;
370 PurpleConversation *conv;
371 370
372 purple_debug_info("bonjour", "Recieved conversation close notification from %s.\n", pb->name); 371 purple_debug_info("bonjour", "Recieved conversation close notification from %s.\n", pb->name);
373 372
374 g_return_if_fail(bb != NULL); 373 g_return_if_fail(bb != NULL);
375 374
376 /* Inform the user that the conversation has been closed */ 375 /* Inform the user that the conversation has been closed */
377 if (bb->conversation != NULL) { 376 if (bb->conversation != NULL) {
377 #if 0
378 PurpleConversation *conv;
378 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, pb->name, pb->account); 379 conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, pb->name, pb->account);
379 if (conv != NULL) { 380 if (conv != NULL) {
380 char *tmp = g_strdup_printf(_("%s has closed the conversation."), pb->name); 381 char *tmp = g_strdup_printf(_("%s has closed the conversation."), pb->name);
381 purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL)); 382 purple_conversation_write(conv, NULL, tmp, PURPLE_MESSAGE_SYSTEM, time(NULL));
382 g_free(tmp); 383 g_free(tmp);
383 } 384 }
385 #endif
384 /* Close the socket, clear the watcher and free memory */ 386 /* Close the socket, clear the watcher and free memory */
385 bonjour_jabber_close_conversation(bb->conversation); 387 bonjour_jabber_close_conversation(bb->conversation);
386 bb->conversation = NULL; 388 bb->conversation = NULL;
387 } 389 }
388 390
423 ret = send(source, ss->msg, len, 0); 425 ret = send(source, ss->msg, len, 0);
424 426
425 if (ret == -1 && errno == EAGAIN) 427 if (ret == -1 && errno == EAGAIN)
426 return; 428 return;
427 else if (ret <= 0) { 429 else if (ret <= 0) {
428 const char *err = strerror(errno); 430 const char *err = g_strerror(errno);
429 PurpleConversation *conv; 431 PurpleConversation *conv;
430 432
431 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n", 433 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
432 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)"); 434 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)");
433 435
478 ret = send(client_socket, stream_start, len, 0); 480 ret = send(client_socket, stream_start, len, 0);
479 481
480 if (ret == -1 && errno == EAGAIN) 482 if (ret == -1 && errno == EAGAIN)
481 ret = 0; 483 ret = 0;
482 else if (ret <= 0) { 484 else if (ret <= 0) {
483 const char *err = strerror(errno); 485 const char *err = g_strerror(errno);
484 486
485 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n", 487 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
486 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)"); 488 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)");
487 489
488 close(client_socket); 490 close(client_socket);
519 { 521 {
520 PurpleBuddy *pb = NULL; 522 PurpleBuddy *pb = NULL;
521 struct sockaddr_in their_addr; /* connector's address information */ 523 struct sockaddr_in their_addr; /* connector's address information */
522 socklen_t sin_size = sizeof(struct sockaddr); 524 socklen_t sin_size = sizeof(struct sockaddr);
523 int client_socket; 525 int client_socket;
526 int flags;
524 BonjourBuddy *bb; 527 BonjourBuddy *bb;
525 char *address_text = NULL; 528 char *address_text = NULL;
526 PurpleBuddyList *bl = purple_get_blist(); 529 PurpleBuddyList *bl = purple_get_blist();
527 struct _check_buddy_by_address_t *cbba; 530 struct _check_buddy_by_address_t *cbba;
528 531
531 return; 534 return;
532 535
533 if ((client_socket = accept(server_socket, (struct sockaddr *)&their_addr, &sin_size)) == -1) 536 if ((client_socket = accept(server_socket, (struct sockaddr *)&their_addr, &sin_size)) == -1)
534 return; 537 return;
535 538
536 fcntl(client_socket, F_SETFL, O_NONBLOCK); 539 flags = fcntl(client_socket, F_GETFL);
540 fcntl(client_socket, F_SETFL, flags | O_NONBLOCK);
537 541
538 /* Look for the buddy that has opened the conversation and fill information */ 542 /* Look for the buddy that has opened the conversation and fill information */
539 address_text = inet_ntoa(their_addr.sin_addr); 543 address_text = inet_ntoa(their_addr.sin_addr);
540 purple_debug_info("bonjour", "Received incoming connection from %s.\n", address_text); 544 purple_debug_info("bonjour", "Received incoming connection from %s.\n", address_text);
541 cbba = g_new0(struct _check_buddy_by_address_t, 1); 545 cbba = g_new0(struct _check_buddy_by_address_t, 1);
577 gboolean bind_successful; 581 gboolean bind_successful;
578 582
579 /* Open a listening socket for incoming conversations */ 583 /* Open a listening socket for incoming conversations */
580 if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0) 584 if ((data->socket = socket(PF_INET, SOCK_STREAM, 0)) < 0)
581 { 585 {
582 purple_debug_error("bonjour", "Cannot open socket: %s\n", strerror(errno)); 586 purple_debug_error("bonjour", "Cannot open socket: %s\n", g_strerror(errno));
583 purple_connection_error_reason (data->account->gc, 587 purple_connection_error_reason (data->account->gc,
584 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 588 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
585 _("Cannot open socket")); 589 _("Cannot open socket"));
586 return -1; 590 return -1;
587 } 591 }
588 592
589 /* Make the socket reusable */ 593 /* Make the socket reusable */
590 if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0) 594 if (setsockopt(data->socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != 0)
591 { 595 {
592 purple_debug_error("bonjour", "Error setting socket options: %s\n", strerror(errno)); 596 purple_debug_error("bonjour", "Error setting socket options: %s\n", g_strerror(errno));
593 purple_connection_error_reason (data->account->gc, 597 purple_connection_error_reason (data->account->gc,
594 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 598 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
595 _("Error setting socket options")); 599 _("Error setting socket options"));
596 return -1; 600 return -1;
597 } 601 }
613 } 617 }
614 618
615 /* On no! We tried 10 ports and could not bind to ANY of them */ 619 /* On no! We tried 10 ports and could not bind to ANY of them */
616 if (!bind_successful) 620 if (!bind_successful)
617 { 621 {
618 purple_debug_error("bonjour", "Cannot bind socket: %s\n", strerror(errno)); 622 purple_debug_error("bonjour", "Cannot bind socket: %s\n", g_strerror(errno));
619 purple_connection_error_reason (data->account->gc, 623 purple_connection_error_reason (data->account->gc,
620 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 624 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
621 _("Could not bind socket to port")); 625 _("Could not bind socket to port"));
622 return -1; 626 return -1;
623 } 627 }
624 628
625 /* Attempt to listen on the bound socket */ 629 /* Attempt to listen on the bound socket */
626 if (listen(data->socket, 10) != 0) 630 if (listen(data->socket, 10) != 0)
627 { 631 {
628 purple_debug_error("bonjour", "Cannot listen on socket: %s\n", strerror(errno)); 632 purple_debug_error("bonjour", "Cannot listen on socket: %s\n", g_strerror(errno));
629 purple_connection_error_reason (data->account->gc, 633 purple_connection_error_reason (data->account->gc,
630 PURPLE_CONNECTION_ERROR_NETWORK_ERROR, 634 PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
631 _("Could not listen on socket")); 635 _("Could not listen on socket"));
632 return -1; 636 return -1;
633 } 637 }
672 bb->conversation = NULL; 676 bb->conversation = NULL;
673 return; 677 return;
674 } 678 }
675 679
676 if (!bonjour_jabber_stream_init(pb, source)) { 680 if (!bonjour_jabber_stream_init(pb, source)) {
677 const char *err = strerror(errno); 681 const char *err = g_strerror(errno);
678 PurpleConversation *conv; 682 PurpleConversation *conv;
679 683
680 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n", 684 purple_debug_error("bonjour", "Error starting stream with buddy %s at %s:%d error: %s\n",
681 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)"); 685 purple_buddy_get_name(pb), bb->ip ? bb->ip : "(null)", bb->port_p2pj, err ? err : "(null)");
682 686