- 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)
This commit is contained in:
Sebastien Helleu 2003-11-30 19:18:06 +00:00
parent c8c5ff3d68
commit a1f09df80f
20 changed files with 498 additions and 288 deletions

View File

@ -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) */
}

View File

@ -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 ();

View File

@ -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)

View File

@ -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 },

View File

@ -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)
*/

View File

@ -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
*/

View File

@ -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 *);

View File

@ -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;
}
}

View File

@ -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:

View File

@ -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 ();

View File

@ -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) */
}

View File

@ -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 ();

View File

@ -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)

View File

@ -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 },

View File

@ -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)
*/

View File

@ -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
*/

View File

@ -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 *);

View File

@ -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;
}
}

View File

@ -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:

View File

@ -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 ();