Changeset a02f34f for protocols/jabber
- Timestamp:
- 2008-08-11T23:07:12Z (16 years ago)
- Branches:
- master
- Children:
- 5d550c5
- Parents:
- 66be784
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
protocols/jabber/s5bytestream.c
r66be784 ra02f34f 24 24 #include "jabber.h" 25 25 #include "sha1.h" 26 #include "lib/ftutil.h" 26 27 #include <poll.h> 27 28 /* Some ifdefs for ulibc (Thanks to Whoopie) */29 #ifndef HOST_NAME_MAX30 #include <sys/param.h>31 #ifdef MAXHOSTNAMELEN32 #define HOST_NAME_MAX MAXHOSTNAMELEN33 #else34 #define HOST_NAME_MAX 25535 #endif36 #endif37 38 #ifndef AI_NUMERICSERV39 #define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */40 #endif41 28 42 29 struct bs_transfer { … … 115 102 gboolean jabber_bs_send_request( struct jabber_transfer *tf, GSList *streamhosts ); 116 103 gboolean jabber_bs_send_handshake( gpointer data, gint fd, b_input_condition cond ); 117 gboolean jabber_bs_send_listen( struct bs_transfer *bt, struct sockaddr_storage *saddr, char *host, char *port );118 104 static xt_status jabber_bs_send_handle_activate( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ); 119 105 void jabber_bs_send_activate( struct bs_transfer *bt ); … … 902 888 struct jabber_data *jd = tf->ic->proto_data; 903 889 char *proxysetting = g_strdup ( set_getstr( &tf->ic->acc->set, "proxy" ) ); 904 char *proxy, *next;890 char *proxy, *next, *errmsg = NULL; 905 891 char port[6]; 906 892 char host[INET6_ADDRSTRLEN]; … … 913 899 *next++ = '\0'; 914 900 915 if( ( strcmp( proxy, "<local>" ) == 0 ) && jabber_bs_send_listen( bt, &tf->saddr, host, port ) ) { 916 sh = g_new0( jabber_streamhost_t, 1 ); 917 sh->jid = g_strdup( tf->ini_jid ); 918 sh->host = g_strdup( host ); 919 strcpy( sh->port, port ); 920 bt->streamhosts = g_slist_append( bt->streamhosts, sh ); 921 922 bt->tf->watch_in = b_input_add( tf->fd, GAIM_INPUT_READ, jabber_bs_send_handshake, bt ); 923 bt->connect_timeout = b_timeout_add( JABBER_BS_LISTEN_TIMEOUT * 1000, jabber_bs_connect_timeout, bt ); 901 if( strcmp( proxy, "<local>" ) == 0 ) { 902 if( ( tf->fd = ft_listen( &tf->saddr, host, port, FALSE, &errmsg ) ) != -1 ) { 903 sh = g_new0( jabber_streamhost_t, 1 ); 904 sh->jid = g_strdup( tf->ini_jid ); 905 sh->host = g_strdup( host ); 906 strcpy( sh->port, port ); 907 bt->streamhosts = g_slist_append( bt->streamhosts, sh ); 908 909 bt->tf->watch_in = b_input_add( tf->fd, GAIM_INPUT_READ, jabber_bs_send_handshake, bt ); 910 bt->connect_timeout = b_timeout_add( JABBER_BS_LISTEN_TIMEOUT * 1000, jabber_bs_connect_timeout, bt ); 911 } else { 912 imcb_log( tf->ic, "Transferring file %s: couldn't listen locally(non fatal, check your ft_listen setting in bitlbee.conf): %s", 913 tf->ft->file_name, 914 errmsg ); 915 } 924 916 } else if( strcmp( proxy, "<auto>" ) == 0 ) { 925 917 while ( streamhosts ) { … … 1020 1012 1021 1013 return FALSE; 1022 }1023 1024 /*1025 * Creates a listening socket and returns it in saddr_ptr.1026 */1027 gboolean jabber_bs_send_listen( struct bs_transfer *bt, struct sockaddr_storage *saddr, char *host, char *port )1028 {1029 struct jabber_transfer *tf = bt->tf;1030 int fd,gret;1031 char hostname[ HOST_NAME_MAX + 1 ];1032 struct addrinfo hints, *rp;1033 socklen_t ssize = sizeof( struct sockaddr_storage );1034 1035 /* won't be long till someone asks for this to be configurable :) */1036 1037 ASSERTSOCKOP( gethostname( hostname, sizeof( hostname ) ), "gethostname()" );1038 1039 memset( &hints, 0, sizeof( struct addrinfo ) );1040 hints.ai_socktype = SOCK_STREAM;1041 hints.ai_flags = AI_NUMERICSERV;1042 1043 if ( ( gret = getaddrinfo( hostname, "0", &hints, &rp ) ) != 0 )1044 return jabber_bs_abort( bt, "getaddrinfo() failed: %s", gai_strerror( gret ) );1045 1046 memcpy( saddr, rp->ai_addr, rp->ai_addrlen );1047 1048 ASSERTSOCKOP( fd = tf->fd = socket( saddr->ss_family, SOCK_STREAM, 0 ), "Opening socket" );1049 1050 ASSERTSOCKOP( bind( fd, ( struct sockaddr *)saddr, rp->ai_addrlen ), "Binding socket" );1051 1052 freeaddrinfo( rp );1053 1054 ASSERTSOCKOP( listen( fd, 1 ), "Making socket listen" );1055 1056 if ( !inet_ntop( saddr->ss_family, saddr->ss_family == AF_INET ?1057 ( void * )&( ( struct sockaddr_in * ) saddr )->sin_addr.s_addr : ( void * )&( ( struct sockaddr_in6 * ) saddr )->sin6_addr.s6_addr1058 , host, INET6_ADDRSTRLEN ) )1059 return jabber_bs_abort( bt, "inet_ntop failed on listening socket" );1060 1061 ASSERTSOCKOP( getsockname( fd, ( struct sockaddr *)saddr, &ssize ), "Getting socket name" );1062 1063 if( saddr->ss_family == AF_INET )1064 sprintf( port, "%d", ntohs( ( ( struct sockaddr_in *) saddr )->sin_port ) );1065 else1066 sprintf( port, "%d", ntohs( ( ( struct sockaddr_in6 *) saddr )->sin6_port ) );1067 1068 return TRUE;1069 1014 } 1070 1015
Note: See TracChangeset
for help on using the changeset viewer.