- Timestamp:
- 2008-08-11T23:07:12Z (16 years ago)
- Branches:
- master
- Children:
- 5d550c5
- Parents:
- 66be784
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
dcc.c
r66be784 ra02f34f 29 29 #include <netinet/tcp.h> 30 30 #include <regex.h> 31 32 /* Some ifdefs for ulibc (Thanks to Whoopie) */ 33 #ifndef HOST_NAME_MAX 34 #include <sys/param.h> 35 #ifdef MAXHOSTNAMELEN 36 #define HOST_NAME_MAX MAXHOSTNAMELEN 37 #else 38 #define HOST_NAME_MAX 255 39 #endif 40 #endif 41 42 #ifndef AI_NUMERICSERV 43 #define AI_NUMERICSERV 0x0400 /* Don't use name resolution. */ 44 #endif 31 #include "lib/ftutil.h" 45 32 46 33 /* … … 80 67 static void dcc_close( file_transfer_t *file ); 81 68 gboolean dccs_send_proto( gpointer data, gint fd, b_input_condition cond ); 82 gboolean dcc_listen( dcc_file_transfer_t *df, struct sockaddr_storage **saddr_ptr );83 69 int dccs_send_request( struct dcc_file_transfer *df, char *user_nick, struct sockaddr_storage *saddr ); 84 70 gboolean dccs_recv_start( file_transfer_t *ft ); … … 86 72 gboolean dccs_recv_write_request( file_transfer_t *ft ); 87 73 gboolean dcc_progress( gpointer data, gint fd, b_input_condition cond ); 74 gboolean dcc_abort( dcc_file_transfer_t *df, char *reason, ... ); 88 75 89 76 /* As defined in ft.h */ … … 143 130 file_transfer_t *file; 144 131 dcc_file_transfer_t *df; 145 struct sockaddr_storage *saddr; 146 147 if( file_size > global.conf->max_filetransfer_size ) 132 struct sockaddr_storage saddr; 133 char *errmsg; 134 char host[INET6_ADDRSTRLEN]; 135 char port[6]; 136 137 if( file_size > global.conf->ft_max_size ) 148 138 return NULL; 149 139 … … 153 143 154 144 /* listen and request */ 155 if( !dcc_listen( df, &saddr ) || 156 !dccs_send_request( df, user_nick, saddr ) ) 145 146 if( ( df->fd = ft_listen( &saddr, host, port, TRUE, &errmsg ) ) == -1 ) { 147 dcc_abort( df, "Failed to listen locally, check your ft_listen setting in bitlbee.conf: %s", errmsg ); 157 148 return NULL; 158 159 g_free( saddr ); 149 } 150 151 file->status = FT_STATUS_LISTENING; 152 153 if( !dccs_send_request( df, user_nick, &saddr ) ) 154 return NULL; 160 155 161 156 /* watch */ … … 258 253 259 254 g_free( cmd ); 260 261 return TRUE;262 }263 264 /*265 * Creates a listening socket and returns it in saddr_ptr.266 */267 gboolean dcc_listen( dcc_file_transfer_t *df, struct sockaddr_storage **saddr_ptr )268 {269 file_transfer_t *file = df->ft;270 struct sockaddr_storage *saddr;271 int fd,gret;272 char hostname[ HOST_NAME_MAX + 1 ];273 struct addrinfo hints, *rp;274 socklen_t ssize = sizeof( struct sockaddr_storage );275 276 /* won't be long till someone asks for this to be configurable :) */277 278 ASSERTSOCKOP( gethostname( hostname, sizeof( hostname ) ), "gethostname()" );279 280 memset( &hints, 0, sizeof( struct addrinfo ) );281 hints.ai_socktype = SOCK_STREAM;282 hints.ai_flags = AI_NUMERICSERV;283 284 if ( ( gret = getaddrinfo( hostname, "0", &hints, &rp ) != 0 ) )285 return dcc_abort( df, "getaddrinfo(): %s", gai_strerror( gret ) );286 287 saddr = g_new( struct sockaddr_storage, 1 );288 289 *saddr_ptr = saddr;290 291 memcpy( saddr, rp->ai_addr, rp->ai_addrlen );292 293 ASSERTSOCKOP( fd = df->fd = socket( saddr->ss_family, SOCK_STREAM, 0 ), "Opening socket" );294 295 ASSERTSOCKOP( bind( fd, ( struct sockaddr *)saddr, rp->ai_addrlen ), "Binding socket" );296 297 freeaddrinfo( rp );298 299 ASSERTSOCKOP( getsockname( fd, ( struct sockaddr *)saddr, &ssize ), "Getting socket name" );300 301 ASSERTSOCKOP( listen( fd, 1 ), "Making socket listen" );302 303 file->status = FT_STATUS_LISTENING;304 255 305 256 return TRUE;
Note: See TracChangeset
for help on using the changeset viewer.