File: | irc/notifylist/notifylist.c |
Location: | line 244, column 20 |
Description: | Value stored to 'data' is never read |
1 | /* |
2 | notifylist.c : irssi |
3 | |
4 | Copyright (C) 1999-2000 Timo Sirainen |
5 | |
6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2 of the License, or |
9 | (at your option) any later version. |
10 | |
11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | GNU General Public License for more details. |
15 | |
16 | You should have received a copy of the GNU General Public License along |
17 | with this program; if not, write to the Free Software Foundation, Inc., |
18 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
19 | */ |
20 | |
21 | #include "module.h" |
22 | #include "modules.h" |
23 | #include "signals.h" |
24 | #include "settings.h" |
25 | |
26 | #include "irc.h" |
27 | #include "irc-channels.h" |
28 | #include "servers-redirect.h" |
29 | #include "masks.h" |
30 | #include "nicklist.h" |
31 | |
32 | #include "notifylist.h" |
33 | #include "notify-setup.h" |
34 | |
35 | GSList *notifies; |
36 | |
37 | NOTIFYLIST_REC *notifylist_add(const char *mask, const char *ircnets, |
38 | int away_check) |
39 | { |
40 | NOTIFYLIST_REC *rec; |
41 | |
42 | g_return_val_if_fail(mask != NULL, NULL)do{ if (mask != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "mask != NULL"); return ( ((void *)0)); }; }while (0); |
43 | |
44 | rec = g_new0(NOTIFYLIST_REC, 1)((NOTIFYLIST_REC *) g_malloc0 (((gsize) sizeof (NOTIFYLIST_REC )) * ((gsize) (1)))); |
45 | rec->mask = g_strdup(mask); |
46 | rec->ircnets = ircnets == NULL((void *)0) || *ircnets == '\0' ? NULL((void *)0) : |
47 | g_strsplit(ircnets, " ", -1); |
48 | rec->away_check = away_check; |
49 | |
50 | notifylist_add_config(rec); |
51 | |
52 | notifies = g_slist_append(notifies, rec); |
53 | signal_emit("notifylist new", 1, rec); |
54 | return rec; |
55 | } |
56 | |
57 | static void notify_destroy(NOTIFYLIST_REC *rec) |
58 | { |
59 | if (rec->ircnets != NULL((void *)0)) g_strfreev(rec->ircnets); |
60 | g_free(rec->mask); |
61 | g_free(rec); |
62 | } |
63 | |
64 | void notifylist_destroy_all(void) |
65 | { |
66 | g_slist_foreach(notifies, (GFunc) notify_destroy, NULL((void *)0)); |
67 | g_slist_free(notifies); |
68 | |
69 | notifies = NULL((void *)0); |
70 | } |
71 | |
72 | void notifylist_remove(const char *mask) |
73 | { |
74 | NOTIFYLIST_REC *rec; |
75 | |
76 | g_return_if_fail(mask != NULL)do{ if (mask != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "mask != NULL"); return; }; }while (0); |
77 | |
78 | rec = notifylist_find(mask, "*"); |
79 | if (rec == NULL((void *)0)) return; |
80 | |
81 | notifylist_remove_config(rec); |
82 | notifies = g_slist_remove(notifies, rec); |
83 | signal_emit("notifylist remove", 1, rec); |
84 | |
85 | notify_destroy(rec); |
86 | } |
87 | |
88 | int notifylist_ircnets_match(NOTIFYLIST_REC *rec, const char *ircnet) |
89 | { |
90 | char **tmp; |
91 | |
92 | if (rec->ircnets == NULL((void *)0)) return TRUE(!(0)); |
93 | if (ircnet == NULL((void *)0)) return FALSE(0); |
94 | if (strcmp(ircnet, "*") == 0) return TRUE(!(0)); |
95 | |
96 | for (tmp = rec->ircnets; *tmp != NULL((void *)0); tmp++) { |
97 | if (g_strcasecmp(*tmp, ircnet) == 0) |
98 | return TRUE(!(0)); |
99 | } |
100 | |
101 | return FALSE(0); |
102 | } |
103 | |
104 | NOTIFYLIST_REC *notifylist_find(const char *mask, const char *ircnet) |
105 | { |
106 | NOTIFYLIST_REC *best; |
107 | GSList *tmp; |
108 | int len; |
109 | |
110 | best = NULL((void *)0); |
111 | len = strlen(mask); |
112 | for (tmp = notifies; tmp != NULL((void *)0); tmp = tmp->next) { |
113 | NOTIFYLIST_REC *rec = tmp->data; |
114 | |
115 | /* check mask */ |
116 | if (g_strncasecmp(rec->mask, mask, len) != 0 || |
117 | (rec->mask[len] != '\0' && rec->mask[len] != '!')) continue; |
118 | |
119 | /* check ircnet */ |
120 | if (rec->ircnets == NULL((void *)0)) { |
121 | best = rec; |
122 | continue; |
123 | } |
124 | |
125 | if (notifylist_ircnets_match(rec, ircnet)) |
126 | return rec; |
127 | } |
128 | |
129 | return best; |
130 | } |
131 | |
132 | int notifylist_ison_server(IRC_SERVER_REC *server, const char *nick) |
133 | { |
134 | NOTIFY_NICK_REC *rec; |
135 | |
136 | g_return_val_if_fail(nick != NULL, FALSE)do{ if (nick != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "nick != NULL"); return ( (0)); }; }while (0); |
137 | g_return_val_if_fail(IS_IRC_SERVER(server), FALSE)do{ if ((((IRC_SERVER_REC *) chat_protocol_check_cast(((SERVER_REC *) module_check_cast(server, __builtin_offsetof(SERVER_REC, type ), "SERVER")), __builtin_offsetof(IRC_SERVER_REC, chat_type), "IRC")) ? (!(0)) : (0))) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "IS_IRC_SERVER(server)") ; return ((0)); }; }while (0); |
138 | |
139 | rec = notify_nick_find(server, nick); |
140 | return rec != NULL((void *)0) && rec->host_ok && rec->away_ok; |
141 | } |
142 | |
143 | static IRC_SERVER_REC *notifylist_ison_serverlist(const char *nick, const char *taglist) |
144 | { |
145 | IRC_SERVER_REC *server; |
146 | char **list, **tmp; |
147 | |
148 | g_return_val_if_fail(nick != NULL, NULL)do{ if (nick != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "nick != NULL"); return ( ((void *)0)); }; }while (0); |
149 | g_return_val_if_fail(taglist != NULL, NULL)do{ if (taglist != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "taglist != NULL"); return (((void *)0)); }; }while (0); |
150 | |
151 | list = g_strsplit(taglist, " ", -1); |
152 | |
153 | server = NULL((void *)0); |
154 | for (tmp = list; *tmp != NULL((void *)0); tmp++) { |
155 | server = (IRC_SERVER_REC *) server_find_chatnet(*tmp); |
156 | |
157 | if (IS_IRC_SERVER(server)(((IRC_SERVER_REC *) chat_protocol_check_cast(((SERVER_REC *) module_check_cast(server, __builtin_offsetof(SERVER_REC, type ), "SERVER")), __builtin_offsetof(IRC_SERVER_REC, chat_type), "IRC")) ? (!(0)) : (0)) && |
158 | notifylist_ison_server(server, nick)) |
159 | break; |
160 | } |
161 | g_strfreev(list); |
162 | |
163 | return tmp == NULL((void *)0) ? NULL((void *)0) : server; |
164 | } |
165 | |
166 | IRC_SERVER_REC *notifylist_ison(const char *nick, const char *serverlist) |
167 | { |
168 | GSList *tmp; |
169 | |
170 | g_return_val_if_fail(nick != NULL, FALSE)do{ if (nick != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "nick != NULL"); return ( (0)); }; }while (0); |
171 | g_return_val_if_fail(serverlist != NULL, FALSE)do{ if (serverlist != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "serverlist != NULL"); return ((0)); }; }while (0); |
172 | |
173 | if (*serverlist != '\0') |
174 | return notifylist_ison_serverlist(nick, serverlist); |
175 | |
176 | /* any server.. */ |
177 | for (tmp = servers; tmp != NULL((void *)0); tmp = tmp->next) { |
178 | IRC_SERVER_REC *server = tmp->data; |
179 | |
180 | if (IS_IRC_SERVER(server)(((IRC_SERVER_REC *) chat_protocol_check_cast(((SERVER_REC *) module_check_cast(server, __builtin_offsetof(SERVER_REC, type ), "SERVER")), __builtin_offsetof(IRC_SERVER_REC, chat_type), "IRC")) ? (!(0)) : (0)) && |
181 | notifylist_ison_server(server, nick)) |
182 | return tmp->data; |
183 | } |
184 | |
185 | return NULL((void *)0); |
186 | } |
187 | |
188 | static void notifylist_init_server(IRC_SERVER_REC *server) |
189 | { |
190 | MODULE_SERVER_REC *rec; |
191 | |
192 | g_return_if_fail(server != NULL)do{ if (server != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "server != NULL"); return ; }; }while (0); |
193 | |
194 | if (!IS_IRC_SERVER(server)(((IRC_SERVER_REC *) chat_protocol_check_cast(((SERVER_REC *) module_check_cast(server, __builtin_offsetof(SERVER_REC, type ), "SERVER")), __builtin_offsetof(IRC_SERVER_REC, chat_type), "IRC")) ? (!(0)) : (0))) |
195 | return; |
196 | |
197 | rec = g_new0(MODULE_SERVER_REC,1 )((MODULE_SERVER_REC *) g_malloc0 (((gsize) sizeof (MODULE_SERVER_REC )) * ((gsize) (1)))); |
198 | MODULE_DATA_SET(server, rec)g_hash_table_insert((server)->module_data, "irc/notifylist" , rec); |
199 | } |
200 | |
201 | static void notifylist_deinit_server(IRC_SERVER_REC *server) |
202 | { |
203 | MODULE_SERVER_REC *mserver; |
204 | NOTIFY_NICK_REC *rec; |
205 | |
206 | g_return_if_fail(server != NULL)do{ if (server != ((void *)0)) { } else { g_return_if_fail_warning (((gchar*) 0), __PRETTY_FUNCTION__, "server != NULL"); return ; }; }while (0); |
207 | |
208 | if (!IS_IRC_SERVER(server)(((IRC_SERVER_REC *) chat_protocol_check_cast(((SERVER_REC *) module_check_cast(server, __builtin_offsetof(SERVER_REC, type ), "SERVER")), __builtin_offsetof(IRC_SERVER_REC, chat_type), "IRC")) ? (!(0)) : (0))) |
209 | return; |
210 | |
211 | mserver = MODULE_DATA(server)g_hash_table_lookup((server)->module_data, "irc/notifylist" ); |
212 | while (mserver->notify_users != NULL((void *)0)) { |
213 | rec = mserver->notify_users->data; |
214 | |
215 | mserver->notify_users = g_slist_remove(mserver->notify_users, rec); |
216 | notify_nick_destroy(rec); |
217 | } |
218 | g_free(mserver); |
219 | MODULE_DATA_UNSET(server)g_hash_table_remove((server)->module_data, "irc/notifylist" ); |
220 | } |
221 | |
222 | void notifylist_left(IRC_SERVER_REC *server, NOTIFY_NICK_REC *rec) |
223 | { |
224 | MODULE_SERVER_REC *mserver; |
225 | |
226 | mserver = MODULE_DATA(server)g_hash_table_lookup((server)->module_data, "irc/notifylist" ); |
227 | mserver->notify_users = g_slist_remove(mserver->notify_users, rec); |
228 | |
229 | if (rec->host_ok && rec->away_ok) { |
230 | signal_emit("notifylist left", 6, |
231 | server, rec->nick, |
232 | rec->user, rec->host, |
233 | rec->realname, rec->awaymsg); |
234 | } |
235 | |
236 | notify_nick_destroy(rec); |
237 | } |
238 | |
239 | static void event_quit(IRC_SERVER_REC *server, const char *data, |
240 | const char *nick) |
241 | { |
242 | NOTIFY_NICK_REC *rec; |
243 | |
244 | if (*data == ':') data++; /* quit message */ |
Value stored to 'data' is never read | |
245 | |
246 | rec = notify_nick_find(server, nick); |
247 | if (rec != NULL((void *)0)) notifylist_left(server, rec); |
248 | } |
249 | |
250 | static void notifylist_check_join(IRC_SERVER_REC *server, const char *nick, |
251 | const char *userhost, const char *realname, int away) |
252 | { |
253 | NOTIFYLIST_REC *notify; |
254 | NOTIFY_NICK_REC *rec; |
255 | char *user, *host; |
256 | |
257 | if (nick == NULL((void *)0)) |
258 | return; |
259 | |
260 | notify = notifylist_find(nick, server->connrec->chatnet); |
261 | if (notify == NULL((void *)0)) return; |
262 | |
263 | rec = notify_nick_find(server, nick); |
264 | if (rec != NULL((void *)0) && rec->join_announced) return; |
265 | if (rec == NULL((void *)0)) rec = notify_nick_create(server, nick); |
266 | |
267 | user = g_strdup(userhost == NULL((void *)0) ? "" : userhost); |
268 | host = strchr(user, '@'); |
269 | if (host != NULL((void *)0)) *host++ = '\0'; else host = ""; |
270 | |
271 | if (!mask_match(SERVER(server)((SERVER_REC *) module_check_cast(server, __builtin_offsetof( SERVER_REC, type), "SERVER")), notify->mask, nick, user, host)) { |
272 | g_free(user); |
273 | return; |
274 | } |
275 | |
276 | if (notify->away_check && away == -1) { |
277 | /* we need to know if the nick is away */ |
278 | g_free(user); |
279 | return; |
280 | } |
281 | |
282 | g_free_not_null(rec->user)g_free(rec->user); |
283 | g_free_not_null(rec->host)g_free(rec->host); |
284 | g_free_not_null(rec->realname)g_free(rec->realname); |
285 | rec->user = g_strdup(user); |
286 | rec->host = g_strdup(host); |
287 | rec->realname = realname == NULL((void *)0) || *realname == '\0' ? NULL((void *)0) : g_strdup(realname); |
288 | |
289 | if (away != -1) rec->away = away; |
290 | rec->host_ok = TRUE(!(0)); |
291 | rec->join_announced = TRUE(!(0)); |
292 | |
293 | signal_emit("notifylist joined", 6, |
294 | server, rec->nick, rec->user, rec->host, realname, NULL((void *)0)); |
295 | g_free(user); |
296 | } |
297 | |
298 | static void event_privmsg(IRC_SERVER_REC *server, const char *data, |
299 | const char *nick, const char *address) |
300 | { |
301 | if (nick != NULL((void *)0)) { |
302 | notifylist_check_join(server, nick, address, "", -1); |
303 | } |
304 | } |
305 | |
306 | static void event_join(IRC_SERVER_REC *server, const char *data, |
307 | const char *nick, const char *address) |
308 | { |
309 | notifylist_check_join(server, nick, address, "", -1); |
310 | } |
311 | |
312 | static void sig_channel_wholist(IRC_CHANNEL_REC *channel) |
313 | { |
314 | GSList *nicks, *tmp; |
315 | |
316 | nicks = nicklist_getnicks(CHANNEL(channel)((CHANNEL_REC *) module_check_cast_module(channel, __builtin_offsetof (CHANNEL_REC, type), "WINDOW ITEM TYPE", "CHANNEL"))); |
317 | for (tmp = nicks; tmp != NULL((void *)0); tmp = tmp->next) { |
318 | NICK_REC *rec = tmp->data; |
319 | |
320 | notifylist_check_join(channel->server, rec->nick, rec->host, rec->realname, rec->gone); |
321 | } |
322 | g_slist_free(nicks); |
323 | } |
324 | |
325 | void irc_notifylist_init(void) |
326 | { |
327 | notifylist_read_config(); |
328 | |
329 | notifylist_commands_init(); |
330 | notifylist_ison_init(); |
331 | notifylist_whois_init(); |
332 | signal_add("server connected", (SIGNAL_FUNC) notifylist_init_server)signal_add_full("irc/notifylist", 0, ("server connected"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) notifylist_init_server), ((void *)0)); |
333 | signal_add("server disconnected", (SIGNAL_FUNC) notifylist_deinit_server)signal_add_full("irc/notifylist", 0, ("server disconnected"), (SIGNAL_FUNC) ((SIGNAL_FUNC) notifylist_deinit_server), ((void *)0)); |
334 | signal_add("event quit", (SIGNAL_FUNC) event_quit)signal_add_full("irc/notifylist", 0, ("event quit"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) event_quit), ((void *)0)); |
335 | signal_add("event privmsg", (SIGNAL_FUNC) event_privmsg)signal_add_full("irc/notifylist", 0, ("event privmsg"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) event_privmsg), ((void *)0)); |
336 | signal_add("event join", (SIGNAL_FUNC) event_join)signal_add_full("irc/notifylist", 0, ("event join"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) event_join), ((void *)0)); |
337 | signal_add("channel wholist", (SIGNAL_FUNC) sig_channel_wholist)signal_add_full("irc/notifylist", 0, ("channel wholist"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) sig_channel_wholist), ((void *)0)); |
338 | signal_add("setup reread", (SIGNAL_FUNC) notifylist_read_config)signal_add_full("irc/notifylist", 0, ("setup reread"), (SIGNAL_FUNC ) ((SIGNAL_FUNC) notifylist_read_config), ((void *)0)); |
339 | |
340 | settings_check()settings_check_module("irc/notifylist"); |
341 | module_register("notifylist", "irc")module_register_full("notifylist", "irc", "irc/notifylist"); |
342 | } |
343 | |
344 | void irc_notifylist_deinit(void) |
345 | { |
346 | notifylist_commands_deinit(); |
347 | notifylist_ison_deinit(); |
348 | notifylist_whois_deinit(); |
349 | |
350 | signal_remove("server connected", (SIGNAL_FUNC) notifylist_init_server)signal_remove_full(("server connected"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) notifylist_init_server), ((void *)0)); |
351 | signal_remove("server disconnected", (SIGNAL_FUNC) notifylist_deinit_server)signal_remove_full(("server disconnected"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) notifylist_deinit_server), ((void *)0)); |
352 | signal_remove("event quit", (SIGNAL_FUNC) event_quit)signal_remove_full(("event quit"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) event_quit), ((void *)0)); |
353 | signal_remove("event privmsg", (SIGNAL_FUNC) event_privmsg)signal_remove_full(("event privmsg"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) event_privmsg), ((void *)0)); |
354 | signal_remove("event join", (SIGNAL_FUNC) event_join)signal_remove_full(("event join"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) event_join), ((void *)0)); |
355 | signal_remove("channel wholist", (SIGNAL_FUNC) sig_channel_wholist)signal_remove_full(("channel wholist"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) sig_channel_wholist), ((void *)0)); |
356 | signal_remove("setup reread", (SIGNAL_FUNC) notifylist_read_config)signal_remove_full(("setup reread"), (SIGNAL_FUNC) ((SIGNAL_FUNC ) notifylist_read_config), ((void *)0)); |
357 | |
358 | notifylist_destroy_all(); |
359 | } |