Changes in / [6398094:eda0270]
- Files:
-
- 30 added
- 22 deleted
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile
r6398094 reda0270 10 10 11 11 # Program variables 12 objects = account.o bitlbee.o conf.o crypting.o help.o i ni.o ipc.o irc.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o storage_text.o unix.o url.o user.o util.o12 objects = account.o bitlbee.o conf.o crypting.o help.o ipc.o irc.o irc_commands.o log.o nick.o query.o root_commands.o set.o storage.o $(STORAGE_OBJS) unix.o user.o 13 13 headers = account.h bitlbee.h commands.h conf.h config.h crypting.h help.h ini.h ipc.h irc.h log.h nick.h query.h set.h sock.h storage.h url.h user.h protocols/http_client.h protocols/md5.h protocols/nogaim.h protocols/proxy.h protocols/sha.h protocols/ssl_client.h 14 subdirs = protocols 14 subdirs = protocols lib 15 15 16 16 # Expansion of variables … … 42 42 43 43 distclean: clean $(subdirs) 44 rm -f Makefile.settings config.h 44 rm -f Makefile.settings config.h bitlbee.pc 45 45 find . -name 'DEADJOE' -o -name '*.orig' -o -name '*.rej' -o -name '*~' -exec rm -f {} \; 46 46 -
account.c
r6398094 reda0270 31 31 { 32 32 account_t *a; 33 set_t *s; 33 34 34 35 if( irc->accounts ) 35 36 { 36 37 for( a = irc->accounts; a->next; a = a->next ); 37 a = a->next = g_new0 38 a = a->next = g_new0( account_t, 1 ); 38 39 } 39 40 else … … 45 46 a->user = g_strdup( user ); 46 47 a->pass = g_strdup( pass ); 48 a->auto_connect = 1; 47 49 a->irc = irc; 48 50 51 s = set_add( &a->set, "auto_connect", "true", set_eval_account, a ); 52 s->flags |= ACC_SET_NOSAVE; 53 54 s = set_add( &a->set, "password", NULL, set_eval_account, a ); 55 s->flags |= ACC_SET_NOSAVE; 56 57 s = set_add( &a->set, "username", NULL, set_eval_account, a ); 58 s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; 59 set_setstr( &a->set, "username", user ); 60 61 a->nicks = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free ); 62 63 /* This function adds some more settings (and might want to do more 64 things that have to be done now, although I can't think of anything. */ 65 if( prpl->acc_init ) 66 prpl->acc_init( a ); 67 49 68 return( a ); 69 } 70 71 char *set_eval_account( set_t *set, char *value ) 72 { 73 account_t *acc = set->data; 74 75 /* Double-check: We refuse to edit on-line accounts. */ 76 if( set->flags & ACC_SET_OFFLINE_ONLY && acc->gc ) 77 return NULL; 78 79 if( strcmp( set->key, "username" ) == 0 ) 80 { 81 g_free( acc->user ); 82 acc->user = g_strdup( value ); 83 return value; 84 } 85 else if( strcmp( set->key, "password" ) == 0 ) 86 { 87 g_free( acc->pass ); 88 acc->pass = g_strdup( value ); 89 return NULL; /* password shouldn't be visible in plaintext! */ 90 } 91 else if( strcmp( set->key, "server" ) == 0 ) 92 { 93 g_free( acc->server ); 94 if( *value ) 95 acc->server = g_strdup( value ); 96 else 97 acc->server = NULL; 98 return value; 99 } 100 else if( strcmp( set->key, "auto_connect" ) == 0 ) 101 { 102 if( !is_bool( value ) ) 103 return NULL; 104 105 acc->auto_connect = bool2int( value ); 106 return value; 107 } 108 109 return NULL; 50 110 } 51 111 … … 68 128 for( a = irc->accounts; a; a = a->next ) 69 129 if( a->prpl == proto && 70 a->prpl-> cmp_buddynames( handle, a->user ) == 0 )130 a->prpl->handle_cmp( handle, a->user ) == 0 ) 71 131 ret = a; 72 132 } … … 129 189 } 130 190 191 while( a->set ) 192 set_del( &a->set, a->set->key ); 193 194 g_hash_table_destroy( a->nicks ); 195 131 196 g_free( a->user ); 132 197 g_free( a->pass ); … … 142 207 void account_on( irc_t *irc, account_t *a ) 143 208 { 144 struct aim_user *u;145 146 209 if( a->gc ) 147 210 { … … 152 215 cancel_auto_reconnect( a ); 153 216 154 u = g_new0 ( struct aim_user, 1 );155 u->irc = irc;156 u->prpl = a->prpl;157 strncpy( u->username, a->user, sizeof( u->username ) - 1 );158 strncpy( u->password, a->pass, sizeof( u->password ) - 1 );159 if( a->server) strncpy( u->proto_opt[0], a->server, sizeof( u->proto_opt[0] ) - 1 );160 161 a->gc = (struct gaim_connection *) u; /* Bit hackish :-/ */162 217 a->reconnect = 0; 163 164 a->prpl->login( u ); 218 a->prpl->login( a ); 165 219 } 166 220 -
account.h
r6398094 reda0270 34 34 char *server; 35 35 36 int auto_connect; 36 37 int reconnect; 38 39 set_t *set; 40 GHashTable *nicks; 37 41 38 42 struct irc *irc; … … 47 51 void account_off( irc_t *irc, account_t *a ); 48 52 53 char *set_eval_account( set_t *set, char *value ); 54 55 #define ACC_SET_NOSAVE 1 56 #define ACC_SET_OFFLINE_ONLY 2 57 #define ACC_SET_ONLINE_ONLY 4 58 49 59 #endif -
bitlbee.c
r6398094 reda0270 310 310 irc_t *irc; 311 311 312 /* Since we're fork()ing here, let's make sure we won't 313 get the same random numbers as the parent/siblings. */ 314 srand( time( NULL ) ^ getpid() ); 315 312 316 /* Close the listening socket, we're a client. */ 313 317 close( global.listen_socket ); -
bitlbee.h
r6398094 reda0270 124 124 #include "commands.h" 125 125 #include "account.h" 126 #include "nick.h" 126 127 #include "conf.h" 127 128 #include "log.h" … … 130 131 #include "query.h" 131 132 #include "sock.h" 132 #include " util.h"133 #include "misc.h" 133 134 #include "proxy.h" 134 135 -
conf.c
r6398094 reda0270 34 34 #include "ipc.h" 35 35 36 #include "pro tocols/proxy.h"36 #include "proxy.h" 37 37 38 38 char *CONF_FILE; … … 55 55 conf->nofork = 0; 56 56 conf->verbose = 0; 57 conf->primary_storage = "text"; 57 conf->primary_storage = "xml"; 58 conf->migrate_storage = g_strsplit( "text", ",", -1 ); 58 59 conf->runmode = RUNMODE_INETD; 59 60 conf->authmode = AUTHMODE_OPEN; … … 322 323 if( g_strcasecmp( ini->section, "defaults" ) == 0 ) 323 324 { 324 set_t *s = set_find( irc, ini->key );325 set_t *s = set_find( &irc->set, ini->key ); 325 326 326 327 if( s ) -
configure
r6398094 reda0270 31 31 32 32 events=glib 33 ldap=auto 33 34 ssl=auto 34 35 … … 66 67 67 68 --ipv6=0/1 IPv6 socket support $ipv6 69 70 --ldap=0/1/auto LDAP support $ldap 68 71 69 72 --events=... Event handler (glib, libevent) $events … … 141 144 fi 142 145 143 echo CFLAGS+=-I`pwd` -I`pwd`/ protocols -I. >> Makefile.settings146 echo CFLAGS+=-I`pwd` -I`pwd`/lib -I`pwd`/protocols -I. >> Makefile.settings 144 147 145 148 echo CFLAGS+=-DHAVE_CONFIG_H >> Makefile.settings 146 149 147 150 if [ -n "$CC" ]; then 148 echo "CC=$CC" >> Makefile.settings;151 CC=$CC 149 152 elif type gcc > /dev/null 2> /dev/null; then 150 echo "CC=gcc" >> Makefile.settings;153 CC=gcc 151 154 elif type cc > /dev/null 2> /dev/null; then 152 echo "CC=cc" >> Makefile.settings;155 CC=cc 153 156 else 154 157 echo 'Cannot find a C compiler, aborting.' 155 158 exit 1; 156 159 fi 160 161 echo "CC=$CC" >> Makefile.settings; 157 162 158 163 if [ -n "$LD" ]; then … … 232 237 } 233 238 234 if [ "$msn" = 1 -o "$jabber" = 1 ]; then 235 if [ "$ssl" = "auto" ]; then 236 detect_gnutls 237 if [ "$ret" = "0" ]; then 238 detect_nss 239 fi; 240 elif [ "$ssl" = "gnutls" ]; then 241 detect_gnutls; 242 elif [ "$ssl" = "nss" ]; then 243 detect_nss; 244 elif [ "$ssl" = "openssl" ]; then 239 detect_ldap() 240 { 241 TMPFILE=`mktemp` 242 if $CC -o $TMPFILE -shared -lldap 2>/dev/null >/dev/null; then 243 cat<<EOF>>Makefile.settings 244 EFLAGS+=-lldap 245 CFLAGS+= 246 EOF 247 ldap=1 248 rm -f $TMPFILE 249 ret=1 250 else 251 ldap=0 252 ret=0 253 fi 254 } 255 256 if [ "$ssl" = "auto" ]; then 257 detect_gnutls 258 if [ "$ret" = "0" ]; then 259 detect_nss 260 fi 261 elif [ "$ssl" = "gnutls" ]; then 262 detect_gnutls 263 elif [ "$ssl" = "nss" ]; then 264 detect_nss 265 elif [ "$ssl" = "openssl" ]; then 266 echo 267 echo 'No detection code exists for OpenSSL. Make sure that you have a complete' 268 echo 'install of OpenSSL (including devel/header files) before reporting' 269 echo 'compilation problems.' 270 echo 271 echo 'Also, keep in mind that the OpenSSL is, according to some people, not' 272 echo 'completely GPL-compatible. Using GnuTLS or NSS is recommended and better' 273 echo 'supported by us. However, on many BSD machines, OpenSSL can be considered' 274 echo 'part of the operating system, which makes it GPL-compatible.' 275 echo 276 echo 'For more info, see: http://www.openssl.org/support/faq.html#LEGAL2' 277 echo ' http://www.gnome.org/~markmc/openssl-and-the-gpl.html' 278 echo 279 echo 'Please note that distributing a BitlBee binary which links to OpenSSL is' 280 echo 'probably illegal. If you want to create and distribute a binary BitlBee' 281 echo 'package, you really should use GnuTLS or NSS instead.' 282 echo 283 echo 'Also, the OpenSSL license requires us to say this:' 284 echo ' * "This product includes software developed by the OpenSSL Project' 285 echo ' * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"' 286 287 echo 'EFLAGS+=-lssl -lcrypto' >> Makefile.settings 288 289 ret=1 290 elif [ "$ssl" = "bogus" ]; then 291 echo 292 echo 'Using bogus SSL code. This means some features have to be disabled.' 293 294 ## Yes, you, at the console! How can you authenticate if you don't have any SSL!? 295 if [ "$msn" = "1" ]; then 245 296 echo 246 echo 'No detection code exists for OpenSSL. Make sure that you have a complete' 247 echo 'install of OpenSSL (including devel/header files) before reporting' 248 echo 'compilation problems.' 249 echo 250 echo 'Also, keep in mind that the OpenSSL is, according to some people, not' 251 echo 'completely GPL-compatible. Using GnuTLS or NSS is recommended and better' 252 echo 'supported by us. However, on many BSD machines, OpenSSL can be considered' 253 echo 'part of the operating system, which makes it GPL-compatible.' 254 echo 255 echo 'For more info, see: http://www.openssl.org/support/faq.html#LEGAL2' 256 echo ' http://www.gnome.org/~markmc/openssl-and-the-gpl.html' 257 echo 258 echo 'Please note that distributing a BitlBee binary which links to OpenSSL is' 259 echo 'probably illegal. If you want to create and distribute a binary BitlBee' 260 echo 'package, you really should use GnuTLS or NSS instead.' 261 echo 262 echo 'Also, the OpenSSL license requires us to say this:' 263 echo ' * "This product includes software developed by the OpenSSL Project' 264 echo ' * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"' 265 266 echo 'EFLAGS+=-lssl -lcrypto' >> Makefile.settings 267 268 ret=1; 269 elif [ "$ssl" = "bogus" ]; then 270 echo 271 echo 'Using bogus SSL code. This will not make the MSN module work, but it will' 272 echo 'allow you to use the Jabber module - although without working SSL support.' 273 274 ret=1; 275 else 276 echo 277 echo 'ERROR: Unknown SSL library specified.' 278 exit 1; 279 fi 280 281 if [ "$ret" = "0" ]; then 282 echo 283 echo 'ERROR: Could not find a suitable SSL library (GnuTLS, libnss or OpenSSL).' 284 echo ' This is necessary for MSN and full Jabber support. To continue,' 285 echo ' install a suitable SSL library or disable MSN support (--msn=0).' 286 echo ' If you want Jabber without SSL support you can try --ssl=bogus.' 287 288 exit 1; 289 fi; 290 291 echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings 292 fi 297 echo 'Real SSL support is necessary for MSN authentication, will build without' 298 echo 'MSN protocol support.' 299 msn=0 300 fi 301 302 ret=1 303 else 304 echo 305 echo 'ERROR: Unknown SSL library specified.' 306 exit 1 307 fi 308 309 if [ "$ret" = "0" ]; then 310 echo 311 echo 'ERROR: Could not find a suitable SSL library (GnuTLS, libnss or OpenSSL).' 312 echo ' Please note that this script doesn'\''t have detection code for OpenSSL,' 313 echo ' so if you want to use that, you have to select it by hand. If you don'\''t' 314 echo ' need SSL support, you can select the "bogus" SSL library. (--ssl=bogus)' 315 316 exit 1 317 fi; 318 319 echo 'SSL_CLIENT=ssl_'$ssl'.o' >> Makefile.settings 320 321 STORAGES="text xml" 322 323 if [ "$ldap" = "auto" ]; then 324 detect_ldap 325 fi 326 327 if [ "$ldap" = 0 ]; then 328 echo "#undef WITH_LDAP" >> config.h 329 elif [ "$ldap" = 1 ]; then 330 echo "#define WITH_LDAP 1" >> config.h 331 STORAGES="$STORAGES ldap" 332 fi 333 334 for i in $STORAGES; do 335 STORAGE_OBJS="$STORAGE_OBJS storage_$i.o" 336 done 337 echo "STORAGE_OBJS="$STORAGE_OBJS >> Makefile.settings 293 338 294 339 if [ "$strip" = 0 ]; then … … 304 349 elif type strip > /dev/null 2> /dev/null; then 305 350 echo "STRIP=strip" >> Makefile.settings; 306 elif /bin/test -x /usr/ccs/bin/strip; then307 echo "STRIP=/usr/ccs/bin/strip" >> Makefile.settings;308 351 else 309 352 echo … … 384 427 if [ "$protocols" = "PROTOCOLS = " ]; then 385 428 echo "WARNING: You haven't selected any communication protocol to compile!" 386 echo " Bitl bee will run, but you will be unable to connect to IM servers!"429 echo " BitlBee will run, but you will be unable to connect to IM servers!" 387 430 fi 388 431 … … 419 462 420 463 if [ "$debug" = "1" ]; then 421 echo ' Debugging enabled.' ;422 else 423 echo ' Debugging disabled.' ;464 echo ' Debugging enabled.' 465 else 466 echo ' Debugging disabled.' 424 467 fi 425 468 426 469 if [ "$strip" = "1" ]; then 427 echo ' Binary stripping enabled.'; 428 else 429 echo ' Binary stripping disabled.'; 430 fi 431 432 echo ' Using event handler: '$events; 433 echo ' Using SSL library: '$ssl; 434 435 #if [ "$flood" = "0" ]; then 436 # echo ' Flood protection disabled.'; 437 #else 438 # echo ' Flood protection enabled.'; 439 #fi 470 echo ' Binary stripping enabled.' 471 else 472 echo ' Binary stripping disabled.' 473 fi 474 475 echo ' Using event handler: '$events 476 echo ' Using SSL library: '$ssl 477 echo ' Building with these storage backends: '$STORAGES 440 478 441 479 if [ -n "$protocols" ]; then 442 echo ' Building with these protocols:' $protocols ;443 else 444 echo ' Building without IM-protocol support. We wish you a lot of fun...' ;445 fi 480 echo ' Building with these protocols:' $protocols 481 else 482 echo ' Building without IM-protocol support. We wish you a lot of fun...' 483 fi -
doc/user-guide/commands.xml
r6398094 reda0270 11 11 12 12 <para> 13 Available actions: add, del, list, on, off . See <emphasis>help account <action></emphasis> for more information.13 Available actions: add, del, list, on, off and set. See <emphasis>help account <action></emphasis> for more information. 14 14 </para> 15 15 … … 26 26 27 27 <bitlbee-command name="jabber"> 28 <syntax>account add jabber <handle > <password> [<servertag>]</syntax>28 <syntax>account add jabber <handle@server.tld> <password> [<servertag>]</syntax> 29 29 30 30 <description> 31 31 <para> 32 Note that the servertag argument is optional. You only have to use it if the part after the @ in your handle isn't the hostname of your Jabber server, or if you want to use SSL/connect to a non-standard port number. The format is simple: [<servername>[:<portnumber>][:ssl]]. For example, this is how you can connect to Google Talk: 32 Note that the servertag argument is optional. You only have to use it if the part after the @ in your handle isn't the hostname of your Jabber server, or if you want to use SSL/connect to a non-standard port number. The format is simple: [<servername>[:<portnumber>][:ssl]]. 33 </para> 34 </description> 35 36 <description> 37 <para> 38 Google Talk uses the Jabber protocol. Please note that Google talk is SSL-only, but officially reachable over both port 5222 and 5223. Usually BitlBee users have to connect via port 5223, for example like this: 33 39 </para> 34 40 </description> … … 38 44 <ircline nick="root">Account successfully added</ircline> 39 45 </ircexample> 40 41 <description>42 <para>43 Note that Google talk is SSL-only, but officially reachable over both port 5222 and 5223. However, for some people only port 5222 works, for some people only 5223. This is something you'll have to try out.44 </para>45 </description>46 46 </bitlbee-command> 47 47 48 48 <bitlbee-command name="msn"> 49 <syntax>account add msn <handle > <password></syntax>49 <syntax>account add msn <handle@server.tld> <password></syntax> 50 50 51 51 <description> … … 103 103 <description> 104 104 <para> 105 This command will try to log into the specified account. If no account is specified, BitlBee will log into all the accounts . (Including accounts awaiting a reconnection)105 This command will try to log into the specified account. If no account is specified, BitlBee will log into all the accounts that have the auto_connect flag set. 106 106 </para> 107 107 … … 118 118 <description> 119 119 <para> 120 This command disconnects the connection for the specified account. If no account is specified, BitlBee will deactivate all active accounts . (Including accounts awaiting a reconnection)120 This command disconnects the connection for the specified account. If no account is specified, BitlBee will deactivate all active accounts and cancel all pending reconnects. 121 121 </para> 122 122 … … 133 133 <para> 134 134 This command gives you a list of all the accounts known by BitlBee, including the numbers you'll need for most account commands. 135 </para> 136 </description> 137 </bitlbee-command> 138 139 <bitlbee-command name="set"> 140 <syntax>account set <account id></syntax> 141 <syntax>account set <account id>/<setting></syntax> 142 <syntax>account set <account id>/<setting> <value></syntax> 143 144 <description> 145 <para> 146 This account can be used to change various settings for IM accounts. For all protocols, this command can be used to change the handle or the password BitlBee uses to log in and if it should be logged in automatically. Some protocols have additional settings. You can see the settings available for a connection by typing <emphasis>account set <account id></emphasis>. 147 </para> 148 149 <para> 150 For more infomation about a setting, see <emphasis>help set <setting></emphasis>. 151 </para> 152 153 <para> 154 The account ID can be a number (see <emphasis>account list</emphasis>), the protocol name or (part of) the screenname, as long as it matches only one connection. 135 155 </para> 136 156 </description> … … 276 296 </bitlbee-command> 277 297 298 <bitlbee-setting name="auto_connect" type="boolean"> 299 <default>True</default> 300 301 <description> 302 <para> 303 With this option enabled, when you identify BitlBee will automatically connect to your accounts, with this disabled it will not do this. 304 </para> 305 306 <para> 307 This setting can also be changed for specific accounts using the <emphasis>account set</emphasis> command. (However, these values will be ignored if the global <emphasis>auto_connect</emphasis> setting is disabled!) 308 </para> 309 </description> 310 </bitlbee-setting> 311 312 <bitlbee-setting name="auto_reconnect" type="boolean"> 313 <default>False</default> 314 315 <description> 316 <para> 317 If an IM-connections breaks, you're supposed to bring it back up yourself. Having BitlBee do this automatically might not always be a good idea, for several reasons. If you want the connections to be restored automatically, you can enable this setting. 318 </para> 319 320 <para> 321 See also the <emphasis>auto_reconnect_delay</emphasis> setting. 322 </para> 323 </description> 324 325 </bitlbee-setting> 326 327 <bitlbee-setting name="auto_reconnect_delay" type="integer"> 328 <default>300</default> 329 330 <description> 331 <para> 332 Tell BitlBee after how many seconds it should attempt to bring an IM-connection back up after a crash. It's not a good idea to set this value very low, it will cause too much useless traffic when an IM-server is down for a few hours. 333 </para> 334 335 <para> 336 See also the <emphasis>auto_reconnect</emphasis> setting. 337 </para> 338 </description> 339 </bitlbee-setting> 340 341 <bitlbee-setting name="away_devoice" type="boolean"> 342 <default>True</default> 343 344 <description> 345 <para> 346 With this option enabled, the root user devoices people when they go away (just away, not offline) and gives the voice back when they come back. You might dislike the voice-floods you'll get if your contact list is huge, so this option can be disabled. 347 </para> 348 </description> 349 </bitlbee-setting> 350 351 <bitlbee-setting name="buddy_sendbuffer" type="boolean"> 352 <default>False</default> 353 354 <description> 355 <para> 356 By default, when you send a message to someone, BitlBee forwards this message to the user immediately. When you paste a large number of lines, the lines will be sent in separate messages, which might not be very nice to read. If you enable this setting, BitlBee will buffer your messages and wait for more data. 357 </para> 358 359 <para> 360 Using the <emphasis>buddy_sendbuffer_delay</emphasis> setting you can specify the number of seconds BitlBee should wait for more data before the complete message is sent. 361 </para> 362 363 <para> 364 Please note that if you remove a buddy from your list (or if the connection to that user drops) and there's still data in the buffer, this data will be lost. BitlBee will not try to send the message to the user in those cases. 365 </para> 366 </description> 367 </bitlbee-setting> 368 369 <bitlbee-setting name="buddy_sendbuffer_delay" type="integer"> 370 <default>200</default> 371 372 <description> 373 374 <para> 375 Tell BitlBee after how many (mili)seconds a buffered message should be sent. Values greater than 5 will be interpreted as miliseconds, 5 and lower as seconds. 376 </para> 377 378 <para> 379 See also the <emphasis>buddy_sendbuffer</emphasis> setting. 380 </para> 381 </description> 382 </bitlbee-setting> 383 278 384 <bitlbee-setting name="charset" type="string"> 279 385 <default>iso8859-1</default> … … 292 398 </bitlbee-setting> 293 399 294 <bitlbee-setting name="private" type="boolean">295 <default>True</default>296 297 <description>298 299 <para>300 If value is true, messages from users will appear in separate query windows. If false, messages from users will appear in the control channel.301 </para>302 303 <para>304 This setting is remembered (during one session) per-user, this setting only changes the default state. This option takes effect as soon as you reconnect.305 </para>306 </description>307 </bitlbee-setting>308 309 <bitlbee-setting name="save_on_quit" type="boolean">310 <default>True</default>311 312 <description>313 <para>314 If enabled causes BitlBee to save all current settings and account details when user disconnects. This is enabled by default, and these days there's not really a reason to have it disabled anymore.315 </para>316 </description>317 </bitlbee-setting>318 319 <bitlbee-setting name="strip_html" type="boolean">320 <default>True</default>321 322 <description>323 <para>324 Determines what BitlBee should do with HTML in messages. Normally this is turned on and HTML will be stripped from messages, if BitlBee thinks there is HTML.325 </para>326 <para>327 If BitlBee fails to detect this sometimes (most likely in AIM messages over an ICQ connection), you can set this setting to <emphasis>always</emphasis>, but this might sometimes accidentally strip non-HTML things too.328 </para>329 </description>330 </bitlbee-setting>331 332 400 <bitlbee-setting name="debug" type="boolean"> 333 401 <default>False</default> … … 340 408 </bitlbee-setting> 341 409 342 <bitlbee-setting name="to_char" type="string"> 343 <default>": "</default> 344 345 <description> 346 347 <para> 348 It's customary that messages meant for one specific person on an IRC channel are prepended by his/her alias followed by a colon ':'. BitlBee does this by default. If you prefer a different character, you can set it using <emphasis>set to_char</emphasis>. 349 </para> 350 351 <para> 352 Please note that this setting is only used for incoming messages. For outgoing messages you can use ':' (colon) or ',' to separate the destination nick from the message, and this is not configurable. 353 </para> 354 </description> 355 </bitlbee-setting> 356 357 <bitlbee-setting name="typing_notice" type="boolean"> 410 <bitlbee-setting name="default_target" type="string"> 411 <default>root</default> 412 <possible-values>root, last</possible-values> 413 414 <description> 415 <para> 416 With this value set to <emphasis>root</emphasis>, lines written in the control channel without any nickname in front of them will be interpreted as commands. If you want BitlBee to send those lines to the last person you addressed in the control channel, set this to <emphasis>last</emphasis>. 417 </para> 418 </description> 419 </bitlbee-setting> 420 421 <bitlbee-setting name="display_name" type="string"> 422 <description> 423 <para> 424 Currently only available for MSN connections. This setting allows you to read and change your "friendly name" for this connection. Since this is a server-side setting, it can't be changed when the account is off-line. 425 </para> 426 </description> 427 </bitlbee-setting> 428 429 <bitlbee-setting name="display_namechanges" type="boolean"> 358 430 <default>False</default> 359 431 360 <description> 361 <para> 362 Sends you a /notice when a user starts typing a message (if the protocol supports it, MSN for example). This is a bug, not a feature. (But please don't report it.. ;-) You don't want to use it. Really. In fact the typing-notification is just one of the least useful 'innovations' ever. It's just there because some guy will probably ask me about it anyway. ;-) 363 </para> 364 </description> 365 </bitlbee-setting> 366 367 <bitlbee-setting name="ops" type="string"> 368 <default>both</default> 369 <possible-values>both, root, user, none</possible-values> 370 371 <description> 372 <para> 373 Some people prefer themself and root to have operator status in &bitlbee, other people don't. You can change these states using this setting. 374 </para> 375 376 <para> 377 The value "both" means both user and root get ops. "root" means, well, just root. "user" means just the user. "none" means nobody will get operator status. 378 </para> 379 </description> 380 </bitlbee-setting> 381 382 <bitlbee-setting name="away_devoice" type="boolean"> 383 <default>True</default> 384 385 <description> 386 <para> 387 With this option enabled, the root user devoices people when they go away (just away, not offline) and gives the voice back when they come back. You might dislike the voice-floods you'll get if your contact list is huge, so this option can be disabled. 388 </para> 389 </description> 432 <para> 433 With this option enabled, root will inform you when someone in your buddy list changes his/her "friendly name". 434 </para> 390 435 </bitlbee-setting> 391 436 … … 417 462 </bitlbee-setting> 418 463 419 <bitlbee-setting name=" auto_connect" type="boolean">464 <bitlbee-setting name="lcnicks" type="boolean"> 420 465 <default>True</default> 421 466 422 467 <description> 423 468 <para> 424 With this option enabled, when you identify BitlBee will automatically connect to your accounts, with this disabled it will not do this. 425 </para> 426 </description> 427 </bitlbee-setting> 428 429 <bitlbee-setting name="auto_reconnect" type="boolean"> 430 <default>False</default> 431 432 <description> 433 <para> 434 If an IM-connections breaks, you're supposed to bring it back up yourself. Having BitlBee do this automatically might not always be a good idea, for several reasons. If you want the connections to be restored automatically, you can enable this setting. 435 </para> 436 437 <para> 438 See also the <emphasis>auto_reconnect_delay</emphasis> setting. 439 </para> 440 </description> 441 442 </bitlbee-setting> 443 444 <bitlbee-setting name="auto_reconnect_delay" type="integer"> 445 <default>300</default> 446 447 <description> 448 449 <para> 450 Tell BitlBee after how many seconds it should attempt to bring an IM-connection back up after a crash. It's not a good idea to set this value very low, it will cause too much useless traffic when an IM-server is down for a few hours. 451 </para> 452 453 <para> 454 See also the <emphasis>auto_reconnect</emphasis> setting. 455 </para> 456 </description> 457 </bitlbee-setting> 458 459 <bitlbee-setting name="buddy_sendbuffer" type="boolean"> 460 <default>False</default> 461 462 <description> 463 464 <para> 465 By default, when you send a message to someone, BitlBee forwards this message to the user immediately. When you paste a large number of lines, the lines will be sent in separate messages, which might not be very nice to read. If you enable this setting, BitlBee will buffer your messages and wait for more data. 466 </para> 467 468 <para> 469 Using the <emphasis>buddy_sendbuffer_delay</emphasis> setting you can specify the number of seconds BitlBee should wait for more data before the complete message is sent. 470 </para> 471 472 <para> 473 Please note that if you remove a buddy from your list (or if the connection to that user drops) and there's still data in the buffer, this data will be lost. BitlBee will not try to send the message to the user in those cases. 474 </para> 475 </description> 476 477 </bitlbee-setting> 478 479 <bitlbee-setting name="buddy_sendbuffer_delay" type="integer"> 480 <default>200</default> 481 482 <description> 483 484 <para> 485 Tell BitlBee after how many (mili)seconds a buffered message should be sent. Values greater than 5 will be interpreted as miliseconds, 5 and lower as seconds. 486 </para> 487 488 <para> 489 See also the <emphasis>buddy_sendbuffer</emphasis> setting. 490 </para> 491 </description> 492 493 </bitlbee-setting> 494 495 <bitlbee-setting name="default_target" type="string"> 496 <default>root</default> 497 <possible-values>root, last</possible-values> 498 499 <description> 500 <para> 501 With this value set to <emphasis>root</emphasis>, lines written in the control channel without any nickname in front of them will be interpreted as commands. If you want BitlBee to send those lines to the last person you addressed in the control channel, set this to <emphasis>last</emphasis>. 502 </para> 503 </description> 504 505 </bitlbee-setting> 506 507 <bitlbee-setting name="display_namechanges" type="boolean"> 508 <default>False</default> 509 510 <para> 511 With this option enabled, root will inform you when someone in your buddy list changes his/her "friendly name". 512 </para> 469 Hereby you can change whether you want all lower case nick names or leave the case as it intended by your peer. 470 </para> 471 </description> 472 473 </bitlbee-setting> 474 475 <bitlbee-setting name="ops" type="string"> 476 <default>both</default> 477 <possible-values>both, root, user, none</possible-values> 478 479 <description> 480 <para> 481 Some people prefer themself and root to have operator status in &bitlbee, other people don't. You can change these states using this setting. 482 </para> 483 484 <para> 485 The value "both" means both user and root get ops. "root" means, well, just root. "user" means just the user. "none" means nobody will get operator status. 486 </para> 487 </description> 513 488 </bitlbee-setting> 514 489 … … 516 491 <description> 517 492 <para> 518 Use this setting to change your "NickServ" password. 493 Use this global setting to change your "NickServ" password. 494 </para> 495 496 <para> 497 This setting is also available for all IM accounts to change the password BitlBee uses to connect to the service. 498 </para> 499 500 <para> 501 Note that BitlBee will always say this setting is empty. This doesn't mean there is no password, it just means that, for security reasons, BitlBee stores passwords somewhere else so they can't just be retrieved in plain text. 502 </para> 503 </description> 504 </bitlbee-setting> 505 506 <bitlbee-setting name="port" type="integer"> 507 <description> 508 <para> 509 Currently only available for Jabber connections. Specifies the port number to connect to. Usually this should be set to 5222, or 5223 for SSL-connections. 510 </para> 511 </description> 512 </bitlbee-setting> 513 514 <bitlbee-setting name="private" type="boolean"> 515 <default>True</default> 516 517 <description> 518 <para> 519 If value is true, messages from users will appear in separate query windows. If false, messages from users will appear in the control channel. 520 </para> 521 522 <para> 523 This setting is remembered (during one session) per-user, this setting only changes the default state. This option takes effect as soon as you reconnect. 519 524 </para> 520 525 </description> … … 536 541 </bitlbee-setting> 537 542 538 <bitlbee-setting name="lcnicks" type="boolean"> 543 <bitlbee-setting name="resource" type="string"> 544 <default>BitlBee</default> 545 546 <description> 547 <para> 548 Can be set for Jabber connections. You can use this to connect to your Jabber account from multiple clients at once, with every client using a different resource string. 549 </para> 550 </description> 551 </bitlbee-setting> 552 553 <bitlbee-setting name="save_on_quit" type="boolean"> 539 554 <default>True</default> 540 555 541 556 <description> 542 557 <para> 543 Hereby you can change whether you want all lower case nick names or leave the case as it intended by your peer. 544 </para> 545 </description> 546 558 If enabled causes BitlBee to save all current settings and account details when user disconnects. This is enabled by default, and these days there's not really a reason to have it disabled anymore. 559 </para> 560 </description> 561 </bitlbee-setting> 562 563 <bitlbee-setting name="server" type="string"> 564 <description> 565 <para> 566 Can be set for Jabber- and OSCAR-connections. For OSCAR, this must be set to <emphasis>login.icq.com</emphasis> if it's an ICQ connection, or <emphasis>login.oscar.aol.com</emphasis> if it's an AIM connection. For Jabber, you have to set this if the servername isn't equal to the part after the @ in the Jabber handle. 567 </para> 568 </description> 569 </bitlbee-setting> 570 571 <bitlbee-setting name="ssl" type="boolean"> 572 <default>False</default> 573 574 <description> 575 <para> 576 Currently only available for Jabber connections. Set this to true if the server accepts SSL connections. 577 </para> 578 </description> 579 </bitlbee-setting> 580 581 <bitlbee-setting name="strip_html" type="boolean"> 582 <default>True</default> 583 584 <description> 585 <para> 586 Determines what BitlBee should do with HTML in messages. Normally this is turned on and HTML will be stripped from messages, if BitlBee thinks there is HTML. 587 </para> 588 <para> 589 If BitlBee fails to detect this sometimes (most likely in AIM messages over an ICQ connection), you can set this setting to <emphasis>always</emphasis>, but this might sometimes accidentally strip non-HTML things too. 590 </para> 591 </description> 592 </bitlbee-setting> 593 594 <bitlbee-setting name="to_char" type="string"> 595 <default>": "</default> 596 597 <description> 598 <para> 599 It's customary that messages meant for one specific person on an IRC channel are prepended by his/her alias followed by a colon ':'. BitlBee does this by default. If you prefer a different character, you can set it using <emphasis>set to_char</emphasis>. 600 </para> 601 602 <para> 603 Please note that this setting is only used for incoming messages. For outgoing messages you can use ':' (colon) or ',' to separate the destination nick from the message, and this is not configurable. 604 </para> 605 </description> 606 </bitlbee-setting> 607 608 <bitlbee-setting name="typing_notice" type="boolean"> 609 <default>False</default> 610 611 <description> 612 <para> 613 Sends you a /notice when a user starts typing a message (if the protocol supports it, MSN for example). This is a bug, not a feature. (But please don't report it.. ;-) You don't want to use it. Really. In fact the typing-notification is just one of the least useful 'innovations' ever. It's just there because some guy will probably ask me about it anyway. ;-) 614 </para> 615 </description> 547 616 </bitlbee-setting> 548 617 -
doc/user-guide/help.xsl
r6398094 reda0270 7 7 version="1.1"> 8 8 9 <xsl:output method="text" encoding=" iso-8859-1" standalone="yes"/>9 <xsl:output method="text" encoding="utf-8" standalone="yes"/> 10 10 <xsl:strip-space elements="*"/> 11 11 -
irc.c
r6398094 reda0270 33 33 GSList *irc_connection_list = NULL; 34 34 35 static char *passchange (irc_t *irc, void *set, char *value) 36 { 37 irc_setpass (irc, value); 38 return (NULL); 35 static char *passchange( irc_t *irc, void *set, char *value ) 36 { 37 irc_setpass( irc, value ); 38 irc_usermsg( irc, "Password successfully changed" ); 39 return NULL; 39 40 } 40 41 … … 123 124 irc_connection_list = g_slist_append( irc_connection_list, irc ); 124 125 125 set_add( irc, "away_devoice", "true", set_eval_away_devoice);126 set_add( irc, "auto_connect", "true", set_eval_bool);127 set_add( irc, "auto_reconnect", "false", set_eval_bool);128 set_add( irc, "auto_reconnect_delay", "300", set_eval_int);129 set_add( irc, "buddy_sendbuffer", "false", set_eval_bool);130 set_add( irc, "buddy_sendbuffer_delay", "200", set_eval_int);131 set_add( irc, "charset", "iso8859-1", set_eval_charset);132 set_add( irc, "debug", "false", set_eval_bool);133 set_add( irc, "default_target", "root", NULL);134 set_add( irc, "display_namechanges", "false", set_eval_bool);135 set_add( irc, "handle_unknown", "root", NULL);136 set_add( irc, "lcnicks", "true", set_eval_bool);137 set_add( irc, "ops", "both", set_eval_ops);138 set_add( irc, "private", "true", set_eval_bool);139 set_add( irc, "query_order", "lifo", NULL);140 set_add( irc, "save_on_quit", "true", set_eval_bool);141 set_add( irc, "strip_html", "true", NULL);142 set_add( irc, "to_char", ": ", set_eval_to_char);143 set_add( irc, "typing_notice", "false", set_eval_bool);144 set_add( irc, "password", NULL, passchange);126 set_add( &irc->set, "away_devoice", "true", set_eval_away_devoice, irc ); 127 set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc ); 128 set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc ); 129 set_add( &irc->set, "auto_reconnect_delay", "300", set_eval_int, irc ); 130 set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc ); 131 set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc ); 132 set_add( &irc->set, "charset", "iso8859-1", set_eval_charset, irc ); 133 set_add( &irc->set, "debug", "false", set_eval_bool, irc ); 134 set_add( &irc->set, "default_target", "root", NULL, irc ); 135 set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc ); 136 set_add( &irc->set, "handle_unknown", "root", NULL, irc ); 137 set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc ); 138 set_add( &irc->set, "ops", "both", set_eval_ops, irc ); 139 set_add( &irc->set, "password", NULL, passchange, irc ); 140 set_add( &irc->set, "private", "true", set_eval_bool, irc ); 141 set_add( &irc->set, "query_order", "lifo", NULL, irc ); 142 set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc ); 143 set_add( &irc->set, "strip_html", "true", NULL, irc ); 144 set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc ); 145 set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc ); 145 146 146 147 conf_loaddefaults( irc ); … … 206 207 void irc_free(irc_t * irc) 207 208 { 208 account_t *account , *accounttmp;209 account_t *account; 209 210 user_t *user, *usertmp; 210 nick_t *nick, *nicktmp;211 211 help_t *helpnode, *helpnodetmp; 212 set_t *setnode, *setnodetmp;213 212 214 213 log_message( LOGLVL_INFO, "Destroying connection with fd %d", irc->fd ); 215 214 216 if( irc->status & USTATUS_IDENTIFIED && set_getint( irc, "save_on_quit" ) )215 if( irc->status & USTATUS_IDENTIFIED && set_getint( &irc->set, "save_on_quit" ) ) 217 216 if( storage_save( irc, TRUE ) != STORAGE_OK ) 218 217 irc_usermsg( irc, "Error while saving settings!" ); … … 254 253 query_del(irc, irc->queries); 255 254 256 if (irc->accounts != NULL) { 257 account = irc->accounts; 258 while (account != NULL) { 259 g_free(account->user); 260 g_free(account->pass); 261 g_free(account->server); 262 accounttmp = account; 263 account = account->next; 264 g_free(accounttmp); 265 } 266 } 255 while (irc->accounts) 256 account_del(irc, irc->accounts); 257 258 while (irc->set) 259 set_del(&irc->set, irc->set->key); 267 260 268 261 if (irc->users != NULL) { … … 289 282 g_hash_table_destroy(irc->watches); 290 283 291 if (irc->nicks != NULL) {292 nick = irc->nicks;293 while (nick != NULL) {294 g_free(nick->nick);295 g_free(nick->handle);296 297 nicktmp = nick;298 nick = nick->next;299 g_free(nicktmp);300 }301 }302 284 if (irc->help != NULL) { 303 285 helpnode = irc->help; … … 310 292 } 311 293 } 312 if (irc->set != NULL) {313 setnode = irc->set;314 while (setnode != NULL) {315 g_free(setnode->key);316 g_free(setnode->def);317 g_free(setnode->value);318 319 setnodetmp = setnode;320 setnode = setnode->next;321 g_free(setnodetmp);322 }323 }324 294 g_free(irc); 325 295 … … 332 302 void irc_setpass (irc_t *irc, const char *pass) 333 303 { 334 if (irc->password)g_free (irc->password);304 g_free (irc->password); 335 305 336 306 if (pass) { 337 307 irc->password = g_strdup (pass); 338 irc_usermsg (irc, "Password successfully changed");339 308 } else { 340 309 irc->password = NULL; … … 367 336 } 368 337 369 if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )338 if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 370 339 { 371 340 conv[IRC_MAX_LINE] = 0; … … 587 556 588 557 strip_newlines( line ); 589 if( ( cs = set_getstr( irc, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )558 if( ( cs = set_getstr( &irc->set, "charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 590 559 { 591 560 char conv[IRC_MAX_LINE+1]; … … 670 639 } 671 640 672 if( u->gc && !u->away && set_get int( irc, "away_devoice" ) )641 if( u->gc && !u->away && set_getbool( &irc->set, "away_devoice" ) ) 673 642 strcat( namelist, "+" ); 674 643 else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) || … … 683 652 { 684 653 GList *l; 654 char *ops = set_getstr( &irc->set, "ops" ); 685 655 686 656 /* root and the user aren't in the channel userlist but should … … 930 900 { 931 901 char *nick, *s; 932 char reason[ 64];902 char reason[128]; 933 903 934 904 if( u->gc && u->gc->flags & OPT_LOGGING_OUT ) 935 905 { 936 if( u->gc-> user->proto_opt[0][0])906 if( u->gc->acc->server ) 937 907 g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost, 938 u->gc-> user->proto_opt[0]);908 u->gc->acc->server ); 939 909 else if( ( s = strchr( u->gc->username, '@' ) ) ) 940 910 g_snprintf( reason, sizeof( reason ), "%s %s", irc->myhost, … … 942 912 else 943 913 g_snprintf( reason, sizeof( reason ), "%s %s.%s", irc->myhost, 944 u->gc-> prpl->name, irc->myhost );914 u->gc->acc->prpl->name, irc->myhost ); 945 915 946 916 /* proto_opt might contain garbage after the : */ … … 1018 988 else if( g_strncasecmp( s + 1, "TYPING", 6 ) == 0 ) 1019 989 { 1020 if( u && u->gc && u->gc-> prpl->send_typing && strlen( s ) >= 10 )990 if( u && u->gc && u->gc->acc->prpl->send_typing && strlen( s ) >= 10 ) 1021 991 { 1022 992 time_t current_typing_notice = time( NULL ); … … 1024 994 if( current_typing_notice - u->last_typing_notice >= 5 ) 1025 995 { 1026 u->gc-> prpl->send_typing( u->gc, u->handle, s[8] == '1' );996 u->gc->acc->prpl->send_typing( u->gc, u->handle, s[8] == '1' ); 1027 997 u->last_typing_notice = current_typing_notice; 1028 998 } … … 1057 1027 } 1058 1028 } 1059 else if( c && c->gc && c->gc-> prpl )1029 else if( c && c->gc && c->gc->acc && c->gc->acc->prpl ) 1060 1030 { 1061 1031 return( bim_chat_msg( c->gc, c->id, s ) ); … … 1089 1059 if( !u || !u->gc ) return; 1090 1060 1091 if( set_getint( irc, "buddy_sendbuffer" ) && set_getint( irc, "buddy_sendbuffer_delay" ) > 0 )1061 if( set_getint( &irc->set, "buddy_sendbuffer" ) && set_getint( &irc->set, "buddy_sendbuffer_delay" ) > 0 ) 1092 1062 { 1093 1063 int delay; … … 1116 1086 strcat( u->sendbuf, "\n" ); 1117 1087 1118 delay = set_getint( irc, "buddy_sendbuffer_delay" );1088 delay = set_getint( &irc->set, "buddy_sendbuffer_delay" ); 1119 1089 if( delay <= 5 ) 1120 1090 delay *= 1000; … … 1181 1151 int len = strlen( irc->nick) + 3; 1182 1152 prefix = g_new (char, len ); 1183 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( irc, "to_char" ) );1153 g_snprintf( prefix, len, "%s%s", irc->nick, set_getstr( &irc->set, "to_char" ) ); 1184 1154 prefix[len-1] = 0; 1185 1155 } -
irc.h
r6398094 reda0270 98 98 99 99 #include "user.h" 100 #include "nick.h"100 // #include "nick.h" 101 101 102 102 extern GSList *irc_connection_list; -
irc_commands.c
r6398094 reda0270 150 150 irc_part( irc, u, c->channel ); 151 151 152 if( c->gc && c->gc->prpl)152 if( c->gc ) 153 153 { 154 154 c->joined = 0; 155 c->gc-> prpl->chat_leave( c->gc, c->id );155 c->gc->acc->prpl->chat_leave( c->gc, c->id ); 156 156 } 157 157 } … … 173 173 user_t *u = user_find( irc, cmd[1] + 1 ); 174 174 175 if( u && u->gc && u->gc-> prpl && u->gc->prpl->chat_open )175 if( u && u->gc && u->gc->acc->prpl->chat_open ) 176 176 { 177 177 irc_reply( irc, 403, "%s :Initializing groupchat in a different channel", cmd[1] ); 178 178 179 if( !u->gc-> prpl->chat_open( u->gc, u->handle ) )179 if( !u->gc->acc->prpl->chat_open( u->gc, u->handle ) ) 180 180 { 181 181 irc_usermsg( irc, "Could not open a groupchat with %s.", u->nick ); … … 205 205 206 206 if( u && c && ( u->gc == c->gc ) ) 207 if( c->gc && c->gc-> prpl && c->gc->prpl->chat_invite )208 { 209 c->gc-> prpl->chat_invite( c->gc, c->id, "", u->handle );207 if( c->gc && c->gc->acc->prpl->chat_invite ) 208 { 209 c->gc->acc->prpl->chat_invite( c->gc, c->id, "", u->handle ); 210 210 irc_reply( irc, 341, "%s %s", nick, channel ); 211 211 return; … … 230 230 { 231 231 unsigned int i; 232 char *t = set_getstr( irc, "default_target" );232 char *t = set_getstr( &irc->set, "default_target" ); 233 233 234 234 if( g_strcasecmp( t, "last" ) == 0 && irc->last_target ) … … 477 477 478 478 if( u->gc ) 479 irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->user->username, 480 *u->gc->user->proto_opt[0] ? u->gc->user->proto_opt[0] : "", u->gc->prpl->name ); 479 irc_reply( irc, 312, "%s %s.%s :%s network", u->nick, u->gc->acc->user, 480 u->gc->acc->server && *u->gc->acc->server ? u->gc->acc->server : "", 481 u->gc->acc->prpl->name ); 481 482 else 482 483 irc_reply( irc, 312, "%s %s :%s", u->nick, irc->myhost, IRCD_INFO ); -
nick.c
r6398094 reda0270 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-200 4Wilmer van der Gaast and others *4 * Copyright 2002-2006 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 27 27 #include "bitlbee.h" 28 28 29 void nick_set( irc_t *irc, const char *handle, struct prpl *proto, const char *nick ) 30 { 31 nick_t *m = NULL, *n = irc->nicks; 32 33 while( n ) 34 { 35 if( ( g_strcasecmp( n->handle, handle ) == 0 ) && n->proto == proto ) 36 { 37 g_free( n->nick ); 38 n->nick = nick_dup( nick ); 39 nick_strip( n->nick ); 40 41 return; 42 } 43 n = ( m = n )->next; // :-P 44 } 45 46 if( m ) 47 n = m->next = g_new0( nick_t, 1 ); 29 /* Store handles in lower case and strip spaces, because AIM is braindead. */ 30 static char *clean_handle( const char *orig ) 31 { 32 char *new = g_malloc( strlen( orig ) + 1 ); 33 int i = 0; 34 35 do { 36 if (*orig != ' ') 37 new[i++] = tolower( *orig ); 38 } 39 while (*(orig++)); 40 41 return new; 42 } 43 44 void nick_set( account_t *acc, const char *handle, const char *nick ) 45 { 46 char *store_handle, *store_nick = g_malloc( MAX_NICK_LENGTH + 1 ); 47 48 store_handle = clean_handle( handle ); 49 strncpy( store_nick, nick, MAX_NICK_LENGTH ); 50 nick_strip( store_nick ); 51 52 g_hash_table_replace( acc->nicks, store_handle, store_nick ); 53 } 54 55 char *nick_get( account_t *acc, const char *handle, const char *realname ) 56 { 57 static char nick[MAX_NICK_LENGTH+1]; 58 char *store_handle, *found_nick; 59 int inf_protection = 256; 60 61 memset( nick, 0, MAX_NICK_LENGTH + 1 ); 62 63 store_handle = clean_handle( handle ); 64 /* Find out if we stored a nick for this person already. If not, try 65 to generate a sane nick automatically. */ 66 if( ( found_nick = g_hash_table_lookup( acc->nicks, store_handle ) ) ) 67 { 68 strncpy( nick, found_nick, MAX_NICK_LENGTH ); 69 } 48 70 else 49 n = irc->nicks = g_new0( nick_t, 1 );50 51 n->handle = g_strdup( handle );52 n->proto = proto;53 n->nick = nick_dup( nick );54 55 nick_strip( n->nick );56 }57 58 char *nick_get( irc_t *irc, const char *handle, struct prpl *proto, const char *realname )59 {60 static char nick[MAX_NICK_LENGTH+1];61 nick_t *n = irc->nicks;62 int inf_protection = 256;63 64 memset( nick, 0, MAX_NICK_LENGTH + 1 );65 66 while( n && !*nick )67 if( ( n->proto == proto ) && ( g_strcasecmp( n->handle, handle ) == 0 ) )68 strcpy( nick, n->nick );69 else70 n = n->next;71 72 if( !n )73 71 { 74 72 char *s; … … 86 84 87 85 nick_strip( nick ); 88 if (set_getint(irc, "lcnicks"))86 if( set_getbool( &acc->irc->set, "lcnicks" ) ) 89 87 nick_lc( nick ); 90 88 } 91 92 while( !nick_ok( nick ) || user_find( irc, nick ) ) 89 g_free( store_handle ); 90 91 /* Now, find out if the nick is already in use at the moment, and make 92 subtle changes to make it unique. */ 93 while( !nick_ok( nick ) || user_find( acc->irc, nick ) ) 93 94 { 94 95 if( strlen( nick ) < ( MAX_NICK_LENGTH - 1 ) ) … … 106 107 int i; 107 108 108 irc_usermsg( irc, "WARNING: Almost had an infinite loop in nick_get()! "109 "This used to be a fatal BitlBee bug, but we tried to fix it. "110 "This message should *never* appear anymore. "111 "If it does, please *do* send us a bug report! "112 "Please send all the following lines in your report:" );113 114 irc_usermsg( irc, "Trying to get a sane nick for handle %s", handle );109 irc_usermsg( acc->irc, "WARNING: Almost had an infinite loop in nick_get()! " 110 "This used to be a fatal BitlBee bug, but we tried to fix it. " 111 "This message should *never* appear anymore. " 112 "If it does, please *do* send us a bug report! " 113 "Please send all the following lines in your report:" ); 114 115 irc_usermsg( acc->irc, "Trying to get a sane nick for handle %s", handle ); 115 116 for( i = 0; i < MAX_NICK_LENGTH; i ++ ) 116 irc_usermsg( irc, "Char %d: %c/%d", i, nick[i], nick[i] );117 118 irc_usermsg( irc, "FAILED. Returning an insane nick now. Things might break. "119 "Good luck, and please don't forget to paste the lines up here "120 "in #bitlbee on OFTC or in a mail to wilmer@gaast.net" );117 irc_usermsg( acc->irc, "Char %d: %c/%d", i, nick[i], nick[i] ); 118 119 irc_usermsg( acc->irc, "FAILED. Returning an insane nick now. Things might break. " 120 "Good luck, and please don't forget to paste the lines up here " 121 "in #bitlbee on OFTC or in a mail to wilmer@gaast.net" ); 121 122 122 123 g_snprintf( nick, MAX_NICK_LENGTH + 1, "xx%x", rand() ); … … 126 127 } 127 128 128 return( nick ); 129 } 130 131 void nick_del( irc_t *irc, const char *nick ) 132 { 133 nick_t *l = NULL, *n = irc->nicks; 134 135 while( n ) 136 { 137 if( g_strcasecmp( n->nick, nick ) == 0 ) 138 { 139 if( l ) 140 l->next = n->next; 141 else 142 irc->nicks = n->next; 143 144 g_free( n->handle ); 145 g_free( n->nick ); 146 g_free( n ); 147 148 break; 149 } 150 n = (l=n)->next; 151 } 129 return nick; 130 } 131 132 void nick_del( account_t *acc, const char *handle ) 133 { 134 g_hash_table_remove( acc->nicks, handle ); 152 135 } 153 136 -
nick.h
r6398094 reda0270 24 24 */ 25 25 26 typedef struct __NICK 27 { 28 char *handle; 29 struct prpl *proto; 30 char *nick; 31 struct __NICK *next; 32 } nick_t; 33 34 void nick_set( irc_t *irc, const char *handle, struct prpl *proto, const char *nick ); 35 char *nick_get( irc_t *irc, const char *handle, struct prpl *proto, const char *realname ); 36 void nick_del( irc_t *irc, const char *nick ); 26 void nick_set( account_t *acc, const char *handle, const char *nick ); 27 char *nick_get( account_t *acc, const char *handle, const char *realname ); 28 void nick_del( account_t *acc, const char *handle ); 37 29 void nick_strip( char *nick ); 38 30 -
protocols/Makefile
r6398094 reda0270 10 10 11 11 # [SH] Program variables 12 objects = $(EVENT_HANDLER) http_client.o md5.o nogaim.o proxy.o sha.o $(SSL_CLIENT)12 objects = nogaim.o 13 13 14 14 # [SH] The next two lines should contain the directory name (in $(subdirs)) -
protocols/jabber/jabber.c
r6398094 reda0270 561 561 static void gjab_start(gjconn gjc) 562 562 { 563 struct aim_user *user;563 account_t *acc; 564 564 int port = -1, ssl = 0; 565 char *server = NULL , *s;565 char *server = NULL; 566 566 567 567 if (!gjc || gjc->state != JCONN_STATE_OFF) 568 568 return; 569 569 570 user = GJ_GC(gjc)->user; 571 if (*user->proto_opt[0]) { 572 /* If there's a dot, assume there's a hostname in the beginning */ 573 if (strchr(user->proto_opt[0], '.')) { 574 server = g_strdup(user->proto_opt[0]); 575 if ((s = strchr(server, ':'))) 576 *s = 0; 577 } 578 579 /* After the hostname, there can be a port number */ 580 s = strchr(user->proto_opt[0], ':'); 581 if (s && isdigit(s[1])) 582 sscanf(s + 1, "%d", &port); 583 584 /* And if there's the string ssl, the user wants an SSL-connection */ 585 if (strstr(user->proto_opt[0], ":ssl") || g_strcasecmp(user->proto_opt[0], "ssl") == 0) 586 ssl = 1; 587 } 588 589 if (port == -1 && !ssl) 590 port = DEFAULT_PORT; 591 else if (port == -1 && ssl) 592 port = DEFAULT_PORT_SSL; 593 else if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) { 570 acc = GJ_GC(gjc)->acc; 571 server = acc->server; 572 port = set_getint(&acc->set, "port"); 573 ssl = set_getbool(&acc->set, "ssl"); 574 575 if (port < JABBER_PORT_MIN || port > JABBER_PORT_MAX) { 594 576 serv_got_crap(GJ_GC(gjc), "For security reasons, the Jabber port number must be in the %d-%d range.", JABBER_PORT_MIN, JABBER_PORT_MAX); 595 577 STATE_EVT(JCONN_STATE_OFF) … … 614 596 } 615 597 616 g_free(server); 617 618 if (!user->gc || (gjc->fd < 0)) { 598 if (!acc->gc || (gjc->fd < 0)) { 619 599 STATE_EVT(JCONN_STATE_OFF) 620 600 return; … … 1516 1496 } 1517 1497 1518 static void jabber_login(struct aim_user *user) 1519 { 1520 struct gaim_connection *gc = new_gaim_conn(user); 1521 struct jabber_data *jd = gc->proto_data = g_new0(struct jabber_data, 1); 1522 char *loginname = create_valid_jid(user->username, DEFAULT_SERVER, "BitlBee"); 1523 1498 static void jabber_acc_init(account_t *acc) 1499 { 1500 set_t *s; 1501 1502 s = set_add( &acc->set, "port", "5222", set_eval_int, acc ); 1503 s->flags |= ACC_SET_OFFLINE_ONLY; 1504 1505 s = set_add( &acc->set, "resource", "BitlBee", NULL, acc ); 1506 s->flags |= ACC_SET_OFFLINE_ONLY; 1507 1508 s = set_add( &acc->set, "server", NULL, set_eval_account, acc ); 1509 s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; 1510 1511 s = set_add( &acc->set, "ssl", "false", set_eval_bool, acc ); 1512 s->flags |= ACC_SET_OFFLINE_ONLY; 1513 } 1514 1515 static void jabber_login(account_t *acc) 1516 { 1517 struct gaim_connection *gc; 1518 struct jabber_data *jd; 1519 char *resource, *loginname; 1520 1521 /* Time to move some data/things from the old syntax to the new one: */ 1522 if (acc->server) { 1523 char *s, *tmp_server; 1524 int port; 1525 1526 if (g_strcasecmp(acc->server, "ssl") == 0) { 1527 set_setstr(&acc->set, "server", ""); 1528 set_setint(&acc->set, "port", DEFAULT_PORT_SSL); 1529 set_setstr(&acc->set, "ssl", "true"); 1530 1531 g_free(acc->server); 1532 acc->server = NULL; 1533 } else if ((s = strchr(acc->server, ':'))) { 1534 if (strstr(acc->server, ":ssl")) { 1535 set_setint(&acc->set, "port", DEFAULT_PORT_SSL); 1536 set_setstr(&acc->set, "ssl", "true"); 1537 } 1538 if (isdigit(s[1])) { 1539 if (sscanf(s + 1, "%d", &port) == 1) 1540 set_setint(&acc->set, "port", port); 1541 } 1542 tmp_server = g_strndup(acc->server, s - acc->server); 1543 set_setstr(&acc->set, "server", tmp_server); 1544 g_free(tmp_server); 1545 } 1546 } 1547 1548 gc = new_gaim_conn(acc); 1549 jd = gc->proto_data = g_new0(struct jabber_data, 1); 1550 1551 if( strchr( acc->user, '@' ) == NULL ) 1552 { 1553 hide_login_progress( gc, "Invalid account name" ); 1554 signoff( gc ); 1555 return; 1556 } 1557 1558 resource = set_getstr(&acc->set, "resource"); 1559 loginname = create_valid_jid(acc->user, DEFAULT_SERVER, resource); 1560 1524 1561 jd->hash = g_hash_table_new(g_str_hash, g_str_equal); 1525 1562 jd->chats = NULL; /* we have no chats yet */ … … 1527 1564 set_login_progress(gc, 1, _("Connecting")); 1528 1565 1529 if (!(jd->gjc = gjab_new(loginname, user->password, gc))) {1566 if (!(jd->gjc = gjab_new(loginname, acc->pass, gc))) { 1530 1567 g_free(loginname); 1531 1568 hide_login_progress(gc, _("Unable to connect")); … … 2337 2374 ret->name = "jabber"; 2338 2375 ret->away_states = jabber_away_states; 2376 ret->acc_init = jabber_acc_init; 2339 2377 ret->login = jabber_login; 2340 2378 ret->close = jabber_close; … … 2349 2387 ret->alias_buddy = jabber_roster_update; 2350 2388 ret->group_buddy = jabber_group_change; 2351 ret-> cmp_buddynames= g_strcasecmp;2389 ret->handle_cmp = g_strcasecmp; 2352 2390 2353 2391 register_protocol (ret); -
protocols/msn/msn.c
r6398094 reda0270 27 27 #include "msn.h" 28 28 29 static void msn_login( struct aim_user *acct ) 30 { 31 struct gaim_connection *gc = new_gaim_conn( acct ); 29 static char *msn_set_display_name( set_t *set, char *value ); 30 31 static void msn_acc_init( account_t *acc ) 32 { 33 set_t *s; 34 35 s = set_add( &acc->set, "display_name", NULL, msn_set_display_name, acc ); 36 s->flags |= ACC_SET_NOSAVE | ACC_SET_ONLINE_ONLY; 37 } 38 39 static void msn_login( account_t *acc ) 40 { 41 struct gaim_connection *gc = new_gaim_conn( acc ); 32 42 struct msn_data *md = g_new0( struct msn_data, 1 ); 33 43 … … 37 47 md->fd = -1; 38 48 39 if( strchr( acc t->username, '@' ) == NULL )49 if( strchr( acc->user, '@' ) == NULL ) 40 50 { 41 51 hide_login_progress( gc, "Invalid account name" ); … … 212 222 static void msn_set_info( struct gaim_connection *gc, char *info ) 213 223 { 214 int i; 215 char buf[1024], *fn, *s; 216 struct msn_data *md = gc->proto_data; 217 218 if( strlen( info ) > 129 ) 219 { 220 do_error_dialog( gc, "Maximum name length exceeded", "MSN" ); 221 return; 222 } 223 224 /* Of course we could use http_encode() here, but when we encode 225 every character, the server is less likely to complain about the 226 chosen name. However, the MSN server doesn't seem to like escaped 227 non-ASCII chars, so we keep those unescaped. */ 228 s = fn = g_new0( char, strlen( info ) * 3 + 1 ); 229 for( i = 0; info[i]; i ++ ) 230 if( info[i] & 128 ) 231 { 232 *s = info[i]; 233 s ++; 234 } 235 else 236 { 237 g_snprintf( s, 4, "%%%02X", info[i] ); 238 s += 3; 239 } 240 241 g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, gc->username, fn ); 242 msn_write( gc, buf, strlen( buf ) ); 243 g_free( fn ); 224 msn_set_display_name( set_find( &gc->acc->set, "display_name" ), info ); 244 225 } 245 226 … … 380 361 } 381 362 363 static char *msn_set_display_name( set_t *set, char *value ) 364 { 365 account_t *acc = set->data; 366 struct gaim_connection *gc = acc->gc; 367 struct msn_data *md; 368 char buf[1024], *fn, *s; 369 int i; 370 371 /* Double-check. */ 372 if( gc == NULL ) 373 return NULL; 374 375 md = gc->proto_data; 376 377 if( strlen( value ) > 129 ) 378 { 379 serv_got_crap( gc, "Maximum name length exceeded" ); 380 return NULL; 381 } 382 383 /* Of course we could use http_encode() here, but when we encode 384 every character, the server is less likely to complain about the 385 chosen name. However, the MSN server doesn't seem to like escaped 386 non-ASCII chars, so we keep those unescaped. */ 387 s = fn = g_new0( char, strlen( value ) * 3 + 1 ); 388 for( i = 0; value[i]; i ++ ) 389 if( value[i] & 128 ) 390 { 391 *s = value[i]; 392 s ++; 393 } 394 else 395 { 396 g_snprintf( s, 4, "%%%02X", value[i] ); 397 s += 3; 398 } 399 400 g_snprintf( buf, sizeof( buf ), "REA %d %s %s\r\n", ++md->trId, gc->username, fn ); 401 msn_write( gc, buf, strlen( buf ) ); 402 g_free( fn ); 403 404 /* Returning NULL would be better, because the server still has to 405 confirm the name change. However, it looks a bit confusing to the 406 user. */ 407 return value; 408 } 409 382 410 void msn_init() 383 411 { 384 412 struct prpl *ret = g_new0(struct prpl, 1); 413 385 414 ret->name = "msn"; 386 415 ret->login = msn_login; 416 ret->acc_init = msn_acc_init; 387 417 ret->close = msn_close; 388 418 ret->send_im = msn_send_im; … … 404 434 ret->rem_deny = msn_rem_deny; 405 435 ret->send_typing = msn_send_typing; 406 ret-> cmp_buddynames= g_strcasecmp;436 ret->handle_cmp = g_strcasecmp; 407 437 408 438 register_protocol(ret); -
protocols/msn/ns.c
r6398094 reda0270 223 223 else if( num_parts == 7 && strcmp( cmd[2], "OK" ) == 0 ) 224 224 { 225 set_t *s; 226 225 227 http_decode( cmd[4] ); 226 228 227 229 strncpy( gc->displayname, cmd[4], sizeof( gc->displayname ) ); 228 230 gc->displayname[sizeof(gc->displayname)-1] = 0; 231 232 if( ( s = set_find( &gc->acc->set, "display_name" ) ) ) 233 { 234 g_free( s->value ); 235 s->value = g_strdup( cmd[4] ); 236 } 229 237 230 238 set_login_progress( gc, 1, "Authenticated, getting buddy list" ); … … 517 525 if( g_strcasecmp( cmd[3], gc->username ) == 0 ) 518 526 { 527 set_t *s; 528 519 529 http_decode( cmd[4] ); 520 530 strncpy( gc->displayname, cmd[4], sizeof( gc->displayname ) ); 521 531 gc->displayname[sizeof(gc->displayname)-1] = 0; 532 533 if( ( s = set_find( &gc->acc->set, "display_name" ) ) ) 534 { 535 g_free( s->value ); 536 s->value = g_strdup( cmd[4] ); 537 } 522 538 } 523 539 else -
protocols/nogaim.c
r6398094 reda0270 145 145 /* multi.c */ 146 146 147 struct gaim_connection *new_gaim_conn( struct aim_user *user)147 struct gaim_connection *new_gaim_conn( account_t *acc ) 148 148 { 149 149 struct gaim_connection *gc; 150 account_t *a;151 150 152 151 gc = g_new0( struct gaim_connection, 1 ); 153 152 154 gc->prpl = user->prpl;155 g_snprintf( gc->username, sizeof( gc->username ), "%s", user->username);156 g_snprintf( gc->password, sizeof( gc->password ), "%s", user->password);157 /* [MD] BUGFIX: don't set gc->irc to the global IRC, but use the one from the struct aim_user.158 * This fixes daemon mode breakage where IRC doesn't point to the currently active connection.159 */160 gc->irc = user->irc;153 /* Maybe we should get rid of this memory waste later. ;-) */ 154 g_snprintf( gc->username, sizeof( gc->username ), "%s", acc->user ); 155 g_snprintf( gc->password, sizeof( gc->password ), "%s", acc->pass ); 156 157 gc->irc = acc->irc; 158 gc->acc = acc; 159 acc->gc = gc; 161 160 162 161 connections = g_slist_append( connections, gc ); 163 164 user->gc = gc;165 gc->user = user;166 167 // Find the account_t so we can set its gc pointer168 for( a = gc->irc->accounts; a; a = a->next )169 if( ( struct aim_user * ) a->gc == user )170 {171 a->gc = gc;172 break;173 }174 162 175 163 return( gc ); … … 189 177 190 178 connections = g_slist_remove( connections, gc ); 191 g_free( gc->user );192 179 g_free( gc ); 193 180 } … … 220 207 va_end( params ); 221 208 222 if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||223 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )209 if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || 210 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) ) 224 211 strip_html( text ); 225 212 226 213 /* Try to find a different connection on the same protocol. */ 227 214 for( a = gc->irc->accounts; a; a = a->next ) 228 if( a->prpl == gc-> prpl && a->gc != gc )215 if( a->prpl == gc->acc->prpl && a->gc != gc ) 229 216 break; 230 217 231 218 /* If we found one, include the screenname in the message. */ 232 219 if( a ) 233 irc_usermsg( gc->irc, "%s(%s) - %s", gc-> prpl->name, gc->username, text );220 irc_usermsg( gc->irc, "%s(%s) - %s", gc->acc->prpl->name, gc->username, text ); 234 221 else 235 irc_usermsg( gc->irc, "%s - %s", gc-> prpl->name, text );222 irc_usermsg( gc->irc, "%s - %s", gc->acc->prpl->name, text ); 236 223 237 224 g_free( text ); … … 242 229 struct gaim_connection *gc = d; 243 230 244 if( gc-> prpl && gc->prpl->keepalive )245 gc-> prpl->keepalive( gc );231 if( gc->acc->prpl->keepalive ) 232 gc->acc->prpl->keepalive( gc ); 246 233 247 234 return TRUE; … … 297 284 b_event_remove( gc->keepalive ); 298 285 gc->flags |= OPT_LOGGING_OUT; 286 299 287 gc->keepalive = 0; 300 gc-> prpl->close( gc );288 gc->acc->prpl->close( gc ); 301 289 b_event_remove( gc->inpa ); 302 290 … … 323 311 /* Uhm... This is very sick. */ 324 312 } 325 else if( !gc->wants_to_die && set_getint( irc, "auto_reconnect" ) )326 { 327 int delay = set_getint( irc, "auto_reconnect_delay" );313 else if( !gc->wants_to_die && set_getint( &irc->set, "auto_reconnect" ) ) 314 { 315 int delay = set_getint( &irc->set, "auto_reconnect_delay" ); 328 316 329 317 serv_got_crap( gc, "Reconnecting in %d seconds..", delay ); … … 364 352 irc_t *irc = gc->irc; 365 353 366 if( set_getint( irc, "debug" ) && 0 ) /* This message is too useless */354 if( set_getint( &irc->set, "debug" ) && 0 ) /* This message is too useless */ 367 355 serv_got_crap( gc, "Receiving user add from handle: %s", handle ); 368 356 369 357 if( user_findhandle( gc, handle ) ) 370 358 { 371 if( set_getint( irc, "debug" ) )359 if( set_getint( &irc->set, "debug" ) ) 372 360 serv_got_crap( gc, "User already exists, ignoring add request: %s", handle ); 373 361 … … 378 366 379 367 memset( nick, 0, MAX_NICK_LENGTH + 1 ); 380 strcpy( nick, nick_get( gc-> irc, handle, gc->prpl, realname ) );368 strcpy( nick, nick_get( gc->acc, handle, realname ) ); 381 369 382 370 u = user_add( gc->irc, nick ); … … 390 378 u->user = g_strndup( handle, s - handle ); 391 379 } 392 else if( gc-> user->proto_opt[0] && *gc->user->proto_opt[0])380 else if( gc->acc->server ) 393 381 { 394 382 char *colon; 395 383 396 if( ( colon = strchr( gc-> user->proto_opt[0], ':' ) ) )397 u->host = g_strndup( gc-> user->proto_opt[0],398 colon - gc-> user->proto_opt[0]);384 if( ( colon = strchr( gc->acc->server, ':' ) ) ) 385 u->host = g_strndup( gc->acc->server, 386 colon - gc->acc->server ); 399 387 else 400 u->host = g_strdup( gc-> user->proto_opt[0]);388 u->host = g_strdup( gc->acc->server ); 401 389 402 390 u->user = g_strdup( handle ); … … 409 397 else 410 398 { 411 u->host = g_strdup( gc-> user->prpl->name );399 u->host = g_strdup( gc->acc->prpl->name ); 412 400 u->user = g_strdup( handle ); 413 401 } … … 457 445 u->realname = g_strdup( realname ); 458 446 459 if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( gc->irc, "display_namechanges" ) )447 if( ( gc->flags & OPT_LOGGED_IN ) && set_getint( &gc->irc->set, "display_namechanges" ) ) 460 448 serv_got_crap( gc, "User `%s' changed name to `%s'", u->nick, u->realname ); 461 449 } … … 479 467 void show_got_added_yes( gpointer w, struct show_got_added_data *data ) 480 468 { 481 data->gc-> prpl->add_buddy( data->gc, data->handle );469 data->gc->acc->prpl->add_buddy( data->gc, data->handle ); 482 470 add_buddy( data->gc, NULL, data->handle, data->handle ); 483 471 … … 513 501 if( !u ) 514 502 { 515 if( g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "add" ) == 0 )503 if( g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "add" ) == 0 ) 516 504 { 517 505 add_buddy( gc, NULL, handle, NULL ); … … 520 508 else 521 509 { 522 if( set_getint( gc->irc, "debug" ) || g_strcasecmp( set_getstr( gc->irc, "handle_unknown" ), "ignore" ) != 0 )510 if( set_getint( &gc->irc->set, "debug" ) || g_strcasecmp( set_getstr( &gc->irc->set, "handle_unknown" ), "ignore" ) != 0 ) 523 511 { 524 512 serv_got_crap( gc, "serv_got_update() for handle %s:", handle ); … … 558 546 } 559 547 560 if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "oscar") || !strcmp(gc->prpl->name, "icq")) )548 if( ( type & UC_UNAVAILABLE ) && ( strcmp( gc->acc->prpl->name, "oscar" ) == 0 || strcmp( gc->acc->prpl->name, "icq" ) == 0 ) ) 561 549 { 562 550 u->away = g_strdup( "Away" ); 563 551 } 564 else if( ( type & UC_UNAVAILABLE ) && ( !strcmp(gc->prpl->name, "jabber")) )552 else if( ( type & UC_UNAVAILABLE ) && ( strcmp( gc->acc->prpl->name, "jabber" ) == 0 ) ) 565 553 { 566 554 if( type & UC_DND ) … … 571 559 u->away = g_strdup( "Away" ); 572 560 } 573 else if( ( type & UC_UNAVAILABLE ) && gc-> prpl->get_status_string )574 { 575 u->away = g_strdup( gc-> prpl->get_status_string( gc, type ) );561 else if( ( type & UC_UNAVAILABLE ) && gc->acc->prpl->get_status_string ) 562 { 563 u->away = g_strdup( gc->acc->prpl->get_status_string( gc, type ) ); 576 564 } 577 565 else … … 579 567 580 568 /* LISPy... */ 581 if( ( set_getint( gc->irc, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */569 if( ( set_getint( &gc->irc->set, "away_devoice" ) ) && /* Don't do a thing when user doesn't want it */ 582 570 ( u->online ) && /* Don't touch offline people */ 583 571 ( ( ( u->online != oo ) && !u->away ) || /* Voice joining people */ … … 598 586 if( !u ) 599 587 { 600 char *h = set_getstr( irc, "handle_unknown" );588 char *h = set_getstr( &irc->set, "handle_unknown" ); 601 589 602 590 if( g_strcasecmp( h, "ignore" ) == 0 ) 603 591 { 604 if( set_getint( irc, "debug" ) )592 if( set_getint( &irc->set, "debug" ) ) 605 593 serv_got_crap( gc, "Ignoring message from unknown handle %s", handle ); 606 594 … … 609 597 else if( g_strncasecmp( h, "add", 3 ) == 0 ) 610 598 { 611 int private = set_getint( irc, "private" );599 int private = set_getint( &irc->set, "private" ); 612 600 613 601 if( h[3] ) … … 630 618 } 631 619 632 if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||633 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )620 if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || 621 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) ) 634 622 strip_html( msg ); 635 623 … … 671 659 user_t *u; 672 660 673 if( !set_getint( gc->irc, "typing_notice" ) )661 if( !set_getint( &gc->irc->set, "typing_notice" ) ) 674 662 return; 675 663 … … 693 681 GList *ir; 694 682 695 if( set_getint( gc->irc, "debug" ) )683 if( set_getint( &gc->irc->set, "debug" ) ) 696 684 serv_got_crap( gc, "You were removed from conversation %d", (int) id ); 697 685 … … 732 720 733 721 /* Gaim sends own messages through this too. IRC doesn't want this, so kill them */ 734 if( g_strcasecmp( who, gc->user ->username ) == 0 )722 if( g_strcasecmp( who, gc->username ) == 0 ) 735 723 return; 736 724 … … 738 726 for( c = gc->conversations; c && c->id != id; c = c->next ); 739 727 740 if( ( g_strcasecmp( set_getstr( gc->irc, "strip_html" ), "always" ) == 0 ) ||741 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( gc->irc, "strip_html" ) ) )728 if( ( g_strcasecmp( set_getstr( &gc->irc->set, "strip_html" ), "always" ) == 0 ) || 729 ( ( gc->flags & OPT_CONN_HTML ) && set_getint( &gc->irc->set, "strip_html" ) ) ) 742 730 strip_html( msg ); 743 731 … … 772 760 g_free( s ); 773 761 774 if( set_getint( gc->irc, "debug" ) )762 if( set_getint( &gc->irc->set, "debug" ) ) 775 763 serv_got_crap( gc, "Creating new conversation: (id=%d,handle=%s)", id, handle ); 776 764 … … 786 774 int me = 0; 787 775 788 if( set_getint( b->gc->irc, "debug" ) )776 if( set_getint( &b->gc->irc->set, "debug" ) ) 789 777 serv_got_crap( b->gc, "User %s added to conversation %d", handle, b->id ); 790 778 791 779 /* It might be yourself! */ 792 if( b->gc-> prpl->cmp_buddynames( handle, b->gc->user->username ) == 0 )780 if( b->gc->acc->prpl->handle_cmp( handle, b->gc->username ) == 0 ) 793 781 { 794 782 u = user_find( b->gc->irc, b->gc->irc->nick ); … … 820 808 int me = 0; 821 809 822 if( set_getint( b->gc->irc, "debug" ) )810 if( set_getint( &b->gc->irc->set, "debug" ) ) 823 811 serv_got_crap( b->gc, "User %s removed from conversation %d (%s)", handle, b->id, reason ? reason : "" ); 824 812 825 813 /* It might be yourself! */ 826 if( g_strcasecmp( handle, b->gc->user ->username ) == 0 )814 if( g_strcasecmp( handle, b->gc->username ) == 0 ) 827 815 { 828 816 u = user_find( b->gc->irc, b->gc->irc->nick ); … … 882 870 } 883 871 884 char *set_eval_away_devoice( irc_t *irc, set_t *set, char *value ) 885 { 872 char *set_eval_away_devoice( set_t *set, char *value ) 873 { 874 irc_t *irc = set->data; 886 875 int st; 887 876 … … 897 886 /* Horror.... */ 898 887 899 if( st != set_getint( irc, "away_devoice" ) )888 if( st != set_getint( &irc->set, "away_devoice" ) ) 900 889 { 901 890 char list[80] = ""; … … 937 926 } 938 927 939 return( set_eval_bool( irc,set, value ) );928 return( set_eval_bool( set, value ) ); 940 929 } 941 930 … … 957 946 } 958 947 959 st = gc-> prpl->send_im( gc, handle, msg, strlen( msg ), flags );948 st = gc->acc->prpl->send_im( gc, handle, msg, strlen( msg ), flags ); 960 949 g_free( buf ); 961 950 … … 974 963 } 975 964 976 st = gc-> prpl->chat_send( gc, id, msg );965 st = gc->acc->prpl->chat_send( gc, id, msg ); 977 966 g_free( buf ); 978 967 … … 988 977 989 978 if( !away ) away = ""; 990 ms = m = gc-> prpl->away_states( gc );979 ms = m = gc->acc->prpl->away_states( gc ); 991 980 992 981 while( m ) … … 1009 998 if( m ) 1010 999 { 1011 gc-> prpl->set_away( gc, m->data, *away ? away : NULL );1000 gc->acc->prpl->set_away( gc, m->data, *away ? away : NULL ); 1012 1001 } 1013 1002 else … … 1016 1005 if( s ) 1017 1006 { 1018 gc-> prpl->set_away( gc, s, away );1019 if( set_getint( gc->irc, "debug" ) )1007 gc->acc->prpl->set_away( gc, s, away ); 1008 if( set_getint( &gc->irc->set, "debug" ) ) 1020 1009 serv_got_crap( gc, "Setting away state to %s", s ); 1021 1010 } 1022 1011 else 1023 gc-> prpl->set_away( gc, GAIM_AWAY_CUSTOM, away );1012 gc->acc->prpl->set_away( gc, GAIM_AWAY_CUSTOM, away ); 1024 1013 } 1025 1014 … … 1073 1062 void bim_add_allow( struct gaim_connection *gc, char *handle ) 1074 1063 { 1075 if( g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc-> prpl->cmp_buddynames) == NULL )1064 if( g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->acc->prpl->handle_cmp ) == NULL ) 1076 1065 { 1077 1066 gc->permit = g_slist_prepend( gc->permit, g_strdup( handle ) ); 1078 1067 } 1079 1068 1080 gc-> prpl->add_permit( gc, handle );1069 gc->acc->prpl->add_permit( gc, handle ); 1081 1070 } 1082 1071 … … 1085 1074 GSList *l; 1086 1075 1087 if( ( l = g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc-> prpl->cmp_buddynames) ) )1076 if( ( l = g_slist_find_custom( gc->permit, handle, (GCompareFunc) gc->acc->prpl->handle_cmp ) ) ) 1088 1077 { 1089 1078 g_free( l->data ); … … 1091 1080 } 1092 1081 1093 gc-> prpl->rem_permit( gc, handle );1082 gc->acc->prpl->rem_permit( gc, handle ); 1094 1083 } 1095 1084 1096 1085 void bim_add_block( struct gaim_connection *gc, char *handle ) 1097 1086 { 1098 if( g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc-> prpl->cmp_buddynames) == NULL )1087 if( g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->acc->prpl->handle_cmp ) == NULL ) 1099 1088 { 1100 1089 gc->deny = g_slist_prepend( gc->deny, g_strdup( handle ) ); 1101 1090 } 1102 1091 1103 gc-> prpl->add_deny( gc, handle );1092 gc->acc->prpl->add_deny( gc, handle ); 1104 1093 } 1105 1094 … … 1108 1097 GSList *l; 1109 1098 1110 if( ( l = g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc-> prpl->cmp_buddynames) ) )1099 if( ( l = g_slist_find_custom( gc->deny, handle, (GCompareFunc) gc->acc->prpl->handle_cmp ) ) ) 1111 1100 { 1112 1101 g_free( l->data ); … … 1114 1103 } 1115 1104 1116 gc-> prpl->rem_deny( gc, handle );1117 } 1105 gc->acc->prpl->rem_deny( gc, handle ); 1106 } -
protocols/nogaim.h
r6398094 reda0270 39 39 40 40 #include "bitlbee.h" 41 #include "account.h" 41 42 #include "proxy.h" 42 43 #include "md5.h" … … 63 64 struct gaim_connection 64 65 { 65 struct prpl *prpl;66 account_t *acc; 66 67 guint32 flags; 67 68 … … 78 79 GSList *deny; 79 80 int permdeny; 80 81 struct aim_user *user;82 81 83 82 char username[64]; … … 126 125 }; 127 126 128 struct aim_user {129 char username[64];130 char alias[SELF_ALIAS_LEN];131 char password[32];132 char user_info[2048];133 int options;134 struct prpl *prpl;135 /* prpls can use this to save information about the user,136 * like which server to connect to, etc */137 char proto_opt[7][256];138 139 struct gaim_connection *gc;140 irc_t *irc;141 };142 143 127 struct prpl { 144 128 int options; 145 129 const char *name; 146 130 147 void (* login) (struct aim_user *); 131 void (* acc_init) (account_t *); 132 void (* login) (account_t *); 148 133 void (* keepalive) (struct gaim_connection *); 149 134 void (* close) (struct gaim_connection *); … … 180 165 181 166 /* Mainly for AOL, since they think "Bung hole" == "Bu ngho le". *sigh* */ 182 int (* cmp_buddynames) (const char *who1, const char *who2);167 int (* handle_cmp) (const char *who1, const char *who2); 183 168 }; 184 169 … … 206 191 207 192 void nogaim_init(); 208 char *set_eval_away_devoice( irc_t *irc,set_t *set, char *value );193 char *set_eval_away_devoice( set_t *set, char *value ); 209 194 210 195 gboolean auto_reconnect( gpointer data, gint fd, b_input_condition cond ); … … 212 197 213 198 /* multi.c */ 214 G_MODULE_EXPORT struct gaim_connection *new_gaim_conn( struct aim_user *user);199 G_MODULE_EXPORT struct gaim_connection *new_gaim_conn( account_t *acc ); 215 200 G_MODULE_EXPORT void destroy_gaim_conn( struct gaim_connection *gc ); 216 201 G_MODULE_EXPORT void set_login_progress( struct gaim_connection *gc, int step, char *msg ); -
protocols/oscar/oscar.c
r6398094 reda0270 356 356 } 357 357 358 static void oscar_login(struct aim_user *user) { 358 static void oscar_acc_init(account_t *acc) 359 { 360 set_t *s; 361 362 s = set_add( &acc->set, "server", NULL, set_eval_account, acc ); 363 s->flags |= ACC_SET_NOSAVE | ACC_SET_OFFLINE_ONLY; 364 } 365 366 static void oscar_login(account_t *acc) { 359 367 aim_session_t *sess; 360 368 aim_conn_t *conn; 361 369 char buf[256]; 362 struct gaim_connection *gc = new_gaim_conn( user);370 struct gaim_connection *gc = new_gaim_conn(acc); 363 371 struct oscar_data *odata = gc->proto_data = g_new0(struct oscar_data, 1); 364 372 365 if (isdigit( *user->username)) {373 if (isdigit(acc->user[0])) { 366 374 odata->icq = TRUE; 367 375 /* This is odd but it's necessary for a proper do_import and do_export. 368 376 We don't do those anymore, but let's stick with it, just in case 369 it accidentally fixes something else too... */377 it accidentally fixes something else too... </bitlbee> */ 370 378 gc->password[8] = 0; 371 379 } else { … … 390 398 } 391 399 392 if (g_strcasecmp(user->proto_opt[USEROPT_AUTH], "login.icq.com") != 0 && 393 g_strcasecmp(user->proto_opt[USEROPT_AUTH], "login.oscar.aol.com") != 0) { 394 serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",user->proto_opt[USEROPT_AUTH]); 400 if (acc->server == NULL) { 401 hide_login_progress(gc, "No servername specified"); 402 signoff(gc); 403 return; 404 } 405 406 if (g_strcasecmp(acc->server, "login.icq.com") != 0 && 407 g_strcasecmp(acc->server, "login.oscar.aol.com") != 0) { 408 serv_got_crap(gc, "Warning: Unknown OSCAR server: `%s'. Please review your configuration if the connection fails.",acc->server); 395 409 } 396 410 … … 402 416 403 417 conn->status |= AIM_CONN_STATUS_INPROGRESS; 404 conn->fd = proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? 405 user->proto_opt[USEROPT_AUTH] : AIM_DEFAULT_LOGIN_SERVER, 406 user->proto_opt[USEROPT_AUTHPORT][0] ? 407 atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT, 408 oscar_login_connect, gc); 418 conn->fd = proxy_connect(acc->server, AIM_LOGIN_PORT, oscar_login_connect, gc); 409 419 if (conn->fd < 0) { 410 420 hide_login_progress(gc, _("Couldn't connect to host")); … … 485 495 struct aim_authresp_info *info; 486 496 int i; char *host; int port; 487 struct aim_user *user;488 497 aim_conn_t *bosconn; 489 498 490 499 struct gaim_connection *gc = sess->aux_data; 491 500 struct oscar_data *od = gc->proto_data; 492 user = gc->user; 493 port = user->proto_opt[USEROPT_AUTHPORT][0] ? 494 atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT, 501 port = AIM_LOGIN_PORT; 495 502 496 503 va_start(ap, fr); … … 871 878 struct aim_redirect_data *redir; 872 879 struct gaim_connection *gc = sess->aux_data; 873 struct aim_user *user = gc->user;874 880 aim_conn_t *tstconn; 875 881 int i; … … 877 883 int port; 878 884 879 port = user->proto_opt[USEROPT_AUTHPORT][0] ?880 atoi(user->proto_opt[USEROPT_AUTHPORT]) : AIM_LOGIN_PORT,881 882 885 va_start(ap, fr); 883 886 redir = va_arg(ap, struct aim_redirect_data *); 884 887 va_end(ap); 885 888 889 port = AIM_LOGIN_PORT; 886 890 for (i = 0; i < (int)strlen(redir->ip); i++) { 887 891 if (redir->ip[i] == ':') { … … 1723 1727 odata->rights.maxsiglen = odata->rights.maxawaymsglen = (guint)maxsiglen; 1724 1728 1729 /* FIXME: It seems we're not really using this, and it broke now that 1730 struct aim_user is dead. 1725 1731 aim_bos_setprofile(sess, fr->conn, gc->user->user_info, NULL, gaim_caps); 1726 1732 */ 1733 1727 1734 return 1; 1728 1735 } … … 2656 2663 ret->away_states = oscar_away_states; 2657 2664 ret->login = oscar_login; 2665 ret->acc_init = oscar_acc_init; 2658 2666 ret->close = oscar_close; 2659 2667 ret->send_im = oscar_send_im; … … 2673 2681 ret->set_permit_deny = oscar_set_permit_deny; 2674 2682 ret->keepalive = oscar_keepalive; 2675 ret->cmp_buddynames = aim_sncmp;2676 2683 ret->get_status_string = oscar_get_status_string; 2677 2684 ret->send_typing = oscar_send_typing; 2685 2686 ret->handle_cmp = aim_sncmp; 2678 2687 2679 2688 register_protocol(ret); -
protocols/yahoo/libyahoo2.c
r6398094 reda0270 89 89 #define vsnprintf _vsnprintf 90 90 #endif 91 92 #include "base64.h" 91 93 92 94 #ifdef USE_STRUCT_CALLBACKS … … 695 697 } 696 698 697 static char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 698 "abcdefghijklmnopqrstuvwxyz" 699 "0123456789._"; 699 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ 700 700 static void to_y64(unsigned char *out, const unsigned char *in, int inlen) 701 /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */ 702 { 703 for (; inlen >= 3; inlen -= 3) 704 { 705 *out++ = base64digits[in[0] >> 2]; 706 *out++ = base64digits[((in[0]<<4) & 0x30) | (in[1]>>4)]; 707 *out++ = base64digits[((in[1]<<2) & 0x3c) | (in[2]>>6)]; 708 *out++ = base64digits[in[2] & 0x3f]; 709 in += 3; 710 } 711 if (inlen > 0) 712 { 713 unsigned char fragment; 714 715 *out++ = base64digits[in[0] >> 2]; 716 fragment = (in[0] << 4) & 0x30; 717 if (inlen > 1) 718 fragment |= in[1] >> 4; 719 *out++ = base64digits[fragment]; 720 *out++ = (inlen < 2) ? '-' 721 : base64digits[(in[1] << 2) & 0x3c]; 722 *out++ = '-'; 723 } 724 *out = '\0'; 701 { 702 base64_encode_real(in, inlen, out, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-"); 725 703 } 726 704 -
protocols/yahoo/yahoo.c
r6398094 reda0270 121 121 } 122 122 123 static void byahoo_login( struct aim_user *user)124 { 125 struct gaim_connection *gc = new_gaim_conn( user);123 static void byahoo_login( account_t *acc ) 124 { 125 struct gaim_connection *gc = new_gaim_conn( acc ); 126 126 struct byahoo_data *yd = gc->proto_data = g_new0( struct byahoo_data, 1 ); 127 127 … … 130 130 131 131 set_login_progress( gc, 1, "Connecting" ); 132 yd->y2_id = yahoo_init( user->username, user->password);132 yd->y2_id = yahoo_init( acc->user, acc->pass ); 133 133 yahoo_login( yd->y2_id, yd->current_status ); 134 134 } … … 409 409 ret->chat_leave = byahoo_chat_leave; 410 410 ret->chat_open = byahoo_chat_open; 411 ret->cmp_buddynames = g_strcasecmp; 411 412 ret->handle_cmp = g_strcasecmp; 412 413 413 414 register_protocol(ret); … … 425 426 yd = gc->proto_data; 426 427 427 if( !strcmp(gc->prpl->name, "yahoo")&& yd->y2_id == id )428 if( strcmp( gc->acc->prpl->name, "yahoo" ) == 0 && yd->y2_id == id ) 428 429 return( gc ); 429 430 } -
query.c
r6398094 reda0270 63 63 } 64 64 65 if( g_strcasecmp( set_getstr( irc, "query_order" ), "lifo" ) == 0 || irc->queries == q )65 if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "lifo" ) == 0 || irc->queries == q ) 66 66 query_display( irc, q ); 67 67 … … 172 172 query_t *q; 173 173 174 if( g_strcasecmp( set_getstr( irc, "query_order" ), "fifo" ) == 0 )174 if( g_strcasecmp( set_getstr( &irc->set, "query_order" ), "fifo" ) == 0 ) 175 175 q = irc->queries; 176 176 else -
root_commands.c
r6398094 reda0270 127 127 } 128 128 129 static void cmd_account( irc_t *irc, char **cmd ); 130 129 131 static void cmd_identify( irc_t *irc, char **cmd ) 130 132 { 131 133 storage_status_t status = storage_load( irc->nick, cmd[1], irc ); 134 char *account_on[] = { "account", "on", NULL }; 132 135 133 136 switch (status) { … … 139 142 break; 140 143 case STORAGE_OK: 141 irc_usermsg( irc, "Password accepted " );144 irc_usermsg( irc, "Password accepted, settings and accounts loaded" ); 142 145 irc_umode_set( irc, "+R", 1 ); 146 if( set_getint( &irc->set, "auto_connect" ) ) 147 cmd_account( irc, account_on ); 143 148 break; 149 case STORAGE_OTHER_ERROR: 144 150 default: 145 irc_usermsg( irc, " Something very weird happened" );151 irc_usermsg( irc, "Unknown error while loading configuration" ); 146 152 break; 147 153 } … … 226 232 227 233 a = account_add( irc, prpl, cmd[3], cmd[4] ); 228 229 234 if( cmd[5] ) 230 a->server = g_strdup(cmd[5] );235 set_setstr( &a->set, "server", cmd[5] ); 231 236 232 237 irc_usermsg( irc, "Account successfully added" ); … … 306 311 307 312 for( a = irc->accounts; a; a = a->next ) 308 if( !a->gc )313 if( !a->gc && a->auto_connect ) 309 314 account_on( irc, a ); 310 315 } … … 352 357 } 353 358 } 359 else if( g_strcasecmp( cmd[1], "set" ) == 0 ) 360 { 361 char *acc_handle, *set_name = NULL, *tmp; 362 363 if( !cmd[2] ) 364 { 365 irc_usermsg( irc, "Not enough parameters given (need %d)", 2 ); 366 return; 367 } 368 369 acc_handle = g_strdup( cmd[2] ); 370 if( ( tmp = strchr( acc_handle, '/' ) ) ) 371 { 372 *tmp = 0; 373 set_name = tmp + 1; 374 } 375 a = account_get( irc, acc_handle ); 376 377 if( a == NULL ) 378 { 379 g_free( acc_handle ); 380 irc_usermsg( irc, "Invalid account" ); 381 return; 382 } 383 384 if( cmd[3] ) 385 { 386 set_t *s = set_find( &a->set, set_name ); 387 388 if( a->gc && s && s->flags & ACC_SET_OFFLINE_ONLY ) 389 { 390 g_free( acc_handle ); 391 irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "off" ); 392 return; 393 } 394 else if( !a->gc && s && s->flags & ACC_SET_ONLINE_ONLY ) 395 { 396 g_free( acc_handle ); 397 irc_usermsg( irc, "This setting can only be changed when the account is %s-line", "on" ); 398 return; 399 } 400 401 set_setstr( &a->set, set_name, cmd[3] ); 402 403 if( ( strcmp( cmd[3], "=" ) ) == 0 && cmd[4] ) 404 irc_usermsg( irc, "Warning: Correct syntax: \002account set <variable> <value>\002 (without =)" ); 405 } 406 if( set_name ) /* else 'forgotten' on purpose.. Must show new value after changing */ 407 { 408 char *s = set_getstr( &a->set, set_name ); 409 if( s ) 410 irc_usermsg( irc, "%s = `%s'", set_name, s ); 411 else 412 irc_usermsg( irc, "%s is empty", set_name ); 413 } 414 else 415 { 416 set_t *s = a->set; 417 while( s ) 418 { 419 if( s->value || s->def ) 420 irc_usermsg( irc, "%s = `%s'", s->key, s->value?s->value:s->def ); 421 else 422 irc_usermsg( irc, "%s is empty", s->key ); 423 s = s->next; 424 } 425 } 426 427 g_free( acc_handle ); 428 } 354 429 else 355 430 { … … 394 469 else 395 470 { 396 nick_set( irc, cmd[2], a->gc->prpl, cmd[3] );471 nick_set( a, cmd[2], cmd[3] ); 397 472 } 398 473 } … … 401 476 add them to your *real* (server-side) contact list. */ 402 477 if( add_for_real ) 403 a->gc-> prpl->add_buddy( a->gc, cmd[2] );478 a->gc->acc->prpl->add_buddy( a->gc, cmd[2] ); 404 479 405 480 add_buddy( a->gc, NULL, cmd[2], cmd[2] ); … … 435 510 } 436 511 437 if( !gc-> prpl->get_info )512 if( !gc->acc->prpl->get_info ) 438 513 { 439 514 irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] ); … … 441 516 else 442 517 { 443 gc-> prpl->get_info( gc, cmd[2] );518 gc->acc->prpl->get_info( gc, cmd[2] ); 444 519 } 445 520 } … … 476 551 else if( u->send_handler == buddy_send_handler ) 477 552 { 478 nick_set( irc, u->handle, u->gc->prpl, cmd[2] );553 nick_set( u->gc->acc, u->handle, cmd[2] ); 479 554 } 480 555 … … 495 570 s = g_strdup( u->handle ); 496 571 497 u->gc-> prpl->remove_buddy( u->gc, u->handle, NULL );572 u->gc->acc->prpl->remove_buddy( u->gc, u->handle, NULL ); 498 573 user_del( irc, cmd[1] ); 499 nick_del( irc, cmd[1]);574 nick_del( u->gc->acc, u->handle ); 500 575 501 576 irc_usermsg( irc, "Buddy `%s' (nick %s) removed from contact list", s, cmd[1] ); … … 552 627 } 553 628 554 if( !gc-> prpl->add_deny || !gc->prpl->rem_permit )629 if( !gc->acc->prpl->add_deny || !gc->acc->prpl->rem_permit ) 555 630 { 556 631 irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] ); … … 611 686 } 612 687 613 if( !gc-> prpl->rem_deny || !gc->prpl->add_permit )688 if( !gc->acc->prpl->rem_deny || !gc->acc->prpl->add_permit ) 614 689 { 615 690 irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] ); … … 666 741 if( cmd[1] && cmd[2] ) 667 742 { 668 set_setstr( irc, cmd[1], cmd[2] );743 set_setstr( &irc->set, cmd[1], cmd[2] ); 669 744 670 745 if( ( strcmp( cmd[2], "=" ) ) == 0 && cmd[3] ) … … 673 748 if( cmd[1] ) /* else 'forgotten' on purpose.. Must show new value after changing */ 674 749 { 675 char *s = set_getstr( irc, cmd[1] );750 char *s = set_getstr( &irc->set, cmd[1] ); 676 751 if( s ) 677 752 irc_usermsg( irc, "%s = `%s'", cmd[1], s ); 753 else 754 irc_usermsg( irc, "%s is empty", cmd[1] ); 678 755 } 679 756 else … … 684 761 if( s->value || s->def ) 685 762 irc_usermsg( irc, "%s = `%s'", s->key, s->value?s->value:s->def ); 763 else 764 irc_usermsg( irc, "%s is empty", s->key ); 686 765 s = s->next; 687 766 } … … 727 806 if( online == 1 ) 728 807 { 729 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc-> user->prpl->name );808 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name ); 730 809 irc_usermsg( irc, format, u->nick, s, "Online" ); 731 810 } … … 738 817 if( away == 1 ) 739 818 { 740 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc-> user->prpl->name );819 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name ); 741 820 irc_usermsg( irc, format, u->nick, s, u->away ); 742 821 } … … 748 827 if( offline == 1 ) 749 828 { 750 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc-> user->prpl->name );829 g_snprintf( s, sizeof( s ) - 1, "%s@%s (%s)", u->user, u->host, u->gc->acc->prpl->name ); 751 830 irc_usermsg( irc, format, u->nick, s, "Offline" ); 752 831 } … … 773 852 irc_usermsg( irc, "Your name is `%s'" , a->gc->displayname ? a->gc->displayname : "NULL" ); 774 853 } 775 else if ( !a-> gc->prpl->set_info )854 else if ( !a->prpl->set_info ) 776 855 { 777 856 irc_usermsg( irc, "Command `%s' not supported by this protocol", cmd[0] ); … … 781 860 irc_usermsg( irc, "Setting your name to `%s'", cmd[2] ); 782 861 783 a-> gc->prpl->set_info( a->gc, cmd[2] );862 a->prpl->set_info( a->gc, cmd[2] ); 784 863 } 785 864 } … … 800 879 for( num = 0; q; q = q->next, num ++ ) 801 880 if( q->gc ) /* Not necessary yet, but it might come later */ 802 irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc-> prpl->name, q->gc->username, q->question );881 irc_usermsg( irc, "%d, %s(%s): %s", num, q->gc->acc->prpl->name, q->gc->username, q->question ); 803 882 else 804 883 irc_usermsg( irc, "%d, BitlBee: %s", num, q->question ); 805 }806 807 static void cmd_import_buddies( irc_t *irc, char **cmd )808 {809 struct gaim_connection *gc;810 account_t *a;811 nick_t *n;812 813 if( !( a = account_get( irc, cmd[1] ) ) )814 {815 irc_usermsg( irc, "Invalid account" );816 return;817 }818 else if( !( ( gc = a->gc ) && ( a->gc->flags & OPT_LOGGED_IN ) ) )819 {820 irc_usermsg( irc, "That account is not on-line" );821 return;822 }823 824 if( cmd[2] )825 {826 if( g_strcasecmp( cmd[2], "clear" ) == 0 )827 {828 user_t *u;829 830 for( u = irc->users; u; u = u->next )831 if( u->gc == gc )832 {833 u->gc->prpl->remove_buddy( u->gc, u->handle, NULL );834 user_del( irc, u->nick );835 }836 837 irc_usermsg( irc, "Old buddy list cleared." );838 }839 else840 {841 irc_usermsg( irc, "Invalid argument: %s", cmd[2] );842 return;843 }844 }845 846 for( n = gc->irc->nicks; n; n = n->next )847 {848 if( n->proto == gc->prpl && !user_findhandle( gc, n->handle ) )849 {850 gc->prpl->add_buddy( gc, n->handle );851 add_buddy( gc, NULL, n->handle, NULL );852 }853 }854 855 irc_usermsg( irc, "Sent all add requests. Please wait for a while, the server needs some time to handle all the adds." );856 884 } 857 885 … … 874 902 { "blist", 0, cmd_blist, 0 }, 875 903 { "nick", 1, cmd_nick, 0 }, 876 { "import_buddies", 1, cmd_import_buddies, 0 },877 904 { "qlist", 0, cmd_qlist, 0 }, 878 905 { NULL } -
set.c
r6398094 reda0270 26 26 #include "bitlbee.h" 27 27 28 set_t *set_add( irc_t *irc, char *key, char *def, void *eval ) 29 { 30 set_t *s = set_find( irc, key ); 31 32 if( !s ) 33 { 34 if( ( s = irc->set ) ) 28 set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data ) 29 { 30 set_t *s = set_find( head, key ); 31 32 /* Possibly the setting already exists. If it doesn't exist yet, 33 we create it. If it does, we'll just change the default. */ 34 if( !s ) 35 { 36 if( ( s = *head ) ) 35 37 { 36 38 while( s->next ) s = s->next; 37 s->next = g_new 39 s->next = g_new0( set_t, 1 ); 38 40 s = s->next; 39 41 } 40 42 else 41 43 { 42 s = irc->set = g_new( set_t, 1 );44 s = *head = g_new0( set_t, 1 ); 43 45 } 44 memset( s, 0, sizeof( set_t ) );45 46 s->key = g_strdup( key ); 46 47 } … … 53 54 if( def ) s->def = g_strdup( def ); 54 55 55 if( s->eval ) 56 { 57 g_free( s->eval ); 58 s->eval = NULL; 59 } 60 if( eval ) s->eval = eval; 61 62 return( s ); 63 } 64 65 set_t *set_find( irc_t *irc, char *key ) 66 { 67 set_t *s = irc->set; 56 s->eval = eval; 57 s->data = data; 58 59 return s; 60 } 61 62 set_t *set_find( set_t **head, char *key ) 63 { 64 set_t *s = *head; 68 65 69 66 while( s ) … … 74 71 } 75 72 76 return ( s );77 } 78 79 char *set_getstr( irc_t *irc, char *key )80 { 81 set_t *s = set_find( irc, key );73 return s; 74 } 75 76 char *set_getstr( set_t **head, char *key ) 77 { 78 set_t *s = set_find( head, key ); 82 79 83 80 if( !s || ( !s->value && !s->def ) ) 84 return ( NULL );85 86 return ( s->value?s->value:s->def );87 } 88 89 int set_getint( irc_t *irc, char *key )90 { 91 char *s = set_getstr( irc, key );81 return NULL; 82 83 return s->value ? s->value : s->def; 84 } 85 86 int set_getint( set_t **head, char *key ) 87 { 88 char *s = set_getstr( head, key ); 92 89 int i = 0; 93 90 94 91 if( !s ) 95 return ( 0 );92 return 0; 96 93 97 94 if( ( g_strcasecmp( s, "true" ) == 0 ) || ( g_strcasecmp( s, "yes" ) == 0 ) || ( g_strcasecmp( s, "on" ) == 0 ) ) 98 return ( 1 );95 return 1; 99 96 100 97 if( sscanf( s, "%d", &i ) != 1 ) 101 return( 0 ); 102 103 return( i ); 104 } 105 106 int set_setstr( irc_t *irc, char *key, char *value ) 107 { 108 set_t *s = set_find( irc, key ); 98 return 0; 99 100 return i; 101 } 102 103 int set_getbool( set_t **head, char *key ) 104 { 105 char *s = set_getstr( head, key ); 106 107 if( !s ) 108 return 0; 109 110 return bool2int( s ); 111 } 112 113 int set_setstr( set_t **head, char *key, char *value ) 114 { 115 set_t *s = set_find( head, key ); 109 116 char *nv = value; 110 117 111 118 if( !s ) 112 s = set_add( irc, key, NULL, NULL );113 114 if( s->eval && !( nv = s->eval( irc,s, value ) ) )115 return ( 0 );119 s = set_add( head, key, NULL, NULL, NULL ); 120 121 if( s->eval && !( nv = s->eval( s, value ) ) ) 122 return 0; 116 123 117 124 if( s->value ) … … 121 128 } 122 129 130 /* If there's a default setting and it's equal to what we're trying to 131 set, stick with s->value = NULL. Otherwise, remember the setting. */ 123 132 if( !s->def || ( strcmp( nv, s->def ) != 0 ) ) 124 133 s->value = g_strdup( nv ); … … 127 136 g_free( nv ); 128 137 129 return ( 1 );130 } 131 132 int set_setint( irc_t *irc, char *key, int value )138 return 1; 139 } 140 141 int set_setint( set_t **head, char *key, int value ) 133 142 { 134 143 char s[24]; /* Not quite 128-bit clean eh? ;-) */ 135 144 136 sprintf( s, "%d", value );137 return ( set_setstr( irc, key, s ));138 } 139 140 void set_del( irc_t *irc, char *key )141 { 142 set_t *s = irc->set, *t = NULL;145 g_snprintf( s, sizeof( s ), "%d", value ); 146 return set_setstr( head, key, s ); 147 } 148 149 void set_del( set_t **head, char *key ) 150 { 151 set_t *s = *head, *t = NULL; 143 152 144 153 while( s ) … … 153 162 t->next = s->next; 154 163 else 155 irc->set= s->next;164 *head = s->next; 156 165 157 166 g_free( s->key ); … … 162 171 } 163 172 164 char *set_eval_int( irc_t *irc, set_t *set, char *value ) 165 { 166 char *s = value; 167 168 for( ; *s; s ++ ) 169 if( *s < '0' || *s > '9' ) 170 return( NULL ); 171 172 return( value ); 173 } 174 175 char *set_eval_bool( irc_t *irc, set_t *set, char *value ) 176 { 177 if( ( g_strcasecmp( value, "true" ) == 0 ) || ( g_strcasecmp( value, "yes" ) == 0 ) || ( g_strcasecmp( value, "on" ) == 0 ) ) 178 return( value ); 179 if( ( g_strcasecmp( value, "false" ) == 0 ) || ( g_strcasecmp( value, "no" ) == 0 ) || ( g_strcasecmp( value, "off" ) == 0 ) ) 180 return( value ); 181 return( set_eval_int( irc, set, value ) ); 182 } 183 184 char *set_eval_to_char( irc_t *irc, set_t *set, char *value ) 173 char *set_eval_int( set_t *set, char *value ) 174 { 175 char *s; 176 177 for( s = value; *s; s ++ ) 178 if( !isdigit( *s ) ) 179 return NULL; 180 181 return value; 182 } 183 184 char *set_eval_bool( set_t *set, char *value ) 185 { 186 return is_bool( value ) ? value : NULL; 187 } 188 189 char *set_eval_to_char( set_t *set, char *value ) 185 190 { 186 191 char *s = g_new( char, 3 ); … … 191 196 sprintf( s, "%c ", *value ); 192 197 193 return( s ); 194 } 195 196 char *set_eval_ops( irc_t *irc, set_t *set, char *value ) 197 { 198 return s; 199 } 200 201 char *set_eval_ops( set_t *set, char *value ) 202 { 203 irc_t *irc = set->data; 204 198 205 if( g_strcasecmp( value, "user" ) == 0 ) 199 {200 206 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 201 207 irc->channel, "+o-o", irc->nick, irc->mynick ); 202 return( value );203 }204 208 else if( g_strcasecmp( value, "root" ) == 0 ) 205 {206 209 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 207 210 irc->channel, "-o+o", irc->nick, irc->mynick ); 208 return( value );209 }210 211 else if( g_strcasecmp( value, "both" ) == 0 ) 211 {212 212 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 213 213 irc->channel, "+oo", irc->nick, irc->mynick ); 214 return( value );215 }216 214 else if( g_strcasecmp( value, "none" ) == 0 ) 217 {218 215 irc_write( irc, ":%s!%s@%s MODE %s %s %s %s", irc->mynick, irc->mynick, irc->myhost, 219 216 irc->channel, "-oo", irc->nick, irc->mynick ); 220 return( value ); 221 } 222 223 return( NULL ); 224 } 225 217 else 218 return NULL; 219 220 return value; 221 } 222 223 char *set_eval_charset( set_t *set, char *value ) 224 { 225 GIConv cd; 226 227 if ( g_strncasecmp( value, "none", 4 ) == 0 ) 228 return value; 229 230 cd = g_iconv_open( "UTF-8", value ); 231 if( cd == (GIConv) -1 ) 232 return NULL; 233 234 g_iconv_close( cd ); 235 return value; 236 } -
set.h
r6398094 reda0270 2 2 * BitlBee -- An IRC to other IM-networks gateway * 3 3 * * 4 * Copyright 2002-200 4Wilmer van der Gaast and others *4 * Copyright 2002-2006 Wilmer van der Gaast and others * 5 5 \********************************************************************/ 6 6 … … 26 26 typedef struct set 27 27 { 28 void *data; 29 28 30 char *key; 29 31 char *value; 30 32 char *def; /* Default */ 31 33 32 /* Eval: Returns NULL if the value is incorrect. Can return a 33 corrected value. set_setstr() should be able to free() the 34 returned string! */ 35 char *(*eval) ( irc_t *irc, struct set *set, char *value ); 34 int flags; 35 36 /* Eval: Returns NULL if the value is incorrect or exactly the 37 passed value variable. When returning a corrected value, 38 set_setstr() should be able to free() the returned string! */ 39 char *(*eval) ( struct set *set, char *value ); 36 40 struct set *next; 37 41 } set_t; 38 42 39 set_t *set_add( irc_t *irc, char *key, char *def, void *eval ); 40 G_MODULE_EXPORT set_t *set_find( irc_t *irc, char *key ); 41 G_MODULE_EXPORT char *set_getstr( irc_t *irc, char *key ); 42 G_MODULE_EXPORT int set_getint( irc_t *irc, char *key ); 43 int set_setstr( irc_t *irc, char *key, char *value ); 44 int set_setint( irc_t *irc, char *key, int value ); 45 void set_del( irc_t *irc, char *key ); 43 set_t *set_add( set_t **head, char *key, char *def, void *eval, void *data ); 44 set_t *set_find( set_t **head, char *key ); 45 G_MODULE_EXPORT char *set_getstr( set_t **head, char *key ); 46 G_MODULE_EXPORT int set_getint( set_t **head, char *key ); 47 G_MODULE_EXPORT int set_getbool( set_t **head, char *key ); 48 int set_setstr( set_t **head, char *key, char *value ); 49 int set_setint( set_t **head, char *key, int value ); 50 void set_del( set_t **head, char *key ); 46 51 47 char *set_eval_int( irc_t *irc, set_t *set, char *value ); 48 char *set_eval_bool( irc_t *irc, set_t *set, char *value ); 49 char *set_eval_to_char( irc_t *irc, set_t *set, char *value ); 50 char *set_eval_ops( irc_t *irc, set_t *set, char *value ); 52 char *set_eval_int( set_t *set, char *value ); 53 char *set_eval_bool( set_t *set, char *value ); 51 54 52 55 char *set_eval_to_char( set_t *set, char *value ); 56 char *set_eval_ops( set_t *set, char *value ); 57 char *set_eval_charset( set_t *set, char *value ); -
storage.c
r6398094 reda0270 6 6 7 7 /* Support for multiple storage backends */ 8 9 /* Copyright (C) 2005 Jelmer Vernooij <jelmer@samba.org> */ 8 10 9 11 /* … … 29 31 30 32 extern storage_t storage_text; 33 extern storage_t storage_xml; 31 34 32 static GList text_entry = { &storage_text, NULL, NULL }; 33 static GList *storage_backends = &text_entry; 35 static GList *storage_backends = NULL; 34 36 35 37 void register_storage_backend(storage_t *backend) … … 41 43 { 42 44 GList *gl; 43 storage_t *st ;45 storage_t *st = NULL; 44 46 45 47 for (gl = storage_backends; gl; gl = gl->next) { … … 63 65 int i; 64 66 storage_t *storage; 65 67 68 register_storage_backend(&storage_text); 69 register_storage_backend(&storage_xml); 70 66 71 storage = storage_init_single(primary); 67 if (storage == NULL )72 if (storage == NULL && storage->save == NULL) 68 73 return NULL; 69 74 -
storage.h
r6398094 reda0270 33 33 STORAGE_ALREADY_EXISTS, 34 34 STORAGE_OTHER_ERROR /* Error that isn't caused by user input, such as 35 36 35 a database that is unreachable. log() will be 36 used for the exact error message */ 37 37 } storage_status_t; 38 38 -
storage_text.c
r6398094 reda0270 28 28 #include "crypting.h" 29 29 30 /* DO NOT USE THIS FUNCTION IN NEW CODE. This31 * function is here merely because the save/load code still uses32 * ids rather than names */33 static struct prpl *find_protocol_by_id(int id)34 {35 switch (id) {36 case 0: case 1: case 3: return find_protocol("oscar");37 case 4: return find_protocol("msn");38 case 2: return find_protocol("yahoo");39 case 8: return find_protocol("jabber");40 default: break;41 }42 return NULL;43 }44 45 static int find_protocol_id(const char *name)46 {47 if (!strcmp(name, "oscar")) return 1;48 if (!strcmp(name, "msn")) return 4;49 if (!strcmp(name, "yahoo")) return 2;50 if (!strcmp(name, "jabber")) return 8;51 52 return -1;53 }54 55 56 30 static void text_init (void) 57 31 { … … 70 44 FILE *fp; 71 45 user_t *ru = user_find( irc, ROOT_NICK ); 46 account_t *acc, *acc_lookup[9]; 72 47 73 48 if( irc->status & USTATUS_IDENTIFIED ) … … 80 55 fscanf( fp, "%32[^\n]s", s ); 81 56 82 if (checkpass (password, s) != 0)57 if( checkpass( password, s ) != 0 ) 83 58 { 84 59 fclose( fp ); … … 100 75 fclose( fp ); 101 76 77 /* Build a list with the first listed account of every protocol 78 number. So if the user had nicks defined for a second account on 79 the same IM network, those nicks will be added to the wrong 80 account, and the user should rename those buddies again. But at 81 least from now on things will be saved properly. */ 82 memset( acc_lookup, 0, sizeof( acc_lookup ) ); 83 for( acc = irc->accounts; acc; acc = acc->next ) 84 { 85 if( acc_lookup[0] == NULL && strcmp( acc->prpl->name, "oscar" ) == 0 ) 86 acc_lookup[0] = acc_lookup[1] = acc_lookup[3] = acc; 87 else if( acc_lookup[2] == NULL && strcmp( acc->prpl->name, "yahoo" ) == 0 ) 88 acc_lookup[2] = acc; 89 else if( acc_lookup[4] == NULL && strcmp( acc->prpl->name, "msn" ) == 0 ) 90 acc_lookup[4] = acc; 91 else if( acc_lookup[8] == NULL && strcmp( acc->prpl->name, "jabber" ) == 0 ) 92 acc_lookup[8] = acc; 93 } 94 102 95 g_snprintf( s, 511, "%s%s%s", global.conf->configdir, my_nick, ".nicks" ); 103 96 fp = fopen( s, "r" ); … … 105 98 while( fscanf( fp, "%s %d %s", s, &proto, nick ) > 0 ) 106 99 { 107 struct prpl *prpl; 108 109 prpl = find_protocol_by_id(proto); 110 111 if (!prpl) 100 if( ( acc = acc_lookup[proto] ) == NULL ) 112 101 continue; 113 102 114 103 http_decode( s ); 115 nick_set( irc, s, prpl, nick );104 nick_set( acc, s, nick ); 116 105 } 117 106 fclose( fp ); 118 119 if( set_getint( irc, "auto_connect" ) )120 {121 strcpy( s, "account on" ); /* Can't do this directly because r_c_s alters the string */122 root_command_string( irc, ru, s, 0 );123 }124 125 return STORAGE_OK;126 }127 128 static storage_status_t text_save( irc_t *irc, int overwrite )129 {130 char s[512];131 char path[512], new_path[512];132 char *line;133 nick_t *n;134 set_t *set;135 mode_t ou = umask( 0077 );136 account_t *a;137 FILE *fp;138 char *hash;139 140 if (!overwrite) {141 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );142 if (access( path, F_OK ) != -1)143 return STORAGE_ALREADY_EXISTS;144 145 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );146 if (access( path, F_OK ) != -1)147 return STORAGE_ALREADY_EXISTS;148 }149 150 /*\151 * [SH] Nothing should be saved if no password is set, because the152 * password is not set if it was wrong, or if one is not identified153 * yet. This means that a malicious user could easily overwrite154 * files owned by someone else:155 * a Bad Thing, methinks156 \*/157 158 /* [WVG] No? Really? */159 160 /*\161 * [SH] Okay, okay, it wasn't really Wilmer who said that, it was162 * me. I just thought it was funny.163 \*/164 165 hash = hashpass( irc->password );166 if( hash == NULL )167 {168 irc_usermsg( irc, "Please register yourself if you want to save your settings." );169 return STORAGE_OTHER_ERROR;170 }171 172 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".nicks~" );173 fp = fopen( path, "w" );174 if( !fp ) return STORAGE_OTHER_ERROR;175 for( n = irc->nicks; n; n = n->next )176 {177 strcpy( s, n->handle );178 s[169] = 0; /* Prevent any overflow (169 ~ 512 / 3) */179 http_encode( s );180 g_snprintf( s + strlen( s ), 510 - strlen( s ), " %d %s", find_protocol_id(n->proto->name), n->nick );181 if( fprintf( fp, "%s\n", s ) != strlen( s ) + 1 )182 {183 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );184 fclose( fp );185 return STORAGE_OTHER_ERROR;186 }187 }188 if( fclose( fp ) != 0 )189 {190 irc_usermsg( irc, "fclose() reported an error. Disk full?" );191 return STORAGE_OTHER_ERROR;192 }193 194 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".nicks" );195 if( unlink( new_path ) != 0 )196 {197 if( errno != ENOENT )198 {199 irc_usermsg( irc, "Error while removing old .nicks file" );200 return STORAGE_OTHER_ERROR;201 }202 }203 if( rename( path, new_path ) != 0 )204 {205 irc_usermsg( irc, "Error while renaming new .nicks file" );206 return STORAGE_OTHER_ERROR;207 }208 209 g_snprintf( path, 511, "%s%s%s", global.conf->configdir, irc->nick, ".accounts~" );210 fp = fopen( path, "w" );211 if( !fp ) return STORAGE_OTHER_ERROR;212 if( fprintf( fp, "%s", hash ) != strlen( hash ) )213 {214 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );215 fclose( fp );216 return STORAGE_OTHER_ERROR;217 }218 g_free( hash );219 220 for( a = irc->accounts; a; a = a->next )221 {222 if( !strcmp(a->prpl->name, "oscar") )223 g_snprintf( s, sizeof( s ), "account add oscar \"%s\" \"%s\" %s", a->user, a->pass, a->server );224 else225 g_snprintf( s, sizeof( s ), "account add %s \"%s\" \"%s\" \"%s\"",226 a->prpl->name, a->user, a->pass, a->server ? a->server : "" );227 228 line = obfucrypt( s, irc->password );229 if( *line )230 {231 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )232 {233 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );234 fclose( fp );235 return STORAGE_OTHER_ERROR;236 }237 }238 g_free( line );239 }240 241 for( set = irc->set; set; set = set->next )242 {243 if( set->value && set->def )244 {245 g_snprintf( s, sizeof( s ), "set %s \"%s\"", set->key, set->value );246 line = obfucrypt( s, irc->password );247 if( *line )248 {249 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )250 {251 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );252 fclose( fp );253 return STORAGE_OTHER_ERROR;254 }255 }256 g_free( line );257 }258 }259 260 if( strcmp( irc->mynick, ROOT_NICK ) != 0 )261 {262 g_snprintf( s, sizeof( s ), "rename %s %s", ROOT_NICK, irc->mynick );263 line = obfucrypt( s, irc->password );264 if( *line )265 {266 if( fprintf( fp, "%s\n", line ) != strlen( line ) + 1 )267 {268 irc_usermsg( irc, "fprintf() wrote too little. Disk full?" );269 fclose( fp );270 return STORAGE_OTHER_ERROR;271 }272 }273 g_free( line );274 }275 if( fclose( fp ) != 0 )276 {277 irc_usermsg( irc, "fclose() reported an error. Disk full?" );278 return STORAGE_OTHER_ERROR;279 }280 281 g_snprintf( new_path, 512, "%s%s%s", global.conf->configdir, irc->nick, ".accounts" );282 if( unlink( new_path ) != 0 )283 {284 if( errno != ENOENT )285 {286 irc_usermsg( irc, "Error while removing old .accounts file" );287 return STORAGE_OTHER_ERROR;288 }289 }290 if( rename( path, new_path ) != 0 )291 {292 irc_usermsg( irc, "Error while renaming new .accounts file" );293 return STORAGE_OTHER_ERROR;294 }295 296 umask( ou );297 107 298 108 return STORAGE_OK; … … 343 153 .check_pass = text_check_pass, 344 154 .remove = text_remove, 345 .load = text_load, 346 .save = text_save 155 .load = text_load 347 156 }; -
unix.c
r6398094 reda0270 48 48 49 49 b_main_init(); 50 51 50 log_init(); 52 53 51 nogaim_init(); 54 52 53 srand( time( NULL ) ^ getpid() ); 54 55 55 CONF_FILE = g_strdup( CONF_FILE_DEF ); 56 57 56 global.helpfile = g_strdup( HELP_FILE ); 58 57 59 58 global.conf = conf_load( argc, argv ); 60 59 if( global.conf == NULL ) 61 60 return( 1 ); 62 63 61 64 62 if( global.conf->runmode == RUNMODE_INETD ) 65 63 { … … 89 87 if( i != 0 ) 90 88 return( i ); 91 89 92 90 global.storage = storage_init( global.conf->primary_storage, global.conf->migrate_storage ); 93 91 if ( global.storage == NULL) { -
user.c
r6398094 reda0270 67 67 68 68 u->user = u->realname = u->host = u->nick = g_strdup( nick ); 69 u->is_private = set_getint( irc, "private" );69 u->is_private = set_getint( &irc->set, "private" ); 70 70 71 71 key = g_strdup( nick ); … … 143 143 user_t *user_findhandle( struct gaim_connection *gc, char *handle ) 144 144 { 145 user_t *u = gc->irc->users; 146 147 while( u ) 148 { 149 if( u->gc == gc && u->handle && gc->prpl->cmp_buddynames ( u->handle, handle ) == 0 ) 150 break; 151 u = u->next; 152 } 153 154 return( u ); 145 user_t *u; 146 char *nick; 147 148 /* First, let's try a hash lookup. If it works, it's probably faster. */ 149 if( ( nick = g_hash_table_lookup( gc->acc->nicks, handle ) ) && 150 ( u = user_find( gc->irc, nick ) ) && 151 ( gc->acc->prpl->handle_cmp( handle, u->handle ) == 0 ) ) 152 return u; 153 154 /* However, it doesn't always work, so in that case we'll have to dig 155 through the whole userlist. :-( */ 156 for( u = gc->irc->users; u; u = u->next ) 157 if( u->gc == gc && u->handle && gc->acc->prpl->handle_cmp( u->handle, handle ) == 0 ) 158 return u; 159 160 return NULL; 155 161 } 156 162
Note: See TracChangeset
for help on using the changeset viewer.