From a1f09df80f29cdb9644538be73a32898e04c6d65 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 30 Nov 2003 19:18:06 +0000 Subject: [PATCH] - added IRC::get_info function for Perl scripts - cleanup code in main() function of weechat.c - fixed bug when unloading all Perl scripts (now end and restart Perl interpreter) --- src/common/weechat.c | 189 +++++++++++----------------- src/common/weechat.h | 9 +- src/common/weeconfig.c | 12 +- src/irc/irc-commands.c | 4 +- src/irc/irc-recv.c | 50 ++++++++ src/irc/irc-server.c | 23 +++- src/irc/irc.h | 5 +- src/plugins/perl/wee-perl.c | 86 ++++++++++++- src/plugins/plugins.c | 11 +- src/plugins/plugins.h | 4 +- weechat/src/common/weechat.c | 189 +++++++++++----------------- weechat/src/common/weechat.h | 9 +- weechat/src/common/weeconfig.c | 12 +- weechat/src/irc/irc-commands.c | 4 +- weechat/src/irc/irc-recv.c | 50 ++++++++ weechat/src/irc/irc-server.c | 23 +++- weechat/src/irc/irc.h | 5 +- weechat/src/plugins/perl/wee-perl.c | 86 ++++++++++++- weechat/src/plugins/plugins.c | 11 +- weechat/src/plugins/plugins.h | 4 +- 20 files changed, 498 insertions(+), 288 deletions(-) diff --git a/src/common/weechat.c b/src/common/weechat.c index 8f9c93452..0d822732c 100644 --- a/src/common/weechat.c +++ b/src/common/weechat.c @@ -60,14 +60,14 @@ #include "../plugins/plugins.h" -/* char *display_name; */ -int quit_weechat; /* = 1 if quit request from user... why ? :'( */ - -FILE *log_file; /* WeeChat log file (~/.weechat/weechat.log */ +int quit_weechat; /* = 1 if quit request from user... why ? :'( */ +char *weechat_home; /* WeeChat home dir. (example: /home/toto/.weechat) */ +FILE *log_file; /* WeeChat log file (~/.weechat/weechat.log */ /* * my_sigint: SIGINT handler, do nothing (just ignore this signal) + * Prevents user for exiting with Ctrl-C */ void @@ -126,19 +126,6 @@ wee_parse_args (int argc, char *argv[]) printf ("\n%s%s", WEE_LICENSE); exit (0); } - /*else if ((strcmp (argv[i], "-d") == 0) - || (strcmp (argv[i], "--display") == 0)) - { - if (i == (argc - 1)) - fprintf (stderr, - _("%s no display specified (parameter '%s'), ignored\n"), - WEECHAT_WARNING, argv[i]); - else - { - display_name = argv[i + 1]; - i++; - } - }*/ else if ((strcmp (argv[i], "-v") == 0) || (strcmp (argv[i], "--version") == 0)) { @@ -161,24 +148,25 @@ wee_parse_args (int argc, char *argv[]) void wee_create_home_dir () { - char *weechat_home_dir; int return_code; - weechat_home_dir = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (weechat_home_dir, "%s/.weechat", getenv ("HOME")); - return_code = mkdir (weechat_home_dir, 0755); + /* TODO: rewrite this code for Windows version */ + weechat_home = + (char *) malloc ((strlen (getenv ("HOME")) + 10) * sizeof (char)); + sprintf (weechat_home, "%s/.weechat", getenv ("HOME")); + + /* try to create home directory */ + return_code = mkdir (weechat_home, 0755); if (return_code < 0) { + /* exit if error (except if directory already exists) */ if (errno != EEXIST) { fprintf (stderr, _("%s cannot create directory \"%s\"\n"), - WEECHAT_ERROR, weechat_home_dir); - free (weechat_home_dir); + WEECHAT_ERROR, weechat_home); exit (1); } } - free (weechat_home_dir); } /* @@ -206,8 +194,8 @@ wee_init_log () char *filename; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_LOG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_LOG_NAME, weechat_home); if ((log_file = fopen (filename, "wt")) == NULL) { free (filename); @@ -219,76 +207,12 @@ wee_init_log () } /* - * wee_shutdown: shutdown WeeChat + * weechat_welcome_message: display WeeChat welcome message - yeah! */ void -wee_shutdown () +weechat_welcome_message () { - server_free_all (); - gui_end (); - if (log_file) - fclose (log_file); - exit (0); -} - -/* - * main: WeeChat startup - */ - -int -main (int argc, char *argv[]) -{ - t_irc_server *ptr_server; - - #ifdef ENABLE_NLS - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - #endif - - /* ignore SIGINT signal (for example Ctrl-C) */ - signal (SIGINT, my_sigint); - - /* pre-initiliaze interface */ - gui_pre_init (&argc, &argv); - - /* initialize variables */ - wee_init_vars (); - - /* parse command line args */ - wee_parse_args (argc, argv); - - /* create weechat home directory */ - wee_create_home_dir (); - - /* init log file */ - wee_init_log (); - - /* build commands index (sorted), for completion */ - index_command_build (); - - /* read configuration */ - switch (config_read ()) - { - case 0: /* success */ - break; - case -1: /* config file not found */ - config_create_default (); - config_read (); - break; - default: /* other error (fatal) */ - server_free_all (); - return 1; - } - - /* init gui */ - gui_init (); - - /* init plugin interface(s) */ - plugin_init (); - - /* Welcome message - yeah! */ if (cfg_look_startup_logo) { gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, @@ -320,34 +244,67 @@ main (int argc, char *argv[]) cfg_look_startup_version) gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); +} + +/* + * wee_shutdown: shutdown WeeChat + */ + +void +wee_shutdown () +{ + server_free_all (); + gui_end (); + if (log_file) + fclose (log_file); + exit (0); +} + +/* + * main: WeeChat startup + */ + +int +main (int argc, char *argv[]) +{ + #ifdef ENABLE_NLS + setlocale (LC_ALL, ""); /* initialize gettext */ + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + #endif - /* connect to all servers (with autoconnect flag) */ - for (ptr_server = irc_servers; ptr_server; - ptr_server = ptr_server->next_server) + signal (SIGINT, my_sigint); /* ignore SIGINT signal */ + gui_pre_init (&argc, &argv); /* pre-initiliaze interface */ + wee_init_vars (); /* initialize some variables */ + wee_parse_args (argc, argv); /* parse command line args */ + wee_create_home_dir (); /* create weechat home directory */ + wee_init_log (); /* init log file */ + index_command_build (); /* build commands index for completion */ + + switch (config_read ()) /* read configuration */ { - if (ptr_server->autoconnect) - { - gui_window_new (ptr_server, NULL); - if (server_connect (ptr_server)) - irc_login (ptr_server); - } + case 0: /* config file OK */ + break; + case -1: /* config file not found */ + config_create_default (); + config_read (); + break; + default: /* other error (fatal) */ + server_free_all (); + return 1; } - /* WeeChat main loop */ - gui_main_loop (); + gui_init (); /* init WeeChat interface */ + plugin_init (); /* init plugin interface(s) */ + weechat_welcome_message (); /* display WeeChat welcome message */ + server_auto_connect (); /* auto-connect to servers */ - /* end plugin interface(s) */ - plugin_end (); + gui_main_loop (); /* WeeChat main loop */ - /* disconnect from all servers */ - server_disconnect_all (); - - /* save config file */ - config_write (NULL); + plugin_end (); /* end plugin interface(s) */ + server_disconnect_all (); /* disconnect from all servers */ + config_write (NULL); /* save config file */ + wee_shutdown (); /* quit WeeChat (oh no, why?) */ - /* program ending */ - wee_shutdown (); - - /* make gcc happy (statement never executed) */ - return 0; + return 0; /* make gcc happy (never executed) */ } diff --git a/src/common/weechat.h b/src/common/weechat.h index c7a9e63da..53fc0dc21 100644 --- a/src/common/weechat.h +++ b/src/common/weechat.h @@ -86,16 +86,9 @@ " -l, --license display WeeChat license\n" \ " -v, --version display WeeChat version\n\n" -/* " -d, --display choose X display\n" \*/ - - -/*#define DEFAULT_DISPLAY ":0" */ - - -/*extern char *display_name; */ -int quit_weechat; extern int quit_weechat; +extern char *weechat_home; extern void wee_log_printf (char *, ...); extern void wee_shutdown (); diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 6a5464f5f..91fcc792f 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -721,8 +721,8 @@ config_read () char line[1024], *ptr_line, *pos, *pos2; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); if ((file = fopen (filename, "rt")) == NULL) { gui_printf (NULL, _("%s config file \"%s\" not found.\n"), @@ -937,8 +937,8 @@ config_create_default () time_t current_time; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); if ((file = fopen (filename, "wt")) == NULL) { gui_printf (NULL, _("%s cannot create file \"%s\"\n"), @@ -1069,8 +1069,8 @@ config_write (char *config_name) else { filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); } if ((file = fopen (filename, "wt")) == NULL) diff --git a/src/irc/irc-commands.c b/src/irc/irc-commands.c index 2a234871c..b8a5ee05e 100644 --- a/src/irc/irc-commands.c +++ b/src/irc/irc-commands.c @@ -268,8 +268,8 @@ t_irc_command irc_commands[] = { "301", N_("away message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_301 }, { "302", N_("userhost"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_302 }, { "303", N_("ison"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_303 }, - { "305", N_("unaway"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_reply }, - { "306", N_("now away"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_reply }, + { "305", N_("unaway"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_305 }, + { "306", N_("now away"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_306 }, { "311", N_("whois (user)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_311 }, { "312", N_("whois (server)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_312 }, { "313", N_("whois (operator)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_313 }, diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 6c53c806a..a690f00ae 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -1333,6 +1333,56 @@ irc_cmd_recv_303 (t_irc_server *server, char *host, char *arguments) return 0; } +/* + * irc_cmd_recv_305: '305' command (unaway) + */ + +int +irc_cmd_recv_305 (t_irc_server *server, char *host, char *arguments) +{ + /* make gcc happy */ + (void) host; + + arguments = strchr (arguments, ' '); + if (arguments) + { + while (arguments[0] == ' ') + arguments++; + if (arguments[0] == ':') + arguments++; + irc_display_prefix (server->window, PREFIX_SERVER); + gui_printf_color (server->window, + COLOR_WIN_CHAT, "%s\n", arguments); + } + server->is_away = 0; + return 0; +} + +/* + * irc_cmd_recv_306: '306' command (now away) + */ + +int +irc_cmd_recv_306 (t_irc_server *server, char *host, char *arguments) +{ + /* make gcc happy */ + (void) host; + + arguments = strchr (arguments, ' '); + if (arguments) + { + while (arguments[0] == ' ') + arguments++; + if (arguments[0] == ':') + arguments++; + irc_display_prefix (server->window, PREFIX_SERVER); + gui_printf_color (server->window, + COLOR_WIN_CHAT, "%s\n", arguments); + } + server->is_away = 1; + return 0; +} + /* * irc_cmd_recv_311: '311' command (whois, user) */ diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index 070b1312f..66404a232 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -467,7 +467,7 @@ server_recv (t_irc_server *server) } /* - * server_connect: connect to an irc server + * server_connect: connect to an IRC server */ int @@ -571,6 +571,27 @@ server_connect (t_irc_server *server) return 1; } +/* + * server_auto_connect: auto-connect to servers (called at startup) + */ + +void +server_auto_connect () +{ + t_irc_server *ptr_server; + + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (ptr_server->autoconnect) + { + gui_window_new (ptr_server, NULL); + if (server_connect (ptr_server)) + irc_login (ptr_server); + } + } +} + /* * server_disconnect: disconnect from an irc server */ diff --git a/src/irc/irc.h b/src/irc/irc.h index 7459dc50f..614a78548 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -32,7 +32,7 @@ #define PREFIX_PART "<--" #define PREFIX_QUIT "<--" #define PREFIX_ERROR "=!=" -#define PREFIX_PLUGIN "=P=" +#define PREFIX_PLUGIN "-P-" #define CHANNEL_PREFIX "#&+!" @@ -152,6 +152,7 @@ extern int server_send (t_irc_server *, char *, int); extern int server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); extern int server_connect (); +extern void server_auto_connect (); extern void server_disconnect (t_irc_server *); extern void server_disconnect_all (); extern t_irc_server *server_search (char *); @@ -256,6 +257,8 @@ extern int irc_cmd_recv_004 (t_irc_server *, char *, char *); extern int irc_cmd_recv_301 (t_irc_server *, char *, char *); extern int irc_cmd_recv_302 (t_irc_server *, char *, char *); extern int irc_cmd_recv_303 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_305 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_306 (t_irc_server *, char *, char *); extern int irc_cmd_recv_311 (t_irc_server *, char *, char *); extern int irc_cmd_recv_312 (t_irc_server *, char *, char *); extern int irc_cmd_recv_313 (t_irc_server *, char *, char *); diff --git a/src/plugins/perl/wee-perl.c b/src/plugins/perl/wee-perl.c index 11538022f..d02ef86cf 100644 --- a/src/plugins/perl/wee-perl.c +++ b/src/plugins/perl/wee-perl.c @@ -57,6 +57,10 @@ static XS (XS_IRC_register) t_plugin_script *ptr_perl_script, *perl_script_found, *new_perl_script; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); version = SvPV (ST (1), integer); shutdown_func = SvPV (ST (2), integer); @@ -127,6 +131,9 @@ static XS (XS_IRC_print) char *message; dXSARGS; + /* make gcc happy */ + (void) cv; + for (i = 0; i < items; i++) { message = SvPV (ST (i), integer); @@ -144,13 +151,16 @@ static XS (XS_IRC_print) static XS (XS_IRC_print_with_channel) { - int i, integer; + int integer; char *message, *channel, *server = NULL; t_gui_window *ptr_window; t_irc_server *ptr_server; t_irc_channel *ptr_channel; dXSARGS; + /* make gcc happy */ + (void) cv; + /* server specified */ if (items > 2) { @@ -204,6 +214,10 @@ static XS (XS_IRC_add_message_handler) int integer; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); function = SvPV (ST (1), integer); plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler, @@ -222,6 +236,10 @@ static XS (XS_IRC_add_command_handler) t_plugin_handler *ptr_plugin_handler; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); function = SvPV (ST (1), integer); if (!index_command_search (name)) @@ -238,6 +256,62 @@ static XS (XS_IRC_add_command_handler) XSRETURN_EMPTY; } +/* + * IRC::get_info: get various infos + */ + +static XS (XS_IRC_get_info) +{ + char *arg, *info = NULL; + int integer; + dXSARGS; + + /* make gcc happy */ + (void) items; + (void) cv; + + arg = SvPV (ST (0), integer); + + if (arg) + { + + if ( (strcasecmp (arg, "0") == 0) || (strcasecmp (arg, "version") == 0) ) + { + info = PACKAGE_STRING; + } + else if ( (strcasecmp (arg, "1") == 0) || (strcasecmp (arg, "nick") == 0) ) + { + info = current_irc_server->nick; + } + else if ( (strcasecmp (arg, "2") == 0) || (strcasecmp (arg, "channel") == 0) ) + { + if (WIN_IS_CHANNEL (gui_current_window)) + info = CHANNEL (gui_current_window)->name; + } + else if ( (strcasecmp (arg, "3") == 0) || (strcasecmp (arg, "server") == 0) ) + { + info = current_irc_server->name; + } + else if ( (strcasecmp (arg, "4") == 0) || (strcasecmp (arg, "weechatdir") == 0) ) + { + info = weechat_home; + } + else if ( (strcasecmp (arg, "5") == 0) || (strcasecmp (arg, "away") == 0) ) + { + XST_mIV (0, current_irc_server->is_away); + XSRETURN (1); + return; + } + + if (info) + XST_mPV (0, info); + else + XST_mPV (0, ""); + } + + XSRETURN (1); +} + /* * xs_init: initialize subroutines */ @@ -251,6 +325,7 @@ xs_init (pTHX) newXS ("IRC::print_with_channel", XS_IRC_print_with_channel, "IRC"); newXS ("IRC::add_message_handler", XS_IRC_add_message_handler, "IRC"); newXS ("IRC::add_command_handler", XS_IRC_add_command_handler, "IRC"); + newXS ("IRC::get_info", XS_IRC_get_info, "IRC"); } /* @@ -462,10 +537,19 @@ wee_perl_end () /* unload all scripts */ wee_perl_unload_all (); + /* free all handlers */ + plugin_handler_free_all_type (&plugin_msg_handlers, + &last_plugin_msg_handler, + PLUGIN_TYPE_PERL); + plugin_handler_free_all_type (&plugin_cmd_handlers, + &last_plugin_cmd_handler, + PLUGIN_TYPE_PERL); + /* free Perl interpreter */ if (my_perl) { perl_destruct (my_perl); perl_free (my_perl); + my_perl = NULL; } } diff --git a/src/plugins/plugins.c b/src/plugins/plugins.c index c33f94900..431dab27c 100644 --- a/src/plugins/plugins.c +++ b/src/plugins/plugins.c @@ -283,14 +283,9 @@ plugin_unload (int plugin_type, char *scriptname) { case PLUGIN_TYPE_PERL: #ifdef PLUGIN_PERL - wee_perl_unload_all (); - /* impossible to unload only one Perl script */ - plugin_handler_free_all_type (&plugin_msg_handlers, - &last_plugin_msg_handler, - PLUGIN_TYPE_PERL); - plugin_handler_free_all_type (&plugin_cmd_handlers, - &last_plugin_cmd_handler, - PLUGIN_TYPE_PERL); + /* unload one Perl script is not allowed */ + wee_perl_end (); + wee_perl_init (); #endif break; case PLUGIN_TYPE_PYTHON: diff --git a/src/plugins/plugins.h b/src/plugins/plugins.h index 0a46d7136..011ffdc45 100644 --- a/src/plugins/plugins.h +++ b/src/plugins/plugins.h @@ -66,7 +66,9 @@ extern void plugin_load (int, char *); extern void plugin_unload (int, char *); extern t_plugin_handler *plugin_handler_search (t_plugin_handler *, char *); extern void plugin_handler_add (t_plugin_handler **, t_plugin_handler **, - int, char *, char *); + int, char *, char *); +extern void plugin_handler_free_all_type (t_plugin_handler **, + t_plugin_handler **, int); extern void plugin_event_msg (char *, char *); extern int plugin_exec_command (char *, char *); extern void plugin_end (); diff --git a/weechat/src/common/weechat.c b/weechat/src/common/weechat.c index 8f9c93452..0d822732c 100644 --- a/weechat/src/common/weechat.c +++ b/weechat/src/common/weechat.c @@ -60,14 +60,14 @@ #include "../plugins/plugins.h" -/* char *display_name; */ -int quit_weechat; /* = 1 if quit request from user... why ? :'( */ - -FILE *log_file; /* WeeChat log file (~/.weechat/weechat.log */ +int quit_weechat; /* = 1 if quit request from user... why ? :'( */ +char *weechat_home; /* WeeChat home dir. (example: /home/toto/.weechat) */ +FILE *log_file; /* WeeChat log file (~/.weechat/weechat.log */ /* * my_sigint: SIGINT handler, do nothing (just ignore this signal) + * Prevents user for exiting with Ctrl-C */ void @@ -126,19 +126,6 @@ wee_parse_args (int argc, char *argv[]) printf ("\n%s%s", WEE_LICENSE); exit (0); } - /*else if ((strcmp (argv[i], "-d") == 0) - || (strcmp (argv[i], "--display") == 0)) - { - if (i == (argc - 1)) - fprintf (stderr, - _("%s no display specified (parameter '%s'), ignored\n"), - WEECHAT_WARNING, argv[i]); - else - { - display_name = argv[i + 1]; - i++; - } - }*/ else if ((strcmp (argv[i], "-v") == 0) || (strcmp (argv[i], "--version") == 0)) { @@ -161,24 +148,25 @@ wee_parse_args (int argc, char *argv[]) void wee_create_home_dir () { - char *weechat_home_dir; int return_code; - weechat_home_dir = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (weechat_home_dir, "%s/.weechat", getenv ("HOME")); - return_code = mkdir (weechat_home_dir, 0755); + /* TODO: rewrite this code for Windows version */ + weechat_home = + (char *) malloc ((strlen (getenv ("HOME")) + 10) * sizeof (char)); + sprintf (weechat_home, "%s/.weechat", getenv ("HOME")); + + /* try to create home directory */ + return_code = mkdir (weechat_home, 0755); if (return_code < 0) { + /* exit if error (except if directory already exists) */ if (errno != EEXIST) { fprintf (stderr, _("%s cannot create directory \"%s\"\n"), - WEECHAT_ERROR, weechat_home_dir); - free (weechat_home_dir); + WEECHAT_ERROR, weechat_home); exit (1); } } - free (weechat_home_dir); } /* @@ -206,8 +194,8 @@ wee_init_log () char *filename; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_LOG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_LOG_NAME, weechat_home); if ((log_file = fopen (filename, "wt")) == NULL) { free (filename); @@ -219,76 +207,12 @@ wee_init_log () } /* - * wee_shutdown: shutdown WeeChat + * weechat_welcome_message: display WeeChat welcome message - yeah! */ void -wee_shutdown () +weechat_welcome_message () { - server_free_all (); - gui_end (); - if (log_file) - fclose (log_file); - exit (0); -} - -/* - * main: WeeChat startup - */ - -int -main (int argc, char *argv[]) -{ - t_irc_server *ptr_server; - - #ifdef ENABLE_NLS - setlocale (LC_ALL, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - #endif - - /* ignore SIGINT signal (for example Ctrl-C) */ - signal (SIGINT, my_sigint); - - /* pre-initiliaze interface */ - gui_pre_init (&argc, &argv); - - /* initialize variables */ - wee_init_vars (); - - /* parse command line args */ - wee_parse_args (argc, argv); - - /* create weechat home directory */ - wee_create_home_dir (); - - /* init log file */ - wee_init_log (); - - /* build commands index (sorted), for completion */ - index_command_build (); - - /* read configuration */ - switch (config_read ()) - { - case 0: /* success */ - break; - case -1: /* config file not found */ - config_create_default (); - config_read (); - break; - default: /* other error (fatal) */ - server_free_all (); - return 1; - } - - /* init gui */ - gui_init (); - - /* init plugin interface(s) */ - plugin_init (); - - /* Welcome message - yeah! */ if (cfg_look_startup_logo) { gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, @@ -320,34 +244,67 @@ main (int argc, char *argv[]) cfg_look_startup_version) gui_printf_color (NULL, COLOR_WIN_CHAT_PREFIX1, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n"); +} + +/* + * wee_shutdown: shutdown WeeChat + */ + +void +wee_shutdown () +{ + server_free_all (); + gui_end (); + if (log_file) + fclose (log_file); + exit (0); +} + +/* + * main: WeeChat startup + */ + +int +main (int argc, char *argv[]) +{ + #ifdef ENABLE_NLS + setlocale (LC_ALL, ""); /* initialize gettext */ + bindtextdomain (PACKAGE, LOCALEDIR); + textdomain (PACKAGE); + #endif - /* connect to all servers (with autoconnect flag) */ - for (ptr_server = irc_servers; ptr_server; - ptr_server = ptr_server->next_server) + signal (SIGINT, my_sigint); /* ignore SIGINT signal */ + gui_pre_init (&argc, &argv); /* pre-initiliaze interface */ + wee_init_vars (); /* initialize some variables */ + wee_parse_args (argc, argv); /* parse command line args */ + wee_create_home_dir (); /* create weechat home directory */ + wee_init_log (); /* init log file */ + index_command_build (); /* build commands index for completion */ + + switch (config_read ()) /* read configuration */ { - if (ptr_server->autoconnect) - { - gui_window_new (ptr_server, NULL); - if (server_connect (ptr_server)) - irc_login (ptr_server); - } + case 0: /* config file OK */ + break; + case -1: /* config file not found */ + config_create_default (); + config_read (); + break; + default: /* other error (fatal) */ + server_free_all (); + return 1; } - /* WeeChat main loop */ - gui_main_loop (); + gui_init (); /* init WeeChat interface */ + plugin_init (); /* init plugin interface(s) */ + weechat_welcome_message (); /* display WeeChat welcome message */ + server_auto_connect (); /* auto-connect to servers */ - /* end plugin interface(s) */ - plugin_end (); + gui_main_loop (); /* WeeChat main loop */ - /* disconnect from all servers */ - server_disconnect_all (); - - /* save config file */ - config_write (NULL); + plugin_end (); /* end plugin interface(s) */ + server_disconnect_all (); /* disconnect from all servers */ + config_write (NULL); /* save config file */ + wee_shutdown (); /* quit WeeChat (oh no, why?) */ - /* program ending */ - wee_shutdown (); - - /* make gcc happy (statement never executed) */ - return 0; + return 0; /* make gcc happy (never executed) */ } diff --git a/weechat/src/common/weechat.h b/weechat/src/common/weechat.h index c7a9e63da..53fc0dc21 100644 --- a/weechat/src/common/weechat.h +++ b/weechat/src/common/weechat.h @@ -86,16 +86,9 @@ " -l, --license display WeeChat license\n" \ " -v, --version display WeeChat version\n\n" -/* " -d, --display choose X display\n" \*/ - - -/*#define DEFAULT_DISPLAY ":0" */ - - -/*extern char *display_name; */ -int quit_weechat; extern int quit_weechat; +extern char *weechat_home; extern void wee_log_printf (char *, ...); extern void wee_shutdown (); diff --git a/weechat/src/common/weeconfig.c b/weechat/src/common/weeconfig.c index 6a5464f5f..91fcc792f 100644 --- a/weechat/src/common/weeconfig.c +++ b/weechat/src/common/weeconfig.c @@ -721,8 +721,8 @@ config_read () char line[1024], *ptr_line, *pos, *pos2; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); if ((file = fopen (filename, "rt")) == NULL) { gui_printf (NULL, _("%s config file \"%s\" not found.\n"), @@ -937,8 +937,8 @@ config_create_default () time_t current_time; filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); if ((file = fopen (filename, "wt")) == NULL) { gui_printf (NULL, _("%s cannot create file \"%s\"\n"), @@ -1069,8 +1069,8 @@ config_write (char *config_name) else { filename = - (char *) malloc ((strlen (getenv ("HOME")) + 64) * sizeof (char)); - sprintf (filename, "%s/.weechat/" WEECHAT_CONFIG_NAME, getenv ("HOME")); + (char *) malloc ((strlen (weechat_home) + 64) * sizeof (char)); + sprintf (filename, "%s/" WEECHAT_CONFIG_NAME, weechat_home); } if ((file = fopen (filename, "wt")) == NULL) diff --git a/weechat/src/irc/irc-commands.c b/weechat/src/irc/irc-commands.c index 2a234871c..b8a5ee05e 100644 --- a/weechat/src/irc/irc-commands.c +++ b/weechat/src/irc/irc-commands.c @@ -268,8 +268,8 @@ t_irc_command irc_commands[] = { "301", N_("away message"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_301 }, { "302", N_("userhost"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_302 }, { "303", N_("ison"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_303 }, - { "305", N_("unaway"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_reply }, - { "306", N_("now away"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_server_reply }, + { "305", N_("unaway"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_305 }, + { "306", N_("now away"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_306 }, { "311", N_("whois (user)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_311 }, { "312", N_("whois (server)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_312 }, { "313", N_("whois (operator)"), "", "", 0, 0, 1, NULL, NULL, irc_cmd_recv_313 }, diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index 6c53c806a..a690f00ae 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -1333,6 +1333,56 @@ irc_cmd_recv_303 (t_irc_server *server, char *host, char *arguments) return 0; } +/* + * irc_cmd_recv_305: '305' command (unaway) + */ + +int +irc_cmd_recv_305 (t_irc_server *server, char *host, char *arguments) +{ + /* make gcc happy */ + (void) host; + + arguments = strchr (arguments, ' '); + if (arguments) + { + while (arguments[0] == ' ') + arguments++; + if (arguments[0] == ':') + arguments++; + irc_display_prefix (server->window, PREFIX_SERVER); + gui_printf_color (server->window, + COLOR_WIN_CHAT, "%s\n", arguments); + } + server->is_away = 0; + return 0; +} + +/* + * irc_cmd_recv_306: '306' command (now away) + */ + +int +irc_cmd_recv_306 (t_irc_server *server, char *host, char *arguments) +{ + /* make gcc happy */ + (void) host; + + arguments = strchr (arguments, ' '); + if (arguments) + { + while (arguments[0] == ' ') + arguments++; + if (arguments[0] == ':') + arguments++; + irc_display_prefix (server->window, PREFIX_SERVER); + gui_printf_color (server->window, + COLOR_WIN_CHAT, "%s\n", arguments); + } + server->is_away = 1; + return 0; +} + /* * irc_cmd_recv_311: '311' command (whois, user) */ diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index 070b1312f..66404a232 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -467,7 +467,7 @@ server_recv (t_irc_server *server) } /* - * server_connect: connect to an irc server + * server_connect: connect to an IRC server */ int @@ -571,6 +571,27 @@ server_connect (t_irc_server *server) return 1; } +/* + * server_auto_connect: auto-connect to servers (called at startup) + */ + +void +server_auto_connect () +{ + t_irc_server *ptr_server; + + for (ptr_server = irc_servers; ptr_server; + ptr_server = ptr_server->next_server) + { + if (ptr_server->autoconnect) + { + gui_window_new (ptr_server, NULL); + if (server_connect (ptr_server)) + irc_login (ptr_server); + } + } +} + /* * server_disconnect: disconnect from an irc server */ diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 7459dc50f..614a78548 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -32,7 +32,7 @@ #define PREFIX_PART "<--" #define PREFIX_QUIT "<--" #define PREFIX_ERROR "=!=" -#define PREFIX_PLUGIN "=P=" +#define PREFIX_PLUGIN "-P-" #define CHANNEL_PREFIX "#&+!" @@ -152,6 +152,7 @@ extern int server_send (t_irc_server *, char *, int); extern int server_sendf (t_irc_server *, char *, ...); extern void server_recv (t_irc_server *); extern int server_connect (); +extern void server_auto_connect (); extern void server_disconnect (t_irc_server *); extern void server_disconnect_all (); extern t_irc_server *server_search (char *); @@ -256,6 +257,8 @@ extern int irc_cmd_recv_004 (t_irc_server *, char *, char *); extern int irc_cmd_recv_301 (t_irc_server *, char *, char *); extern int irc_cmd_recv_302 (t_irc_server *, char *, char *); extern int irc_cmd_recv_303 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_305 (t_irc_server *, char *, char *); +extern int irc_cmd_recv_306 (t_irc_server *, char *, char *); extern int irc_cmd_recv_311 (t_irc_server *, char *, char *); extern int irc_cmd_recv_312 (t_irc_server *, char *, char *); extern int irc_cmd_recv_313 (t_irc_server *, char *, char *); diff --git a/weechat/src/plugins/perl/wee-perl.c b/weechat/src/plugins/perl/wee-perl.c index 11538022f..d02ef86cf 100644 --- a/weechat/src/plugins/perl/wee-perl.c +++ b/weechat/src/plugins/perl/wee-perl.c @@ -57,6 +57,10 @@ static XS (XS_IRC_register) t_plugin_script *ptr_perl_script, *perl_script_found, *new_perl_script; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); version = SvPV (ST (1), integer); shutdown_func = SvPV (ST (2), integer); @@ -127,6 +131,9 @@ static XS (XS_IRC_print) char *message; dXSARGS; + /* make gcc happy */ + (void) cv; + for (i = 0; i < items; i++) { message = SvPV (ST (i), integer); @@ -144,13 +151,16 @@ static XS (XS_IRC_print) static XS (XS_IRC_print_with_channel) { - int i, integer; + int integer; char *message, *channel, *server = NULL; t_gui_window *ptr_window; t_irc_server *ptr_server; t_irc_channel *ptr_channel; dXSARGS; + /* make gcc happy */ + (void) cv; + /* server specified */ if (items > 2) { @@ -204,6 +214,10 @@ static XS (XS_IRC_add_message_handler) int integer; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); function = SvPV (ST (1), integer); plugin_handler_add (&plugin_msg_handlers, &last_plugin_msg_handler, @@ -222,6 +236,10 @@ static XS (XS_IRC_add_command_handler) t_plugin_handler *ptr_plugin_handler; dXSARGS; + /* make gcc happy */ + (void) items; + (void) cv; + name = SvPV (ST (0), integer); function = SvPV (ST (1), integer); if (!index_command_search (name)) @@ -238,6 +256,62 @@ static XS (XS_IRC_add_command_handler) XSRETURN_EMPTY; } +/* + * IRC::get_info: get various infos + */ + +static XS (XS_IRC_get_info) +{ + char *arg, *info = NULL; + int integer; + dXSARGS; + + /* make gcc happy */ + (void) items; + (void) cv; + + arg = SvPV (ST (0), integer); + + if (arg) + { + + if ( (strcasecmp (arg, "0") == 0) || (strcasecmp (arg, "version") == 0) ) + { + info = PACKAGE_STRING; + } + else if ( (strcasecmp (arg, "1") == 0) || (strcasecmp (arg, "nick") == 0) ) + { + info = current_irc_server->nick; + } + else if ( (strcasecmp (arg, "2") == 0) || (strcasecmp (arg, "channel") == 0) ) + { + if (WIN_IS_CHANNEL (gui_current_window)) + info = CHANNEL (gui_current_window)->name; + } + else if ( (strcasecmp (arg, "3") == 0) || (strcasecmp (arg, "server") == 0) ) + { + info = current_irc_server->name; + } + else if ( (strcasecmp (arg, "4") == 0) || (strcasecmp (arg, "weechatdir") == 0) ) + { + info = weechat_home; + } + else if ( (strcasecmp (arg, "5") == 0) || (strcasecmp (arg, "away") == 0) ) + { + XST_mIV (0, current_irc_server->is_away); + XSRETURN (1); + return; + } + + if (info) + XST_mPV (0, info); + else + XST_mPV (0, ""); + } + + XSRETURN (1); +} + /* * xs_init: initialize subroutines */ @@ -251,6 +325,7 @@ xs_init (pTHX) newXS ("IRC::print_with_channel", XS_IRC_print_with_channel, "IRC"); newXS ("IRC::add_message_handler", XS_IRC_add_message_handler, "IRC"); newXS ("IRC::add_command_handler", XS_IRC_add_command_handler, "IRC"); + newXS ("IRC::get_info", XS_IRC_get_info, "IRC"); } /* @@ -462,10 +537,19 @@ wee_perl_end () /* unload all scripts */ wee_perl_unload_all (); + /* free all handlers */ + plugin_handler_free_all_type (&plugin_msg_handlers, + &last_plugin_msg_handler, + PLUGIN_TYPE_PERL); + plugin_handler_free_all_type (&plugin_cmd_handlers, + &last_plugin_cmd_handler, + PLUGIN_TYPE_PERL); + /* free Perl interpreter */ if (my_perl) { perl_destruct (my_perl); perl_free (my_perl); + my_perl = NULL; } } diff --git a/weechat/src/plugins/plugins.c b/weechat/src/plugins/plugins.c index c33f94900..431dab27c 100644 --- a/weechat/src/plugins/plugins.c +++ b/weechat/src/plugins/plugins.c @@ -283,14 +283,9 @@ plugin_unload (int plugin_type, char *scriptname) { case PLUGIN_TYPE_PERL: #ifdef PLUGIN_PERL - wee_perl_unload_all (); - /* impossible to unload only one Perl script */ - plugin_handler_free_all_type (&plugin_msg_handlers, - &last_plugin_msg_handler, - PLUGIN_TYPE_PERL); - plugin_handler_free_all_type (&plugin_cmd_handlers, - &last_plugin_cmd_handler, - PLUGIN_TYPE_PERL); + /* unload one Perl script is not allowed */ + wee_perl_end (); + wee_perl_init (); #endif break; case PLUGIN_TYPE_PYTHON: diff --git a/weechat/src/plugins/plugins.h b/weechat/src/plugins/plugins.h index 0a46d7136..011ffdc45 100644 --- a/weechat/src/plugins/plugins.h +++ b/weechat/src/plugins/plugins.h @@ -66,7 +66,9 @@ extern void plugin_load (int, char *); extern void plugin_unload (int, char *); extern t_plugin_handler *plugin_handler_search (t_plugin_handler *, char *); extern void plugin_handler_add (t_plugin_handler **, t_plugin_handler **, - int, char *, char *); + int, char *, char *); +extern void plugin_handler_free_all_type (t_plugin_handler **, + t_plugin_handler **, int); extern void plugin_event_msg (char *, char *); extern int plugin_exec_command (char *, char *); extern void plugin_end ();