Index: bitlbee.c
===================================================================
--- bitlbee.c	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ bitlbee.c	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -170,5 +170,5 @@
 	{
 		log_message( LOGLVL_INFO, "Destroying connection with fd %d.", irc->fd );
-		irc_free( irc );
+		irc_abort( irc );
 		return FALSE;
 	} 
@@ -178,5 +178,5 @@
 	{
 		log_message( LOGLVL_ERROR, "Maximum line length exceeded." );
-		irc_free( irc );
+		irc_abort( irc );
 		return FALSE;
 	}
@@ -197,15 +197,12 @@
 	st = write( irc->fd, irc->sendbuffer, size );
 	
-	if( st <= 0 )
-	{
-		if( sockerr_again() )
-		{
-			return TRUE;
-		}
-		else
-		{
-			irc_free( irc );
-			return FALSE;
-		}
+	if( st == 0 || ( st < 0 && !sockerr_again() ) )
+	{
+		irc_free( irc );
+		return FALSE;
+	}
+	else if( st < 0 ) /* && sockerr_again() */
+	{
+		return TRUE;
 	}
 	
@@ -214,6 +211,9 @@
 		g_free( irc->sendbuffer );
 		irc->sendbuffer = NULL;
-		
 		irc->w_watch_source_id = 0;
+		
+		if( irc->status == USTATUS_SHUTDOWN )
+			irc_free( irc );
+		
 		return( FALSE );
 	}
Index: ipc.c
===================================================================
--- ipc.c	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ ipc.c	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -125,5 +125,6 @@
 	
 	irc_write( irc, ":%s!%s@%s KILL %s :%s", irc->mynick, irc->mynick, irc->myhost, irc->nick, cmd[2] );
-	g_io_channel_close( irc->io_channel );
+	irc_abort( irc );
+	/* g_io_channel_close( irc->io_channel ); */
 	
 	return 0;
Index: irc.c
===================================================================
--- irc.c	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ irc.c	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -149,4 +149,18 @@
 	
 	return( irc );
+}
+
+void irc_abort( irc_t *irc )
+{
+	irc->status = USTATUS_SHUTDOWN;
+	if( irc->sendbuffer )
+	{
+		g_source_remove( irc->r_watch_source_id );
+		irc->r_watch_source_id = g_timeout_add_full( G_PRIORITY_HIGH, 1000, (GSourceFunc) irc_free, irc, NULL );
+	}
+	else
+	{
+		irc_free( irc );
+	}
 }
 
Index: irc.h
===================================================================
--- irc.h	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ irc.h	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -44,5 +44,6 @@
 	USTATUS_AUTHORIZED,
 	USTATUS_LOGGED_IN,
-	USTATUS_IDENTIFIED
+	USTATUS_IDENTIFIED,
+	USTATUS_SHUTDOWN
 } irc_status_t;
 
@@ -104,4 +105,5 @@
 
 irc_t *irc_new( int fd );
+void irc_abort( irc_t *irc );
 void irc_free( irc_t *irc );
 
