Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/VibeDevelopers/Comet.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150/* * 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. */#include "stdinc.h"#include "client.h"#include "monitor.h"#include "hash.h"#include "numeric.h"#include "send.h"#include "rb_radixtree.h"
static rb_radixtree *monitor_tree;
voidinit_monitor(void){ monitor_tree = rb_radixtree_create("monitor lists", irccasecanon);}
struct monitor *find_monitor(const char *name, int add){ struct monitor *monptr;
monptr = rb_radixtree_retrieve(monitor_tree, name); if (monptr != NULL) return monptr;
if(add) { monptr = rb_malloc(sizeof(*monptr)); rb_strlcpy(monptr->name, name, sizeof(monptr->name)); rb_radixtree_add(monitor_tree, monptr->name, monptr);
return monptr; }
return NULL;}
voidfree_monitor(struct monitor *monptr){ if (rb_dlink_list_length(&monptr->users) > 0) return;
rb_radixtree_delete(monitor_tree, monptr->name); rb_free(monptr);}
boolis_monitoring(struct Client *client_p, const char *name){ struct monitor *monptr = find_monitor(name, 0); if (monptr == NULL) return false;
return rb_dlinkFind(client_p, &monptr->users) != NULL;}
/* 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(struct Client *client_p){ char buf[USERHOST_REPLYLEN]; struct monitor *monptr = find_monitor(client_p->name, 0);
/* noones watching this nick */ if(monptr == NULL) return;
snprintf(buf, sizeof(buf), "%s!%s@%s", client_p->name, client_p->username, client_p->host);
sendto_monitor(client_p, 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(struct Client *client_p){ struct monitor *monptr = find_monitor(client_p->name, 0);
/* noones watching this nick */ if(monptr == NULL) return;
sendto_monitor(client_p, monptr, form_str(RPL_MONOFFLINE), me.name, "*", client_p->name);}
voidclear_monitor(struct Client *client_p){ struct monitor *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);
free_monitor(monptr); }
client_p->localClient->monitor_list.head = client_p->localClient->monitor_list.tail = NULL; client_p->localClient->monitor_list.length = 0;}