Changes in / [913545e:f5d1b31]


Ignore:
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • bitlbee.c

    r913545e rf5d1b31  
    118118       
    119119        if( global.conf->runmode == RUNMODE_FORKDAEMON )
    120                 ipc_master_load_state();
     120                ipc_master_load_state( getenv( "_BITLBEE_RESTART_STATE" ) );
    121121
    122122        if( global.conf->runmode == RUNMODE_DAEMON || global.conf->runmode == RUNMODE_FORKDAEMON )
  • conf.c

    r913545e rf5d1b31  
    7878        }
    7979       
    80         while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hR:u:" ) ) >= 0 )
     80        while( argc > 0 && ( opt = getopt( argc, argv, "i:p:P:nvIDFc:d:hu:" ) ) >= 0 )
    8181        /*     ^^^^ Just to make sure we skip this step from the REHASH handler. */
    8282        {
     
    145145                                "  -h  Show this help page.\n" );
    146146                        return NULL;
    147                 }
    148                 else if( opt == 'R' )
    149                 {
    150                         /* We can't load the statefile yet (and should make very sure we do this
    151                            only once), so set the filename here and load the state information
    152                            when initializing ForkDaemon. (This option only makes sense in that
    153                            mode anyway!) */
    154                         ipc_master_set_statefile( optarg );
    155147                }
    156148                else if( opt == 'u' )
  • ipc.c

    r913545e rf5d1b31  
    3333
    3434GSList *child_list = NULL;
    35 static char *statefile = NULL;
    3635
    3736static void ipc_master_cmd_client( irc_t *data, char **cmd )
     
    6362}
    6463
     64static void ipc_master_cmd_deaf( irc_t *data, char **cmd )
     65{
     66        if( global.conf->runmode == RUNMODE_DAEMON )
     67        {
     68                b_event_remove( global.listen_watch_source_id );
     69                close( global.listen_socket );
     70               
     71                global.listen_socket = global.listen_watch_source_id = -1;
     72       
     73                ipc_to_children_str( "OPERMSG :Closed listening socket, waiting "
     74                                     "for all users to disconnect." );
     75        }
     76        else
     77        {
     78                ipc_to_children_str( "OPERMSG :The DEAF command only works in "
     79                                     "normal daemon mode. Try DIE instead." );
     80        }
     81}
     82
    6583void ipc_master_cmd_rehash( irc_t *data, char **cmd )
    6684{
     
    98116        { "hello",      0, ipc_master_cmd_client,     0 },
    99117        { "die",        0, ipc_master_cmd_die,        0 },
     118        { "deaf",       0, ipc_master_cmd_deaf,       0 },
    100119        { "wallops",    1, NULL,                      IPC_CMD_TO_CHILDREN },
    101120        { "wall",       1, NULL,                      IPC_CMD_TO_CHILDREN },
     
    482501}
    483502
    484 void ipc_master_set_statefile( char *fn )
    485 {
    486         statefile = g_strdup( fn );
    487 }
    488 
    489503
    490504static gboolean new_ipc_client( gpointer data, gint serversock, b_input_condition cond )
     
    550564#endif
    551565
    552 int ipc_master_load_state()
     566int ipc_master_load_state( char *statefile )
    553567{
    554568        struct bitlbee_child *child;
     
    558572        if( statefile == NULL )
    559573                return 0;
     574       
    560575        fp = fopen( statefile, "r" );
    561576        unlink( statefile );    /* Why do it later? :-) */
  • ipc.h

    r913545e rf5d1b31  
    5858
    5959char *ipc_master_save_state();
    60 void ipc_master_set_statefile( char *fn );
    61 int ipc_master_load_state();
     60int ipc_master_load_state( char *statefile );
    6261int ipc_master_listen_socket();
    6362
  • irc.c

    r913545e rf5d1b31  
    315315        g_free( irc );
    316316       
    317         if( global.conf->runmode == RUNMODE_INETD || global.conf->runmode == RUNMODE_FORKDAEMON )
     317        if( global.conf->runmode == RUNMODE_INETD ||
     318            global.conf->runmode == RUNMODE_FORKDAEMON ||
     319            ( global.conf->runmode == RUNMODE_DAEMON &&
     320              global.listen_socket == -1 &&
     321              irc_connection_list == NULL ) )
    318322                b_main_quit();
    319323}
  • irc_commands.c

    r913545e rf5d1b31  
    626626        { "completions", 0, irc_cmd_completions, IRC_CMD_LOGGED_IN },
    627627        { "die",         0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
     628        { "deaf",        0, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
    628629        { "wallops",     1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
    629630        { "wall",        1, NULL,                IRC_CMD_OPER_ONLY | IRC_CMD_TO_MASTER },
  • protocols/msn/ns.c

    r913545e rf5d1b31  
    278278                if( num_parts == 5 )
    279279                {
     280                        int i, groupcount;
     281                       
     282                        groupcount = atoi( cmd[4] );
     283                        if( groupcount > 0 )
     284                        {
     285                                /* valgrind says this is leaking memory, I'm guessing
     286                                   that this happens during server redirects. */
     287                                if( md->grouplist )
     288                                {
     289                                        for( i = 0; i < md->groupcount; i ++ )
     290                                                g_free( md->grouplist[i] );
     291                                        g_free( md->grouplist );
     292                                }
     293                               
     294                                md->groupcount = groupcount;
     295                                md->grouplist = g_new0( char *, md->groupcount );
     296                        }
     297                       
    280298                        md->buddycount = atoi( cmd[3] );
    281                         md->groupcount = atoi( cmd[4] );
    282                         if( md->groupcount > 0 )
    283                                 md->grouplist = g_new0( char *, md->groupcount );
    284                        
    285299                        if( !*cmd[3] || md->buddycount == 0 )
    286300                                msn_logged_in( ic );
     
    665679                                        imcb_log( ic, "INBOX contains %s new messages, plus %s messages in other folders.", inbox, folders );
    666680                                }
     681                               
     682                                g_free( inbox );
     683                                g_free( folders );
    667684                        }
    668685                        else if( g_strncasecmp( ct, "text/x-msmsgsemailnotification", 30 ) == 0 )
  • unix.c

    r913545e rf5d1b31  
    4040static void sighandler( int signal );
    4141
    42 int main( int argc, char *argv[], char **envp )
     42int main( int argc, char *argv[] )
    4343{
    4444        int i = 0;
     
    141141        {
    142142                char *fn = ipc_master_save_state();
    143                 char **args;
    144                 int n, i;
    145143               
    146144                chdir( old_cwd );
    147145               
    148                 n = 0;
    149                 args = g_new0( char *, argc + 3 );
    150                 args[n++] = argv[0];
    151                 if( fn )
    152                 {
    153                         args[n++] = "-R";
    154                         args[n++] = fn;
    155                 }
    156                 for( i = 1; argv[i] && i < argc; i ++ )
    157                 {
    158                         if( strcmp( argv[i], "-R" ) == 0 )
    159                                 i += 2;
    160                        
    161                         args[n++] = argv[i];
    162                 }
     146                setenv( "_BITLBEE_RESTART_STATE", fn, 1 );
     147                g_free( fn );
    163148               
    164149                close( global.listen_socket );
    165150               
    166                 execve( args[0], args, envp );
     151                if( execv( argv[0], argv ) == -1 )
     152                        /* Apparently the execve() failed, so let's just
     153                           jump back into our own/current main(). */
     154                        /* Need more cleanup code to make this work. */
     155                        return 1; /* main( argc, argv ); */
    167156        }
    168157       
Note: See TracChangeset for help on using the changeset viewer.