33 |
#include <sys/stat.h> |
#include <sys/stat.h> |
34 |
#include <dirent.h> |
#include <dirent.h> |
35 |
#include <dlfcn.h> |
#include <dlfcn.h> |
36 |
|
|
37 |
#include "../common/weechat.h" |
#include "../common/weechat.h" |
38 |
#include "plugins.h" |
#include "plugins.h" |
39 |
#include "plugins-config.h" |
#include "plugins-config.h" |
161 |
* return: pointer to handler, NULL if not found |
* return: pointer to handler, NULL if not found |
162 |
*/ |
*/ |
163 |
|
|
164 |
t_plugin_cmd_handler * |
t_plugin_handler * |
165 |
plugin_cmd_handler_search (char *command) |
plugin_cmd_handler_search (char *command) |
166 |
{ |
{ |
167 |
t_weechat_plugin *ptr_plugin; |
t_weechat_plugin *ptr_plugin; |
168 |
t_plugin_cmd_handler *ptr_plugin_cmd_handler; |
t_plugin_handler *ptr_handler; |
169 |
|
|
170 |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
171 |
ptr_plugin = ptr_plugin->next_plugin) |
ptr_plugin = ptr_plugin->next_plugin) |
172 |
{ |
{ |
173 |
for (ptr_plugin_cmd_handler = ptr_plugin->cmd_handlers; |
for (ptr_handler = ptr_plugin->handlers; |
174 |
ptr_plugin_cmd_handler; |
ptr_handler; ptr_handler = ptr_handler->next_handler) |
|
ptr_plugin_cmd_handler = ptr_plugin_cmd_handler->next_handler) |
|
175 |
{ |
{ |
176 |
if (ascii_strcasecmp (ptr_plugin_cmd_handler->command, command) == 0) |
if ((ptr_handler->type == HANDLER_COMMAND) |
177 |
return ptr_plugin_cmd_handler; |
&& (ascii_strcasecmp (ptr_handler->command, command) == 0)) |
178 |
|
return ptr_handler; |
179 |
} |
} |
180 |
} |
} |
181 |
|
|
195 |
* handler when called (used by scripts) |
* handler when called (used by scripts) |
196 |
*/ |
*/ |
197 |
|
|
198 |
t_plugin_msg_handler * |
t_plugin_handler * |
199 |
plugin_msg_handler_add (t_weechat_plugin *plugin, char *irc_command, |
plugin_msg_handler_add (t_weechat_plugin *plugin, char *irc_command, |
200 |
t_plugin_handler_func *handler_func, |
t_plugin_handler_func *handler_func, |
201 |
char *handler_args, void *handler_pointer) |
char *handler_args, void *handler_pointer) |
202 |
{ |
{ |
203 |
t_plugin_msg_handler *new_plugin_msg_handler; |
t_plugin_handler *new_handler; |
204 |
|
|
205 |
new_plugin_msg_handler = (t_plugin_msg_handler *)malloc (sizeof (t_plugin_msg_handler)); |
new_handler = (t_plugin_handler *)malloc (sizeof (t_plugin_handler)); |
206 |
if (new_plugin_msg_handler) |
if (new_handler) |
207 |
{ |
{ |
208 |
new_plugin_msg_handler->irc_command = strdup (irc_command); |
new_handler->type = HANDLER_MESSAGE; |
209 |
new_plugin_msg_handler->msg_handler = handler_func; |
new_handler->irc_command = strdup (irc_command); |
210 |
new_plugin_msg_handler->msg_handler_args = (handler_args) ? strdup (handler_args) : NULL; |
new_handler->command = NULL; |
211 |
new_plugin_msg_handler->msg_handler_pointer = handler_pointer; |
new_handler->description = NULL; |
212 |
new_plugin_msg_handler->running = 0; |
new_handler->arguments = NULL; |
213 |
|
new_handler->arguments_description = NULL; |
214 |
|
new_handler->handler = handler_func; |
215 |
|
new_handler->handler_args = (handler_args) ? strdup (handler_args) : NULL; |
216 |
|
new_handler->handler_pointer = handler_pointer; |
217 |
|
new_handler->running = 0; |
218 |
|
|
219 |
/* add new handler to list */ |
/* add new handler to list */ |
220 |
new_plugin_msg_handler->prev_handler = plugin->last_msg_handler; |
new_handler->prev_handler = plugin->last_handler; |
221 |
new_plugin_msg_handler->next_handler = NULL; |
new_handler->next_handler = NULL; |
222 |
if (plugin->msg_handlers) |
if (plugin->handlers) |
223 |
(plugin->last_msg_handler)->next_handler = new_plugin_msg_handler; |
(plugin->last_handler)->next_handler = new_handler; |
224 |
else |
else |
225 |
plugin->msg_handlers = new_plugin_msg_handler; |
plugin->handlers = new_handler; |
226 |
plugin->last_msg_handler = new_plugin_msg_handler; |
plugin->last_handler = new_handler; |
227 |
} |
} |
228 |
else |
else |
229 |
{ |
{ |
233 |
WEECHAT_ERROR, plugin->name, irc_command); |
WEECHAT_ERROR, plugin->name, irc_command); |
234 |
return NULL; |
return NULL; |
235 |
} |
} |
236 |
return new_plugin_msg_handler; |
return new_handler; |
237 |
} |
} |
238 |
|
|
239 |
/* |
/* |
251 |
* handler when called (used by scripts) |
* handler when called (used by scripts) |
252 |
*/ |
*/ |
253 |
|
|
254 |
t_plugin_cmd_handler * |
t_plugin_handler * |
255 |
plugin_cmd_handler_add (t_weechat_plugin *plugin, char *command, |
plugin_cmd_handler_add (t_weechat_plugin *plugin, char *command, |
256 |
char *description, char *arguments, |
char *description, char *arguments, |
257 |
char *arguments_description, |
char *arguments_description, |
258 |
t_plugin_handler_func *handler_func, |
t_plugin_handler_func *handler_func, |
259 |
char *handler_args, void *handler_pointer) |
char *handler_args, void *handler_pointer) |
260 |
{ |
{ |
261 |
t_plugin_cmd_handler *new_plugin_cmd_handler; |
t_plugin_handler *new_handler; |
262 |
|
|
263 |
if (plugin_cmd_handler_search (command)) |
if (plugin_cmd_handler_search (command)) |
264 |
{ |
{ |
270 |
return NULL; |
return NULL; |
271 |
} |
} |
272 |
|
|
273 |
new_plugin_cmd_handler = (t_plugin_cmd_handler *)malloc (sizeof (t_plugin_cmd_handler)); |
new_handler = (t_plugin_handler *)malloc (sizeof (t_plugin_handler)); |
274 |
if (new_plugin_cmd_handler) |
if (new_handler) |
275 |
{ |
{ |
276 |
new_plugin_cmd_handler->command = strdup (command); |
new_handler->type = HANDLER_COMMAND; |
277 |
new_plugin_cmd_handler->description = (description) ? strdup (description) : NULL; |
new_handler->irc_command = NULL; |
278 |
new_plugin_cmd_handler->arguments = (arguments) ? strdup (arguments) : NULL; |
new_handler->command = strdup (command); |
279 |
new_plugin_cmd_handler->arguments_description = (arguments_description) ? strdup (arguments_description) : NULL; |
new_handler->description = (description) ? strdup (description) : NULL; |
280 |
new_plugin_cmd_handler->cmd_handler = handler_func; |
new_handler->arguments = (arguments) ? strdup (arguments) : NULL; |
281 |
new_plugin_cmd_handler->cmd_handler_args = (handler_args) ? strdup (handler_args) : NULL; |
new_handler->arguments_description = (arguments_description) ? strdup (arguments_description) : NULL; |
282 |
new_plugin_cmd_handler->cmd_handler_pointer = handler_pointer; |
new_handler->handler = handler_func; |
283 |
new_plugin_cmd_handler->running = 0; |
new_handler->handler_args = (handler_args) ? strdup (handler_args) : NULL; |
284 |
|
new_handler->handler_pointer = handler_pointer; |
285 |
|
new_handler->running = 0; |
286 |
|
|
287 |
/* add new handler to list */ |
/* add new handler to list */ |
288 |
new_plugin_cmd_handler->prev_handler = plugin->last_cmd_handler; |
new_handler->prev_handler = plugin->last_handler; |
289 |
new_plugin_cmd_handler->next_handler = NULL; |
new_handler->next_handler = NULL; |
290 |
if (plugin->cmd_handlers) |
if (plugin->handlers) |
291 |
(plugin->last_cmd_handler)->next_handler = new_plugin_cmd_handler; |
(plugin->last_handler)->next_handler = new_handler; |
292 |
else |
else |
293 |
plugin->cmd_handlers = new_plugin_cmd_handler; |
plugin->handlers = new_handler; |
294 |
plugin->last_cmd_handler = new_plugin_cmd_handler; |
plugin->last_handler = new_handler; |
295 |
|
|
296 |
/* add command to WeeChat commands list */ |
/* add command to WeeChat commands list */ |
297 |
if (!weelist_search (index_commands, command)) |
if (!weelist_search (index_commands, command)) |
305 |
WEECHAT_ERROR, plugin->name, command); |
WEECHAT_ERROR, plugin->name, command); |
306 |
return NULL; |
return NULL; |
307 |
} |
} |
308 |
return new_plugin_cmd_handler; |
return new_handler; |
309 |
} |
} |
310 |
|
|
311 |
/* |
/* |
317 |
plugin_msg_handler_exec (char *server, char *irc_command, char *irc_message) |
plugin_msg_handler_exec (char *server, char *irc_command, char *irc_message) |
318 |
{ |
{ |
319 |
t_weechat_plugin *ptr_plugin; |
t_weechat_plugin *ptr_plugin; |
320 |
t_plugin_msg_handler *ptr_plugin_msg_handler; |
t_plugin_handler *ptr_handler; |
321 |
int count; |
int count; |
322 |
|
|
323 |
count = 0; |
count = 0; |
324 |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
325 |
ptr_plugin = ptr_plugin->next_plugin) |
ptr_plugin = ptr_plugin->next_plugin) |
326 |
{ |
{ |
327 |
for (ptr_plugin_msg_handler = ptr_plugin->msg_handlers; |
for (ptr_handler = ptr_plugin->handlers; |
328 |
ptr_plugin_msg_handler; |
ptr_handler; ptr_handler = ptr_handler->next_handler) |
|
ptr_plugin_msg_handler = ptr_plugin_msg_handler->next_handler) |
|
329 |
{ |
{ |
330 |
if (ascii_strcasecmp (ptr_plugin_msg_handler->irc_command, irc_command) == 0) |
if ((ptr_handler->type == HANDLER_MESSAGE) |
331 |
|
&& (ascii_strcasecmp (ptr_handler->irc_command, irc_command) == 0)) |
332 |
{ |
{ |
333 |
if (ptr_plugin_msg_handler->running == 0) |
if (ptr_handler->running == 0) |
334 |
{ |
{ |
335 |
ptr_plugin_msg_handler->running = 1; |
ptr_handler->running = 1; |
336 |
if ((int) (ptr_plugin_msg_handler->msg_handler) (ptr_plugin, |
if ((int) (ptr_handler->handler) (ptr_plugin, |
337 |
server, |
server, |
338 |
irc_command, |
irc_command, |
339 |
irc_message, |
irc_message, |
340 |
ptr_plugin_msg_handler->msg_handler_args, |
ptr_handler->handler_args, |
341 |
ptr_plugin_msg_handler->msg_handler_pointer)) |
ptr_handler->handler_pointer)) |
342 |
count++; |
count++; |
343 |
ptr_plugin_msg_handler->running = 0; |
ptr_handler->running = 0; |
344 |
} |
} |
345 |
} |
} |
346 |
} |
} |
358 |
plugin_cmd_handler_exec (char *server, char *command, char *arguments) |
plugin_cmd_handler_exec (char *server, char *command, char *arguments) |
359 |
{ |
{ |
360 |
t_weechat_plugin *ptr_plugin; |
t_weechat_plugin *ptr_plugin; |
361 |
t_plugin_cmd_handler *ptr_plugin_cmd_handler; |
t_plugin_handler *ptr_handler; |
362 |
int return_code; |
int return_code; |
363 |
|
|
364 |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
for (ptr_plugin = weechat_plugins; ptr_plugin; |
365 |
ptr_plugin = ptr_plugin->next_plugin) |
ptr_plugin = ptr_plugin->next_plugin) |
366 |
{ |
{ |
367 |
for (ptr_plugin_cmd_handler = ptr_plugin->cmd_handlers; |
for (ptr_handler = ptr_plugin->handlers; |
368 |
ptr_plugin_cmd_handler; |
ptr_handler; ptr_handler = ptr_handler->next_handler) |
|
ptr_plugin_cmd_handler = ptr_plugin_cmd_handler->next_handler) |
|
369 |
{ |
{ |
370 |
if (ascii_strcasecmp (ptr_plugin_cmd_handler->command, command) == 0) |
if ((ptr_handler->type == HANDLER_COMMAND) |
371 |
|
&& (ascii_strcasecmp (ptr_handler->command, command) == 0)) |
372 |
{ |
{ |
373 |
if (ptr_plugin_cmd_handler->running == 0) |
if (ptr_handler->running == 0) |
374 |
{ |
{ |
375 |
ptr_plugin_cmd_handler->running = 1; |
ptr_handler->running = 1; |
376 |
return_code = (int) (ptr_plugin_cmd_handler->cmd_handler) (ptr_plugin, |
return_code = (int) (ptr_handler->handler) (ptr_plugin, |
377 |
server, |
server, |
378 |
command, |
command, |
379 |
arguments, |
arguments, |
380 |
ptr_plugin_cmd_handler->cmd_handler_args, |
ptr_handler->handler_args, |
381 |
ptr_plugin_cmd_handler->cmd_handler_pointer); |
ptr_handler->handler_pointer); |
382 |
ptr_plugin_cmd_handler->running = 0; |
ptr_handler->running = 0; |
383 |
return (return_code) ? 1 : 0; |
return (return_code) ? 1 : 0; |
384 |
} |
} |
385 |
} |
} |
390 |
} |
} |
391 |
|
|
392 |
/* |
/* |
393 |
* plugin_msg_handler_remove: remove a message handler for a plugin |
* plugin_handler_remove: remove a handler for a plugin |
|
*/ |
|
|
|
|
|
void |
|
|
plugin_msg_handler_remove (t_weechat_plugin *plugin, |
|
|
t_plugin_msg_handler *plugin_msg_handler) |
|
|
{ |
|
|
t_plugin_msg_handler *new_plugin_msg_handlers; |
|
|
|
|
|
/* remove handler from list */ |
|
|
if (plugin->last_msg_handler == plugin_msg_handler) |
|
|
plugin->last_msg_handler = plugin_msg_handler->prev_handler; |
|
|
if (plugin_msg_handler->prev_handler) |
|
|
{ |
|
|
(plugin_msg_handler->prev_handler)->next_handler = plugin_msg_handler->next_handler; |
|
|
new_plugin_msg_handlers = plugin->msg_handlers; |
|
|
} |
|
|
else |
|
|
new_plugin_msg_handlers = plugin_msg_handler->next_handler; |
|
|
|
|
|
if (plugin_msg_handler->next_handler) |
|
|
(plugin_msg_handler->next_handler)->prev_handler = plugin_msg_handler->prev_handler; |
|
|
|
|
|
/* free data */ |
|
|
if (plugin_msg_handler->irc_command) |
|
|
free (plugin_msg_handler->irc_command); |
|
|
if (plugin_msg_handler->msg_handler_args) |
|
|
free (plugin_msg_handler->msg_handler_args); |
|
|
plugin->msg_handlers = new_plugin_msg_handlers; |
|
|
} |
|
|
|
|
|
/* |
|
|
* plugin_cmd_handler_remove: remove a command handler for a plugin |
|
394 |
*/ |
*/ |
395 |
|
|
396 |
void |
void |
397 |
plugin_cmd_handler_remove (t_weechat_plugin *plugin, |
plugin_handler_remove (t_weechat_plugin *plugin, |
398 |
t_plugin_cmd_handler *plugin_cmd_handler) |
t_plugin_handler *handler) |
399 |
{ |
{ |
400 |
t_plugin_cmd_handler *new_plugin_cmd_handlers; |
t_plugin_handler *new_handlers; |
401 |
|
|
402 |
/* remove handler from list */ |
/* remove handler from list */ |
403 |
if (plugin->last_cmd_handler == plugin_cmd_handler) |
if (plugin->last_handler == handler) |
404 |
plugin->last_cmd_handler = plugin_cmd_handler->prev_handler; |
plugin->last_handler = handler->prev_handler; |
405 |
if (plugin_cmd_handler->prev_handler) |
if (handler->prev_handler) |
406 |
{ |
{ |
407 |
(plugin_cmd_handler->prev_handler)->next_handler = plugin_cmd_handler->next_handler; |
(handler->prev_handler)->next_handler = handler->next_handler; |
408 |
new_plugin_cmd_handlers = plugin->cmd_handlers; |
new_handlers = plugin->handlers; |
409 |
} |
} |
410 |
else |
else |
411 |
new_plugin_cmd_handlers = plugin_cmd_handler->next_handler; |
new_handlers = handler->next_handler; |
412 |
|
|
413 |
if (plugin_cmd_handler->next_handler) |
if (handler->next_handler) |
414 |
(plugin_cmd_handler->next_handler)->prev_handler = plugin_cmd_handler->prev_handler; |
(handler->next_handler)->prev_handler = handler->prev_handler; |
415 |
|
|
416 |
/* remove command from WeeChat command list */ |
/* remove command from WeeChat command list, if command handler */ |
417 |
weelist_remove (&index_commands, &last_index_command, |
if (handler->type == HANDLER_COMMAND) |
418 |
weelist_search (index_commands, plugin_cmd_handler->command)); |
weelist_remove (&index_commands, &last_index_command, |
419 |
|
weelist_search (index_commands, handler->command)); |
420 |
|
|
421 |
/* free data */ |
/* free data */ |
422 |
if (plugin_cmd_handler->command) |
if (handler->irc_command) |
423 |
free (plugin_cmd_handler->command); |
free (handler->irc_command); |
424 |
if (plugin_cmd_handler->description) |
if (handler->command) |
425 |
free (plugin_cmd_handler->description); |
free (handler->command); |
426 |
if (plugin_cmd_handler->arguments) |
if (handler->description) |
427 |
free (plugin_cmd_handler->arguments); |
free (handler->description); |
428 |
if (plugin_cmd_handler->arguments_description) |
if (handler->arguments) |
429 |
free (plugin_cmd_handler->arguments_description); |
free (handler->arguments); |
430 |
if (plugin_cmd_handler->cmd_handler_args) |
if (handler->arguments_description) |
431 |
free (plugin_cmd_handler->cmd_handler_args); |
free (handler->arguments_description); |
432 |
plugin->cmd_handlers = new_plugin_cmd_handlers; |
if (handler->handler_args) |
433 |
} |
free (handler->handler_args); |
434 |
|
|
435 |
/* |
plugin->handlers = new_handlers; |
|
* plugin_msg_handler_remove_all: remove all message handlers for a plugin |
|
|
*/ |
|
|
|
|
|
void |
|
|
plugin_msg_handler_remove_all (t_weechat_plugin *plugin) |
|
|
{ |
|
|
while (plugin->msg_handlers) |
|
|
plugin_msg_handler_remove (plugin, plugin->msg_handlers); |
|
436 |
} |
} |
437 |
|
|
438 |
/* |
/* |
439 |
* plugin_cmd_handler_remove_all: remove all command handlers for a plugin |
* plugin_handler_remove_all: remove all handlers for a plugin |
440 |
*/ |
*/ |
441 |
|
|
442 |
void |
void |
443 |
plugin_cmd_handler_remove_all (t_weechat_plugin *plugin) |
plugin_handler_remove_all (t_weechat_plugin *plugin) |
444 |
{ |
{ |
445 |
while (plugin->cmd_handlers) |
while (plugin->handlers) |
446 |
plugin_cmd_handler_remove (plugin, plugin->cmd_handlers); |
plugin_handler_remove (plugin, plugin->handlers); |
447 |
} |
} |
448 |
|
|
449 |
/* |
/* |
619 |
new_plugin->mkdir_home = &weechat_plugin_mkdir_home; |
new_plugin->mkdir_home = &weechat_plugin_mkdir_home; |
620 |
new_plugin->exec_on_files = &weechat_plugin_exec_on_files; |
new_plugin->exec_on_files = &weechat_plugin_exec_on_files; |
621 |
new_plugin->msg_handler_add = &weechat_plugin_msg_handler_add; |
new_plugin->msg_handler_add = &weechat_plugin_msg_handler_add; |
|
new_plugin->msg_handler_remove = &weechat_plugin_msg_handler_remove; |
|
|
new_plugin->msg_handler_remove_all = &weechat_plugin_msg_handler_remove_all; |
|
622 |
new_plugin->cmd_handler_add = &weechat_plugin_cmd_handler_add; |
new_plugin->cmd_handler_add = &weechat_plugin_cmd_handler_add; |
623 |
new_plugin->cmd_handler_remove = &weechat_plugin_cmd_handler_remove; |
new_plugin->handler_remove = &weechat_plugin_handler_remove; |
624 |
new_plugin->cmd_handler_remove_all = &weechat_plugin_cmd_handler_remove_all; |
new_plugin->handler_remove_all = &weechat_plugin_handler_remove_all; |
625 |
new_plugin->printf = &weechat_plugin_printf; |
new_plugin->printf = &weechat_plugin_printf; |
626 |
new_plugin->printf_server = &weechat_plugin_printf_server; |
new_plugin->printf_server = &weechat_plugin_printf_server; |
627 |
new_plugin->infobar_printf = &weechat_plugin_infobar_printf; |
new_plugin->infobar_printf = &weechat_plugin_infobar_printf; |
635 |
new_plugin->set_plugin_config = &weechat_plugin_set_plugin_config; |
new_plugin->set_plugin_config = &weechat_plugin_set_plugin_config; |
636 |
|
|
637 |
/* handlers */ |
/* handlers */ |
638 |
new_plugin->msg_handlers = NULL; |
new_plugin->handlers = NULL; |
639 |
new_plugin->last_msg_handler = NULL; |
new_plugin->last_handler = NULL; |
|
new_plugin->cmd_handlers = NULL; |
|
|
new_plugin->last_cmd_handler = NULL; |
|
640 |
|
|
641 |
/* add new plugin to list */ |
/* add new plugin to list */ |
642 |
new_plugin->prev_plugin = last_weechat_plugin; |
new_plugin->prev_plugin = last_weechat_plugin; |
772 |
(plugin->next_plugin)->prev_plugin = plugin->prev_plugin; |
(plugin->next_plugin)->prev_plugin = plugin->prev_plugin; |
773 |
|
|
774 |
/* free data */ |
/* free data */ |
775 |
plugin_msg_handler_remove_all (plugin); |
plugin_handler_remove_all (plugin); |
|
plugin_cmd_handler_remove_all (plugin); |
|
776 |
if (plugin->filename) |
if (plugin->filename) |
777 |
free (plugin->filename); |
free (plugin->filename); |
778 |
dlclose (plugin->handle); |
dlclose (plugin->handle); |