aboutsummaryrefslogtreecommitdiffstats
path: root/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'protocols')
-rw-r--r--protocols/jabber/jabber.c5
-rw-r--r--protocols/msn/msn.h5
-rw-r--r--protocols/msn/msn_util.c11
-rw-r--r--protocols/msn/ns.c51
-rw-r--r--protocols/msn/sb.c8
-rw-r--r--protocols/nogaim.c42
-rw-r--r--protocols/oscar/oscar.c13
-rw-r--r--protocols/ssl_openssl.c86
8 files changed, 128 insertions, 93 deletions
diff --git a/protocols/jabber/jabber.c b/protocols/jabber/jabber.c
index ba652b8a..224762ce 100644
--- a/protocols/jabber/jabber.c
+++ b/protocols/jabber/jabber.c
@@ -1231,9 +1231,7 @@ static void jabber_handleroster(gjconn gjc, xmlnode querynode)
x = xmlnode_get_nextsibling(x);
}
- x = jutil_presnew(0, NULL, "Online");
- gjab_send(gjc, x);
- xmlnode_free(x);
+ account_online(GJ_GC(gjc));
}
static void jabber_handleauthresp(gjconn gjc, jpacket p)
@@ -1249,7 +1247,6 @@ static void jabber_handleauthresp(gjconn gjc, jpacket p)
gjab_auth(gjc);
} else {
gjab_reqroster(gjc);
- account_online(GJ_GC(gjc));
((struct jabber_data *)GJ_GC(gjc)->proto_data)->did_import = TRUE;
}
diff --git a/protocols/msn/msn.h b/protocols/msn/msn.h
index 9727c537..0cd174f2 100644
--- a/protocols/msn/msn.h
+++ b/protocols/msn/msn.h
@@ -65,8 +65,11 @@ struct msn_data
GSList *msgq;
GSList *switchboards;
- int buddycount;
const struct msn_away_state *away_state;
+
+ int buddycount;
+ int groupcount;
+ char **grouplist;
};
struct msn_switchboard
diff --git a/protocols/msn/msn_util.c b/protocols/msn/msn_util.c
index e5f0b2c9..5cda9f1c 100644
--- a/protocols/msn/msn_util.c
+++ b/protocols/msn/msn_util.c
@@ -45,19 +45,8 @@ int msn_write( struct gaim_connection *gc, char *s, int len )
int msn_logged_in( struct gaim_connection *gc )
{
- struct msn_data *md = gc->proto_data;
- char buf[1024];
-
account_online( gc );
- /* account_online() sets an away state if there is any, so only
- execute this code if we're not away. */
- if( md->away_state == msn_away_state_list )
- {
- g_snprintf( buf, sizeof( buf ), "CHG %d %s %d\r\n", ++md->trId, md->away_state->code, 0 );
- return( msn_write( gc, buf, strlen( buf ) ) );
- }
-
return( 0 );
}
diff --git a/protocols/msn/ns.c b/protocols/msn/ns.c
index 4ced58a0..90d525ef 100644
--- a/protocols/msn/ns.c
+++ b/protocols/msn/ns.c
@@ -256,6 +256,9 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
if( num_parts == 5 )
{
md->buddycount = atoi( cmd[3] );
+ md->groupcount = atoi( cmd[4] );
+ if( md->groupcount > 0 )
+ md->grouplist = g_new0( char *, md->groupcount );
if( !*cmd[3] || md->buddycount == 0 )
msn_logged_in( gc );
@@ -268,18 +271,6 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
msn_logged_in( gc );
}
}
- else if( strcmp( cmd[0], "GTC" ) == 0 )
- {
- }
- else if( strcmp( cmd[0], "BLP" ) == 0 )
- {
- }
- else if( strcmp( cmd[0], "PRP" ) == 0 )
- {
- }
- else if( strcmp( cmd[0], "LSG" ) == 0 )
- {
- }
else if( strcmp( cmd[0], "LST" ) == 0 )
{
int list;
@@ -296,7 +287,13 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
if( list & 1 ) /* FL */
{
- add_buddy( gc, NULL, cmd[1], cmd[2] );
+ char *group = NULL;
+ int num;
+
+ if( cmd[4] != NULL && sscanf( cmd[4], "%d", &num ) == 1 )
+ group = md->grouplist[num];
+
+ add_buddy( gc, group, cmd[1], cmd[2] );
}
if( list & 2 ) /* AL */
{
@@ -326,11 +323,22 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
}
}
}
- else if( strcmp( cmd[0], "BPR" ) == 0 )
- {
- }
- else if( strcmp( cmd[0], "CHG" ) == 0 )
+ else if( strcmp( cmd[0], "LSG" ) == 0 )
{
+ int num;
+
+ if( num_parts != 4 )
+ {
+ hide_login_progress_error( gc, "Syntax error" );
+ signoff( gc );
+ return( 0 );
+ }
+
+ http_decode( cmd[2] );
+ num = atoi( cmd[1] );
+
+ if( num < md->groupcount )
+ md->grouplist[num] = g_strdup( cmd[2] );
}
else if( strcmp( cmd[0], "CHL" ) == 0 )
{
@@ -356,12 +364,6 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
return( msn_write( gc, buf, strlen( buf ) ) );
}
- else if( strcmp( cmd[0], "QRY" ) == 0 )
- {
- }
- else if( strcmp( cmd[0], "QNG" ) == 0 )
- {
- }
else if( strcmp( cmd[0], "ILN" ) == 0 )
{
const struct msn_away_state *st;
@@ -478,9 +480,6 @@ static int msn_ns_command( gpointer data, char **cmd, int num_parts )
msn_buddy_ask( gc, cmd[4], cmd[5] );
}
}
- else if( strcmp( cmd[0], "REM" ) == 0 )
- {
- }
else if( strcmp( cmd[0], "OUT" ) == 0 )
{
if( cmd[1] && strcmp( cmd[1], "OTH" ) == 0 )
diff --git a/protocols/msn/sb.c b/protocols/msn/sb.c
index deaceba1..234be1d6 100644
--- a/protocols/msn/sb.c
+++ b/protocols/msn/sb.c
@@ -201,9 +201,6 @@ void msn_sb_destroy( struct msn_switchboard *sb )
debug( "Destroying switchboard: %s", sb->who ? sb->who : sb->key ? sb->key : "" );
- if( sb->key ) g_free( sb->key );
- if( sb->who ) g_free( sb->who );
-
if( sb->msgq )
{
struct msn_message *m;
@@ -221,9 +218,12 @@ void msn_sb_destroy( struct msn_switchboard *sb )
serv_got_crap( gc, "Warning: Closing down MSN switchboard connection with "
"unsent message to %s, you'll have to resend it.",
- m->who ? m->who : "(unknown)" );
+ sb->who ? sb->who : "(unknown)" );
}
+ if( sb->key ) g_free( sb->key );
+ if( sb->who ) g_free( sb->who );
+
if( sb->chat )
{
serv_got_chat_left( gc, sb->chat->id );
diff --git a/protocols/nogaim.c b/protocols/nogaim.c
index 29ae860a..28f76fff 100644
--- a/protocols/nogaim.c
+++ b/protocols/nogaim.c
@@ -13,7 +13,7 @@
* from scratch for BitlBee and doesn't contain any code from Gaim anymore
* (except for the function names).
*
- * Copyright 2002-2004 Wilmer van der Gaast <lintux@lintux.cx>
+ * Copyright 2002-2006 Wilmer van der Gaast <wilmer@gaast.net> and others
*/
/*
@@ -38,7 +38,7 @@
#include <ctype.h>
#include <iconv.h>
-static char *proto_away_alias[7][5] =
+static char *proto_away_alias[8][5] =
{
{ "Away from computer", "Away", "Extended away", NULL },
{ "NA", "N/A", "Not available", NULL },
@@ -46,6 +46,7 @@ static char *proto_away_alias[7][5] =
{ "Be right back", "BRB", NULL },
{ "On the phone", "Phone", "On phone", NULL },
{ "Out to lunch", "Lunch", "Food", NULL },
+ { "Invisible", "Hidden" },
{ NULL }
};
static char *proto_away_alias_find( GList *gcm, char *away );
@@ -304,7 +305,7 @@ void hide_login_progress_error( struct gaim_connection *gc, char *msg )
void serv_got_crap( struct gaim_connection *gc, char *format, ... )
{
va_list params;
- char text[1024], buf[1024], acc_id[33];
+ char text[1024], buf[1024], *acc_id;
char *msg;
account_t *a;
@@ -329,11 +330,13 @@ void serv_got_crap( struct gaim_connection *gc, char *format, ... )
/* If we found one, add the screenname to the acc_id. */
if( a )
- g_snprintf( acc_id, 32, "%s(%s)", gc->prpl->name, gc->username );
+ acc_id = g_strdup_printf( "%s(%s)", gc->prpl->name, gc->username );
else
- g_snprintf( acc_id, 32, "%s", gc->prpl->name );
+ acc_id = g_strdup( gc->prpl->name );
irc_usermsg( gc->irc, "%s - %s", acc_id, msg );
+
+ g_free( acc_id );
}
static gboolean send_keepalive( gpointer d )
@@ -351,7 +354,7 @@ void account_online( struct gaim_connection *gc )
user_t *u;
/* MSN servers sometimes redirect you to a different server and do
- the whole login sequence again, so subsequent calls to this
+ the whole login sequence again, so these "late" calls to this
function should be handled correctly. (IOW, ignored) */
if( gc->flags & OPT_LOGGED_IN )
return;
@@ -363,9 +366,11 @@ void account_online( struct gaim_connection *gc )
gc->keepalive = g_timeout_add( 60000, send_keepalive, gc );
gc->flags |= OPT_LOGGED_IN;
- if( u && u->away ) proto_away( gc, u->away );
+ /* Also necessary when we're not away, at least for some of the
+ protocols. */
+ proto_away( gc, u->away );
- if( !strcmp(gc->prpl->name, "icq") )
+ if( strcmp( gc->prpl->name, "ICQ" ) == 0 )
{
for( u = gc->irc->users; u; u = u->next )
if( u->gc == gc )
@@ -469,16 +474,6 @@ void do_ask_dialog( struct gaim_connection *gc, char *msg, void *data, void *doi
/* list.c */
-int bud_list_cache_exists( struct gaim_connection *gc )
-{
- return( 0 );
-}
-
-void do_import( struct gaim_connection *gc, void *null )
-{
- return;
-}
-
void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *realname )
{
user_t *u;
@@ -530,6 +525,7 @@ void add_buddy( struct gaim_connection *gc, char *group, char *handle, char *rea
u->gc = gc;
u->handle = g_strdup( handle );
+ if( group ) u->group = g_strdup( group );
u->send_handler = buddy_send_handler;
u->last_typing_notice = 0;
}
@@ -553,11 +549,6 @@ struct buddy *find_buddy( struct gaim_connection *gc, char *handle )
return( b );
}
-void do_export( struct gaim_connection *gc )
-{
- return;
-}
-
void signoff_blocked( struct gaim_connection *gc )
{
return; /* Make all blocked users look invisible (TODO?) */
@@ -883,11 +874,6 @@ struct conversation *serv_got_joined_chat( struct gaim_connection *gc, int id, c
return( c );
}
-void serv_finish_login( struct gaim_connection *gc )
-{
- return;
-}
-
/* buddy_chat.c */
diff --git a/protocols/oscar/oscar.c b/protocols/oscar/oscar.c
index 4e552bce..97384afb 100644
--- a/protocols/oscar/oscar.c
+++ b/protocols/oscar/oscar.c
@@ -355,7 +355,9 @@ static void oscar_login(struct aim_user *user) {
if (isdigit(*user->username)) {
odata->icq = TRUE;
- /* this is odd but it's necessary for a proper do_import and do_export */
+ /* This is odd but it's necessary for a proper do_import and do_export.
+ We don't do those anymore, but let's stick with it, just in case
+ it accidentally fixes something else too... */
gc->password[8] = 0;
} else {
gc->flags |= OPT_CONN_HTML;
@@ -1147,7 +1149,7 @@ static void gaim_icq_authask(struct gaim_connection *gc, guint32 uin, char *msg)
if (strlen(msg) > 6)
reason = msg + 6;
- dialog_msg = g_strdup_printf("The user %u wants to add you to their buddy list for the following reason:\n\n%s", uin, reason ? reason : "No reason given.");
+ dialog_msg = g_strdup_printf("The user %u wants to add you to their buddy list for the following reason: %s", uin, reason ? reason : "No reason given.");
data->gc = gc;
data->uin = uin;
do_ask_dialog(gc, dialog_msg, data, gaim_icq_authgrant, gaim_icq_authdeny);
@@ -1736,11 +1738,6 @@ static int gaim_bosrights(aim_session_t *sess, aim_frame_t *fr, ...) {
odata->rights.maxpermits = (guint)maxpermits;
odata->rights.maxdenies = (guint)maxdenies;
-// serv_finish_login(gc);
-
- if (bud_list_cache_exists(gc))
- do_import(gc, NULL);
-
aim_clientready(sess, fr->conn);
aim_reqservice(sess, fr->conn, AIM_CONN_TYPE_CHATNAV);
@@ -2095,8 +2092,6 @@ static int gaim_ssi_parselist(aim_session_t *sess, aim_frame_t *fr, ...) {
} /* End of switch on curitem->type */
} /* End of for loop */
- if (tmp)
- do_export(gc);
aim_ssi_enable(sess, fr->conn);
/* Request offline messages, now that the buddy list is complete. */
diff --git a/protocols/ssl_openssl.c b/protocols/ssl_openssl.c
index e62f95b9..b79088cc 100644
--- a/protocols/ssl_openssl.c
+++ b/protocols/ssl_openssl.c
@@ -4,7 +4,7 @@
* Copyright 2002-2004 Wilmer van der Gaast and others *
\********************************************************************/
-/* SSL module - OpenTLS version */
+/* SSL module - OpenSSL version */
/*
This program is free software; you can redistribute it and/or modify
@@ -40,11 +40,13 @@ static gboolean initialized = FALSE;
struct scd
{
- SslInputFunction func;
+ ssl_input_function func;
gpointer data;
int fd;
gboolean established;
+ int inpa;
+ int lasterr; /* Necessary for SSL_get_error */
SSL *ssl;
SSL_CTX *ssl_ctx;
};
@@ -53,7 +55,7 @@ static void ssl_connected( gpointer data, gint source, GaimInputCondition cond )
-void *ssl_connect( char *host, int port, SslInputFunction func, gpointer data )
+void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
{
struct scd *conn = g_new0( struct scd, 1 );
SSL_METHOD *meth;
@@ -92,19 +94,45 @@ void *ssl_connect( char *host, int port, SslInputFunction func, gpointer data )
return( conn );
}
+static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond );
+
static void ssl_connected( gpointer data, gint source, GaimInputCondition cond )
{
struct scd *conn = data;
if( source == -1 )
- goto ssl_connected_failure;
+ return ssl_handshake( data, -1, cond );
+ /* Make it non-blocking at least during the handshake... */
+ sock_make_nonblocking( conn->fd );
SSL_set_fd( conn->ssl, conn->fd );
- if( SSL_connect( conn->ssl ) < 0 )
- goto ssl_connected_failure;
+ return ssl_handshake( data, source, cond );
+}
+
+static void ssl_handshake( gpointer data, gint source, GaimInputCondition cond )
+{
+ struct scd *conn = data;
+ int st;
+
+ if( conn->inpa != -1 )
+ {
+ gaim_input_remove( conn->inpa );
+ conn->inpa = -1;
+ }
+
+ if( ( st = SSL_connect( conn->ssl ) ) < 0 )
+ {
+ conn->lasterr = SSL_get_error( conn->ssl, st );
+ if( conn->lasterr != SSL_ERROR_WANT_READ && conn->lasterr != SSL_ERROR_WANT_WRITE )
+ goto ssl_connected_failure;
+
+ conn->inpa = gaim_input_add( conn->fd, ssl_getdirection( conn ), ssl_handshake, data );
+ return;
+ }
conn->established = TRUE;
+ sock_make_blocking( conn->fd ); /* For now... */
conn->func( conn->data, conn, cond );
return;
@@ -126,24 +154,57 @@ ssl_connected_failure:
int ssl_read( void *conn, char *buf, int len )
{
+ int st;
+
if( !((struct scd*)conn)->established )
- return( 0 );
+ {
+ ssl_errno = SSL_NOHANDSHAKE;
+ return -1;
+ }
+
+ st = SSL_read( ((struct scd*)conn)->ssl, buf, len );
- return( SSL_read( ((struct scd*)conn)->ssl, buf, len ) );
+ ssl_errno = SSL_OK;
+ if( st <= 0 )
+ {
+ ((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st );
+ if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE )
+ ssl_errno = SSL_AGAIN;
+ }
+
+ return st;
}
int ssl_write( void *conn, const char *buf, int len )
{
+ int st;
+
if( !((struct scd*)conn)->established )
- return( 0 );
+ {
+ ssl_errno = SSL_NOHANDSHAKE;
+ return -1;
+ }
+
+ st = SSL_write( ((struct scd*)conn)->ssl, buf, len );
- return( SSL_write( ((struct scd*)conn)->ssl, buf, len ) );
+ ssl_errno = SSL_OK;
+ if( st <= 0 )
+ {
+ ((struct scd*)conn)->lasterr = SSL_get_error( ((struct scd*)conn)->ssl, st );
+ if( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_READ || ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE )
+ ssl_errno = SSL_AGAIN;
+ }
+
+ return st;
}
void ssl_disconnect( void *conn_ )
{
struct scd *conn = conn_;
+ if( conn->inpa != -1 )
+ gaim_input_remove( conn->inpa );
+
if( conn->established )
SSL_shutdown( conn->ssl );
@@ -158,3 +219,8 @@ int ssl_getfd( void *conn )
{
return( ((struct scd*)conn)->fd );
}
+
+GaimInputCondition ssl_getdirection( void *conn )
+{
+ return( ((struct scd*)conn)->lasterr == SSL_ERROR_WANT_WRITE ? GAIM_INPUT_WRITE : GAIM_INPUT_READ );
+}