2 * ircd-ratbox: an advanced Internet Relay Chat Daemon(ircd).
3 * monitor.c - Code for server-side notify lists
5 * Copyright (C) 2005 Lee Hardy <lee -at- leeh.co.uk>
6 * Copyright (C) 2005 ircd-ratbox development team
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
12 * 1.Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * 2.Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3.The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
24 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
29 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
32 * $Id: monitor.c 3520 2007-06-30 22:15:35Z jilles $
40 #include "irc_radixtree.h"
42 static struct irc_radixtree
*monitor_tree
;
47 monitor_tree
= irc_radixtree_create("monitor lists", irc_radixtree_irccasecanon
);
51 find_monitor(const char *name
, int add
)
53 struct monitor
*monptr
;
55 monptr
= irc_radixtree_retrieve(monitor_tree
, name
);
61 monptr
= rb_malloc(sizeof(*monptr
));
62 rb_strlcpy(monptr
->name
, name
, sizeof(monptr
->name
));
63 irc_radixtree_add(monitor_tree
, monptr
->name
, monptr
);
72 free_monitor(struct monitor
*monptr
)
74 if (rb_dlink_list_length(&monptr
->users
) > 0)
77 irc_radixtree_delete(monitor_tree
, monptr
->name
);
83 * inputs - client who has just connected
85 * side effects - notifies any clients monitoring this nickname that it has
86 * connected to the network
89 monitor_signon(struct Client
*client_p
)
91 char buf
[USERHOST_REPLYLEN
];
92 struct monitor
*monptr
= find_monitor(client_p
->name
, 0);
94 /* noones watching this nick */
98 snprintf(buf
, sizeof(buf
), "%s!%s@%s", client_p
->name
, client_p
->username
, client_p
->host
);
100 sendto_monitor(monptr
, form_str(RPL_MONONLINE
), me
.name
, "*", buf
);
105 * inputs - client who is exiting
107 * side effects - notifies any clients monitoring this nickname that it has
111 monitor_signoff(struct Client
*client_p
)
113 struct monitor
*monptr
= find_monitor(client_p
->name
, 0);
115 /* noones watching this nick */
119 sendto_monitor(monptr
, form_str(RPL_MONOFFLINE
), me
.name
, "*",
124 clear_monitor(struct Client
*client_p
)
126 struct monitor
*monptr
;
127 rb_dlink_node
*ptr
, *next_ptr
;
129 RB_DLINK_FOREACH_SAFE(ptr
, next_ptr
, client_p
->localClient
->monitor_list
.head
)
133 rb_dlinkFindDestroy(client_p
, &monptr
->users
);
134 rb_free_rb_dlink_node(ptr
);
136 free_monitor(monptr
);
139 client_p
->localClient
->monitor_list
.head
= client_p
->localClient
->monitor_list
.tail
= NULL
;
140 client_p
->localClient
->monitor_list
.length
= 0;