Changeset 74c119d


Ignore:
Timestamp:
2006-01-15T15:42:20Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
6fda350
Parents:
13caf0a
Message:

Better DIE implementation, added SO_REUSEADDR to listening socket.

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.c

    r13caf0a r74c119d  
    5656        }
    5757       
     58        /* TIME_WAIT (?) sucks.. */
     59        i = 1;
     60        setsockopt( global.listen_socket, SOL_SOCKET, SO_REUSEADDR, &i, sizeof( i ) );
     61       
    5862#ifdef IPV6
    5963        listen_addr.sin6_family = AF_INETx;
  • conf.c

    r13caf0a r74c119d  
    9292                }
    9393                else if( opt == 'n' )
    94                         conf->nofork=1;
     94                        conf->nofork = 1;
    9595                else if( opt == 'v' )
    96                         conf->verbose=1;
     96                        conf->verbose = 1;
    9797                else if( opt == 'I' )
    98                         conf->runmode=RUNMODE_INETD;
     98                        conf->runmode = RUNMODE_INETD;
    9999                else if( opt == 'D' )
    100                         conf->runmode=RUNMODE_DAEMON;
     100                        conf->runmode = RUNMODE_DAEMON;
    101101                else if( opt == 'F' )
    102                         conf->runmode=RUNMODE_FORKDAEMON;
     102                        conf->runmode = RUNMODE_FORKDAEMON;
    103103                else if( opt == 'c' )
    104104                {
     
    108108                                CONF_FILE = g_strdup( optarg );
    109109                                g_free( conf );
     110                                /* Re-evaluate arguments. */
     111                                optind = 1;
    110112                                return( conf_load( argc, argv ) );
    111113                        }
  • ipc.c

    r13caf0a r74c119d  
    3131GSList *child_list = NULL;
    3232
     33
    3334static int ipc_master_cmd_die( irc_t *data, char **cmd )
    3435{
     36        if( global.conf->runmode == RUNMODE_FORKDAEMON )
     37                ipc_to_children_str( "DIE\r\n" );
     38       
    3539        bitlbee_shutdown( NULL );
     40       
     41        return 1;
    3642}
    3743
    3844static int ipc_master_cmd_wallops( irc_t *data, char **cmd )
    3945{
    40         GSList *l;
    41         char msg_buf[513];
    42         int msg_len;
    43        
    44         if( ( msg_len = g_snprintf( msg_buf, sizeof( msg_buf ) - 1, "%s :%s\r\n", cmd[0], cmd[1] ) ) > ( sizeof( msg_buf ) - 1 ) )
    45                 return 0;
    46        
    47         for( l = child_list; l; l = l->next )
    48         {
    49                 struct bitlbee_child *c = l->data;
    50                 write( c->ipc_fd, msg_buf, msg_len );
    51         }
     46        ipc_to_children( cmd );
    5247       
    5348        return 1;
     
    5651static const command_t ipc_master_commands[] = {
    5752        { "die",        0, ipc_master_cmd_die,        0 },
    58         { "wallops",    1, ipc_master_cmd_wallops,    1 },
    59         { "lilo",       1, ipc_master_cmd_wallops,    1 },
     53        { "wallops",    1, ipc_master_cmd_wallops,    0 },
     54        { "lilo",       1, ipc_master_cmd_wallops,    0 },
    6055        { NULL }
    6156};
    6257
     58
     59static int ipc_child_cmd_die( irc_t *data, char **cmd )
     60{
     61        bitlbee_shutdown( NULL );
     62       
     63        return 1;
     64}
     65
    6366static int ipc_child_cmd_wallops( irc_t *data, char **cmd )
    6467{
     
    7578        irc_t *irc = data;
    7679       
    77         irc_write( irc, ":%s NOTICE %s :%s", irc->myhost, irc->nick, cmd[1] );
     80        if( strchr( irc->umode, 's' ) )
     81                irc_write( irc, ":%s NOTICE %s :%s", irc->myhost, irc->nick, cmd[1] );
    7882       
    7983        return 1;
     
    8185
    8286static const command_t ipc_child_commands[] = {
    83         { "wallops",    1, ipc_child_cmd_wallops,     1 },
    84         { "lilo",       1, ipc_child_cmd_lilo,        1 },
     87        { "die",        0, ipc_child_cmd_die,         0 },
     88        { "wallops",    1, ipc_child_cmd_wallops,     0 },
     89        { "lilo",       1, ipc_child_cmd_lilo,        0 },
    8590        { NULL }
    8691};
     92
    8793
    8894static void ipc_command_exec( void *data, char **cmd, const command_t *commands )
     
    191197        if( global.conf->runmode == RUNMODE_FORKDAEMON )
    192198        {
    193                 int i, len;
    194                 char *s;
     199                char *s = irc_build_line( cmd );
     200                write( global.listen_socket, s, strlen( s ) );
     201                g_free( s );
     202        }
     203}
     204
     205void ipc_to_children( char **cmd )
     206{
     207        if( global.conf->runmode == RUNMODE_FORKDAEMON )
     208        {
     209                char *msg_buf = irc_build_line( cmd );
     210                ipc_to_children_str( msg_buf );
     211                g_free( msg_buf );
     212        }
     213}
     214
     215void ipc_to_children_str( char *msg_buf )
     216{
     217        if( global.conf->runmode == RUNMODE_FORKDAEMON )
     218        {
     219                int msg_len = strlen( msg_buf );
     220                GSList *l;
    195221               
    196                 len = 1;
    197                 for( i = 0; cmd[i]; i ++ )
    198                         len += strlen( cmd[i] ) + 1;
    199                
    200                 if( strchr( cmd[i-1], ' ' ) != NULL )
    201                         len ++;
    202                
    203                 s = g_new0( char, len + 1 );
    204                 for( i = 0; cmd[i]; i ++ )
     222                for( l = child_list; l; l = l->next )
    205223                {
    206                         if( cmd[i+1] == NULL && strchr( cmd[i], ' ' ) != NULL )
    207                                 strcat( s, ":" );
    208                        
    209                         strcat( s, cmd[i] );
    210                        
    211                         if( cmd[i+1] )
    212                                 strcat( s, " " );
     224                        struct bitlbee_child *c = l->data;
     225                        write( c->ipc_fd, msg_buf, msg_len );
    213226                }
    214                 strcat( s, "\r\n" );
    215                
    216                 write( global.listen_socket, s, len );
    217         }
    218 }
     227        }
     228}
  • ipc.h

    r13caf0a r74c119d  
    3030void ipc_child_read( gpointer data, gint source, GaimInputCondition cond );
    3131void ipc_to_master( char **cmd );
     32void ipc_to_children( char **cmd );
     33void ipc_to_children_str( char *msg_buf );
    3234
    3335struct bitlbee_child
  • irc.c

    r13caf0a r74c119d  
    432432       
    433433        return cmd;
     434}
     435
     436char *irc_build_line( char **cmd )
     437{
     438        int i, len;
     439        char *s;
     440       
     441        if( cmd[0] == NULL )
     442                return NULL;
     443       
     444        len = 1;
     445        for( i = 0; cmd[i]; i ++ )
     446                len += strlen( cmd[i] ) + 1;
     447       
     448        if( strchr( cmd[i-1], ' ' ) != NULL )
     449                len ++;
     450       
     451        s = g_new0( char, len + 1 );
     452        for( i = 0; cmd[i]; i ++ )
     453        {
     454                if( cmd[i+1] == NULL && strchr( cmd[i], ' ' ) != NULL )
     455                        strcat( s, ":" );
     456               
     457                strcat( s, cmd[i] );
     458               
     459                if( cmd[i+1] )
     460                        strcat( s, " " );
     461        }
     462        strcat( s, "\r\n" );
     463       
     464        return s;
    434465}
    435466
  • irc.h

    r13caf0a r74c119d  
    109109int irc_process( irc_t *irc );
    110110char **irc_parse_line( char *line );
     111char *irc_build_line( char **cmd );
    111112
    112113void irc_vawrite( irc_t *irc, char *format, va_list params );
Note: See TracChangeset for help on using the changeset viewer.