- Timestamp:
- 2010-07-10T15:08:02Z (14 years ago)
- Branches:
- master
- Children:
- e92c4f4
- Parents:
- 534e406
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
irc.c
r534e406 rf1c2b21 619 619 } 620 620 621 /* Flush sendbuffer if you can. If it fails, fail silently and let some 622 I/O event handler clean up. */ 623 void irc_flush( irc_t *irc ) 624 { 625 ssize_t n; 626 size_t len; 627 628 if( irc->sendbuffer == NULL ) 629 return; 630 631 len = strlen( irc->sendbuffer ); 632 if( ( n = send( irc->fd, irc->sendbuffer, len, 0 ) ) == len ) 633 { 634 g_free( irc->sendbuffer ); 635 irc->sendbuffer = NULL; 636 637 b_event_remove( irc->w_watch_source_id ); 638 irc->w_watch_source_id = 0; 639 } 640 else if( n > 0 ) 641 { 642 char *s = g_strdup( irc->sendbuffer + n ); 643 g_free( irc->sendbuffer ); 644 irc->sendbuffer = s; 645 } 646 /* Otherwise something went wrong and we don't currently care 647 what the error was. We may or may not succeed later, we 648 were just trying to flush the buffer immediately. */ 649 } 650 651 /* Meant for takeover functionality. Transfer an IRC connection to a different 652 socket. */ 653 void irc_switch_fd( irc_t *irc, int fd ) 654 { 655 irc_write( irc, "ERROR :Transferring session to a new connection" ); 656 irc_flush( irc ); /* Write it now or forget about it forever. */ 657 658 if( irc->sendbuffer ) 659 { 660 b_event_remove( irc->w_watch_source_id ); 661 g_free( irc->sendbuffer ); 662 irc->sendbuffer = irc->w_watch_source_id = 0; 663 } 664 665 b_event_remove( irc->r_watch_source_id ); 666 closesocket( irc->fd ); 667 irc->fd = fd; 668 irc->r_watch_source_id = b_input_add( irc->fd, B_EV_IO_READ, bitlbee_io_current_client_read, irc ); 669 } 670 671 void irc_sync( irc_t *irc ) 672 { 673 GSList *l; 674 675 irc_write( irc, ":%s!%s@%s MODE %s :+%s", irc->user->nick, 676 irc->user->user, irc->user->host, irc->user->nick, 677 irc->umode ); 678 679 for( l = irc->channels; l; l = l->next ) 680 { 681 irc_channel_t *ic = l->data; 682 if( ic->flags & IRC_CHANNEL_JOINED ) 683 irc_send_join( ic, irc->user ); 684 } 685 } 686 687 void irc_desync( irc_t *irc ) 688 { 689 GSList *l; 690 691 for( l = irc->channels; l; l = l->next ) 692 irc_channel_del_user( l->data, irc->user, IRC_CDU_KICK, 693 "Switching to old session" ); 694 695 irc_write( irc, ":%s!%s@%s MODE %s :-%s", irc->user->nick, 696 irc->user->user, irc->user->host, irc->user->nick, 697 irc->umode ); 698 } 699 621 700 int irc_check_login( irc_t *irc ) 622 701 {
Note: See TracChangeset
for help on using the changeset viewer.