Index: irc_commands.c
===================================================================
--- irc_commands.c	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ irc_commands.c	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -82,5 +82,5 @@
 {
 	irc_write( irc, "ERROR :%s%s", cmd[1]?"Quit: ":"", cmd[1]?cmd[1]:"Client Quit" );
-	g_io_channel_close( irc->io_channel );
+	/* g_io_channel_close( irc->io_channel ); */
 	
 	return( 0 );
Index: log.c
===================================================================
--- log.c	(revision 1ea13be2cf335a471f85ea54d610fb91b7d14564)
+++ log.c	(revision 4c266f2d79212e4e0ff4b9b33088685a2ec452e4)
@@ -38,9 +38,9 @@
 	openlog("bitlbee", LOG_PID, LOG_DAEMON);	
 
-	logoutput.informational=&log_null;
-	logoutput.warning=&log_null;
-	logoutput.error=&log_null;
+	logoutput.informational = &log_null;
+	logoutput.warning = &log_null;
+	logoutput.error = &log_null;
 #ifdef DEBUG
-	logoutput.debug=&log_null;
+	logoutput.debug = &log_null;
 #endif
 
@@ -51,44 +51,44 @@
 	/* I know it's ugly, but it works and I didn't feel like messing with pointer to function pointers */
 
-	if(level==LOGLVL_INFO) {
-		if(output==LOGOUTPUT_NULL)
-			logoutput.informational=&log_null;	
-		else if(output==LOGOUTPUT_IRC)
-			logoutput.informational=&log_irc;	
-		else if(output==LOGOUTPUT_SYSLOG)
-			logoutput.informational=&log_syslog;	
-		else if(output==LOGOUTPUT_CONSOLE) 
-			logoutput.informational=&log_console;	
+	if(level == LOGLVL_INFO) {
+		if(output == LOGOUTPUT_NULL)
+			logoutput.informational = &log_null;	
+		else if(output == LOGOUTPUT_IRC)
+			logoutput.informational = &log_irc;	
+		else if(output == LOGOUTPUT_SYSLOG)
+			logoutput.informational = &log_syslog;	
+		else if(output == LOGOUTPUT_CONSOLE) 
+			logoutput.informational = &log_console;	
 	}
-	else if(level==LOGLVL_WARNING) {
-		if(output==LOGOUTPUT_NULL)
-			logoutput.warning=&log_null;
-		else if(output==LOGOUTPUT_IRC)
-			logoutput.warning=&log_irc;
-		else if(output==LOGOUTPUT_SYSLOG)
-			logoutput.warning=&log_syslog;
-		else if(output==LOGOUTPUT_CONSOLE)
-			logoutput.warning=&log_console;
+	else if(level == LOGLVL_WARNING) {
+		if(output == LOGOUTPUT_NULL)
+			logoutput.warning = &log_null;
+		else if(output == LOGOUTPUT_IRC)
+			logoutput.warning = &log_irc;
+		else if(output == LOGOUTPUT_SYSLOG)
+			logoutput.warning = &log_syslog;
+		else if(output == LOGOUTPUT_CONSOLE)
+			logoutput.warning = &log_console;
 	}
-	else if(level==LOGLVL_ERROR) {
-		if(output==LOGOUTPUT_NULL)
-			logoutput.error=&log_null;
-		else if(output==LOGOUTPUT_IRC)
-			logoutput.error=&log_irc;
-		else if(output==LOGOUTPUT_SYSLOG)
-			logoutput.error=&log_syslog;
-		else if(output==LOGOUTPUT_CONSOLE)
-			logoutput.error=&log_console;
+	else if(level == LOGLVL_ERROR) {
+		if(output == LOGOUTPUT_NULL)
+			logoutput.error = &log_null;
+		else if(output == LOGOUTPUT_IRC)
+			logoutput.error = &log_irc;
+		else if(output == LOGOUTPUT_SYSLOG)
+			logoutput.error = &log_syslog;
+		else if(output == LOGOUTPUT_CONSOLE)
+			logoutput.error = &log_console;
 	}
 #ifdef DEBUG
-	else if(level==LOGLVL_DEBUG) {
-		if(output==LOGOUTPUT_NULL)
-			logoutput.debug=&log_null;
-		else if(output==LOGOUTPUT_IRC)
-			logoutput.debug=&log_irc;
-		else if(output==LOGOUTPUT_SYSLOG)
-			logoutput.debug=&log_syslog;
-		else if(output==LOGOUTPUT_CONSOLE)
-			logoutput.debug=&log_console;
+	else if(level == LOGLVL_DEBUG) {
+		if(output == LOGOUTPUT_NULL)
+			logoutput.debug = &log_null;
+		else if(output == LOGOUTPUT_IRC)
+			logoutput.debug = &log_irc;
+		else if(output == LOGOUTPUT_SYSLOG)
+			logoutput.debug = &log_syslog;
+		else if(output == LOGOUTPUT_CONSOLE)
+			logoutput.debug = &log_console;
 	}
 #endif
@@ -106,12 +106,12 @@
 	va_end(ap);
 
-	if(level==LOGLVL_INFO)
+	if(level == LOGLVL_INFO)
 		(*(logoutput.informational))(level, msgstring);
-	if(level==LOGLVL_WARNING) 
+	if(level == LOGLVL_WARNING) 
 		(*(logoutput.warning))(level, msgstring);
-	if(level==LOGLVL_ERROR)
+	if(level == LOGLVL_ERROR)
 		(*(logoutput.error))(level, msgstring);
 #ifdef DEBUG
-	if(level==LOGLVL_DEBUG)
+	if(level == LOGLVL_DEBUG)
 		(*(logoutput.debug))(level, msgstring);
 #endif
@@ -133,12 +133,12 @@
 
 static void log_irc(int level, char *message) {
-	if(level==LOGLVL_ERROR)
+	if(level == LOGLVL_ERROR)
 		irc_write_all(1, "ERROR :Error: %s", message);
-	if(level==LOGLVL_WARNING)
+	if(level == LOGLVL_WARNING)
 		irc_write_all(0, "ERROR :Warning: %s", message);
-	if(level==LOGLVL_INFO)
+	if(level == LOGLVL_INFO)
 		irc_write_all(0, "ERROR :Informational: %s", message);	
 #ifdef DEBUG
-	if(level==LOGLVL_DEBUG)
+	if(level == LOGLVL_DEBUG)
 		irc_write_all(0, "ERROR :Debug: %s", message);	
 #endif	
@@ -148,12 +148,12 @@
 
 static void log_syslog(int level, char *message) {
-	if(level==LOGLVL_ERROR)
+	if(level == LOGLVL_ERROR)
 		syslog(LOG_ERR, "%s", message);
-	if(level==LOGLVL_WARNING)
+	if(level == LOGLVL_WARNING)
 		syslog(LOG_WARNING, "%s", message);
-	if(level==LOGLVL_INFO)
+	if(level == LOGLVL_INFO)
 		syslog(LOG_INFO, "%s", message);
 #ifdef DEBUG
-	if(level==LOGLVL_DEBUG)
+	if(level == LOGLVL_DEBUG)
 		syslog(LOG_DEBUG, "%s", message);
 #endif
@@ -162,12 +162,12 @@
 
 static void log_console(int level, char *message) {
-	if(level==LOGLVL_ERROR)
+	if(level == LOGLVL_ERROR)
 		fprintf(stderr, "Error: %s\n", message);
-	if(level==LOGLVL_WARNING)
+	if(level == LOGLVL_WARNING)
 		fprintf(stderr, "Warning: %s\n", message);
-	if(level==LOGLVL_INFO)
+	if(level == LOGLVL_INFO)
 		fprintf(stdout, "Informational: %s\n", message);
 #ifdef DEBUG
-	if(level==LOGLVL_DEBUG)
+	if(level == LOGLVL_DEBUG)
 		fprintf(stdout, "Debug: %s\n", message);
 #endif
