Changes in / [6e6b3d7:ec86b22]
- Files:
-
- 11 added
- 44 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r6e6b3d7 rec86b22 10 10 11 11 # Program variables 12 objects = account.o bitlbee.o chat.o crypting.o help.o ipc.o irc.o irc_commands.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) user.o13 headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h user.h lib/events.h lib/ http_client.h lib/ini.h lib/md5.h lib/misc.h lib/proxy.h lib/sha1.h lib/ssl_client.h lib/url.h protocols/nogaim.h12 objects = account.o bitlbee.o chat.o crypting.o dcc.o help.o ipc.o irc.o irc_commands.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) user.o 13 headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h user.h lib/events.h lib/ftutil.h lib/http_client.h lib/ini.h lib/md5.h lib/misc.h lib/proxy.h lib/sha1.h lib/ssl_client.h lib/url.h protocols/ft.h protocols/nogaim.h 14 14 subdirs = lib protocols 15 15 -
bitlbee.c
r6e6b3d7 rec86b22 121 121 } 122 122 123 global.listen_watch_source_id = b_input_add( global.listen_socket, GAIM_INPUT_READ, bitlbee_io_new_client, NULL );123 global.listen_watch_source_id = b_input_add( global.listen_socket, B_EV_IO_READ, bitlbee_io_new_client, NULL ); 124 124 125 125 #ifndef _WIN32 … … 321 321 child->pid = client_pid; 322 322 child->ipc_fd = fds[0]; 323 child->ipc_inpa = b_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child );323 child->ipc_inpa = b_input_add( child->ipc_fd, B_EV_IO_READ, ipc_master_read, child ); 324 324 child_list = g_slist_append( child_list, child ); 325 325 … … 349 349 /* We can store the IPC fd there now. */ 350 350 global.listen_socket = fds[1]; 351 global.listen_watch_source_id = b_input_add( fds[1], GAIM_INPUT_READ, ipc_child_read, irc );351 global.listen_watch_source_id = b_input_add( fds[1], B_EV_IO_READ, ipc_child_read, irc ); 352 352 353 353 close( fds[0] ); -
conf.c
r6e6b3d7 rec86b22 63 63 conf->ping_timeout = 300; 64 64 conf->user = NULL; 65 conf->ft_max_size = SIZE_MAX; 66 conf->ft_max_kbps = G_MAXUINT; 67 conf->ft_listen = NULL; 65 68 conf->protocols = NULL; 66 69 proxytype = 0; … … 315 318 conf->user = g_strdup( ini->value ); 316 319 } 320 else if( g_strcasecmp( ini->key, "ft_max_size" ) == 0 ) 321 { 322 size_t ft_max_size; 323 if( sscanf( ini->value, "%zu", &ft_max_size ) != 1 ) 324 { 325 fprintf( stderr, "Invalid %s value: %s\n", ini->key, ini->value ); 326 return 0; 327 } 328 conf->ft_max_size = ft_max_size; 329 } 330 else if( g_strcasecmp( ini->key, "ft_max_kbps" ) == 0 ) 331 { 332 if( sscanf( ini->value, "%d", &i ) != 1 ) 333 { 334 fprintf( stderr, "Invalid %s value: %s\n", ini->key, ini->value ); 335 return 0; 336 } 337 conf->ft_max_kbps = i; 338 } 339 else if( g_strcasecmp( ini->key, "ft_listen" ) == 0 ) 340 { 341 g_free( conf->ft_listen ); 342 conf->ft_listen = g_strdup( ini->value ); 343 } 317 344 else if( g_strcasecmp( ini->key, "protocols" ) == 0 ) 318 345 { -
conf.h
r6e6b3d7 rec86b22 50 50 int ping_timeout; 51 51 char *user; 52 size_t ft_max_size; 53 int ft_max_kbps; 54 char *ft_listen; 52 55 char **protocols; 53 56 } conf_t; -
configure
r6e6b3d7 rec86b22 27 27 yahoo=1 28 28 twitter=1 29 purple=1 29 30 30 31 debug=0 … … 68 69 --yahoo=0/1 Disable/enable Yahoo part $yahoo 69 70 --twitter=0/1 Disable/enable Twitter part $twitter 71 72 --purple=0/1 Disable/enable libpurple support $purple 70 73 71 74 --debug=0/1 Disable/enable debugging $debug … … 508 511 protoobjs='' 509 512 513 if [ "$purple" = 0 ]; then 514 echo '#undef WITH_PURPLE' >> config.h 515 else 516 if ! $PKG_CONFIG purple; then 517 echo 518 echo 'Cannot find libpurple development libraries, aborting. (Install libpurple-dev?)' 519 exit 1 520 fi 521 echo '#define WITH_PURPLE' >> config.h 522 cat<<EOF>>Makefile.settings 523 EFLAGS += $($PKG_CONFIG purple --libs) 524 PURPLE_CFLAGS += $($PKG_CONFIG purple --cflags) 525 EOF 526 protocols=$protocols'purple ' 527 protoobjs=$protoobjs'purple_mod.o ' 528 529 # Having both libpurple and native IM modules in one binary may 530 # do strange things. Let's not do that. 531 msn=0 532 jabber=0 533 oscar=0 534 yahoo=0 535 twitter=0 536 537 if [ "$events" = "libevent" ]; then 538 echo 539 echo 'Warning: Some libpurple modules (including msn-pecan) do their event handling' 540 echo 'outside libpurple, talking to GLib directly. At least for now the combination' 541 echo 'libpurple + libevent is *not* recommended!' 542 fi 543 fi 544 510 545 if [ "$msn" = 0 ]; then 511 546 echo '#undef WITH_MSN' >> config.h -
debian/control
r6e6b3d7 rec86b22 5 5 Uploaders: Jelmer Vernooij <jelmer@samba.org> 6 6 Standards-Version: 3.8.0 7 Build-Depends: libglib2.0-dev (>= 2.4), libevent-dev, libgnutls-dev | libnss-dev (>= 1.6), debconf-2.0, po-debconf 7 Build-Depends: libglib2.0-dev (>= 2.4), libevent-dev, libgnutls-dev | libnss-dev (>= 1.6), debconf-2.0, po-debconf, libpurple-dev 8 8 Homepage: http://www.bitlbee.org/ 9 9 Vcs-Bzr: http://code.bitlbee.org/bitlbee/ -
debian/rules
r6e6b3d7 rec86b22 1 1 #!/usr/bin/make -f 2 2 3 BITLBEE_CONFIGURE_FLAGS ?= 3 4 DEBUG ?= 0 4 5 … … 14 15 build-arch-stamp: 15 16 [ -d debian ] 16 ./configure --debug=$(DEBUG) --prefix=/usr --etcdir=/etc/bitlbee --events=libevent 17 ./configure --debug=$(DEBUG) --prefix=/usr --etcdir=/etc/bitlbee --events=libevent $(BITLBEE_CONFIGURE_FLAGS) 17 18 $(MAKE) 18 19 # $(MAKE) -C doc/ all -
doc/user-guide/commands.xml
r6e6b3d7 rec86b22 1168 1168 1169 1169 </bitlbee-command> 1170 1171 <bitlbee-command name="transfers"> 1172 <short-description>Monitor, cancel, or reject file transfers</short-description> 1173 <syntax>transfers [<cancel> id | <reject>]</syntax> 1174 1175 <description> 1176 <para> 1177 Without parameters the currently pending file transfers and their status will be listed. Available actions are <emphasis>cancel</emphasis> and <emphasis>reject</emphasis>. See <emphasis>help transfers <action></emphasis> for more information. 1178 </para> 1179 1180 <ircexample> 1181 <ircline nick="ulim">transfers</ircline> 1182 </ircexample> 1183 </description> 1184 1185 <bitlbee-command name="cancel"> 1186 <short-description>Cancels the file transfer with the given id</short-description> 1187 <syntax>transfers <cancel> id</syntax> 1188 1189 <description> 1190 <para>Cancels the file transfer with the given id</para> 1191 </description> 1192 1193 <ircexample> 1194 <ircline nick="ulim">transfers cancel 1</ircline> 1195 <ircline nick="root">Canceling file transfer for test</ircline> 1196 </ircexample> 1197 </bitlbee-command> 1198 1199 <bitlbee-command name="reject"> 1200 <short-description>Rejects all incoming transfers</short-description> 1201 <syntax>transfers <reject></syntax> 1202 1203 <description> 1204 <para>Rejects all incoming (not already transferring) file transfers. Since you probably have only one incoming transfer at a time, no id is neccessary. Or is it?</para> 1205 </description> 1206 1207 <ircexample> 1208 <ircline nick="ulim">transfers reject</ircline> 1209 </ircexample> 1210 </bitlbee-command> 1211 </bitlbee-command> 1212 1170 1213 </chapter> -
help.c
r6e6b3d7 rec86b22 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-200 5Wilmer van der Gaast and others *4 * Copyright 2002-2009 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 169 169 return NULL; 170 170 } 171 172 int help_add_mem( help_t **help, const char *title, const char *content ) 173 { 174 help_t *h, *l = NULL; 175 176 for( h = *help; h; h = h->next ) 177 { 178 if( g_strcasecmp( h->title, title ) == 0 ) 179 return 0; 180 181 l = h; 182 } 183 184 if( l ) 185 h = l->next = g_new0( struct help, 1 ); 186 else 187 *help = h = g_new0( struct help, 1 ); 188 h->fd = -1; 189 h->title = g_strdup( title ); 190 h->length = strlen( content ); 191 h->offset.mem_offset = g_strdup( content ); 192 193 return 1; 194 } -
help.h
r6e6b3d7 rec86b22 46 46 void help_free( help_t **help ); 47 47 char *help_get( help_t **help, char *title ); 48 int help_add_mem( help_t **help, const char *title, const char *content_ ); 48 49 49 50 #endif -
ipc.c
r6e6b3d7 rec86b22 514 514 } 515 515 516 child->ipc_inpa = b_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child );516 child->ipc_inpa = b_input_add( child->ipc_fd, B_EV_IO_READ, ipc_master_read, child ); 517 517 518 518 child_list = g_slist_append( child_list, child ); … … 552 552 } 553 553 554 b_input_add( serversock, GAIM_INPUT_READ, new_ipc_client, NULL );554 b_input_add( serversock, B_EV_IO_READ, new_ipc_client, NULL ); 555 555 556 556 return 1; … … 597 597 return 0; 598 598 } 599 child->ipc_inpa = b_input_add( child->ipc_fd, GAIM_INPUT_READ, ipc_master_read, child );599 child->ipc_inpa = b_input_add( child->ipc_fd, B_EV_IO_READ, ipc_master_read, child ); 600 600 601 601 child_list = g_slist_append( child_list, child ); -
irc.c
r6e6b3d7 rec86b22 29 29 #include "crypting.h" 30 30 #include "ipc.h" 31 #include "dcc.h" 31 32 32 33 static gboolean irc_userping( gpointer _irc, int fd, b_input_condition cond ); … … 125 126 sock_make_nonblocking( irc->fd ); 126 127 127 irc->r_watch_source_id = b_input_add( irc->fd, GAIM_INPUT_READ, bitlbee_io_current_client_read, irc );128 irc->r_watch_source_id = b_input_add( irc->fd, B_EV_IO_READ, bitlbee_io_current_client_read, irc ); 128 129 129 130 irc->status = USTATUS_OFFLINE; … … 214 215 /* Evaluator sets the iconv/oconv structures. */ 215 216 set_eval_charset( set_find( &irc->set, "charset" ), set_getstr( &irc->set, "charset" ) ); 217 218 nogaim_init(); 216 219 217 220 return( irc ); … … 696 699 in the event queue. */ 697 700 /* Really can't be done as long as the code doesn't do error checking very well: 698 if( bitlbee_io_current_client_write( irc, irc->fd, GAIM_INPUT_WRITE ) ) */701 if( bitlbee_io_current_client_write( irc, irc->fd, B_EV_IO_WRITE ) ) */ 699 702 700 703 /* So just always do it via the event handler. */ 701 irc->w_watch_source_id = b_input_add( irc->fd, GAIM_INPUT_WRITE, bitlbee_io_current_client_write, irc );704 irc->w_watch_source_id = b_input_add( irc->fd, B_EV_IO_WRITE, bitlbee_io_current_client_write, irc ); 702 705 } 703 706 … … 725 728 if( now ) 726 729 { 727 bitlbee_io_current_client_write( irc, irc->fd, GAIM_INPUT_WRITE );730 bitlbee_io_current_client_write( irc, irc->fd, B_EV_IO_WRITE ); 728 731 } 729 732 temp = temp->next; … … 1126 1129 return( 1 ); 1127 1130 } 1131 else if( g_strncasecmp( s + 1, "DCC", 3 ) == 0 ) 1132 { 1133 if( u && u->ic && u->ic->acc->prpl->transfer_request ) 1134 { 1135 file_transfer_t *ft = dcc_request( u->ic, s + 5 ); 1136 if ( ft ) 1137 u->ic->acc->prpl->transfer_request( u->ic, ft, u->handle ); 1138 } 1139 return( 1 ); 1140 } 1128 1141 else 1129 1142 { 1130 irc_usermsg( irc, " Non-ACTION CTCP's aren't supported" );1143 irc_usermsg( irc, "Supported CTCPs are ACTION, VERSION, PING, TYPING, DCC" ); 1131 1144 return( 0 ); 1132 1145 } -
irc.h
r6e6b3d7 rec86b22 83 83 struct query *queries; 84 84 struct account *accounts; 85 GSList *file_transfers; 85 86 struct chat *chatrooms; 86 87 -
lib/Makefile
r6e6b3d7 rec86b22 10 10 11 11 # [SH] Program variables 12 objects = arc.o base64.o $(EVENT_HANDLER) http_client.o ini.o md5.o misc.o oauth.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o12 objects = arc.o base64.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o md5.o misc.o oauth.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o 13 13 14 14 CFLAGS += -Wall -
lib/events.h
r6e6b3d7 rec86b22 48 48 the given callback function. */ 49 49 typedef enum { 50 GAIM_INPUT_READ = 1 << 1, 51 GAIM_INPUT_WRITE = 1 << 2 50 B_EV_IO_READ = 1 << 0, 51 B_EV_IO_WRITE = 1 << 1, 52 B_EV_FLAG_FORCE_ONCE = 1 << 16, 53 B_EV_FLAG_FORCE_REPEAT = 1 << 17, 52 54 } b_input_condition; 53 55 typedef gboolean (*b_event_handler)(gpointer data, gint fd, b_input_condition cond); -
lib/events_glib.c
r6e6b3d7 rec86b22 49 49 b_event_handler function; 50 50 gpointer data; 51 guint flags; 51 52 } GaimIOClosure; 52 53 … … 76 77 77 78 if (condition & GAIM_READ_COND) 78 gaim_cond |= GAIM_INPUT_READ;79 gaim_cond |= B_EV_IO_READ; 79 80 if (condition & GAIM_WRITE_COND) 80 gaim_cond |= GAIM_INPUT_WRITE;81 gaim_cond |= B_EV_IO_WRITE; 81 82 82 83 event_debug( "gaim_io_invoke( %d, %d, 0x%x )\n", g_io_channel_unix_get_fd(source), condition, data ); … … 87 88 event_debug( "Returned FALSE, cancelling.\n" ); 88 89 89 return st; 90 if (closure->flags & B_EV_FLAG_FORCE_ONCE) 91 return FALSE; 92 else if (closure->flags & B_EV_FLAG_FORCE_REPEAT) 93 return TRUE; 94 else 95 return st; 90 96 } 91 97 … … 105 111 closure->function = function; 106 112 closure->data = data; 113 closure->flags = condition; 107 114 108 if (condition & GAIM_INPUT_READ)115 if (condition & B_EV_IO_READ) 109 116 cond |= GAIM_READ_COND; 110 if (condition & GAIM_INPUT_WRITE)117 if (condition & B_EV_IO_WRITE) 111 118 cond |= GAIM_WRITE_COND; 112 119 -
lib/events_libevent.c
r6e6b3d7 rec86b22 60 60 b_event_handler function; 61 61 void *data; 62 guint flags; 62 63 }; 63 64 … … 126 127 { 127 128 if( event & EV_READ ) 128 cond |= GAIM_INPUT_READ;129 cond |= B_EV_IO_READ; 129 130 if( event & EV_WRITE ) 130 cond |= GAIM_INPUT_WRITE;131 cond |= B_EV_IO_WRITE; 131 132 } 132 133 … … 150 151 return; 151 152 } 152 else if( !st )153 else if( !st && !( b_ev->flags & B_EV_FLAG_FORCE_REPEAT ) ) 153 154 { 154 155 event_debug( "Handler returned FALSE: " ); … … 174 175 event_debug( "b_input_add( %d, %d, 0x%x, 0x%x ) ", fd, condition, function, data ); 175 176 176 if( ( condition & GAIM_INPUT_READ && ( b_ev = g_hash_table_lookup( read_hash, &fd ) ) ) ||177 ( condition & GAIM_INPUT_WRITE && ( b_ev = g_hash_table_lookup( write_hash, &fd ) ) ) )177 if( ( condition & B_EV_IO_READ && ( b_ev = g_hash_table_lookup( read_hash, &fd ) ) ) || 178 ( condition & B_EV_IO_WRITE && ( b_ev = g_hash_table_lookup( write_hash, &fd ) ) ) ) 178 179 { 179 180 /* We'll stick with this libevent entry, but give it a new BitlBee id. */ … … 198 199 199 200 out_cond = EV_PERSIST; 200 if( condition & GAIM_INPUT_READ )201 if( condition & B_EV_IO_READ ) 201 202 out_cond |= EV_READ; 202 if( condition & GAIM_INPUT_WRITE )203 if( condition & B_EV_IO_WRITE ) 203 204 out_cond |= EV_WRITE; 204 205 … … 212 213 } 213 214 215 b_ev->flags = condition; 214 216 g_hash_table_insert( id_hash, &b_ev->id, b_ev ); 215 217 return b_ev->id; -
lib/http_client.c
r6e6b3d7 rec86b22 149 149 if( req->bytes_written < req->request_length ) 150 150 req->inpa = b_input_add( source, 151 req->ssl ? ssl_getdirection( req->ssl ) : GAIM_INPUT_WRITE,151 req->ssl ? ssl_getdirection( req->ssl ) : B_EV_IO_WRITE, 152 152 http_connected, req ); 153 153 else 154 req->inpa = b_input_add( source, GAIM_INPUT_READ, http_incoming_data, req );154 req->inpa = b_input_add( source, B_EV_IO_READ, http_incoming_data, req ); 155 155 156 156 return FALSE; … … 234 234 /* There will be more! */ 235 235 req->inpa = b_input_add( req->fd, 236 req->ssl ? ssl_getdirection( req->ssl ) : GAIM_INPUT_READ,236 req->ssl ? ssl_getdirection( req->ssl ) : B_EV_IO_READ, 237 237 http_incoming_data, req ); 238 238 -
lib/proxy.c
r6e6b3d7 rec86b22 91 91 b_event_remove(phb->inpa); 92 92 if( phb->proxy_func ) 93 phb->proxy_func(phb->proxy_data, -1, GAIM_INPUT_READ);93 phb->proxy_func(phb->proxy_data, -1, B_EV_IO_READ); 94 94 else { 95 phb->func(phb->data, -1, GAIM_INPUT_READ);95 phb->func(phb->data, -1, B_EV_IO_READ); 96 96 g_free(phb); 97 97 } … … 102 102 b_event_remove(phb->inpa); 103 103 if( phb->proxy_func ) 104 phb->proxy_func(phb->proxy_data, source, GAIM_INPUT_READ);104 phb->proxy_func(phb->proxy_data, source, B_EV_IO_READ); 105 105 else { 106 phb->func(phb->data, source, GAIM_INPUT_READ);106 phb->func(phb->data, source, B_EV_IO_READ); 107 107 g_free(phb); 108 108 } … … 147 147 return -1; 148 148 } else { 149 phb->inpa = b_input_add(fd, GAIM_INPUT_WRITE, gaim_io_connected, phb);149 phb->inpa = b_input_add(fd, B_EV_IO_WRITE, gaim_io_connected, phb); 150 150 phb->fd = fd; 151 151 … … 179 179 if ((memcmp(HTTP_GOODSTRING, inputline, strlen(HTTP_GOODSTRING)) == 0) || 180 180 (memcmp(HTTP_GOODSTRING2, inputline, strlen(HTTP_GOODSTRING2)) == 0)) { 181 phb->func(phb->data, source, GAIM_INPUT_READ);181 phb->func(phb->data, source, B_EV_IO_READ); 182 182 g_free(phb->host); 183 183 g_free(phb); … … 186 186 187 187 close(source); 188 phb->func(phb->data, -1, GAIM_INPUT_READ);188 phb->func(phb->data, -1, B_EV_IO_READ); 189 189 g_free(phb->host); 190 190 g_free(phb); … … 204 204 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { 205 205 close(source); 206 phb->func(phb->data, -1, GAIM_INPUT_READ);206 phb->func(phb->data, -1, B_EV_IO_READ); 207 207 g_free(phb->host); 208 208 g_free(phb); … … 215 215 if (send(source, cmd, strlen(cmd), 0) < 0) { 216 216 close(source); 217 phb->func(phb->data, -1, GAIM_INPUT_READ);217 phb->func(phb->data, -1, B_EV_IO_READ); 218 218 g_free(phb->host); 219 219 g_free(phb); … … 230 230 if (send(source, cmd, strlen(cmd), 0) < 0) { 231 231 close(source); 232 phb->func(phb->data, -1, GAIM_INPUT_READ);232 phb->func(phb->data, -1, B_EV_IO_READ); 233 233 g_free(phb->host); 234 234 g_free(phb); … … 240 240 if (send(source, cmd, strlen(cmd), 0) < 0) { 241 241 close(source); 242 phb->func(phb->data, -1, GAIM_INPUT_READ);243 g_free(phb->host); 244 g_free(phb); 245 return FALSE; 246 } 247 248 phb->inpa = b_input_add(source, GAIM_INPUT_READ, http_canread, phb);242 phb->func(phb->data, -1, B_EV_IO_READ); 243 g_free(phb->host); 244 g_free(phb); 245 return FALSE; 246 } 247 248 phb->inpa = b_input_add(source, B_EV_IO_READ, http_canread, phb); 249 249 250 250 return FALSE; … … 273 273 memset(packet, 0, sizeof(packet)); 274 274 if (read(source, packet, 9) >= 4 && packet[1] == 90) { 275 phb->func(phb->data, source, GAIM_INPUT_READ);275 phb->func(phb->data, source, B_EV_IO_READ); 276 276 g_free(phb->host); 277 277 g_free(phb); … … 280 280 281 281 close(source); 282 phb->func(phb->data, -1, GAIM_INPUT_READ);282 phb->func(phb->data, -1, B_EV_IO_READ); 283 283 g_free(phb->host); 284 284 g_free(phb); … … 299 299 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { 300 300 close(source); 301 phb->func(phb->data, -1, GAIM_INPUT_READ);301 phb->func(phb->data, -1, B_EV_IO_READ); 302 302 g_free(phb->host); 303 303 g_free(phb); … … 309 309 if (!(hp = gethostbyname(phb->host))) { 310 310 close(source); 311 phb->func(phb->data, -1, GAIM_INPUT_READ);311 phb->func(phb->data, -1, B_EV_IO_READ); 312 312 g_free(phb->host); 313 313 g_free(phb); … … 326 326 if (write(source, packet, 9) != 9) { 327 327 close(source); 328 phb->func(phb->data, -1, GAIM_INPUT_READ);329 g_free(phb->host); 330 g_free(phb); 331 return FALSE; 332 } 333 334 phb->inpa = b_input_add(source, GAIM_INPUT_READ, s4_canread, phb);328 phb->func(phb->data, -1, B_EV_IO_READ); 329 g_free(phb->host); 330 g_free(phb); 331 return FALSE; 332 } 333 334 phb->inpa = b_input_add(source, B_EV_IO_READ, s4_canread, phb); 335 335 336 336 return FALSE; … … 359 359 if (read(source, buf, 10) < 10) { 360 360 close(source); 361 phb->func(phb->data, -1, GAIM_INPUT_READ);361 phb->func(phb->data, -1, B_EV_IO_READ); 362 362 g_free(phb->host); 363 363 g_free(phb); … … 366 366 if ((buf[0] != 0x05) || (buf[1] != 0x00)) { 367 367 close(source); 368 phb->func(phb->data, -1, GAIM_INPUT_READ);369 g_free(phb->host); 370 g_free(phb); 371 return FALSE; 372 } 373 374 phb->func(phb->data, source, GAIM_INPUT_READ);368 phb->func(phb->data, -1, B_EV_IO_READ); 369 g_free(phb->host); 370 g_free(phb); 371 return FALSE; 372 } 373 374 phb->func(phb->data, source, B_EV_IO_READ); 375 375 g_free(phb->host); 376 376 g_free(phb); … … 396 396 if (write(source, buf, (5 + strlen(phb->host) + 2)) < (5 + strlen(phb->host) + 2)) { 397 397 close(source); 398 phb->func(phb->data, -1, GAIM_INPUT_READ);398 phb->func(phb->data, -1, B_EV_IO_READ); 399 399 g_free(phb->host); 400 400 g_free(phb); … … 402 402 } 403 403 404 phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_canread_again, phb);404 phb->inpa = b_input_add(source, B_EV_IO_READ, s5_canread_again, phb); 405 405 } 406 406 … … 414 414 if (read(source, buf, 2) < 2) { 415 415 close(source); 416 phb->func(phb->data, -1, GAIM_INPUT_READ);416 phb->func(phb->data, -1, B_EV_IO_READ); 417 417 g_free(phb->host); 418 418 g_free(phb); … … 422 422 if ((buf[0] != 0x01) || (buf[1] != 0x00)) { 423 423 close(source); 424 phb->func(phb->data, -1, GAIM_INPUT_READ);424 phb->func(phb->data, -1, B_EV_IO_READ); 425 425 g_free(phb->host); 426 426 g_free(phb); … … 442 442 if (read(source, buf, 2) < 2) { 443 443 close(source); 444 phb->func(phb->data, -1, GAIM_INPUT_READ);444 phb->func(phb->data, -1, B_EV_IO_READ); 445 445 g_free(phb->host); 446 446 g_free(phb); … … 450 450 if ((buf[0] != 0x05) || (buf[1] == 0xff)) { 451 451 close(source); 452 phb->func(phb->data, -1, GAIM_INPUT_READ);452 phb->func(phb->data, -1, B_EV_IO_READ); 453 453 g_free(phb->host); 454 454 g_free(phb); … … 465 465 if (write(source, buf, 3 + i + j) < 3 + i + j) { 466 466 close(source); 467 phb->func(phb->data, -1, GAIM_INPUT_READ);467 phb->func(phb->data, -1, B_EV_IO_READ); 468 468 g_free(phb->host); 469 469 g_free(phb); … … 471 471 } 472 472 473 phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_readauth, phb);473 phb->inpa = b_input_add(source, B_EV_IO_READ, s5_readauth, phb); 474 474 } else { 475 475 s5_sendconnect(phb, source); … … 491 491 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { 492 492 close(source); 493 phb->func(phb->data, -1, GAIM_INPUT_READ);493 phb->func(phb->data, -1, B_EV_IO_READ); 494 494 g_free(phb->host); 495 495 g_free(phb); … … 513 513 if (write(source, buf, i) < i) { 514 514 close(source); 515 phb->func(phb->data, -1, GAIM_INPUT_READ);516 g_free(phb->host); 517 g_free(phb); 518 return FALSE; 519 } 520 521 phb->inpa = b_input_add(source, GAIM_INPUT_READ, s5_canread, phb);515 phb->func(phb->data, -1, B_EV_IO_READ); 516 g_free(phb->host); 517 g_free(phb); 518 return FALSE; 519 } 520 521 phb->inpa = b_input_add(source, B_EV_IO_READ, s5_canread, phb); 522 522 523 523 return FALSE; -
lib/ssl_bogus.c
r6e6b3d7 rec86b22 59 59 b_input_condition ssl_getdirection( void *conn ) 60 60 { 61 return GAIM_INPUT_READ;61 return B_EV_IO_READ; 62 62 } 63 63 -
lib/ssl_client.h
r6e6b3d7 rec86b22 71 71 G_MODULE_EXPORT int ssl_getfd( void *conn ); 72 72 73 /* This function returns GAIM_INPUT_READ/WRITE. With SSL connections it's73 /* This function returns B_EV_IO_READ/WRITE. With SSL connections it's 74 74 possible that something has to be read while actually were trying to 75 75 write something (think about key exchange/refresh/etc). So when an -
lib/ssl_gnutls.c
r6e6b3d7 rec86b22 106 106 struct scd *conn = data; 107 107 108 return ssl_connected( conn, conn->fd, GAIM_INPUT_WRITE );108 return ssl_connected( conn, conn->fd, B_EV_IO_WRITE ); 109 109 } 110 110 … … 244 244 { 245 245 return( gnutls_record_get_direction( ((struct scd*)conn)->session ) ? 246 GAIM_INPUT_WRITE : GAIM_INPUT_READ );247 } 246 B_EV_IO_WRITE : B_EV_IO_READ ); 247 } -
lib/ssl_nss.c
r6e6b3d7 rec86b22 193 193 { 194 194 /* Just in case someone calls us, let's return the most likely case: */ 195 return GAIM_INPUT_READ;195 return B_EV_IO_READ; 196 196 } -
lib/ssl_openssl.c
r6e6b3d7 rec86b22 102 102 struct scd *conn = data; 103 103 104 return ssl_connected( conn, conn->fd, GAIM_INPUT_WRITE );104 return ssl_connected( conn, conn->fd, B_EV_IO_WRITE ); 105 105 } 106 106 … … 270 270 b_input_condition ssl_getdirection( void *conn ) 271 271 { 272 return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? GAIM_INPUT_WRITE : GAIM_INPUT_READ );273 } 272 return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? B_EV_IO_WRITE : B_EV_IO_READ ); 273 } -
lib/ssl_sspi.c
r6e6b3d7 rec86b22 275 275 GaimInputCondition ssl_getdirection( void *conn ) 276 276 { 277 return GAIM_INPUT_WRITE; /* FIXME: or GAIM_INPUT_READ */278 } 277 return B_EV_IO_WRITE; /* FIXME: or B_EV_IO_READ */ 278 } -
protocols/jabber/Makefile
r6e6b3d7 rec86b22 10 10 11 11 # [SH] Program variables 12 objects = conference.o io.o iq.o jabber.o jabber_util.o message.o presence.o s asl.o12 objects = conference.o io.o iq.o jabber.o jabber_util.o message.o presence.o s5bytestream.o sasl.o si.o 13 13 14 14 CFLAGS += -Wall -
protocols/jabber/io.c
r6e6b3d7 rec86b22 64 64 most cases it probably won't be necessary.) */ 65 65 if( ( ret = jabber_write_queue( ic ) ) && jd->tx_len > 0 ) 66 jd->w_inpa = b_input_add( jd->fd, GAIM_INPUT_WRITE, jabber_write_callback, ic );66 jd->w_inpa = b_input_add( jd->fd, B_EV_IO_WRITE, jabber_write_callback, ic ); 67 67 } 68 68 else … … 504 504 505 505 if( jd->r_inpa <= 0 ) 506 jd->r_inpa = b_input_add( jd->fd, GAIM_INPUT_READ, jabber_read_callback, ic );506 jd->r_inpa = b_input_add( jd->fd, B_EV_IO_READ, jabber_read_callback, ic ); 507 507 508 508 greet = g_strdup_printf( "%s<stream:stream to=\"%s\" xmlns=\"jabber:client\" " -
protocols/jabber/iq.c
r6e6b3d7 rec86b22 91 91 pack = 0; 92 92 } 93 else if( strcmp( s, XMLNS_DISCO VER) == 0 )94 { 95 const char *features[] = { XMLNS_DISCO VER,93 else if( strcmp( s, XMLNS_DISCO_INFO ) == 0 ) 94 { 95 const char *features[] = { XMLNS_DISCO_INFO, 96 96 XMLNS_VERSION, 97 97 XMLNS_TIME, … … 99 99 XMLNS_MUC, 100 100 XMLNS_PING, 101 XMLNS_SI, 102 XMLNS_BYTESTREAMS, 103 XMLNS_FILETRANSFER, 101 104 NULL }; 102 105 const char **f; … … 118 121 { 119 122 xt_free_node( reply ); 120 reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel" );123 reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel", NULL ); 121 124 pack = 0; 122 125 } … … 124 127 else if( strcmp( type, "set" ) == 0 ) 125 128 { 126 if( !( c = xt_find_node( node->children, "query" ) ) || 127 !( s = xt_find_attr( c, "xmlns" ) ) ) 129 if( ( c = xt_find_node( node->children, "si" ) ) && 130 ( s = xt_find_attr( c, "xmlns" ) ) && 131 ( strcmp( s, XMLNS_SI ) == 0 ) ) 132 { 133 return jabber_si_handle_request( ic, node, c ); 134 } 135 else if( !( c = xt_find_node( node->children, "query" ) ) || 136 !( s = xt_find_attr( c, "xmlns" ) ) ) 128 137 { 129 138 imcb_log( ic, "Warning: Received incomplete IQ-%s packet", type ); 130 139 return XT_HANDLED; 131 140 } 132 141 else if( strcmp( s, XMLNS_ROSTER ) == 0 ) 142 { 133 143 /* This is a roster push. XMPP servers send this when someone 134 144 was added to (or removed from) the buddy list. AFAIK they're 135 145 sent even if we added this buddy in our own session. */ 136 if( strcmp( s, XMLNS_ROSTER ) == 0 )137 {138 146 int bare_len = strlen( ic->acc->user ); 139 147 … … 152 160 153 161 xt_free_node( reply ); 154 reply = jabber_make_error_packet( node, "not-allowed", "cancel" );162 reply = jabber_make_error_packet( node, "not-allowed", "cancel", NULL ); 155 163 pack = 0; 156 164 } 157 165 } 166 else if( strcmp( s, XMLNS_BYTESTREAMS ) == 0 ) 167 { 168 /* Bytestream Request (stage 2 of file transfer) */ 169 return jabber_bs_recv_request( ic, node, c ); 170 } 158 171 else 159 172 { 160 173 xt_free_node( reply ); 161 reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel" );174 reply = jabber_make_error_packet( node, "feature-not-implemented", "cancel", NULL ); 162 175 pack = 0; 163 176 } … … 609 622 return st; 610 623 } 624 625 xt_status jabber_iq_parse_features( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ); 626 627 xt_status jabber_iq_query_features( struct im_connection *ic, char *bare_jid ) 628 { 629 struct xt_node *node, *query; 630 struct jabber_buddy *bud; 631 632 if( ( bud = jabber_buddy_by_jid( ic, bare_jid , 0 ) ) == NULL ) 633 { 634 /* Who cares about the unknown... */ 635 imcb_log( ic, "Couldn't find buddy: %s", bare_jid); 636 return XT_HANDLED; 637 } 638 639 if( bud->features ) /* been here already */ 640 return XT_HANDLED; 641 642 node = xt_new_node( "query", NULL, NULL ); 643 xt_add_attr( node, "xmlns", XMLNS_DISCO_INFO ); 644 645 if( !( query = jabber_make_packet( "iq", "get", bare_jid, node ) ) ) 646 { 647 imcb_log( ic, "WARNING: Couldn't generate feature query" ); 648 xt_free_node( node ); 649 return XT_HANDLED; 650 } 651 652 jabber_cache_add( ic, query, jabber_iq_parse_features ); 653 654 return jabber_write_packet( ic, query ) ? XT_HANDLED : XT_ABORT; 655 } 656 657 xt_status jabber_iq_parse_features( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ) 658 { 659 struct xt_node *c; 660 struct jabber_buddy *bud; 661 char *feature, *xmlns, *from; 662 663 if( !( from = xt_find_attr( node, "from" ) ) || 664 !( c = xt_find_node( node->children, "query" ) ) || 665 !( xmlns = xt_find_attr( c, "xmlns" ) ) || 666 !( strcmp( xmlns, XMLNS_DISCO_INFO ) == 0 ) ) 667 { 668 imcb_log( ic, "WARNING: Received incomplete IQ-result packet for discover" ); 669 return XT_HANDLED; 670 } 671 if( ( bud = jabber_buddy_by_jid( ic, from, 0 ) ) == NULL ) 672 { 673 /* Who cares about the unknown... */ 674 imcb_log( ic, "Couldn't find buddy: %s", from ); 675 return XT_HANDLED; 676 } 677 678 c = c->children; 679 while( ( c = xt_find_node( c, "feature" ) ) ) 680 { 681 feature = xt_find_attr( c, "var" ); 682 if( feature ) 683 bud->features = g_slist_append( bud->features, g_strdup( feature ) ); 684 c = c->next; 685 } 686 687 return XT_HANDLED; 688 } 689 690 xt_status jabber_iq_parse_server_features( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ); 691 692 xt_status jabber_iq_query_server( struct im_connection *ic, char *jid, char *xmlns ) 693 { 694 struct xt_node *node, *query; 695 struct jabber_data *jd = ic->proto_data; 696 697 node = xt_new_node( "query", NULL, NULL ); 698 xt_add_attr( node, "xmlns", xmlns ); 699 700 if( !( query = jabber_make_packet( "iq", "get", jid, node ) ) ) 701 { 702 imcb_log( ic, "WARNING: Couldn't generate server query" ); 703 xt_free_node( node ); 704 } 705 706 jd->have_streamhosts--; 707 jabber_cache_add( ic, query, jabber_iq_parse_server_features ); 708 709 return jabber_write_packet( ic, query ) ? XT_HANDLED : XT_ABORT; 710 } 711 712 /* 713 * Query the server for "items", query each "item" for identities, query each "item" that's a proxy for it's bytestream info 714 */ 715 xt_status jabber_iq_parse_server_features( struct im_connection *ic, struct xt_node *node, struct xt_node *orig ) 716 { 717 struct xt_node *c; 718 struct jabber_data *jd = ic->proto_data; 719 char *xmlns, *from; 720 721 if( !( c = xt_find_node( node->children, "query" ) ) || 722 !( from = xt_find_attr( node, "from" ) ) || 723 !( xmlns = xt_find_attr( c, "xmlns" ) ) ) 724 { 725 imcb_log( ic, "WARNING: Received incomplete IQ-result packet for discover" ); 726 return XT_HANDLED; 727 } 728 729 jd->have_streamhosts++; 730 731 if( strcmp( xmlns, XMLNS_DISCO_ITEMS ) == 0 ) 732 { 733 char *itemjid; 734 735 /* answer from server */ 736 737 c = c->children; 738 while( ( c = xt_find_node( c, "item" ) ) ) 739 { 740 itemjid = xt_find_attr( c, "jid" ); 741 742 if( itemjid ) 743 jabber_iq_query_server( ic, itemjid, XMLNS_DISCO_INFO ); 744 745 c = c->next; 746 } 747 } 748 else if( strcmp( xmlns, XMLNS_DISCO_INFO ) == 0 ) 749 { 750 char *category, *type; 751 752 /* answer from potential proxy */ 753 754 c = c->children; 755 while( ( c = xt_find_node( c, "identity" ) ) ) 756 { 757 category = xt_find_attr( c, "category" ); 758 type = xt_find_attr( c, "type" ); 759 760 if( type && ( strcmp( type, "bytestreams" ) == 0 ) && 761 category && ( strcmp( category, "proxy" ) == 0 ) ) 762 jabber_iq_query_server( ic, from, XMLNS_BYTESTREAMS ); 763 764 c = c->next; 765 } 766 } 767 else if( strcmp( xmlns, XMLNS_BYTESTREAMS ) == 0 ) 768 { 769 char *host, *jid, *port_s; 770 int port; 771 772 /* answer from proxy */ 773 774 if( ( c = xt_find_node( c->children, "streamhost" ) ) && 775 ( host = xt_find_attr( c, "host" ) ) && 776 ( port_s = xt_find_attr( c, "port" ) ) && 777 ( sscanf( port_s, "%d", &port ) == 1 ) && 778 ( jid = xt_find_attr( c, "jid" ) ) ) 779 { 780 jabber_streamhost_t *sh = g_new0( jabber_streamhost_t, 1 ); 781 782 sh->jid = g_strdup( jid ); 783 sh->host = g_strdup( host ); 784 g_snprintf( sh->port, sizeof( sh->port ), "%u", port ); 785 786 imcb_log( ic, "Proxy found: jid %s host %s port %u", jid, host, port ); 787 jd->streamhosts = g_slist_append( jd->streamhosts, sh ); 788 } 789 } 790 791 if( jd->have_streamhosts == 0 ) 792 jd->have_streamhosts++; 793 794 return XT_HANDLED; 795 } -
protocols/jabber/jabber.c
r6e6b3d7 rec86b22 65 65 66 66 s = set_add( &acc->set, "priority", "0", set_eval_priority, acc ); 67 68 s = set_add( &acc->set, "proxy", "<local>;<auto>", NULL, acc ); 67 69 68 70 s = set_add( &acc->set, "resource", "BitlBee", NULL, acc ); … … 264 266 struct jabber_data *jd = ic->proto_data; 265 267 268 while( jd->filetransfers ) 269 imcb_file_canceled( ( ( struct jabber_transfer *) jd->filetransfers->data )->ft, "Logging out" ); 270 271 while( jd->streamhosts ) 272 { 273 jabber_streamhost_t *sh = jd->streamhosts->data; 274 jd->streamhosts = g_slist_remove( jd->streamhosts, sh ); 275 g_free( sh->jid ); 276 g_free( sh->host ); 277 g_free( sh ); 278 } 279 266 280 if( jd->fd >= 0 ) 267 281 jabber_end_stream( ic ); … … 544 558 ret->send_typing = jabber_send_typing; 545 559 ret->handle_cmp = g_strcasecmp; 560 ret->transfer_request = jabber_si_transfer_request; 546 561 547 562 register_protocol( ret ); -
protocols/jabber/jabber.h
r6e6b3d7 rec86b22 61 61 } jabber_buddy_flags_t; 62 62 63 /* Stores a streamhost's (a.k.a. proxy) data */ 64 typedef struct 65 { 66 char *jid; 67 char *host; 68 char port[6]; 69 } jabber_streamhost_t; 70 63 71 typedef enum 64 72 { … … 91 99 GHashTable *node_cache; 92 100 GHashTable *buddies; 101 102 GSList *filetransfers; 103 GSList *streamhosts; 104 int have_streamhosts; 93 105 }; 94 106 … … 127 139 struct jabber_away_state *away_state; 128 140 char *away_message; 141 GSList *features; 129 142 130 143 time_t last_msg; … … 140 153 char *my_full_jid; /* Separate copy because of case sensitivity. */ 141 154 struct jabber_buddy *me; 155 }; 156 157 struct jabber_transfer 158 { 159 /* bitlbee's handle for this transfer */ 160 file_transfer_t *ft; 161 162 /* the stream's private handle */ 163 gpointer streamhandle; 164 165 /* timeout for discover queries */ 166 gint disco_timeout; 167 gint disco_timeout_fired; 168 169 struct im_connection *ic; 170 171 struct jabber_buddy *bud; 172 173 int watch_in; 174 int watch_out; 175 176 char *ini_jid; 177 char *tgt_jid; 178 char *iq_id; 179 char *sid; 180 int accepted; 181 182 size_t bytesread, byteswritten; 183 int fd; 184 struct sockaddr_storage saddr; 142 185 }; 143 186 … … 167 210 168 211 /* Some supported extensions/legacy stuff */ 169 #define XMLNS_AUTH "jabber:iq:auth" /* XEP-0078 */ 170 #define XMLNS_VERSION "jabber:iq:version" /* XEP-0092 */ 171 #define XMLNS_TIME "jabber:iq:time" /* XEP-0090 */ 172 #define XMLNS_PING "urn:xmpp:ping" /* XEP-0199 */ 173 #define XMLNS_VCARD "vcard-temp" /* XEP-0054 */ 174 #define XMLNS_DELAY "jabber:x:delay" /* XEP-0091 */ 175 #define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* 0085 */ 176 #define XMLNS_DISCOVER "http://jabber.org/protocol/disco#info" /* 0030 */ 177 #define XMLNS_MUC "http://jabber.org/protocol/muc" /* XEP-0045 */ 178 #define XMLNS_MUC_USER "http://jabber.org/protocol/muc#user"/* XEP-0045 */ 179 #define XMLNS_CAPS "http://jabber.org/protocol/caps" /* XEP-0115 */ 212 #define XMLNS_AUTH "jabber:iq:auth" /* XEP-0078 */ 213 #define XMLNS_VERSION "jabber:iq:version" /* XEP-0092 */ 214 #define XMLNS_TIME "jabber:iq:time" /* XEP-0090 */ 215 #define XMLNS_PING "urn:xmpp:ping" /* XEP-0199 */ 216 #define XMLNS_VCARD "vcard-temp" /* XEP-0054 */ 217 #define XMLNS_DELAY "jabber:x:delay" /* XEP-0091 */ 218 #define XMLNS_XDATA "jabber:x:data" /* XEP-0004 */ 219 #define XMLNS_CHATSTATES "http://jabber.org/protocol/chatstates" /* XEP-0085 */ 220 #define XMLNS_DISCO_INFO "http://jabber.org/protocol/disco#info" /* XEP-0030 */ 221 #define XMLNS_DISCO_ITEMS "http://jabber.org/protocol/disco#items" /* XEP-0030 */ 222 #define XMLNS_MUC "http://jabber.org/protocol/muc" /* XEP-0045 */ 223 #define XMLNS_MUC_USER "http://jabber.org/protocol/muc#user" /* XEP-0045 */ 224 #define XMLNS_CAPS "http://jabber.org/protocol/caps" /* XEP-0115 */ 225 #define XMLNS_FEATURE "http://jabber.org/protocol/feature-neg" /* XEP-0020 */ 226 #define XMLNS_SI "http://jabber.org/protocol/si" /* XEP-0095 */ 227 #define XMLNS_FILETRANSFER "http://jabber.org/protocol/si/profile/file-transfer" /* XEP-0096 */ 228 #define XMLNS_BYTESTREAMS "http://jabber.org/protocol/bytestreams" /* XEP-0065 */ 229 #define XMLNS_IBB "http://jabber.org/protocol/ibb" /* XEP-0047 */ 180 230 181 231 /* iq.c */ … … 187 237 int jabber_add_to_roster( struct im_connection *ic, char *handle, char *name ); 188 238 int jabber_remove_from_roster( struct im_connection *ic, char *handle ); 239 xt_status jabber_iq_query_features( struct im_connection *ic, char *bare_jid ); 240 xt_status jabber_iq_query_server( struct im_connection *ic, char *jid, char *xmlns ); 241 242 /* si.c */ 243 int jabber_si_handle_request( struct im_connection *ic, struct xt_node *node, struct xt_node *sinode ); 244 void jabber_si_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *who ); 245 void jabber_si_free_transfer( file_transfer_t *ft); 246 247 /* s5bytestream.c */ 248 int jabber_bs_recv_request( struct im_connection *ic, struct xt_node *node, struct xt_node *qnode); 249 gboolean jabber_bs_send_start( struct jabber_transfer *tf ); 250 gboolean jabber_bs_send_write( file_transfer_t *ft, char *buffer, unsigned int len ); 189 251 190 252 /* message.c */ … … 200 262 char *set_eval_tls( set_t *set, char *value ); 201 263 struct xt_node *jabber_make_packet( char *name, char *type, char *to, struct xt_node *children ); 202 struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type );264 struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type, char *err_code ); 203 265 void jabber_cache_add( struct im_connection *ic, struct xt_node *node, jabber_cache_event func ); 204 266 struct xt_node *jabber_cache_get( struct im_connection *ic, char *id ); -
protocols/jabber/jabber_util.c
r6e6b3d7 rec86b22 99 99 } 100 100 101 struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type )101 struct xt_node *jabber_make_error_packet( struct xt_node *orig, char *err_cond, char *err_type, char *err_code ) 102 102 { 103 103 struct xt_node *node, *c; … … 111 111 c = xt_new_node( "error", NULL, c ); 112 112 xt_add_attr( c, "type", err_type ); 113 114 /* Add the error code, if present */ 115 if (err_code) 116 xt_add_attr( c, "code", err_code ); 113 117 114 118 /* To make the actual error packet, we copy the original packet and -
protocols/msn/Makefile
r6e6b3d7 rec86b22 10 10 11 11 # [SH] Program variables 12 objects = msn.o msn_util.o ns.o passport.o sb.o tables.o12 objects = invitation.o msn.o msn_util.o ns.o passport.o sb.o tables.o 13 13 14 14 CFLAGS += -Wall -
protocols/msn/msn.c
r6e6b3d7 rec86b22 79 79 if( md ) 80 80 { 81 while( md->filetransfers ) { 82 imcb_file_canceled( md->filetransfers->data, "Closing connection" ); 83 } 84 81 85 if( md->fd >= 0 ) 82 86 closesocket( md->fd ); … … 328 332 ret->send_typing = msn_send_typing; 329 333 ret->handle_cmp = g_strcasecmp; 334 ret->transfer_request = msn_ftp_transfer_request; 330 335 331 336 register_protocol(ret); -
protocols/msn/msn.h
r6e6b3d7 rec86b22 74 74 int sb_failures; 75 75 time_t first_sb_failure; 76 GSList *filetransfers; 76 77 77 78 const struct msn_away_state *away_state; … … 189 190 void msn_sb_stop_keepalives( struct msn_switchboard *sb ); 190 191 192 /* invitation.c */ 193 void msn_ftp_transfer_request( struct im_connection *ic, file_transfer_t *ft, char *who ); 194 191 195 #endif //_MSN_H -
protocols/msn/ns.c
r6e6b3d7 rec86b22 76 76 if( msn_write( ic, s, strlen( s ) ) ) 77 77 { 78 ic->inpa = b_input_add( md->fd, GAIM_INPUT_READ, msn_ns_callback, ic );78 ic->inpa = b_input_add( md->fd, B_EV_IO_READ, msn_ns_callback, ic ); 79 79 imcb_log( ic, "Connected to server, waiting for reply" ); 80 80 } -
protocols/msn/sb.c
r6e6b3d7 rec86b22 29 29 #include "passport.h" 30 30 #include "md5.h" 31 #include "invitation.h" 31 32 32 33 static gboolean msn_sb_callback( gpointer data, gint source, b_input_condition cond ); … … 173 174 buf = g_new0( char, i ); 174 175 i = g_snprintf( buf, i, MSN_TYPING_HEADERS, sb->ic->acc->user ); 176 } 177 else if( strncmp( text, MSN_INVITE_HEADERS, sizeof( MSN_INVITE_HEADERS ) - 1 ) == 0 ) 178 { 179 buf = g_strdup( text ); 180 i = strlen( buf ); 175 181 } 176 182 else if( strcmp( text, SB_KEEPALIVE_MESSAGE ) == 0 ) … … 315 321 316 322 if( msn_sb_write( sb, buf, strlen( buf ) ) ) 317 sb->inp = b_input_add( sb->fd, GAIM_INPUT_READ, msn_sb_callback, sb );323 sb->inp = b_input_add( sb->fd, B_EV_IO_READ, msn_sb_callback, sb ); 318 324 else 319 325 debug( "Error %d while connecting to switchboard server", 2 ); … … 694 700 else if( g_strncasecmp( ct, "text/x-msmsgsinvite", 19 ) == 0 ) 695 701 { 696 char *itype = msn_findheader( body, "Application-GUID:", blen ); 697 char buf[1024]; 702 char *command = msn_findheader( body, "Invitation-Command:", blen ); 703 char *cookie = msn_findheader( body, "Invitation-Cookie:", blen ); 704 unsigned int icookie; 698 705 699 706 g_free( ct ); 700 707 701 *buf = 0; 702 703 if( !itype ) 704 return( 1 ); 705 706 /* File transfer. */ 707 if( strcmp( itype, "{5D3E02AB-6190-11d3-BBBB-00C04F795683}" ) == 0 ) 708 { 709 char *name = msn_findheader( body, "Application-File:", blen ); 710 char *size = msn_findheader( body, "Application-FileSize:", blen ); 711 712 if( name && size ) 713 { 714 g_snprintf( buf, sizeof( buf ), "<< \x02""BitlBee\x02"" - Filetransfer: `%s', %s bytes >>\n" 715 "Filetransfers are not supported by BitlBee for now...", name, size ); 716 } 717 else 718 { 719 strcpy( buf, "<< \x02""BitlBee\x02"" - Corrupted MSN filetransfer invitation message >>" ); 720 } 721 722 if( name ) g_free( name ); 723 if( size ) g_free( size ); 724 } 725 else 726 { 727 char *iname = msn_findheader( body, "Application-Name:", blen ); 728 729 g_snprintf( buf, sizeof( buf ), "<< \x02""BitlBee\x02"" - Unknown MSN invitation - %s (%s) >>", 730 itype, iname ? iname : "no name" ); 731 732 if( iname ) g_free( iname ); 733 } 734 735 g_free( itype ); 736 737 if( !*buf ) 738 return( 1 ); 739 740 if( sb->who ) 741 { 742 imcb_buddy_msg( ic, cmd[1], buf, 0, 0 ); 743 } 744 else if( sb->chat ) 745 { 746 imcb_chat_msg( sb->chat, cmd[1], buf, 0, 0 ); 747 } 748 else 749 { 750 /* PANIC! */ 751 } 708 /* Every invite should have both a Command and Cookie header */ 709 if( !command || !cookie ) { 710 g_free( command ); 711 g_free( cookie ); 712 imcb_log( ic, "Warning: No command or cookie from %s", sb->who ); 713 return 1; 714 } 715 716 icookie = strtoul( cookie, NULL, 10 ); 717 g_free( cookie ); 718 719 if( g_strncasecmp( command, "INVITE", 6 ) == 0 ) { 720 msn_invitation_invite( sb, cmd[1], icookie, body, blen ); 721 } else if( g_strncasecmp( command, "ACCEPT", 6 ) == 0 ) { 722 msn_invitation_accept( sb, cmd[1], icookie, body, blen ); 723 } else if( g_strncasecmp( command, "CANCEL", 6 ) == 0 ) { 724 msn_invitation_cancel( sb, cmd[1], icookie, body, blen ); 725 } else { 726 imcb_log( ic, "Warning: Received invalid invitation with " 727 "command %s from %s", command, sb->who ); 728 } 729 730 g_free( command ); 731 } 732 else if( g_strncasecmp( ct, "application/x-msnmsgrp2p", 24 ) == 0 ) 733 { 734 imcb_error( sb->ic, "Cannot receive file from %s: BitlBee does not " 735 "support msnmsgrp2p yet.", sb->who ); 736 g_free( ct ); 752 737 } 753 738 else if( g_strncasecmp( ct, "text/x-msmsgscontrol", 20 ) == 0 ) -
protocols/nogaim.c
r6e6b3d7 rec86b22 117 117 { 118 118 GList *gl; 119 for (gl = protocols; gl; gl = gl->next) 119 120 for( gl = protocols; gl; gl = gl->next ) 120 121 { 121 122 struct prpl *proto = gl->data; 122 if(!g_strcasecmp(proto->name, name)) 123 124 if( g_strcasecmp( proto->name, name ) == 0 ) 123 125 return proto; 124 126 } 127 125 128 return NULL; 126 129 } … … 134 137 extern void jabber_initmodule(); 135 138 extern void twitter_initmodule(); 139 extern void purple_initmodule(); 136 140 137 141 #ifdef WITH_MSN … … 153 157 #ifdef WITH_TWITTER 154 158 twitter_initmodule(); 159 #endif 160 161 #ifdef WITH_PURPLE 162 purple_initmodule(); 155 163 #endif 156 164 -
protocols/nogaim.h
r6e6b3d7 rec86b22 45 45 #include "proxy.h" 46 46 #include "query.h" 47 #include "md5.h" 48 #include "ft.h" 47 49 48 50 #define BUDDY_ALIAS_MAXLEN 388 /* because MSN names can be 387 characters */ … … 132 134 * - The user sees this name ie. when imcb_log() is used. */ 133 135 const char *name; 136 void *data; 134 137 135 138 /* Added this one to be able to add per-account settings, don't think … … 228 231 void (* auth_allow) (struct im_connection *, const char *who); 229 232 void (* auth_deny) (struct im_connection *, const char *who); 233 234 /* Incoming transfer request */ 235 void (* transfer_request) (struct im_connection *, file_transfer_t *ft, char *handle ); 230 236 }; 231 237 -
protocols/oscar/oscar.c
r6e6b3d7 rec86b22 290 290 odata = (struct oscar_data *)ic->proto_data; 291 291 292 if (condition & GAIM_INPUT_READ) {292 if (condition & B_EV_IO_READ) { 293 293 if (aim_get_command(odata->sess, conn) >= 0) { 294 294 aim_rxdispatch(odata->sess); … … 362 362 363 363 aim_conn_completeconnect(sess, conn); 364 ic->inpa = b_input_add(conn->fd, GAIM_INPUT_READ,364 ic->inpa = b_input_add(conn->fd, B_EV_IO_READ, 365 365 oscar_callback, conn); 366 366 … … 492 492 493 493 aim_conn_completeconnect(sess, bosconn); 494 ic->inpa = b_input_add(bosconn->fd, GAIM_INPUT_READ,494 ic->inpa = b_input_add(bosconn->fd, B_EV_IO_READ, 495 495 oscar_callback, bosconn); 496 496 imcb_log(ic, _("Connection established, cookie sent")); … … 702 702 703 703 aim_conn_completeconnect(sess, tstconn); 704 odata->cnpa = b_input_add(tstconn->fd, GAIM_INPUT_READ,704 odata->cnpa = b_input_add(tstconn->fd, B_EV_IO_READ, 705 705 oscar_callback, tstconn); 706 706 … … 730 730 731 731 aim_conn_completeconnect(sess, tstconn); 732 odata->paspa = b_input_add(tstconn->fd, GAIM_INPUT_READ,732 odata->paspa = b_input_add(tstconn->fd, B_EV_IO_READ, 733 733 oscar_callback, tstconn); 734 734 … … 766 766 aim_conn_completeconnect(sess, ccon->conn); 767 767 ccon->inpa = b_input_add(tstconn->fd, 768 GAIM_INPUT_READ,768 B_EV_IO_READ, 769 769 oscar_callback, tstconn); 770 770 odata->oscar_chats = g_slist_append(odata->oscar_chats, ccon); -
protocols/yahoo/yahoo.c
r6e6b3d7 rec86b22 686 686 687 687 inp->d = d; 688 d->tag = inp->h = b_input_add( fd, GAIM_INPUT_READ, (b_event_handler) byahoo_read_ready_callback, (gpointer) d );688 d->tag = inp->h = b_input_add( fd, B_EV_IO_READ, (b_event_handler) byahoo_read_ready_callback, (gpointer) d ); 689 689 } 690 690 else if( cond == YAHOO_INPUT_WRITE ) … … 697 697 698 698 inp->d = d; 699 d->tag = inp->h = b_input_add( fd, GAIM_INPUT_WRITE, (b_event_handler) byahoo_write_ready_callback, (gpointer) d );699 d->tag = inp->h = b_input_add( fd, B_EV_IO_WRITE, (b_event_handler) byahoo_write_ready_callback, (gpointer) d ); 700 700 } 701 701 else -
root_commands.c
r6e6b3d7 rec86b22 1154 1154 { 1155 1155 irc_usermsg( irc, "Unknown command: %s %s. Please use \x02help commands\x02 to get a list of available commands.", "chat", cmd[1] ); 1156 } 1157 } 1158 1159 static void cmd_transfer( irc_t *irc, char **cmd ) 1160 { 1161 GSList *files = irc->file_transfers; 1162 enum { LIST, REJECT, CANCEL }; 1163 int subcmd = LIST; 1164 int fid; 1165 1166 if( !files ) 1167 { 1168 irc_usermsg( irc, "No pending transfers" ); 1169 return; 1170 } 1171 1172 if( cmd[1] && ( strcmp( cmd[1], "reject" ) == 0 ) ) 1173 { 1174 subcmd = REJECT; 1175 } 1176 else if( cmd[1] && ( strcmp( cmd[1], "cancel" ) == 0 ) && 1177 cmd[2] && ( sscanf( cmd[2], "%d", &fid ) == 1 ) ) 1178 { 1179 subcmd = CANCEL; 1180 } 1181 1182 for( ; files; files = g_slist_next( files ) ) 1183 { 1184 file_transfer_t *file = files->data; 1185 1186 switch( subcmd ) { 1187 case LIST: 1188 if ( file->status == FT_STATUS_LISTENING ) 1189 irc_usermsg( irc, 1190 "Pending file(id %d): %s (Listening...)", file->local_id, file->file_name); 1191 else 1192 { 1193 int kb_per_s = 0; 1194 time_t diff = time( NULL ) - file->started ? : 1; 1195 if ( ( file->started > 0 ) && ( file->bytes_transferred > 0 ) ) 1196 kb_per_s = file->bytes_transferred / 1024 / diff; 1197 1198 irc_usermsg( irc, 1199 "Pending file(id %d): %s (%10zd/%zd kb, %d kb/s)", file->local_id, file->file_name, 1200 file->bytes_transferred/1024, file->file_size/1024, kb_per_s); 1201 } 1202 break; 1203 case REJECT: 1204 if( file->status == FT_STATUS_LISTENING ) 1205 { 1206 irc_usermsg( irc, "Rejecting file transfer for %s", file->file_name ); 1207 imcb_file_canceled( file, "Denied by user" ); 1208 } 1209 break; 1210 case CANCEL: 1211 if( file->local_id == fid ) 1212 { 1213 irc_usermsg( irc, "Canceling file transfer for %s", file->file_name ); 1214 imcb_file_canceled( file, "Canceled by user" ); 1215 } 1216 break; 1217 } 1156 1218 } 1157 1219 } … … 1178 1240 { "join_chat", 2, cmd_join_chat, 0 }, 1179 1241 { "chat", 1, cmd_chat, 0 }, 1242 { "transfer", 0, cmd_transfer, 0 }, 1180 1243 { NULL } 1181 1244 }; -
set.c
r6e6b3d7 rec86b22 29 29 char *SET_INVALID = "nee"; 30 30 31 set_t *set_add( set_t **head, c har *key,char *def, set_eval eval, void *data )31 set_t *set_add( set_t **head, const char *key, const char *def, set_eval eval, void *data ) 32 32 { 33 33 set_t *s = set_find( head, key ); … … 63 63 } 64 64 65 set_t *set_find( set_t **head, c har *key )65 set_t *set_find( set_t **head, const char *key ) 66 66 { 67 67 set_t *s = *head; … … 77 77 } 78 78 79 char *set_getstr( set_t **head, c har *key )79 char *set_getstr( set_t **head, const char *key ) 80 80 { 81 81 set_t *s = set_find( head, key ); … … 87 87 } 88 88 89 int set_getint( set_t **head, c har *key )89 int set_getint( set_t **head, const char *key ) 90 90 { 91 91 char *s = set_getstr( head, key ); … … 101 101 } 102 102 103 int set_getbool( set_t **head, c har *key )103 int set_getbool( set_t **head, const char *key ) 104 104 { 105 105 char *s = set_getstr( head, key ); … … 111 111 } 112 112 113 int set_setstr( set_t **head, c har *key, char *value )113 int set_setstr( set_t **head, const char *key, char *value ) 114 114 { 115 115 set_t *s = set_find( head, key ); … … 150 150 } 151 151 152 int set_setint( set_t **head, c har *key, int value )152 int set_setint( set_t **head, const char *key, int value ) 153 153 { 154 154 char s[24]; /* Not quite 128-bit clean eh? ;-) */ … … 158 158 } 159 159 160 void set_del( set_t **head, c har *key )160 void set_del( set_t **head, const char *key ) 161 161 { 162 162 set_t *s = *head, *t = NULL; … … 182 182 } 183 183 184 int set_reset( set_t **head, c har *key )184 int set_reset( set_t **head, const char *key ) 185 185 { 186 186 set_t *s; … … 211 211 { 212 212 return is_bool( value ) ? value : SET_INVALID; 213 } 214 215 char *set_eval_list( set_t *set, char *value ) 216 { 217 GSList *options = set->eval_data, *opt; 218 219 for( opt = options; opt; opt = opt->next ) 220 if( strcmp( value, opt->data ) == 0 ) 221 return value; 222 223 /* TODO: It'd be nice to show the user a list of allowed values, 224 but we don't have enough context here to do that. May 225 want to fix that. */ 226 227 return NULL; 213 228 } 214 229 -
set.h
r6e6b3d7 rec86b22 69 69 set_setstr() should be able to free() the returned string! */ 70 70 set_eval eval; 71 void *eval_data; 71 72 struct set *next; 72 73 } set_t; 73 74 74 75 /* Should be pretty clear. */ 75 set_t *set_add( set_t **head, c har *key,char *def, set_eval eval, void *data );76 set_t *set_add( set_t **head, const char *key, const char *def, set_eval eval, void *data ); 76 77 77 78 /* Returns the raw set_t. Might be useful sometimes. */ 78 set_t *set_find( set_t **head, c har *key );79 set_t *set_find( set_t **head, const char *key ); 79 80 80 81 /* Returns a pointer to the string value of this setting. Don't modify the 81 82 returned string, and don't free() it! */ 82 G_MODULE_EXPORT char *set_getstr( set_t **head, c har *key );83 G_MODULE_EXPORT char *set_getstr( set_t **head, const char *key ); 83 84 84 85 /* Get an integer. In previous versions set_getint() was also used to read 85 86 boolean values, but this SHOULD be done with set_getbool() now! */ 86 G_MODULE_EXPORT int set_getint( set_t **head, c har *key );87 G_MODULE_EXPORT int set_getbool( set_t **head, c har *key );87 G_MODULE_EXPORT int set_getint( set_t **head, const char *key ); 88 G_MODULE_EXPORT int set_getbool( set_t **head, const char *key ); 88 89 89 90 /* set_setstr() strdup()s the given value, so after using this function 90 91 you can free() it, if you want. */ 91 int set_setstr( set_t **head, c har *key, char *value );92 int set_setint( set_t **head, c har *key, int value );93 void set_del( set_t **head, c har *key );94 int set_reset( set_t **head, c har *key );92 int set_setstr( set_t **head, const char *key, char *value ); 93 int set_setint( set_t **head, const char *key, int value ); 94 void set_del( set_t **head, const char *key ); 95 int set_reset( set_t **head, const char *key ); 95 96 96 97 /* Two very useful generic evaluators. */ 97 98 char *set_eval_int( set_t *set, char *value ); 98 99 char *set_eval_bool( set_t *set, char *value ); 100 101 /* Another more complicated one. */ 102 char *set_eval_list( set_t *set, char *value ); 99 103 100 104 /* Some not very generic evaluators that really shouldn't be here... */ -
unix.c
r6e6b3d7 rec86b22 56 56 57 57 log_init(); 58 58 59 global.conf_file = g_strdup( CONF_FILE_DEF ); 59 60 global.conf = conf_load( argc, argv ); … … 62 63 63 64 b_main_init(); 64 nogaim_init();65 65 66 66 srand( time( NULL ) ^ getpid() ); 67 67 68 global.helpfile = g_strdup( HELP_FILE ); 69 if( help_init( &global.help, global.helpfile ) == NULL ) 70 log_message( LOGLVL_WARNING, "Error opening helpfile %s.", HELP_FILE ); 71 72 global.storage = storage_init( global.conf->primary_storage, global.conf->migrate_storage ); 73 if( global.storage == NULL ) 74 { 75 log_message( LOGLVL_ERROR, "Unable to load storage backend '%s'", global.conf->primary_storage ); 76 return( 1 ); 77 } 68 78 69 79 if( global.conf->runmode == RUNMODE_INETD ) … … 116 126 setuid( pw->pw_uid ); 117 127 } 118 }119 120 global.storage = storage_init( global.conf->primary_storage, global.conf->migrate_storage );121 if( global.storage == NULL )122 {123 log_message( LOGLVL_ERROR, "Unable to load storage backend '%s'", global.conf->primary_storage );124 return( 1 );125 128 } 126 129 … … 142 145 if( !getuid() || !geteuid() ) 143 146 log_message( LOGLVL_WARNING, "BitlBee is running with root privileges. Why?" ); 144 if( help_init( &global.help, global.helpfile ) == NULL )145 log_message( LOGLVL_WARNING, "Error opening helpfile %s.", HELP_FILE );146 147 147 148 b_main_run();
Note: See TracChangeset
for help on using the changeset viewer.