Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • irc.c

    r823de9d r435f552  
    2929#include "crypting.h"
    3030#include "ipc.h"
    31 #include <sys/types.h>
    32 #include <sys/wait.h>
    3331
    3432static gboolean irc_userping( gpointer _irc, int fd, b_input_condition cond );
    35 static void irc_welcome( irc_t* irc );
    3633
    3734GSList *irc_connection_list = NULL;
     
    8178}
    8279
     80static char *set_eval_away_status( set_t *set, char *value )
     81{
     82        irc_t *irc = set->data;
     83        account_t *a;
     84       
     85        g_free( set->value );
     86        set->value = g_strdup( value );
     87       
     88        for( a = irc->accounts; a; a = a->next )
     89        {
     90                struct im_connection *ic = a->ic;
     91               
     92                if( ic && ic->flags & OPT_LOGGED_IN )
     93                        imc_away_send_update( ic );
     94        }
     95       
     96        return value;
     97}
     98
    8399irc_t *irc_new( int fd )
    84100{
     
    145161
    146162        irc_connection_list = g_slist_append( irc_connection_list, irc );
    147 
     163       
     164        s = set_add( &irc->set, "away", NULL,  set_eval_away_status, irc );
     165        s->flags |= SET_NULL_OK;
     166        s = set_add( &irc->set, "away_devoice", "true",  set_eval_away_devoice, irc );
    148167        s = set_add( &irc->set, "auto_connect", "true", set_eval_bool, irc );
    149         s = set_add( &irc->set, "auto_reconnect", "false", set_eval_bool, irc );
     168        s = set_add( &irc->set, "auto_reconnect", "true", set_eval_bool, irc );
    150169        s = set_add( &irc->set, "auto_reconnect_delay", "5*3<900", set_eval_account_reconnect_delay, irc );
    151170        s = set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
    152171        s = set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
    153172        s = set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
    154         s = set_add( &irc->set, "color_encrypted", "true", set_eval_bool, irc );
    155173        s = set_add( &irc->set, "debug", "false", set_eval_bool, irc );
    156174        s = set_add( &irc->set, "default_target", "root", NULL, irc );
    157175        s = set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
    158176        s = set_add( &irc->set, "handle_unknown", "root", NULL, irc );
    159         s = set_add( &irc->set, "halfop_buddies", "encrypted", set_eval_halfop_buddies, irc );
    160177        s = set_add( &irc->set, "lcnicks", "true", set_eval_bool, irc );
    161         s = set_add( &irc->set, "op_buddies", "trusted", set_eval_op_buddies, irc );
    162         s = set_add( &irc->set, "op_root", "true", set_eval_op_root, irc );
    163         s = set_add( &irc->set, "otr_policy", "oppurtunistic", set_eval_otr_policy, irc );
     178        s = set_add( &irc->set, "ops", "both", set_eval_ops, irc );
    164179        s = set_add( &irc->set, "password", NULL, set_eval_password, irc );
    165180        s->flags |= SET_NULL_OK;
     
    169184        s = set_add( &irc->set, "save_on_quit", "true", set_eval_bool, irc );
    170185        s = set_add( &irc->set, "simulate_netsplit", "true", set_eval_bool, irc );
     186        s = set_add( &irc->set, "status", NULL,  set_eval_away_status, irc );
     187        s->flags |= SET_NULL_OK;
    171188        s = set_add( &irc->set, "strip_html", "true", NULL, irc );
    172189        s = set_add( &irc->set, "to_char", ": ", set_eval_to_char, irc );
    173190        s = set_add( &irc->set, "typing_notice", "false", set_eval_bool, irc );
    174         s = set_add( &irc->set, "voice_buddies", "notaway", set_eval_voice_buddies, irc);
    175191       
    176192        conf_loaddefaults( irc );
    177 
    178         irc->otr = otr_new();
    179 
     193       
    180194        /* Evaluator sets the iconv/oconv structures. */
    181195        set_eval_charset( set_find( &irc->set, "charset" ), set_getstr( &irc->set, "charset" ) );
     
    329343       
    330344        g_free( irc->last_target );
    331 
    332         otr_free(irc->otr);
    333345       
    334346        g_free( irc );
    335 
     347       
    336348        if( global.conf->runmode == RUNMODE_INETD ||
    337349            global.conf->runmode == RUNMODE_FORKDAEMON ||
     
    418430                        }
    419431                       
    420                         if( lines[i] )
    421                         {
    422                                 if( ( cmd = irc_parse_line( lines[i] ) ) == NULL )
    423                                         continue;
     432                        if( lines[i] && ( cmd = irc_parse_line( lines[i] ) ) )
     433                        {
    424434                                irc_exec( irc, cmd );
    425435                                g_free( cmd );
     
    496506        if( line[0] == ':' )
    497507        {
    498                 for( i = 0; line[i] != ' '; i ++ );
     508                for( i = 0; line[i] && line[i] != ' '; i ++ );
    499509                line = line + i;
    500510        }
     
    704714}
    705715
    706 const char *user_mode_prefix( irc_t *irc, user_t *u )
    707 {
    708         static char op[] = "@";
    709         static char halfop[] = "%";
    710         static char voice[] = "+";
    711         static char none[] = "";
    712 
    713         int or = set_getbool(&irc->set, "op_root");
    714         int ou = set_getbool(&irc->set, "op_user");
    715         char *ob = set_getstr(&irc->set, "op_buddies");
    716         char *hb = set_getstr(&irc->set, "halfop_buddies");
    717         char *vb = set_getstr(&irc->set, "voice_buddies");
    718 
    719         if( (!strcmp(u->nick, irc->mynick) && or) ||
    720             (!strcmp(u->nick, irc->nick) && ou) ||
    721         (!u->away && !strcmp(ob, "notaway")) ||
    722         (u->encrypted && !strcmp(ob, "encrypted")) ||
    723         (u->encrypted>1 && !strcmp(ob, "trusted"))
    724       )
    725                 return op;
    726         else if( (!u->away && !strcmp(hb, "notaway")) ||
    727              (u->encrypted && !strcmp(hb, "encrypted")) ||
    728              (u->encrypted>1 && !strcmp(hb, "trusted"))
    729                )
    730                 return halfop;
    731         else if( (!u->away && !strcmp(vb, "notaway")) ||
    732              (u->encrypted && !strcmp(vb, "encrypted")) ||
    733              (u->encrypted>1 && !strcmp(vb, "trusted"))
    734                )
    735                 return voice;
    736         else
    737                 return none;
    738 }
    739                        
    740716void irc_names( irc_t *irc, char *channel )
    741717{
     
    743719        char namelist[385] = "";
    744720        struct groupchat *c = NULL;
     721        char *ops = set_getstr( &irc->set, "ops" );
    745722       
    746723        /* RFCs say there is no error reply allowed on NAMES, so when the
     
    757734                        }
    758735                       
    759                         strcat( namelist, user_mode_prefix(irc, u) );
     736                        if( u->ic && !u->away && set_getbool( &irc->set, "away_devoice" ) )
     737                                strcat( namelist, "+" );
     738                        else if( ( strcmp( u->nick, irc->mynick ) == 0 && ( strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) == 0 ) ) ||
     739                                 ( strcmp( u->nick, irc->nick ) == 0 && ( strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) == 0 ) ) )
     740                                strcat( namelist, "@" );
     741                       
    760742                        strcat( namelist, u->nick );
    761743                        strcat( namelist, " " );
     
    768750                /* root and the user aren't in the channel userlist but should
    769751                   show up in /NAMES, so list them first: */
    770                 sprintf( namelist, "%s%s %s%s ", set_getbool(&irc->set, "op_root") ? "@" : "", irc->mynick,
    771                                                  set_getbool(&irc->set, "op_user") ? "@" : "", irc->nick );
     752                sprintf( namelist, "%s%s %s%s ", strcmp( ops, "root" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->mynick,
     753                                                 strcmp( ops, "user" ) == 0 || strcmp( ops, "both" ) ? "@" : "", irc->nick );
    772754               
    773755                for( l = c->in_room; l; l = l->next ) if( ( u = user_findhandle( c->ic, l->data ) ) )
     
    779761                        }
    780762                       
    781                         strcat( namelist, user_mode_prefix(irc, u) );
    782763                        strcat( namelist, u->nick );
    783764                        strcat( namelist, " " );
     
    821802        irc_reply( irc,   3, ":%s", IRCD_INFO );
    822803        irc_reply( irc,   4, "%s %s %s %s", irc->myhost, BITLBEE_VERSION, UMODES UMODES_PRIV, CMODES );
    823         irc_reply( irc,   5, "PREFIX=(ohv)@%%+ CHANTYPES=#& CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server", CMODES, MAX_NICK_LENGTH - 1 );
     804        irc_reply( irc,   5, "PREFIX=(ov)@+ CHANTYPES=%s CHANMODES=,,,%s NICKLEN=%d NETWORK=BitlBee "
     805                             "CASEMAPPING=rfc1459 MAXTARGETS=1 WATCH=128 :are supported by this server",
     806                             CTYPES, CMODES, MAX_NICK_LENGTH - 1 );
    824807        irc_motd( irc );
    825808        irc->umode[0] = '\0';
    826809        irc_umode_set( irc, "+" UMODE, 1 );
    827 u = user_add( irc, irc->mynick );
     810
     811        u = user_add( irc, irc->mynick );
    828812        u->host = g_strdup( irc->myhost );
    829813        u->realname = g_strdup( ROOT_FN );
     
    847831        irc_spawn( irc, u );
    848832       
    849         irc_welcome( irc );
     833        irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
     834                          "If you've never used BitlBee before, please do read the help "
     835                          "information using the \x02help\x02 command. Lots of FAQs are "
     836                          "answered there.\n"
     837                          "If you already have an account on this server, just use the "
     838                          "\x02identify\x02 command to identify yourself." );
    850839       
    851840        if( global.conf->runmode == RUNMODE_FORKDAEMON || global.conf->runmode == RUNMODE_DAEMON )
     
    862851                root_command( irc, send_cmd );
    863852                g_free( send_cmd[1] );
    864         }
    865 }
    866 
    867 static void irc_welcome( irc_t *irc )
    868 {
    869         FILE *f;
    870        
    871         f = fopen( global.conf->welcomefile, "r" );
    872         if( !f )
    873         {
    874                 irc_usermsg( irc, "Welcome to the BitlBee gateway!\n\n"
    875                                   "If you've never used BitlBee before, please do read the help "
    876                                   "information using the \x02help\x02 command. Lots of FAQs are "
    877                                   "answered there.\n"
    878                                   "OTR users please note: Private key files are owned by the user "
    879                                   "BitlBee is running as.\n"
    880                                   "If you already have an account on this server, just use the "
    881                                   "\x02identify\x02 command to identify yourself." );
    882         }
    883         else
    884         {
    885                 char linebuf[380];
    886                
    887                 while( fgets( linebuf, 380, f ) )
    888                 {
    889                         irc_usermsg( irc, linebuf );
    890                 }
    891                
    892                 fclose( f );
    893853        }
    894854}
     
    10851045        user_t *u = NULL;
    10861046       
    1087         if( *nick == '#' || *nick == '&' )
     1047        if( strchr( CTYPES, *nick ) )
    10881048        {
    10891049                if( !( c = irc_chat_by_channel( irc, nick ) ) )
Note: See TracChangeset for help on using the changeset viewer.