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 26 2006-09-20 18:02:06Z spb $
44 static struct monitor
*monitorTable
[MONITOR_HASH_SIZE
];
45 BlockHeap
*monitor_heap
;
47 static void cleanup_monitor(void *unused
);
52 monitor_heap
= BlockHeapCreate(sizeof(struct monitor
), MONITOR_HEAP_SIZE
);
53 eventAddIsh("cleanup_monitor", cleanup_monitor
, NULL
, 3600);
56 static inline unsigned int
57 hash_monitor_nick(const char *name
)
59 return fnv_hash_upper((const unsigned char *) name
, MONITOR_HASH_BITS
);
63 find_monitor(const char *name
, int add
)
65 struct monitor
*monptr
;
67 unsigned int hashv
= hash_monitor_nick(name
);
69 for(monptr
= monitorTable
[hashv
]; monptr
; monptr
= monptr
->hnext
)
71 if(!irccmp(monptr
->name
, name
))
77 monptr
= BlockHeapAlloc(monitor_heap
);
78 strlcpy(monptr
->name
, name
, sizeof(monptr
->name
));
80 monptr
->hnext
= monitorTable
[hashv
];
81 monitorTable
[hashv
] = monptr
;
91 * inputs - client who has just connected
93 * side effects - notifies any clients monitoring this nickname that it has
94 * connected to the network
97 monitor_signon(struct Client
*client_p
)
99 char buf
[USERHOST_REPLYLEN
];
100 struct monitor
*monptr
= find_monitor(client_p
->name
, 0);
101 struct Client
*target_p
;
104 /* noones watching this nick */
108 ircsnprintf(buf
, sizeof(buf
), "%s!%s@%s",
109 client_p
->name
, client_p
->username
, client_p
->host
);
111 DLINK_FOREACH(ptr
, monptr
->users
.head
)
113 target_p
= ptr
->data
;
115 sendto_one(target_p
, form_str(RPL_MONONLINE
),
116 me
.name
, target_p
->name
, buf
);
122 * inputs - client who is exiting
124 * side effects - notifies any clients monitoring this nickname that it has
128 monitor_signoff(struct Client
*client_p
)
130 struct monitor
*monptr
= find_monitor(client_p
->name
, 0);
133 /* noones watching this nick */
137 DLINK_FOREACH(ptr
, monptr
->users
.head
)
139 sendto_one(ptr
->data
, form_str(RPL_MONOFFLINE
),
140 me
.name
, ((struct Client
*) ptr
->data
)->name
, client_p
->name
);
145 clear_monitor(struct Client
*client_p
)
147 struct monitor
*monptr
;
148 dlink_node
*ptr
, *next_ptr
;
150 DLINK_FOREACH_SAFE(ptr
, next_ptr
, client_p
->localClient
->monitor_list
.head
)
154 /* we leave the actual entry around with no users, itll be
155 * cleaned up periodically by cleanup_monitor() --anfl
157 dlinkFindDestroy(client_p
, &monptr
->users
);
158 free_dlink_node(ptr
);
161 client_p
->localClient
->monitor_list
.head
= client_p
->localClient
->monitor_list
.tail
= NULL
;
162 client_p
->localClient
->monitor_list
.length
= 0;
166 cleanup_monitor(void *unused
)
168 struct monitor
*last_ptr
= NULL
;
169 struct monitor
*next_ptr
, *ptr
;
172 for(i
= 0; i
< MONITOR_HASH_SIZE
; i
++)
175 for(ptr
= monitorTable
[i
]; ptr
; ptr
= next_ptr
)
177 next_ptr
= ptr
->hnext
;
179 if(!dlink_list_length(&ptr
->users
))
182 last_ptr
->hnext
= next_ptr
;
184 monitorTable
[i
] = next_ptr
;
186 BlockHeapFree(monitor_heap
, ptr
);