Index: protocols/ssl_sspi.c
===================================================================
--- protocols/ssl_sspi.c	(revision b1bd100c3d3f866e0fa891fc5ce6a4d4c5a284e6)
+++ protocols/ssl_sspi.c	(revision fcc2da97bcfa5e0d704179fae9c4ed59cbaf79c5)
@@ -32,4 +32,5 @@
 #include <sspi.h>
 #include <schannel.h>
+#include "sock.h"
 
 static gboolean initialized = FALSE;
@@ -42,42 +43,49 @@
 	gpointer data;
 	gboolean established;
-	int inpa;
   	CredHandle cred;		/* SSL credentials */
 	CtxtHandle context;		/* SSL context */
 	SecPkgContext_StreamSizes sizes;
+
+	char *host;
+
+	char *pending_raw_data;
+	gsize pending_raw_data_len;
+	char *pending_data;
+	gsize pending_data_len;
 };
 
 static void ssl_connected(gpointer, gint, GaimInputCondition);
 
-void sspi_global_init( void )
+void sspi_global_init(void)
 {
 	/* FIXME */
 }
 
-void sspi_global_deinit( void )
+void sspi_global_deinit(void)
 {
 	/* FIXME */
 }
 
-void *ssl_connect( char *host, int port, ssl_input_function func, gpointer data )
-{
-	struct scd *conn = g_new0( struct scd, 1 );
+void *ssl_connect(char *host, int port, ssl_input_function func, gpointer data)
+{
+	struct scd *conn = g_new0(struct scd, 1);
 		
-	conn->fd = proxy_connect( host, port, ssl_connected, conn );
+	conn->fd = proxy_connect(host, port, ssl_connected, conn);
+	sock_make_nonblocking(conn->fd);
 	conn->func = func;
 	conn->data = data;
-	conn->inpa = -1;
-	
-	if( conn->fd < 0 )
+	conn->host = g_strdup(host);
+	
+	if (conn->fd < 0)
 	{
-		g_free( conn );
-		return( NULL );
-	}
-	
-	if( !initialized )
+		g_free(conn);
+		return NULL;
+	}
+	
+	if (!initialized)
 	{
 		sspi_global_init();
 		initialized = TRUE;
-		atexit( sspi_global_deinit );
+		atexit(sspi_global_deinit);
 	}
 
@@ -85,7 +93,7 @@
 }
 
-static void ssl_connected(gpointer data, gint fd, GaimInputCondition cond)
-{
-	struct scd *conn = data;
+static void ssl_connected(gpointer _conn, gint fd, GaimInputCondition cond)
+{
+	struct scd *conn = _conn;
 	SCHANNEL_CRED ssl_cred;
 	TimeStamp timestamp;
@@ -97,4 +105,6 @@
 		ISC_REQ_MANUAL_CRED_VALIDATION;
 	ULONG a;
+	gsize size = 0;
+	gchar *data = NULL;
 
 	memset(&ssl_cred, 0, sizeof(SCHANNEL_CRED));
@@ -105,11 +115,11 @@
 
 	if (st != SEC_E_OK) {
-		conn->func( conn->data, NULL, cond );
+		conn->func(conn->data, NULL, cond);
 		return;
-	
+	}
 	
 	do {
 		/* initialize buffers */
-	    ibuf[0].cbBuffer = size; ibuf[0].pvBuffer = buf;
+	    ibuf[0].cbBuffer = size; ibuf[0].pvBuffer = data;
 	    ibuf[1].cbBuffer = 0; ibuf[1].pvBuffer = NULL;
 	    obuf[0].cbBuffer = 0; obuf[0].pvBuffer = NULL;
@@ -122,6 +132,7 @@
 	    ibufs.pBuffers = ibuf; obufs.pBuffers = obuf;
 
-		st = InitializeSecurityContext(&conn->cred, size?&conn->context:NULL, host, req, 0, SECURITY_NETWORK_DREP, size?&ibufs:NULL, 0, &conn->context, &obufs, &a, &timestamp);  
+		st = InitializeSecurityContext(&conn->cred, size?&conn->context:NULL, conn->host, req, 0, SECURITY_NETWORK_DREP, size?&ibufs:NULL, 0, &conn->context, &obufs, &a, &timestamp);  
     	if (obuf[0].pvBuffer && obuf[0].cbBuffer) {
+			/* FIXME: Check return value */
 			send(conn->fd, obuf[0].pvBuffer, obuf[0].cbBuffer, 0);
 		}
@@ -131,15 +142,18 @@
 			break;
 		case SEC_I_CONTINUE_NEEDED:
-
+			break;
+		case SEC_E_INCOMPLETE_MESSAGE:
+			break;
+		case SEC_E_OK:
+			break;
 		}
 	
-
 		QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->sizes);
 	} while (1);
 
-	conn->func( conn->data, conn, cond );
-}
-
-int ssl_read( void *conn, char *retdata, int len )
+	conn->func(conn->data, conn, cond);
+}
+
+int ssl_read(void *conn, char *retdata, int len)
 {
 	struct scd *scd = conn;
@@ -165,4 +179,9 @@
 	SECURITY_STATUS st = DecryptMessage(&scd->context, &msg, 0, NULL);
 
+	if (st != SEC_E_OK) {
+		/* FIXME */
+		return -1;
+	}
+
 	for (i = 0; i < 4; i++) {
 		if (buf[i].BufferType == SECBUFFER_DATA) {
@@ -173,8 +192,8 @@
 
 	g_free(data);
-	return( -1 );
-}
-
-int ssl_write( void *conn, const char *userdata, int len )
+	return -1;
+}
+
+int ssl_write(void *conn, const char *userdata, int len)
 {
 	struct scd *scd = conn;
@@ -214,5 +233,5 @@
 }
 
-void ssl_disconnect( void *conn )
+void ssl_disconnect(void *conn)
 {
 	struct scd *scd = conn;
@@ -244,10 +263,16 @@
 	FreeCredentialsHandle(&scd->cred);
 
-	closesocket( scd->fd );
+	closesocket(scd->fd);
+	g_free(scd->host);
 	g_free(scd);
 }
 
-int ssl_getfd( void *conn )
-{
-	return( ((struct scd*)conn)->fd );
-}
+int ssl_getfd(void *conn)
+{
+	return ((struct scd*)conn)->fd;
+}
+
+GaimInputCondition ssl_getdirection( void *conn )
+{
+	return GAIM_INPUT_WRITE; /* FIXME: or GAIM_INPUT_READ */
+}
