aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitlbee.c26
-rw-r--r--ipc.c3
-rw-r--r--irc.c14
-rw-r--r--irc.h4
-rw-r--r--irc_commands.c2
-rw-r--r--log.c112
6 files changed, 89 insertions, 72 deletions
diff --git a/bitlbee.c b/bitlbee.c
index dc6b8261..7b0b8398 100644
--- a/bitlbee.c
+++ b/bitlbee.c
@@ -169,7 +169,7 @@ gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condit
if( !irc_process( irc ) )
{
log_message( LOGLVL_INFO, "Destroying connection with fd %d.", irc->fd );
- irc_free( irc );
+ irc_abort( irc );
return FALSE;
}
@@ -177,7 +177,7 @@ gboolean bitlbee_io_current_client_read( GIOChannel *source, GIOCondition condit
if( irc->readbuffer && ( strlen( irc->readbuffer ) > 1024 ) )
{
log_message( LOGLVL_ERROR, "Maximum line length exceeded." );
- irc_free( irc );
+ irc_abort( irc );
return FALSE;
}
@@ -196,25 +196,25 @@ gboolean bitlbee_io_current_client_write( GIOChannel *source, GIOCondition condi
size = strlen( irc->sendbuffer );
st = write( irc->fd, irc->sendbuffer, size );
- if( st <= 0 )
+ if( st == 0 || ( st < 0 && !sockerr_again() ) )
{
- if( sockerr_again() )
- {
- return TRUE;
- }
- else
- {
- irc_free( irc );
- return FALSE;
- }
+ irc_free( irc );
+ return FALSE;
+ }
+ else if( st < 0 ) /* && sockerr_again() */
+ {
+ return TRUE;
}
if( st == size )
{
g_free( irc->sendbuffer );
irc->sendbuffer = NULL;
-
irc->w_watch_source_id = 0;
+
+ if( irc->status == USTATUS_SHUTDOWN )
+ irc_free( irc );
+
return( FALSE );
}
else
diff --git a/ipc.c b/ipc.c
index dfde24bd..fcede7ec 100644
--- a/ipc.c
+++ b/ipc.c
@@ -124,7 +124,8 @@ static int ipc_child_cmd_kill( irc_t *irc, char **cmd )
return 1; /* It's not for us. */
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;
}
diff --git a/irc.c b/irc.c
index a0ba6e53..15ad37f8 100644
--- a/irc.c
+++ b/irc.c
@@ -150,6 +150,20 @@ irc_t *irc_new( int fd )
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 );
+ }
+}
+
static gboolean irc_free_userhash( gpointer key, gpointer value, gpointer data )
{
g_free( key );
diff --git a/irc.h b/irc.h
index c8246c16..093de7c9 100644
--- a/irc.h
+++ b/irc.h
@@ -43,7 +43,8 @@ typedef enum
USTATUS_OFFLINE,
USTATUS_AUTHORIZED,
USTATUS_LOGGED_IN,
- USTATUS_IDENTIFIED
+ USTATUS_IDENTIFIED,
+ USTATUS_SHUTDOWN
} irc_status_t;
typedef struct channel
@@ -103,6 +104,7 @@ typedef struct irc
extern GSList *irc_connection_list;
irc_t *irc_new( int fd );
+void irc_abort( irc_t *irc );
void irc_free( irc_t *irc );
int irc_exec( irc_t *irc, char **cmd );
diff --git a/irc_commands.c b/irc_commands.c
index 2e225702..152df767 100644
--- a/irc_commands.c
+++ b/irc_commands.c
@@ -81,7 +81,7 @@ static int irc_cmd_nick( irc_t *irc, char **cmd )
static int irc_cmd_quit( irc_t *irc, char **cmd )
{
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 );
}
diff --git a/log.c b/log.c
index ad39d775..4606fb88 100644
--- a/log.c
+++ b/log.c
@@ -37,11 +37,11 @@ static void log_console(int level, char *logmessage);
void log_init(void) {
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
return;
@@ -50,46 +50,46 @@ void log_init(void) {
void log_link(int level, int output) {
/* 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
return;
@@ -105,14 +105,14 @@ void log_message(int level, char *message, ... ) {
msgstring = g_strdup_vprintf(message, ap);
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
@@ -132,14 +132,14 @@ static void log_null(int level, char *message) {
}
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
@@ -147,28 +147,28 @@ static void log_irc(int level, char *message) {
}
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
return;
}
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
return;