/* * ircd-ratbox: an advanced Internet Relay Chat Daemon(ircd). * monitor.c - Code for server-side notify lists * * Copyright (C) 2005 Lee Hardy <lee -at- leeh.co.uk> * Copyright (C) 2005 ircd-ratbox development team * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1.Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2.Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3.The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * $Id: monitor.c 3520 2007-06-30 22:15:35Z jilles $ */#include "stdinc.h"#include "client.h"#include "monitor.h"#include "hash.h"#include "numeric.h"structmonitor*monitorTable[MONITOR_HASH_SIZE];staticrb_bh*monitor_heap;voidinit_monitor(void){monitor_heap=rb_bh_create(sizeof(structmonitor),MONITOR_HEAP_SIZE,"monitor_heap");}staticinlineunsignedinthash_monitor_nick(constchar*name){returnfnv_hash_upper((constunsignedchar*)name,MONITOR_HASH_BITS);}structmonitor*find_monitor(constchar*name,intadd){structmonitor*monptr;unsignedinthashv=hash_monitor_nick(name);for(monptr=monitorTable[hashv];monptr;monptr=monptr->hnext){if(!irccmp(monptr->name,name))returnmonptr;}if(add){monptr=rb_bh_alloc(monitor_heap);rb_strlcpy(monptr->name,name,sizeof(monptr->name));monptr->hnext=monitorTable[hashv];monitorTable[hashv]=monptr;returnmonptr;}returnNULL;}voidfree_monitor(structmonitor*monptr){rb_bh_free(monitor_heap,monptr);}/* monitor_signon() * * inputs - client who has just connected * outputs - * side effects - notifies any clients monitoring this nickname that it has * connected to the network */voidmonitor_signon(structClient*client_p){charbuf[USERHOST_REPLYLEN];structmonitor*monptr=find_monitor(client_p->name,0);/* noones watching this nick */if(monptr==NULL)return;rb_snprintf(buf,sizeof(buf),"%s!%s@%s",client_p->name,client_p->username,client_p->host);sendto_monitor(monptr,form_str(RPL_MONONLINE),me.name,"*",buf);}/* monitor_signoff() * * inputs - client who is exiting * outputs - * side effects - notifies any clients monitoring this nickname that it has * left the network */voidmonitor_signoff(structClient*client_p){structmonitor*monptr=find_monitor(client_p->name,0);/* noones watching this nick */if(monptr==NULL)return;sendto_monitor(monptr,form_str(RPL_MONOFFLINE),me.name,"*",client_p->name);}voidclear_monitor(structClient*client_p){structmonitor*monptr;rb_dlink_node*ptr,*next_ptr;RB_DLINK_FOREACH_SAFE(ptr,next_ptr,client_p->localClient->monitor_list.head){monptr=ptr->data;rb_dlinkFindDestroy(client_p,&monptr->users);rb_free_rb_dlink_node(ptr);}client_p->localClient->monitor_list.head=client_p->localClient->monitor_list.tail=NULL;client_p->localClient->monitor_list.length=0;}