Hey everyone,

I'd appreciate any input and constructive criticism on the
following.  Hopefully it's something simple that I'm overlooking. 

I recently put together a simple check for a multiplaying character.  It
doesn't do anything except write to wiznet.  It seems to be working fine,
but today I noticed the mud I'm working on crashed in the
function.  Here's the GDB info:

#0  0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388
4388            if ( (!IS_NPC(ch_check) && !IS_NPC(ch))
(gdb) bt
#0  0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388
#1  0x80777f3 in nanny (d=0x40a3334c, argument=0x40a33774 "") at
comm.c:3064
#2  0x80740f0 in game_loop_unix (control=4) at comm.c:1183
#3  0x80734fb in main (argc=4, argv=0xbffffdd4) at comm.c:497
#4  0x4005ecbe in __libc_start_main () from /lib/libc.so.6

#0  0x8079fcc in check_multiplay (ch=0x40bd38e0) at comm.c:4388
4388            if ( (!IS_NPC(ch_check) && !IS_NPC(ch))
(gdb) info local
ch = (CHAR_DATA *) 0x40bd38e0
ch_check = (CHAR_DATA *) 0x40ba01d4

I went ahead and printed ch and ch_check and they're both PC's, as I
thought.  I can't think of why it would have crashed, as there have been
at least a hundred logins and logouts since I made this live.

I call it in the nanny, right when it tells the room that someone entered
the game.  

        check_multiplay( ch );

Here's the function:
host is IP address and host2 is resolved domain.

void check_multiplay( CHAR_DATA *ch )
{
    CHAR_DATA *ch_check;
            
    if(!ch)
    {
        log_string( "ch is null in multiplay check." );
        return;
    }
 
    /* Don't want to give away immortals */            
    if(IS_IMMORTAL(ch))
        return;
            
    for ( ch_check = char_list; ch_check != NULL; ch_check = ch_check->next )
    {
        if ( (!IS_NPC(ch_check) && !IS_NPC(ch)) <-- Offending line
        && !str_cmp( ch->desc->host2, ch_check->desc->host2)
        && ch != ch_check )
        {  
            char buf[MSL];
    
            /* Don't want to give away immortals */
            if(IS_IMMORTAL(ch_check))
                return;
     
            /* Just in case */
            if(ch->name)
                sprintf(buf, "%s may be multiplaying.", ch->name);
            else
            {
                log_string( "ch->name is null in multiplay check." );
                return;
            }
    
            wiznet( "$N may be multiplaying.", ch, NULL, 
WIZ_ON,0,get_trust(ch));
            log_string( buf );
        
            return;
        }
    }       

    return; 

}


Reply via email to