mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Cleaned up code.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@480 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
2a1052bbce
commit
c2397475c5
@ -44,18 +44,17 @@
|
|||||||
#define g_free_and_null(a) \
|
#define g_free_and_null(a) \
|
||||||
if (a) { g_free(a); (a) = NULL; }
|
if (a) { g_free(a); (a) = NULL; }
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
G_INPUT_READ = 1 << 0,
|
G_INPUT_READ = 1 << 0,
|
||||||
G_INPUT_WRITE = 1 << 1,
|
G_INPUT_WRITE = 1 << 1,
|
||||||
G_INPUT_EXCEPTION = 1 << 2
|
G_INPUT_EXCEPTION = 1 << 2
|
||||||
} GInputCondition;
|
} GInputCondition;
|
||||||
|
|
||||||
typedef void (*GInputFunction) (gpointer data, int source,
|
typedef void (*GInputFunction) (void *data, int source,
|
||||||
GInputCondition condition);
|
GInputCondition condition);
|
||||||
|
|
||||||
int g_input_add(int source, GInputCondition condition,
|
int g_input_add(int source, GInputCondition condition,
|
||||||
GInputFunction function, gpointer data);
|
GInputFunction function, void *data);
|
||||||
|
|
||||||
#define MAX_INT_STRLEN ((sizeof(int) * CHAR_BIT + 2) / 3 + 1)
|
#define MAX_INT_STRLEN ((sizeof(int) * CHAR_BIT + 2) / 3 + 1)
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ noinst_LTLIBRARIES = libcore.la
|
|||||||
INCLUDES = \
|
INCLUDES = \
|
||||||
$(GLIB_CFLAGS) \
|
$(GLIB_CFLAGS) \
|
||||||
-DSYSCONFDIR=\""$(sysconfdir)"\" \
|
-DSYSCONFDIR=\""$(sysconfdir)"\" \
|
||||||
|
-DMODULEDIR=\""$(libdir)/irssi/modules"\" \
|
||||||
-I$(top_srcdir)/src \
|
-I$(top_srcdir)/src \
|
||||||
-I$(top_srcdir)/src/core
|
-I$(top_srcdir)/src/core
|
||||||
|
|
||||||
@ -24,6 +25,7 @@ libcore_la_SOURCES = \
|
|||||||
modules.c \
|
modules.c \
|
||||||
net-disconnect.c \
|
net-disconnect.c \
|
||||||
net-nonblock.c \
|
net-nonblock.c \
|
||||||
|
net-sendbuffer.c \
|
||||||
network.c \
|
network.c \
|
||||||
pidwait.c \
|
pidwait.c \
|
||||||
rawlog.c \
|
rawlog.c \
|
||||||
@ -47,6 +49,7 @@ noinst_HEADERS = \
|
|||||||
net-disconnect.h \
|
net-disconnect.h \
|
||||||
net-internal.h \
|
net-internal.h \
|
||||||
net-nonblock.h \
|
net-nonblock.h \
|
||||||
|
net-sendbuffer.h \
|
||||||
network.h \
|
network.h \
|
||||||
pidwait.h \
|
pidwait.h \
|
||||||
rawlog.h \
|
rawlog.h \
|
||||||
|
@ -25,10 +25,13 @@ GArray *iopt_tables = NULL;
|
|||||||
|
|
||||||
void args_register(struct poptOption *options)
|
void args_register(struct poptOption *options)
|
||||||
{
|
{
|
||||||
if (iopt_tables == NULL)
|
if (iopt_tables == NULL) {
|
||||||
iopt_tables = g_array_new(TRUE, TRUE, sizeof(struct poptOption));
|
iopt_tables = g_array_new(TRUE, TRUE,
|
||||||
|
sizeof(struct poptOption));
|
||||||
|
}
|
||||||
|
|
||||||
while (options->longName != NULL || options->shortName != '\0' || options->arg != NULL) {
|
while (options->longName != NULL || options->shortName != '\0' ||
|
||||||
|
options->arg != NULL) {
|
||||||
g_array_append_val(iopt_tables, *options);
|
g_array_append_val(iopt_tables, *options);
|
||||||
options = options+1;
|
options = options+1;
|
||||||
}
|
}
|
||||||
@ -42,13 +45,16 @@ void args_execute(int argc, char *argv[])
|
|||||||
if (iopt_tables == NULL)
|
if (iopt_tables == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
con = poptGetContext(PACKAGE, argc, argv, (struct poptOption *) (iopt_tables->data), 0);
|
con = poptGetContext(PACKAGE, argc, argv,
|
||||||
|
(struct poptOption *) (iopt_tables->data), 0);
|
||||||
poptReadDefaultConfig(con, TRUE);
|
poptReadDefaultConfig(con, TRUE);
|
||||||
|
|
||||||
while ((nextopt = poptGetNextOpt(con)) > 0) ;
|
while ((nextopt = poptGetNextOpt(con)) > 0) ;
|
||||||
|
|
||||||
if (nextopt != -1) {
|
if (nextopt != -1) {
|
||||||
printf(_("Error on option %s: %s.\nRun '%s --help' to see a full list of available command line options.\n"),
|
printf(_("Error on option %s: %s.\n"
|
||||||
|
"Run '%s --help' to see a full list of "
|
||||||
|
"available command line options.\n"),
|
||||||
poptBadOption(con, 0),
|
poptBadOption(con, 0),
|
||||||
poptStrerror(nextopt),
|
poptStrerror(nextopt),
|
||||||
argv[0]);
|
argv[0]);
|
||||||
|
@ -64,14 +64,16 @@ int command_have_sub(const char *command)
|
|||||||
for (tmp = commands; tmp != NULL; tmp = tmp->next) {
|
for (tmp = commands; tmp != NULL; tmp = tmp->next) {
|
||||||
COMMAND_REC *rec = tmp->data;
|
COMMAND_REC *rec = tmp->data;
|
||||||
|
|
||||||
if (g_strncasecmp(rec->cmd, command, len) == 0 && rec->cmd[len] == ' ')
|
if (g_strncasecmp(rec->cmd, command, len) == 0 &&
|
||||||
|
rec->cmd[len] == ' ')
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void command_bind_to(int pos, const char *cmd, const char *category, SIGNAL_FUNC func)
|
void command_bind_to(int pos, const char *cmd,
|
||||||
|
const char *category, SIGNAL_FUNC func)
|
||||||
{
|
{
|
||||||
COMMAND_REC *rec;
|
COMMAND_REC *rec;
|
||||||
char *str;
|
char *str;
|
||||||
@ -161,14 +163,16 @@ static const char *command_expand(char *cmd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (multiple) {
|
if (multiple) {
|
||||||
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_AMBIGUOUS), cmd);
|
signal_emit("error command", 2,
|
||||||
|
GINT_TO_POINTER(CMDERR_AMBIGUOUS), cmd);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return match != NULL ? match : cmd;
|
return match != NULL ? match : cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void command_runsub(const char *cmd, const char *data, void *server, void *item)
|
void command_runsub(const char *cmd, const char *data,
|
||||||
|
void *server, void *item)
|
||||||
{
|
{
|
||||||
const char *newcmd;
|
const char *newcmd;
|
||||||
char *orig, *subcmd, *defcmd, *args;
|
char *orig, *subcmd, *defcmd, *args;
|
||||||
@ -177,7 +181,8 @@ void command_runsub(const char *cmd, const char *data, void *server, void *item)
|
|||||||
|
|
||||||
if (*data == '\0') {
|
if (*data == '\0') {
|
||||||
/* no subcommand given - unknown command? */
|
/* no subcommand given - unknown command? */
|
||||||
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_UNKNOWN), cmd);
|
signal_emit("error command", 2,
|
||||||
|
GINT_TO_POINTER(CMDERR_UNKNOWN), cmd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,8 +205,10 @@ void command_runsub(const char *cmd, const char *data, void *server, void *item)
|
|||||||
g_strdown(subcmd);
|
g_strdown(subcmd);
|
||||||
if (!signal_emit(subcmd, 3, args, server, item)) {
|
if (!signal_emit(subcmd, 3, args, server, item)) {
|
||||||
defcmd = g_strdup_printf("default command %s", cmd);
|
defcmd = g_strdup_printf("default command %s", cmd);
|
||||||
if (!signal_emit(defcmd, 3, data, server, item))
|
if (!signal_emit(defcmd, 3, data, server, item)) {
|
||||||
signal_emit("error command", 2, GINT_TO_POINTER(CMDERR_UNKNOWN), subcmd+8);
|
signal_emit("error command", 2,
|
||||||
|
GINT_TO_POINTER(CMDERR_UNKNOWN), subcmd+8);
|
||||||
|
}
|
||||||
g_free(defcmd);
|
g_free(defcmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,7 +397,8 @@ static int get_cmd_options(char **data, int ignore_unknown,
|
|||||||
option = cmd_get_param(data);
|
option = cmd_get_param(data);
|
||||||
|
|
||||||
/* check if this option can have argument */
|
/* check if this option can have argument */
|
||||||
pos = optlist == NULL ? -1 : option_find(optlist, option);
|
pos = optlist == NULL ? -1 :
|
||||||
|
option_find(optlist, option);
|
||||||
if (pos == -1 && !ignore_unknown) {
|
if (pos == -1 && !ignore_unknown) {
|
||||||
/* unknown option! */
|
/* unknown option! */
|
||||||
*data = option;
|
*data = option;
|
||||||
@ -404,9 +412,11 @@ static int get_cmd_options(char **data, int ignore_unknown,
|
|||||||
if (pos >= 0) {
|
if (pos >= 0) {
|
||||||
/* if we used a shortcut of parameter, put
|
/* if we used a shortcut of parameter, put
|
||||||
the whole parameter name in options table */
|
the whole parameter name in options table */
|
||||||
option = optlist[pos] + iscmdtype(*optlist[pos]);
|
option = optlist[pos] +
|
||||||
|
iscmdtype(*optlist[pos]);
|
||||||
}
|
}
|
||||||
if (options != NULL) g_hash_table_insert(options, option, "");
|
if (options != NULL)
|
||||||
|
g_hash_table_insert(options, option, "");
|
||||||
|
|
||||||
if (pos == -1 || !iscmdtype(*optlist[pos]))
|
if (pos == -1 || !iscmdtype(*optlist[pos]))
|
||||||
option = NULL;
|
option = NULL;
|
||||||
@ -464,7 +474,7 @@ int cmd_get_params(const char *data, gpointer *free_me, int count, ...)
|
|||||||
GHashTable **opthash;
|
GHashTable **opthash;
|
||||||
char **str, *arg, *datad, *old;
|
char **str, *arg, *datad, *old;
|
||||||
va_list args;
|
va_list args;
|
||||||
int cnt, error, len;
|
int cnt, error, len, ignore_unknown;
|
||||||
|
|
||||||
g_return_val_if_fail(data != NULL, FALSE);
|
g_return_val_if_fail(data != NULL, FALSE);
|
||||||
|
|
||||||
@ -506,8 +516,13 @@ int cmd_get_params(const char *data, gpointer *free_me, int count, ...)
|
|||||||
arg = (char *) va_arg(args, char *);
|
arg = (char *) va_arg(args, char *);
|
||||||
opthash = (GHashTable **) va_arg(args, GHashTable **);
|
opthash = (GHashTable **) va_arg(args, GHashTable **);
|
||||||
|
|
||||||
rec->options = *opthash = g_hash_table_new((GHashFunc) g_istr_hash, (GCompareFunc) g_istr_equal);
|
rec->options = *opthash =
|
||||||
error = get_cmd_options(&datad, count & PARAM_FLAG_UNKNOWN_OPTIONS, arg, *opthash);
|
g_hash_table_new((GHashFunc) g_istr_hash,
|
||||||
|
(GCompareFunc) g_istr_equal);
|
||||||
|
|
||||||
|
ignore_unknown = count & PARAM_FLAG_UNKNOWN_OPTIONS;
|
||||||
|
error = get_cmd_options(&datad, ignore_unknown,
|
||||||
|
arg, *opthash);
|
||||||
if (error) break;
|
if (error) break;
|
||||||
|
|
||||||
count &= ~PARAM_FLAG_OPTIONS;
|
count &= ~PARAM_FLAG_OPTIONS;
|
||||||
@ -557,7 +572,8 @@ void cmd_get_remove_func(CMD_GET_FUNC func)
|
|||||||
cmdget_funcs = g_slist_prepend(cmdget_funcs, (void *) func);
|
cmdget_funcs = g_slist_prepend(cmdget_funcs, (void *) func);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parse_command(const char *command, int expand_aliases, SERVER_REC *server, void *item)
|
static void parse_command(const char *command, int expand_aliases,
|
||||||
|
SERVER_REC *server, void *item)
|
||||||
{
|
{
|
||||||
const char *alias, *newcmd;
|
const char *alias, *newcmd;
|
||||||
char *cmd, *orig, *args, *oldcmd;
|
char *cmd, *orig, *args, *oldcmd;
|
||||||
@ -589,8 +605,10 @@ static void parse_command(const char *command, int expand_aliases, SERVER_REC *s
|
|||||||
g_strdown(cmd);
|
g_strdown(cmd);
|
||||||
oldcmd = current_command;
|
oldcmd = current_command;
|
||||||
current_command = cmd+8;
|
current_command = cmd+8;
|
||||||
if (!signal_emit(cmd, 3, args, server, item))
|
if (!signal_emit(cmd, 3, args, server, item)) {
|
||||||
signal_emit_id(signal_default_command, 3, command, server, item);
|
signal_emit_id(signal_default_command, 3,
|
||||||
|
command, server, item);
|
||||||
|
}
|
||||||
current_command = oldcmd;
|
current_command = oldcmd;
|
||||||
|
|
||||||
g_free(cmd);
|
g_free(cmd);
|
||||||
|
@ -33,15 +33,24 @@ enum {
|
|||||||
|
|
||||||
/* Returning from command function with error */
|
/* Returning from command function with error */
|
||||||
#define cmd_return_error(a) \
|
#define cmd_return_error(a) \
|
||||||
{ signal_emit("error command", 1, GINT_TO_POINTER(a)); signal_stop(); return; }
|
G_STMT_START { \
|
||||||
|
signal_emit("error command", 1, GINT_TO_POINTER(a)); \
|
||||||
|
signal_stop(); \
|
||||||
|
return; \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
#define cmd_param_error(a) \
|
#define cmd_param_error(a) \
|
||||||
{ cmd_params_free(free_arg); cmd_return_error(a); }
|
G_STMT_START { \
|
||||||
|
cmd_params_free(free_arg); \
|
||||||
|
cmd_return_error(a); \
|
||||||
|
} G_STMT_END
|
||||||
|
|
||||||
extern GSList *commands;
|
extern GSList *commands;
|
||||||
extern char *current_command; /* the command we're right now. */
|
extern char *current_command; /* the command we're right now. */
|
||||||
|
|
||||||
/* Bind command to specified function. */
|
/* Bind command to specified function. */
|
||||||
void command_bind_to(int pos, const char *cmd, const char *category, SIGNAL_FUNC func);
|
void command_bind_to(int pos, const char *cmd,
|
||||||
|
const char *category, SIGNAL_FUNC func);
|
||||||
#define command_bind(a, b, c) command_bind_to(1, a, b, c)
|
#define command_bind(a, b, c) command_bind_to(1, a, b, c)
|
||||||
#define command_bind_first(a, b, c) command_bind_to(0, a, b, c)
|
#define command_bind_first(a, b, c) command_bind_to(0, a, b, c)
|
||||||
#define command_bind_last(a, b, c) command_bind_to(2, a, b, c)
|
#define command_bind_last(a, b, c) command_bind_to(2, a, b, c)
|
||||||
@ -49,7 +58,8 @@ void command_unbind(const char *cmd, SIGNAL_FUNC func);
|
|||||||
|
|
||||||
/* Run subcommand, `cmd' contains the base command, first word in `data'
|
/* Run subcommand, `cmd' contains the base command, first word in `data'
|
||||||
contains the subcommand */
|
contains the subcommand */
|
||||||
void command_runsub(const char *cmd, const char *data, void *server, void *item);
|
void command_runsub(const char *cmd, const char *data,
|
||||||
|
void *server, void *item);
|
||||||
|
|
||||||
COMMAND_REC *command_find(const char *cmd);
|
COMMAND_REC *command_find(const char *cmd);
|
||||||
int command_have_sub(const char *command);
|
int command_have_sub(const char *command);
|
||||||
|
@ -21,8 +21,7 @@
|
|||||||
#include "module.h"
|
#include "module.h"
|
||||||
#include "levels.h"
|
#include "levels.h"
|
||||||
|
|
||||||
static const char *levels[] =
|
static const char *levels[] = {
|
||||||
{
|
|
||||||
"CRAP",
|
"CRAP",
|
||||||
"MSGS",
|
"MSGS",
|
||||||
"PUBLICS",
|
"PUBLICS",
|
||||||
@ -52,7 +51,7 @@ static const char *levels[] =
|
|||||||
|
|
||||||
int level_get(const char *level)
|
int level_get(const char *level)
|
||||||
{
|
{
|
||||||
int n, len;
|
int n, len, match;
|
||||||
|
|
||||||
if (strcmp(level, "ALL") == 0)
|
if (strcmp(level, "ALL") == 0)
|
||||||
return MSGLEVEL_ALL;
|
return MSGLEVEL_ALL;
|
||||||
@ -60,24 +59,28 @@ int level_get(const char *level)
|
|||||||
if (strcmp(level, "NEVER") == 0)
|
if (strcmp(level, "NEVER") == 0)
|
||||||
return MSGLEVEL_NEVER;
|
return MSGLEVEL_NEVER;
|
||||||
|
|
||||||
/* I never remember if it was PUBLIC or PUBLICS, MSG or MSGS, etc.
|
|
||||||
So, make it work with both. */
|
|
||||||
len = strlen(level);
|
len = strlen(level);
|
||||||
if (toupper(level[len-1]) == 'S') len--;
|
if (len == 0) return 0;
|
||||||
|
|
||||||
|
/* partial match allowed, as long as it's the only one that matches */
|
||||||
|
match = 0;
|
||||||
for (n = 0; levels[n] != NULL; n++) {
|
for (n = 0; levels[n] != NULL; n++) {
|
||||||
if (strncmp(levels[n], level, len) == 0 &&
|
if (strncmp(levels[n], level, len) == 0) {
|
||||||
(levels[n][len] == '\0' || strcmp(levels[n]+len, "S") == 0))
|
if (match > 0) {
|
||||||
return 1 << n;
|
/* ambiguous - abort */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
match = 1L << n;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
int level2bits(const char *level)
|
int level2bits(const char *level)
|
||||||
{
|
{
|
||||||
char *orig, *str, *ptr;
|
char *orig, *str, *ptr;
|
||||||
int ret, slevel, neg;
|
int ret, singlelevel, negative;
|
||||||
|
|
||||||
g_return_val_if_fail(level != NULL, 0);
|
g_return_val_if_fail(level != NULL, 0);
|
||||||
|
|
||||||
@ -94,13 +97,13 @@ int level2bits(const char *level)
|
|||||||
else if (*str != '\0')
|
else if (*str != '\0')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
neg = *ptr == '-' ? 1 : 0;
|
negative = *ptr == '-';
|
||||||
if (*ptr == '-' || *ptr == '+') ptr++;
|
if (*ptr == '-' || *ptr == '+') ptr++;
|
||||||
|
|
||||||
slevel = level_get(ptr);
|
singlelevel = level_get(ptr);
|
||||||
if (slevel != 0) {
|
if (singlelevel != 0) {
|
||||||
ret = !neg ? (ret | slevel) :
|
ret = !negative ? (ret | singlelevel) :
|
||||||
(ret & ~slevel);
|
(ret & ~singlelevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (*str == ' ') str++;
|
while (*str == ' ') str++;
|
||||||
@ -130,9 +133,10 @@ char *bits2level(int bits)
|
|||||||
g_string_append(str, "NEVER ");
|
g_string_append(str, "NEVER ");
|
||||||
|
|
||||||
for (n = 0; levels[n] != NULL; n++) {
|
for (n = 0; levels[n] != NULL; n++) {
|
||||||
if (bits & (1 << n))
|
if (bits & (1L << n))
|
||||||
g_string_sprintfa(str, "%s ", levels[n]);
|
g_string_sprintfa(str, "%s ", levels[n]);
|
||||||
}
|
}
|
||||||
|
if (str->len > 0)
|
||||||
g_string_truncate(str, str->len-1);
|
g_string_truncate(str, str->len-1);
|
||||||
|
|
||||||
ret = str->str;
|
ret = str->str;
|
||||||
@ -143,15 +147,17 @@ char *bits2level(int bits)
|
|||||||
|
|
||||||
int combine_level(int dest, const char *src)
|
int combine_level(int dest, const char *src)
|
||||||
{
|
{
|
||||||
char **list, **item;
|
char **list, **item, *itemname;
|
||||||
int itemlevel;
|
int itemlevel;
|
||||||
|
|
||||||
g_return_val_if_fail(src != NULL, dest);
|
g_return_val_if_fail(src != NULL, dest);
|
||||||
|
|
||||||
list = g_strsplit(src, " ", -1);
|
list = g_strsplit(src, " ", -1);
|
||||||
for (item = list; *item != NULL; item++) {
|
for (item = list; *item != NULL; item++) {
|
||||||
g_strup(*item);
|
itemname = *item + (**item == '+' || **item == '-' ? 1 : 0);
|
||||||
itemlevel = level_get(*item + (**item == '+' || **item == '-' ? 1 : 0));
|
g_strup(itemname);
|
||||||
|
itemlevel = level_get(itemname);
|
||||||
|
|
||||||
if (**item == '-')
|
if (**item == '-')
|
||||||
dest &= ~(itemlevel);
|
dest &= ~(itemlevel);
|
||||||
else
|
else
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
#define MSGLEVEL_ALL 0x03fffff
|
#define MSGLEVEL_ALL 0x03fffff
|
||||||
|
|
||||||
#define MSGLEVEL_NOHILIGHT 0x1000000 /* Don't try to hilight words in this message */
|
#define MSGLEVEL_NOHILIGHT 0x1000000 /* Don't highlight this message */
|
||||||
#define MSGLEVEL_NO_ACT 0x2000000 /* Don't trigger channel activity */
|
#define MSGLEVEL_NO_ACT 0x2000000 /* Don't trigger channel activity */
|
||||||
#define MSGLEVEL_NEVER 0x4000000 /* never ignore / never log */
|
#define MSGLEVEL_NEVER 0x4000000 /* never ignore / never log */
|
||||||
#define MSGLEVEL_LASTLOG 0x8000000 /* never ignore / never log */
|
#define MSGLEVEL_LASTLOG 0x8000000 /* never ignore / never log */
|
||||||
|
@ -123,7 +123,8 @@ int line_split(const char *data, int len, char **output, LINEBUF_REC **buffer)
|
|||||||
len = 0;
|
len = 0;
|
||||||
if (linebuf_find(rec, '\n') == NULL) {
|
if (linebuf_find(rec, '\n') == NULL) {
|
||||||
/* connection closed and last line is missing \n ..
|
/* connection closed and last line is missing \n ..
|
||||||
just add it so we can see if it had anything useful.. */
|
just add it so we can see if it had
|
||||||
|
anything useful.. */
|
||||||
linebuf_append(rec, "\n", 1);
|
linebuf_append(rec, "\n", 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,13 +34,22 @@
|
|||||||
static struct flock lock;
|
static struct flock lock;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const char *rotate_strings[] = {
|
||||||
|
"never",
|
||||||
|
"hourly",
|
||||||
|
"daily",
|
||||||
|
"weekly",
|
||||||
|
"monthly"
|
||||||
|
};
|
||||||
|
|
||||||
GSList *logs;
|
GSList *logs;
|
||||||
|
|
||||||
const char *log_timestamp;
|
const char *log_timestamp;
|
||||||
static int log_file_create_mode;
|
static int log_file_create_mode;
|
||||||
static int rotate_tag;
|
static int rotate_tag;
|
||||||
|
|
||||||
static void log_write_timestamp(int handle, const char *format, const char *suffix, time_t t)
|
static void log_write_timestamp(int handle, const char *format,
|
||||||
|
const char *suffix, time_t stamp)
|
||||||
{
|
{
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
char str[256];
|
char str[256];
|
||||||
@ -48,7 +57,7 @@ static void log_write_timestamp(int handle, const char *format, const char *suff
|
|||||||
g_return_if_fail(format != NULL);
|
g_return_if_fail(format != NULL);
|
||||||
if (*format == '\0') return;
|
if (*format == '\0') return;
|
||||||
|
|
||||||
tm = localtime(&t);
|
tm = localtime(&stamp);
|
||||||
|
|
||||||
str[sizeof(str)-1] = '\0';
|
str[sizeof(str)-1] = '\0';
|
||||||
strftime(str, sizeof(str)-1, format, tm);
|
strftime(str, sizeof(str)-1, format, tm);
|
||||||
@ -61,20 +70,21 @@ int log_start_logging(LOG_REC *log)
|
|||||||
{
|
{
|
||||||
char *str, fname[1024];
|
char *str, fname[1024];
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
time_t t;
|
time_t now;
|
||||||
|
|
||||||
g_return_val_if_fail(log != NULL, FALSE);
|
g_return_val_if_fail(log != NULL, FALSE);
|
||||||
|
|
||||||
if (log->handle != -1)
|
if (log->handle != -1)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
t = time(NULL);
|
now = time(NULL);
|
||||||
tm = localtime(&t);
|
tm = localtime(&now);
|
||||||
|
|
||||||
/* Append/create log file */
|
/* Append/create log file */
|
||||||
str = convert_home(log->fname);
|
str = convert_home(log->fname);
|
||||||
strftime(fname, sizeof(fname), str, tm);
|
strftime(fname, sizeof(fname), str, tm);
|
||||||
log->handle = open(fname, O_WRONLY | O_APPEND | O_CREAT, log_file_create_mode);
|
log->handle = open(fname, O_WRONLY | O_APPEND | O_CREAT,
|
||||||
|
log_file_create_mode);
|
||||||
g_free(str);
|
g_free(str);
|
||||||
|
|
||||||
if (log->handle == -1) {
|
if (log->handle == -1) {
|
||||||
@ -94,7 +104,9 @@ int log_start_logging(LOG_REC *log)
|
|||||||
lseek(log->handle, 0, SEEK_END);
|
lseek(log->handle, 0, SEEK_END);
|
||||||
|
|
||||||
log->opened = log->last = time(NULL);
|
log->opened = log->last = time(NULL);
|
||||||
log_write_timestamp(log->handle, settings_get_str("log_open_string"), "\n", log->last);
|
log_write_timestamp(log->handle,
|
||||||
|
settings_get_str("log_open_string"),
|
||||||
|
"\n", log->last);
|
||||||
|
|
||||||
signal_emit("log started", 1, log);
|
signal_emit("log started", 1, log);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@ -109,7 +121,9 @@ void log_stop_logging(LOG_REC *log)
|
|||||||
|
|
||||||
signal_emit("log stopped", 1, log);
|
signal_emit("log stopped", 1, log);
|
||||||
|
|
||||||
log_write_timestamp(log->handle, settings_get_str("log_close_string"), "\n", time(NULL));
|
log_write_timestamp(log->handle,
|
||||||
|
settings_get_str("log_close_string"),
|
||||||
|
"\n", time(NULL));
|
||||||
|
|
||||||
#ifdef HAVE_FCNTL
|
#ifdef HAVE_FCNTL
|
||||||
memset(&lock, 0, sizeof(lock));
|
memset(&lock, 0, sizeof(lock));
|
||||||
@ -124,7 +138,7 @@ void log_stop_logging(LOG_REC *log)
|
|||||||
void log_write_rec(LOG_REC *log, const char *str)
|
void log_write_rec(LOG_REC *log, const char *str)
|
||||||
{
|
{
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
time_t t;
|
time_t now;
|
||||||
int day;
|
int day;
|
||||||
|
|
||||||
g_return_if_fail(log != NULL);
|
g_return_if_fail(log != NULL);
|
||||||
@ -133,24 +147,27 @@ void log_write_rec(LOG_REC *log, const char *str)
|
|||||||
if (log->handle == -1)
|
if (log->handle == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
t = time(NULL);
|
now = time(NULL);
|
||||||
tm = localtime(&t);
|
tm = localtime(&now);
|
||||||
day = tm->tm_mday;
|
day = tm->tm_mday;
|
||||||
|
|
||||||
tm = localtime(&log->last);
|
tm = localtime(&log->last);
|
||||||
if (tm->tm_mday != day) {
|
if (tm->tm_mday != day) {
|
||||||
/* day changed */
|
/* day changed */
|
||||||
log_write_timestamp(log->handle, settings_get_str("log_day_changed"), "\n", t);
|
log_write_timestamp(log->handle,
|
||||||
|
settings_get_str("log_day_changed"),
|
||||||
|
"\n", now);
|
||||||
}
|
}
|
||||||
log->last = t;
|
log->last = now;
|
||||||
|
|
||||||
log_write_timestamp(log->handle, log_timestamp, str, t);
|
log_write_timestamp(log->handle, log_timestamp, str, now);
|
||||||
write(log->handle, "\n", 1);
|
write(log->handle, "\n", 1);
|
||||||
|
|
||||||
signal_emit("log written", 2, log, str);
|
signal_emit("log written", 2, log, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_file_write(const char *item, int level, const char *str, int no_fallbacks)
|
static void log_file_write(const char *item, int level,
|
||||||
|
const char *str, int no_fallbacks)
|
||||||
{
|
{
|
||||||
GSList *tmp, *fallbacks;
|
GSList *tmp, *fallbacks;
|
||||||
char *tmpstr;
|
char *tmpstr;
|
||||||
@ -181,7 +198,8 @@ void log_file_write(const char *item, int level, const char *str, int no_fallbac
|
|||||||
if (level & MSGLEVEL_PUBLIC)
|
if (level & MSGLEVEL_PUBLIC)
|
||||||
tmpstr = g_strconcat(item, ": ", str, NULL);
|
tmpstr = g_strconcat(item, ": ", str, NULL);
|
||||||
|
|
||||||
g_slist_foreach(fallbacks, (GFunc) log_write_rec, tmpstr ? tmpstr : (char *)str);
|
g_slist_foreach(fallbacks, (GFunc) log_write_rec,
|
||||||
|
tmpstr ? tmpstr : (char *)str);
|
||||||
g_free_not_null(tmpstr);
|
g_free_not_null(tmpstr);
|
||||||
}
|
}
|
||||||
g_slist_free(fallbacks);
|
g_slist_free(fallbacks);
|
||||||
@ -208,18 +226,9 @@ LOG_REC *log_find(const char *fname)
|
|||||||
|
|
||||||
const char *log_rotate2str(int rotate)
|
const char *log_rotate2str(int rotate)
|
||||||
{
|
{
|
||||||
switch (rotate) {
|
g_return_val_if_fail(rotate >= 0 && rotate <= LOG_ROTATE_MONTHLY, NULL);
|
||||||
case LOG_ROTATE_HOURLY:
|
|
||||||
return "hourly";
|
|
||||||
case LOG_ROTATE_DAILY:
|
|
||||||
return "daily";
|
|
||||||
case LOG_ROTATE_WEEKLY:
|
|
||||||
return "weekly";
|
|
||||||
case LOG_ROTATE_MONTHLY:
|
|
||||||
return "monthly";
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
return rotate_strings[rotate];
|
||||||
}
|
}
|
||||||
|
|
||||||
int log_str2rotate(const char *str)
|
int log_str2rotate(const char *str)
|
||||||
@ -331,7 +340,9 @@ void log_close(LOG_REC *log)
|
|||||||
log_destroy(log);
|
log_destroy(log);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sig_printtext_stripped(void *window, void *server, const char *item, gpointer levelp, const char *str)
|
static void sig_printtext_stripped(void *window, void *server,
|
||||||
|
const char *item, gpointer levelp,
|
||||||
|
const char *str)
|
||||||
{
|
{
|
||||||
int level;
|
int level;
|
||||||
|
|
||||||
@ -416,7 +427,8 @@ static void log_read_config(void)
|
|||||||
log->fname = g_strdup(node->key);
|
log->fname = g_strdup(node->key);
|
||||||
log->autoopen = config_node_get_bool(node, "auto_open", FALSE);
|
log->autoopen = config_node_get_bool(node, "auto_open", FALSE);
|
||||||
log->level = level2bits(config_node_get_str(node, "level", 0));
|
log->level = level2bits(config_node_get_str(node, "level", 0));
|
||||||
log->rotate = log_str2rotate(config_node_get_str(node, "rotate", NULL));
|
log->rotate = log_str2rotate(config_node_get_str(
|
||||||
|
node, "rotate", NULL));
|
||||||
if (log->rotate < 0) log->rotate = LOG_ROTATE_NEVER;
|
if (log->rotate < 0) log->rotate = LOG_ROTATE_NEVER;
|
||||||
|
|
||||||
node = config_node_section(node, "items", -1);
|
node = config_node_section(node, "items", -1);
|
||||||
@ -441,11 +453,15 @@ void log_init(void)
|
|||||||
rotate_tag = g_timeout_add(60000, (GSourceFunc) sig_rotate_check, NULL);
|
rotate_tag = g_timeout_add(60000, (GSourceFunc) sig_rotate_check, NULL);
|
||||||
logs = NULL;
|
logs = NULL;
|
||||||
|
|
||||||
settings_add_int("log", "log_create_mode", DEFAULT_LOG_FILE_CREATE_MODE);
|
settings_add_int("log", "log_create_mode",
|
||||||
|
DEFAULT_LOG_FILE_CREATE_MODE);
|
||||||
settings_add_str("log", "log_timestamp", "%H:%M ");
|
settings_add_str("log", "log_timestamp", "%H:%M ");
|
||||||
settings_add_str("log", "log_open_string", "--- Log opened %a %b %d %H:%M:%S %Y");
|
settings_add_str("log", "log_open_string",
|
||||||
settings_add_str("log", "log_close_string", "--- Log closed %a %b %d %H:%M:%S %Y");
|
"--- Log opened %a %b %d %H:%M:%S %Y");
|
||||||
settings_add_str("log", "log_day_changed", "--- Day changed %a %b %d %Y");
|
settings_add_str("log", "log_close_string",
|
||||||
|
"--- Log closed %a %b %d %H:%M:%S %Y");
|
||||||
|
settings_add_str("log", "log_day_changed",
|
||||||
|
"--- Day changed %a %b %d %Y");
|
||||||
|
|
||||||
read_settings();
|
read_settings();
|
||||||
log_read_config();
|
log_read_config();
|
||||||
|
@ -28,10 +28,11 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
GInputCondition condition;
|
GInputCondition condition;
|
||||||
GInputFunction function;
|
GInputFunction function;
|
||||||
gpointer data;
|
void *data;
|
||||||
} IRSSI_INPUT_REC;
|
} IRSSI_INPUT_REC;
|
||||||
|
|
||||||
static gboolean irssi_io_invoke(GIOChannel *source, GIOCondition condition, gpointer data)
|
static int irssi_io_invoke(GIOChannel *source, GIOCondition condition,
|
||||||
|
void *data)
|
||||||
{
|
{
|
||||||
IRSSI_INPUT_REC *rec = data;
|
IRSSI_INPUT_REC *rec = data;
|
||||||
GInputCondition icond = 0;
|
GInputCondition icond = 0;
|
||||||
@ -43,14 +44,16 @@ static gboolean irssi_io_invoke(GIOChannel *source, GIOCondition condition, gpoi
|
|||||||
if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
|
if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
|
||||||
icond |= G_INPUT_EXCEPTION;
|
icond |= G_INPUT_EXCEPTION;
|
||||||
|
|
||||||
if (rec->condition & icond)
|
if (rec->condition & icond) {
|
||||||
rec->function(rec->data, g_io_channel_unix_get_fd(source), icond);
|
rec->function(rec->data, g_io_channel_unix_get_fd(source),
|
||||||
|
icond);
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int g_input_add(int source, GInputCondition condition,
|
int g_input_add(int source, GInputCondition condition,
|
||||||
GInputFunction function, gpointer data)
|
GInputFunction function, void *data)
|
||||||
{
|
{
|
||||||
IRSSI_INPUT_REC *rec;
|
IRSSI_INPUT_REC *rec;
|
||||||
unsigned int result;
|
unsigned int result;
|
||||||
@ -109,7 +112,8 @@ int find_substr(const char *list, const char *item)
|
|||||||
ptr = strchr(list, ' ');
|
ptr = strchr(list, ' ');
|
||||||
if (ptr == NULL) ptr = list+strlen(list);
|
if (ptr == NULL) ptr = list+strlen(list);
|
||||||
|
|
||||||
if (g_strncasecmp(list, item, ptr-list) == 0 && item[ptr-list] == '\0')
|
if (g_strncasecmp(list, item, ptr-list) == 0 &&
|
||||||
|
item[ptr-list] == '\0')
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
list = ptr;
|
list = ptr;
|
||||||
@ -149,42 +153,10 @@ int strarray_find(char **array, const char *item)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int copyfile(const char *src, const char *dest)
|
|
||||||
{
|
|
||||||
FILE *fs, *fd;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
g_return_val_if_fail(src != NULL, FALSE);
|
|
||||||
g_return_val_if_fail(dest != NULL, FALSE);
|
|
||||||
|
|
||||||
fs = fopen(src, "rb");
|
|
||||||
if (fs == NULL) return FALSE;
|
|
||||||
|
|
||||||
ret = FALSE;
|
|
||||||
remove(dest); /* just to be sure there's no link already in dest */
|
|
||||||
|
|
||||||
fd = fopen(dest, "w+");
|
|
||||||
if (fd != NULL) {
|
|
||||||
int len;
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
while ((len = fread(buf, 1, sizeof(buf), fs)) > 0) {
|
|
||||||
if (fwrite(buf, 1, len, fd) != len)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fclose(fd);
|
|
||||||
ret = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fs);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int execute(const char *cmd)
|
int execute(const char *cmd)
|
||||||
{
|
{
|
||||||
char **args;
|
char **args;
|
||||||
char *prev, *dupcmd;
|
int pid;
|
||||||
int pid, max, cnt;
|
|
||||||
|
|
||||||
g_return_val_if_fail(cmd != NULL, -1);
|
g_return_val_if_fail(cmd != NULL, -1);
|
||||||
|
|
||||||
@ -195,25 +167,9 @@ int execute(const char *cmd)
|
|||||||
return pid;
|
return pid;
|
||||||
}
|
}
|
||||||
|
|
||||||
dupcmd = g_strdup(cmd);
|
args = g_strsplit(cmd, " ", -1);
|
||||||
max = 5; cnt = 0;
|
|
||||||
args = g_malloc(sizeof(char *)*max);
|
|
||||||
for (prev = dupcmd; ; dupcmd++) {
|
|
||||||
if (*dupcmd == '\0' || *dupcmd == ' ') {
|
|
||||||
args[cnt++] = prev;
|
|
||||||
if (cnt == max) {
|
|
||||||
max += 5;
|
|
||||||
args = g_realloc(args, sizeof(char *)*max);
|
|
||||||
}
|
|
||||||
if (*dupcmd == '\0') break;
|
|
||||||
*dupcmd++ = '\0';
|
|
||||||
prev = dupcmd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
args[cnt] = NULL;
|
|
||||||
|
|
||||||
execvp(args[0], args);
|
execvp(args[0], args);
|
||||||
g_free(dupcmd);
|
g_strfreev(args);
|
||||||
|
|
||||||
_exit(99);
|
_exit(99);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -16,7 +16,6 @@ int strarray_length(char **array);
|
|||||||
/* return index of `item' in `array' or -1 if not found */
|
/* return index of `item' in `array' or -1 if not found */
|
||||||
int strarray_find(char **array, const char *item);
|
int strarray_find(char **array, const char *item);
|
||||||
|
|
||||||
int copyfile(const char *src, const char *dest);
|
|
||||||
int execute(const char *cmd); /* returns pid or -1 = error */
|
int execute(const char *cmd); /* returns pid or -1 = error */
|
||||||
|
|
||||||
GSList *gslist_find_string(GSList *list, const char *key);
|
GSList *gslist_find_string(GSList *list, const char *key);
|
||||||
|
@ -22,8 +22,6 @@
|
|||||||
#include "modules.h"
|
#include "modules.h"
|
||||||
#include "signals.h"
|
#include "signals.h"
|
||||||
|
|
||||||
#define PLUGINSDIR "/usr/local/lib/irssi/plugins" /*FIXME: configurable*/
|
|
||||||
|
|
||||||
GSList *modules;
|
GSList *modules;
|
||||||
|
|
||||||
static GHashTable *uniqids, *uniqstrids;
|
static GHashTable *uniqids, *uniqstrids;
|
||||||
@ -34,7 +32,7 @@ static int next_uniq_id;
|
|||||||
int module_get_uniq_id(const char *module, int id)
|
int module_get_uniq_id(const char *module, int id)
|
||||||
{
|
{
|
||||||
GHashTable *ids;
|
GHashTable *ids;
|
||||||
gpointer origkey, uniqid;
|
gpointer origkey, uniqid, idp;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
g_return_val_if_fail(module != NULL, -1);
|
g_return_val_if_fail(module != NULL, -1);
|
||||||
@ -42,15 +40,17 @@ int module_get_uniq_id(const char *module, int id)
|
|||||||
ids = g_hash_table_lookup(idlookup, module);
|
ids = g_hash_table_lookup(idlookup, module);
|
||||||
if (ids == NULL) {
|
if (ids == NULL) {
|
||||||
/* new module */
|
/* new module */
|
||||||
ids = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
|
ids = g_hash_table_new((GHashFunc) g_direct_hash,
|
||||||
|
(GCompareFunc) g_direct_equal);
|
||||||
g_hash_table_insert(idlookup, g_strdup(module), ids);
|
g_hash_table_insert(idlookup, g_strdup(module), ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_hash_table_lookup_extended(ids, GINT_TO_POINTER(id), &origkey, &uniqid)) {
|
idp = GINT_TO_POINTER(id);
|
||||||
|
if (!g_hash_table_lookup_extended(ids, idp, &origkey, &uniqid)) {
|
||||||
/* not found */
|
/* not found */
|
||||||
ret = next_uniq_id++;
|
ret = next_uniq_id++;
|
||||||
g_hash_table_insert(ids, GINT_TO_POINTER(id), GINT_TO_POINTER(ret));
|
g_hash_table_insert(ids, idp, GINT_TO_POINTER(ret));
|
||||||
g_hash_table_insert(uniqids, GINT_TO_POINTER(ret), GINT_TO_POINTER(id));
|
g_hash_table_insert(uniqids, GINT_TO_POINTER(ret), idp);
|
||||||
} else {
|
} else {
|
||||||
ret = GPOINTER_TO_INT(uniqid);
|
ret = GPOINTER_TO_INT(uniqid);
|
||||||
}
|
}
|
||||||
@ -70,7 +70,8 @@ int module_get_uniq_id_str(const char *module, const char *id)
|
|||||||
ids = g_hash_table_lookup(stridlookup, module);
|
ids = g_hash_table_lookup(stridlookup, module);
|
||||||
if (ids == NULL) {
|
if (ids == NULL) {
|
||||||
/* new module */
|
/* new module */
|
||||||
ids = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
|
ids = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
|
(GCompareFunc) g_str_equal);
|
||||||
g_hash_table_insert(stridlookup, g_strdup(module), ids);
|
g_hash_table_insert(stridlookup, g_strdup(module), ids);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,22 +93,25 @@ int module_get_uniq_id_str(const char *module, const char *id)
|
|||||||
/* returns the original module specific id, -1 = not found */
|
/* returns the original module specific id, -1 = not found */
|
||||||
int module_find_id(const char *module, int uniqid)
|
int module_find_id(const char *module, int uniqid)
|
||||||
{
|
{
|
||||||
GHashTable *ids;
|
GHashTable *idlist;
|
||||||
gpointer origkey, id;
|
gpointer origkey, id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
g_return_val_if_fail(module != NULL, -1);
|
g_return_val_if_fail(module != NULL, -1);
|
||||||
|
|
||||||
ret = g_hash_table_lookup_extended(uniqids, GINT_TO_POINTER(uniqid), &origkey, &id) ?
|
if (!g_hash_table_lookup_extended(uniqids, GINT_TO_POINTER(uniqid),
|
||||||
GPOINTER_TO_INT(id) : -1;
|
&origkey, &id))
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (ret != -1) {
|
|
||||||
/* check that module matches */
|
/* check that module matches */
|
||||||
ids = g_hash_table_lookup(idlookup, module);
|
idlist = g_hash_table_lookup(idlookup, module);
|
||||||
if (ids == NULL || !g_hash_table_lookup_extended(ids, GINT_TO_POINTER(ret), &origkey, &id) ||
|
if (idlist == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
ret = GPOINTER_TO_INT(id);
|
||||||
|
if (!g_hash_table_lookup_extended(idlist, id, &origkey, &id) ||
|
||||||
GPOINTER_TO_INT(id) != uniqid)
|
GPOINTER_TO_INT(id) != uniqid)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -115,32 +119,35 @@ int module_find_id(const char *module, int uniqid)
|
|||||||
/* returns the original module specific id, NULL = not found */
|
/* returns the original module specific id, NULL = not found */
|
||||||
const char *module_find_id_str(const char *module, int uniqid)
|
const char *module_find_id_str(const char *module, int uniqid)
|
||||||
{
|
{
|
||||||
GHashTable *ids;
|
GHashTable *idlist;
|
||||||
gpointer origkey, id;
|
gpointer origkey, id;
|
||||||
const char *ret;
|
const char *ret;
|
||||||
|
|
||||||
g_return_val_if_fail(module != NULL, NULL);
|
g_return_val_if_fail(module != NULL, NULL);
|
||||||
|
|
||||||
ret = g_hash_table_lookup_extended(uniqstrids, GINT_TO_POINTER(uniqid),
|
if (!g_hash_table_lookup_extended(uniqstrids, GINT_TO_POINTER(uniqid),
|
||||||
&origkey, &id) ? id : NULL;
|
&origkey, &id))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
if (ret != NULL) {
|
|
||||||
/* check that module matches */
|
/* check that module matches */
|
||||||
ids = g_hash_table_lookup(stridlookup, module);
|
idlist = g_hash_table_lookup(stridlookup, module);
|
||||||
if (ids == NULL || !g_hash_table_lookup_extended(ids, GINT_TO_POINTER(ret), &origkey, &id) ||
|
if (idlist == NULL)
|
||||||
(GPOINTER_TO_INT(id) != uniqid))
|
return NULL;
|
||||||
|
|
||||||
|
ret = id;
|
||||||
|
if (!g_hash_table_lookup_extended(idlist, id, &origkey, &id) ||
|
||||||
|
GPOINTER_TO_INT(id) != uniqid)
|
||||||
ret = NULL;
|
ret = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gh_uniq_destroy(gpointer key, gpointer value)
|
static void uniq_destroy(gpointer key, gpointer value)
|
||||||
{
|
{
|
||||||
g_hash_table_remove(uniqids, value);
|
g_hash_table_remove(uniqids, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gh_uniq_destroy_str(gpointer key, gpointer value)
|
static void uniq_destroy_str(gpointer key, gpointer value)
|
||||||
{
|
{
|
||||||
g_hash_table_remove(uniqstrids, value);
|
g_hash_table_remove(uniqstrids, value);
|
||||||
g_free(key);
|
g_free(key);
|
||||||
@ -150,23 +157,25 @@ static void gh_uniq_destroy_str(gpointer key, gpointer value)
|
|||||||
when module is destroyed with module's name as the parameter. */
|
when module is destroyed with module's name as the parameter. */
|
||||||
void module_uniq_destroy(const char *module)
|
void module_uniq_destroy(const char *module)
|
||||||
{
|
{
|
||||||
GHashTable *ids;
|
GHashTable *idlist;
|
||||||
gpointer key;
|
gpointer key;
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(idlookup, module, &key, (gpointer *) &ids)) {
|
if (g_hash_table_lookup_extended(idlookup, module, &key,
|
||||||
|
(gpointer *) &idlist)) {
|
||||||
g_hash_table_remove(idlookup, key);
|
g_hash_table_remove(idlookup, key);
|
||||||
g_free(key);
|
g_free(key);
|
||||||
|
|
||||||
g_hash_table_foreach(ids, (GHFunc) gh_uniq_destroy, NULL);
|
g_hash_table_foreach(idlist, (GHFunc) uniq_destroy, NULL);
|
||||||
g_hash_table_destroy(ids);
|
g_hash_table_destroy(idlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(stridlookup, module, &key, (gpointer *) &ids)) {
|
if (g_hash_table_lookup_extended(stridlookup, module, &key,
|
||||||
|
(gpointer *) &idlist)) {
|
||||||
g_hash_table_remove(stridlookup, key);
|
g_hash_table_remove(stridlookup, key);
|
||||||
g_free(key);
|
g_free(key);
|
||||||
|
|
||||||
g_hash_table_foreach(ids, (GHFunc) gh_uniq_destroy_str, NULL);
|
g_hash_table_foreach(idlist, (GHFunc) uniq_destroy_str, NULL);
|
||||||
g_hash_table_destroy(ids);
|
g_hash_table_destroy(idlist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -216,13 +225,14 @@ GModule *module_open(const char *name)
|
|||||||
if (g_path_is_absolute(name))
|
if (g_path_is_absolute(name))
|
||||||
path = g_strdup(name);
|
path = g_strdup(name);
|
||||||
else {
|
else {
|
||||||
path = g_module_build_path(PLUGINSDIR, name);
|
path = g_module_build_path(MODULEDIR, name);
|
||||||
module = g_module_open(path, 0);
|
module = g_module_open(path, 0);
|
||||||
g_free(path);
|
g_free(path);
|
||||||
if (module != NULL) return module;
|
if (module != NULL) return module;
|
||||||
|
|
||||||
/* Plugin not found from global plugin dir, check from home dir */
|
/* module not found from global module dir,
|
||||||
str = g_strdup_printf("%s/.irssi/plugins", g_get_home_dir());
|
check from home dir */
|
||||||
|
str = g_strdup_printf("%s/.irssi/modules", g_get_home_dir());
|
||||||
path = g_module_build_path(str, name);
|
path = g_module_build_path(str, name);
|
||||||
g_free(str);
|
g_free(str);
|
||||||
}
|
}
|
||||||
@ -232,44 +242,39 @@ GModule *module_open(const char *name)
|
|||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
|
||||||
int module_load(const char *path)
|
#define module_error(error, module, text) \
|
||||||
|
signal_emit("module error", 3, GINT_TO_POINTER(error), module, text)
|
||||||
|
|
||||||
|
static int module_load_name(const char *path, const char *name)
|
||||||
{
|
{
|
||||||
void (*module_init) (void);
|
void (*module_init) (void);
|
||||||
GModule *gmodule;
|
GModule *gmodule;
|
||||||
MODULE_REC *rec;
|
MODULE_REC *rec;
|
||||||
char *name, *initfunc;
|
char *initfunc;
|
||||||
|
|
||||||
g_return_val_if_fail(path != NULL, FALSE);
|
|
||||||
|
|
||||||
if (!g_module_supported())
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
name = module_get_name(path);
|
|
||||||
if (module_find(name)) {
|
if (module_find(name)) {
|
||||||
signal_emit("module error", 2, GINT_TO_POINTER(MODULE_ERROR_ALREADY_LOADED), name);
|
module_error(MODULE_ERROR_ALREADY_LOADED, name, NULL);
|
||||||
g_free(name);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gmodule = module_open(path);
|
gmodule = module_open(path);
|
||||||
if (gmodule == NULL) {
|
if (gmodule == NULL) {
|
||||||
signal_emit("module error", 3, GINT_TO_POINTER(MODULE_ERROR_LOAD), name, g_module_error());
|
module_error(MODULE_ERROR_LOAD, name, g_module_error());
|
||||||
g_free(name);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get the module's init() function */
|
||||||
initfunc = g_strconcat(name, "_init", NULL);
|
initfunc = g_strconcat(name, "_init", NULL);
|
||||||
if (!g_module_symbol(gmodule, initfunc, (gpointer *) &module_init)) {
|
if (!g_module_symbol(gmodule, initfunc, (gpointer *) &module_init)) {
|
||||||
signal_emit("module error", 2, GINT_TO_POINTER(MODULE_ERROR_INVALID), name);
|
module_error(MODULE_ERROR_INVALID, name, NULL);
|
||||||
g_module_close(gmodule);
|
g_module_close(gmodule);
|
||||||
g_free(initfunc);
|
g_free(initfunc);
|
||||||
g_free(name);
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
g_free(initfunc);
|
g_free(initfunc);
|
||||||
|
|
||||||
rec = g_new0(MODULE_REC, 1);
|
rec = g_new0(MODULE_REC, 1);
|
||||||
rec->name = name;
|
rec->name = g_strdup(name);
|
||||||
rec->gmodule = gmodule;
|
rec->gmodule = gmodule;
|
||||||
modules = g_slist_append(modules, rec);
|
modules = g_slist_append(modules, rec);
|
||||||
|
|
||||||
@ -279,6 +284,23 @@ int module_load(const char *path)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int module_load(const char *path)
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
g_return_val_if_fail(path != NULL, FALSE);
|
||||||
|
|
||||||
|
if (!g_module_supported())
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
name = module_get_name(path);
|
||||||
|
ret = module_load_name(path, name);
|
||||||
|
g_free(name);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
void module_unload(MODULE_REC *module)
|
void module_unload(MODULE_REC *module)
|
||||||
{
|
{
|
||||||
void (*module_deinit) (void);
|
void (*module_deinit) (void);
|
||||||
@ -290,8 +312,10 @@ void module_unload(MODULE_REC *module)
|
|||||||
|
|
||||||
signal_emit("module unloaded", 1, module);
|
signal_emit("module unloaded", 1, module);
|
||||||
|
|
||||||
|
/* call the module's deinit() function */
|
||||||
deinitfunc = g_strconcat(module->name, "_deinit", NULL);
|
deinitfunc = g_strconcat(module->name, "_deinit", NULL);
|
||||||
if (g_module_symbol(module->gmodule, deinitfunc, (gpointer *) &module_deinit))
|
if (g_module_symbol(module->gmodule, deinitfunc,
|
||||||
|
(gpointer *) &module_deinit))
|
||||||
module_deinit();
|
module_deinit();
|
||||||
g_free(deinitfunc);
|
g_free(deinitfunc);
|
||||||
|
|
||||||
@ -304,11 +328,15 @@ void modules_init(void)
|
|||||||
{
|
{
|
||||||
modules = NULL;
|
modules = NULL;
|
||||||
|
|
||||||
idlookup = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
|
idlookup = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
uniqids = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
|
(GCompareFunc) g_str_equal);
|
||||||
|
uniqids = g_hash_table_new((GHashFunc) g_direct_hash,
|
||||||
|
(GCompareFunc) g_direct_equal);
|
||||||
|
|
||||||
stridlookup = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
|
stridlookup = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
uniqstrids = g_hash_table_new((GHashFunc) g_direct_hash, (GCompareFunc) g_direct_equal);
|
(GCompareFunc) g_str_equal);
|
||||||
|
uniqstrids = g_hash_table_new((GHashFunc) g_direct_hash,
|
||||||
|
(GCompareFunc) g_direct_equal);
|
||||||
next_uniq_id = 0;
|
next_uniq_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,11 +51,7 @@ static void sig_disconnect(NET_DISCONNECT_REC *rec)
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* check if there's any data waiting in socket */
|
/* check if there's any data waiting in socket */
|
||||||
for (;;) {
|
while ((ret = net_receive(rec->handle, buf, sizeof(buf))) > 0) ;
|
||||||
ret = net_receive(rec->handle, buf, sizeof(buf));
|
|
||||||
if (ret <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret == -1) {
|
if (ret == -1) {
|
||||||
/* socket was closed */
|
/* socket was closed */
|
||||||
@ -68,7 +64,6 @@ static int sig_timeout_disconnect(void)
|
|||||||
NET_DISCONNECT_REC *rec;
|
NET_DISCONNECT_REC *rec;
|
||||||
GSList *tmp, *next;
|
GSList *tmp, *next;
|
||||||
time_t now;
|
time_t now;
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* check if we've waited enough for sockets to close themselves */
|
/* check if we've waited enough for sockets to close themselves */
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
@ -77,7 +72,7 @@ static int sig_timeout_disconnect(void)
|
|||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
|
|
||||||
if (rec->created+MAX_CLOSE_WAIT <= now)
|
if (rec->created+MAX_CLOSE_WAIT <= now)
|
||||||
sig_disconnect(rec);
|
net_disconnect_remove(rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disconnects == NULL) {
|
if (disconnects == NULL) {
|
||||||
@ -85,9 +80,7 @@ static int sig_timeout_disconnect(void)
|
|||||||
function */
|
function */
|
||||||
timeout_tag = -1;
|
timeout_tag = -1;
|
||||||
}
|
}
|
||||||
ret = disconnects != NULL ? 1 : 0;
|
return disconnects != NULL;
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to let the other side close the connection, if it still isn't
|
/* Try to let the other side close the connection, if it still isn't
|
||||||
@ -97,14 +90,17 @@ void net_disconnect_later(int handle)
|
|||||||
NET_DISCONNECT_REC *rec;
|
NET_DISCONNECT_REC *rec;
|
||||||
|
|
||||||
rec = g_new(NET_DISCONNECT_REC, 1);
|
rec = g_new(NET_DISCONNECT_REC, 1);
|
||||||
disconnects = g_slist_append(disconnects, rec);
|
|
||||||
|
|
||||||
rec->created = time(NULL);
|
rec->created = time(NULL);
|
||||||
rec->handle = handle;
|
rec->handle = handle;
|
||||||
rec->tag = g_input_add(handle, G_INPUT_READ, (GInputFunction) sig_disconnect, rec);
|
rec->tag = g_input_add(handle, G_INPUT_READ,
|
||||||
|
(GInputFunction) sig_disconnect, rec);
|
||||||
|
|
||||||
if (timeout_tag == -1)
|
if (timeout_tag == -1) {
|
||||||
timeout_tag = g_timeout_add(10000, (GSourceFunc) sig_timeout_disconnect, NULL);
|
timeout_tag = g_timeout_add(10000, (GSourceFunc)
|
||||||
|
sig_timeout_disconnect, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
disconnects = g_slist_append(disconnects, rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void net_disconnect_init(void)
|
void net_disconnect_init(void)
|
||||||
@ -121,9 +117,6 @@ void net_disconnect_deinit(void)
|
|||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
fd_set set;
|
fd_set set;
|
||||||
|
|
||||||
if (disconnects == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* give the sockets a chance to disconnect themselves.. */
|
/* give the sockets a chance to disconnect themselves.. */
|
||||||
max = time(NULL)+MAX_QUIT_CLOSE_WAIT;
|
max = time(NULL)+MAX_QUIT_CLOSE_WAIT;
|
||||||
first = 1;
|
first = 1;
|
||||||
@ -141,12 +134,15 @@ void net_disconnect_deinit(void)
|
|||||||
FD_SET(rec->handle, &set);
|
FD_SET(rec->handle, &set);
|
||||||
tv.tv_sec = first ? 0 : max-now;
|
tv.tv_sec = first ? 0 : max-now;
|
||||||
tv.tv_usec = first ? 100000 : 0;
|
tv.tv_usec = first ? 100000 : 0;
|
||||||
if (select(rec->handle+1, &set, NULL, NULL, &tv) > 0 && FD_ISSET(rec->handle, &set)) {
|
if (select(rec->handle+1, &set, NULL, NULL, &tv) > 0 &&
|
||||||
|
FD_ISSET(rec->handle, &set)) {
|
||||||
/* data coming .. check if we can close the handle */
|
/* data coming .. check if we can close the handle */
|
||||||
sig_disconnect(rec);
|
sig_disconnect(rec);
|
||||||
} else if (first) {
|
} else if (first) {
|
||||||
/* Display the text when we have already waited for a while */
|
/* Display the text when we have already waited
|
||||||
printf(_("Please wait, waiting for servers to close connections..\n"));
|
for a while */
|
||||||
|
printf(_("Please wait, waiting for servers to close "
|
||||||
|
"connections..\n"));
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
|
|
||||||
first = 0;
|
first = 0;
|
||||||
|
@ -25,8 +25,7 @@
|
|||||||
#include "pidwait.h"
|
#include "pidwait.h"
|
||||||
#include "net-nonblock.h"
|
#include "net-nonblock.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct {
|
||||||
{
|
|
||||||
NET_CALLBACK func;
|
NET_CALLBACK func;
|
||||||
void *data;
|
void *data;
|
||||||
|
|
||||||
@ -34,8 +33,7 @@ typedef struct
|
|||||||
int port;
|
int port;
|
||||||
IPADDR *my_ip;
|
IPADDR *my_ip;
|
||||||
int tag;
|
int tag;
|
||||||
}
|
} SIMPLE_THREAD_REC;
|
||||||
SIMPLE_THREAD_REC;
|
|
||||||
|
|
||||||
/* nonblocking gethostbyname(), ip (IPADDR) + error (int, 0 = not error) is
|
/* nonblocking gethostbyname(), ip (IPADDR) + error (int, 0 = not error) is
|
||||||
written to pipe when found PID of the resolver child is returned */
|
written to pipe when found PID of the resolver child is returned */
|
||||||
@ -56,7 +54,8 @@ int net_gethostbyname_nonblock(const char *addr, int pipe)
|
|||||||
|
|
||||||
if (pid != 0) {
|
if (pid != 0) {
|
||||||
/* failed! */
|
/* failed! */
|
||||||
g_warning("net_connect_thread(): fork() failed! Using blocking resolving");
|
g_warning("net_connect_thread(): fork() failed! "
|
||||||
|
"Using blocking resolving");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* child */
|
/* child */
|
||||||
@ -186,7 +185,8 @@ static void simple_readpipe(SIMPLE_THREAD_REC *rec, int pipe)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Connect to server, call func when finished */
|
/* Connect to server, call func when finished */
|
||||||
int net_connect_nonblock(const char *server, int port, const IPADDR *my_ip, NET_CALLBACK func, void *data)
|
int net_connect_nonblock(const char *server, int port, const IPADDR *my_ip,
|
||||||
|
NET_CALLBACK func, void *data)
|
||||||
{
|
{
|
||||||
SIMPLE_THREAD_REC *rec;
|
SIMPLE_THREAD_REC *rec;
|
||||||
int fd[2];
|
int fd[2];
|
||||||
@ -212,7 +212,8 @@ int net_connect_nonblock(const char *server, int port, const IPADDR *my_ip, NET_
|
|||||||
rec->data = data;
|
rec->data = data;
|
||||||
rec->pipes[0] = fd[0];
|
rec->pipes[0] = fd[0];
|
||||||
rec->pipes[1] = fd[1];
|
rec->pipes[1] = fd[1];
|
||||||
rec->tag = g_input_add(fd[0], G_INPUT_READ, (GInputFunction) simple_readpipe, rec);
|
rec->tag = g_input_add(fd[0], G_INPUT_READ,
|
||||||
|
(GInputFunction) simple_readpipe, rec);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -134,8 +134,10 @@ int net_connect_ip(IPADDR *ip, int port, IPADDR *my_ip)
|
|||||||
|
|
||||||
/* set socket options */
|
/* set socket options */
|
||||||
fcntl(handle, F_SETFL, O_NONBLOCK);
|
fcntl(handle, F_SETFL, O_NONBLOCK);
|
||||||
setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt));
|
setsockopt(handle, SOL_SOCKET, SO_REUSEADDR,
|
||||||
setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt));
|
(char *) &opt, sizeof(opt));
|
||||||
|
setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE,
|
||||||
|
(char *) &opt, sizeof(opt));
|
||||||
|
|
||||||
/* set our own address, ignore if bind() fails */
|
/* set our own address, ignore if bind() fails */
|
||||||
if (my_ip != NULL) {
|
if (my_ip != NULL) {
|
||||||
@ -185,8 +187,10 @@ int net_listen(IPADDR *my_ip, int *port)
|
|||||||
|
|
||||||
/* set socket options */
|
/* set socket options */
|
||||||
fcntl(handle, F_SETFL, O_NONBLOCK);
|
fcntl(handle, F_SETFL, O_NONBLOCK);
|
||||||
setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof(opt));
|
setsockopt(handle, SOL_SOCKET, SO_REUSEADDR,
|
||||||
setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE, (char *) &opt, sizeof(opt));
|
(char *) &opt, sizeof(opt));
|
||||||
|
setsockopt(handle, SOL_SOCKET, SO_KEEPALIVE,
|
||||||
|
(char *) &opt, sizeof(opt));
|
||||||
|
|
||||||
/* specify the address/port we want to listen in */
|
/* specify the address/port we want to listen in */
|
||||||
ret = bind(handle, &so.sa, sizeof(so));
|
ret = bind(handle, &so.sa, sizeof(so));
|
||||||
@ -260,7 +264,8 @@ int net_receive(int handle, char *buf, int len)
|
|||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
return -1; /* disconnected */
|
return -1; /* disconnected */
|
||||||
|
|
||||||
if (ret == -1 && (errno == EWOULDBLOCK || errno == EAGAIN))
|
if (ret == -1 && (errno == EWOULDBLOCK || errno == EAGAIN ||
|
||||||
|
errno == EINTR))
|
||||||
return 0; /* no bytes received */
|
return 0; /* no bytes received */
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -275,7 +280,8 @@ int net_transmit(int handle, const char *data, int len)
|
|||||||
g_return_val_if_fail(data != NULL, -1);
|
g_return_val_if_fail(data != NULL, -1);
|
||||||
|
|
||||||
n = send(handle, data, len, 0);
|
n = send(handle, data, len, 0);
|
||||||
if (n == -1 && (errno == EWOULDBLOCK || errno == EAGAIN))
|
if (n == -1 && (errno == EWOULDBLOCK || errno == EAGAIN ||
|
||||||
|
errno == EINTR))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return n > 0 ? n : -1;
|
return n > 0 ? n : -1;
|
||||||
@ -332,7 +338,8 @@ int net_gethostbyname(const char *addr, IPADDR *ip)
|
|||||||
if (host_error != 0)
|
if (host_error != 0)
|
||||||
return host_error;
|
return host_error;
|
||||||
|
|
||||||
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST))
|
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf,
|
||||||
|
sizeof(hbuf), NULL, 0, NI_NUMERICHOST))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
so = (union sockaddr_union *) ai->ai_addr;
|
so = (union sockaddr_union *) ai->ai_addr;
|
||||||
@ -377,7 +384,8 @@ int net_gethostbyaddr(IPADDR *ip, char **name)
|
|||||||
if (host_error != 0)
|
if (host_error != 0)
|
||||||
return host_error;
|
return host_error;
|
||||||
|
|
||||||
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf, sizeof(hbuf), NULL, 0, 0))
|
if (getnameinfo(ai->ai_addr, ai->ai_addrlen, hbuf,
|
||||||
|
sizeof(hbuf), NULL, 0, 0))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/*FIXME: how does this work? *name = g_strdup(ai->?);*/
|
/*FIXME: how does this work? *name = g_strdup(ai->?);*/
|
||||||
@ -461,7 +469,7 @@ const char *net_gethosterror(int error)
|
|||||||
|
|
||||||
if (error == 1) {
|
if (error == 1) {
|
||||||
/* getnameinfo() failed ..
|
/* getnameinfo() failed ..
|
||||||
FIXME: does strerror return the right error message?? */
|
FIXME: does strerror return the right error message? */
|
||||||
return g_strerror(errno);
|
return g_strerror(errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,11 +48,13 @@ static int child_check(void)
|
|||||||
|
|
||||||
/* wait for each pid.. */
|
/* wait for each pid.. */
|
||||||
for (tmp = pids; tmp != NULL; tmp = next) {
|
for (tmp = pids; tmp != NULL; tmp = next) {
|
||||||
|
int pid = GPOINTER_TO_INT(tmp->data);
|
||||||
|
|
||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
if (waitpid(GPOINTER_TO_INT(tmp->data), &status, WNOHANG) > 0) {
|
if (waitpid(pid, &status, WNOHANG) > 0) {
|
||||||
/* process terminated, remove from list */
|
/* process terminated, remove from list */
|
||||||
pids = g_slist_remove(pids, tmp->data);
|
pids = g_slist_remove(pids, tmp->data);
|
||||||
signal_emit_id(signal_pidwait, 1, GPOINTER_TO_INT(tmp->data));
|
signal_emit_id(signal_pidwait, 1, tmp->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -56,7 +56,8 @@ static void rawlog_add(RAWLOG_REC *rawlog, char *str)
|
|||||||
rawlog->nlines++;
|
rawlog->nlines++;
|
||||||
else {
|
else {
|
||||||
g_free(rawlog->lines->data);
|
g_free(rawlog->lines->data);
|
||||||
rawlog->lines = g_slist_remove(rawlog->lines, rawlog->lines->data);
|
rawlog->lines = g_slist_remove(rawlog->lines,
|
||||||
|
rawlog->lines->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rawlog->logging) {
|
if (rawlog->logging) {
|
||||||
@ -113,7 +114,8 @@ void rawlog_open(RAWLOG_REC *rawlog, const char *fname)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
path = convert_home(fname);
|
path = convert_home(fname);
|
||||||
rawlog->handle = open(path, O_WRONLY | O_APPEND | O_CREAT, log_file_create_mode);
|
rawlog->handle = open(path, O_WRONLY | O_APPEND | O_CREAT,
|
||||||
|
log_file_create_mode);
|
||||||
g_free(path);
|
g_free(path);
|
||||||
|
|
||||||
rawlog_dump(rawlog, rawlog->handle);
|
rawlog_dump(rawlog, rawlog->handle);
|
||||||
|
@ -63,20 +63,24 @@ static void sig_disconnected(SERVER_REC *server)
|
|||||||
g_return_if_fail(server != NULL);
|
g_return_if_fail(server != NULL);
|
||||||
|
|
||||||
if (server->eventtable != NULL) {
|
if (server->eventtable != NULL) {
|
||||||
g_hash_table_foreach(server->eventtable, (GHFunc) server_eventtable_destroy, NULL);
|
g_hash_table_foreach(server->eventtable,
|
||||||
|
(GHFunc) server_eventtable_destroy, NULL);
|
||||||
g_hash_table_destroy(server->eventtable);
|
g_hash_table_destroy(server->eventtable);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_foreach(server->eventgrouptable, (GHFunc) server_eventgrouptable_destroy, NULL);
|
g_hash_table_foreach(server->eventgrouptable,
|
||||||
|
(GHFunc) server_eventgrouptable_destroy, NULL);
|
||||||
g_hash_table_destroy(server->eventgrouptable);
|
g_hash_table_destroy(server->eventgrouptable);
|
||||||
|
|
||||||
if (server->cmdtable != NULL) {
|
if (server->cmdtable != NULL) {
|
||||||
g_hash_table_foreach(server->cmdtable, (GHFunc) server_cmdtable_destroy, NULL);
|
g_hash_table_foreach(server->cmdtable,
|
||||||
|
(GHFunc) server_cmdtable_destroy, NULL);
|
||||||
g_hash_table_destroy(server->cmdtable);
|
g_hash_table_destroy(server->cmdtable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_redirect_initv(SERVER_REC *server, const char *command, int last, GSList *list)
|
void server_redirect_initv(SERVER_REC *server, const char *command,
|
||||||
|
int last, GSList *list)
|
||||||
{
|
{
|
||||||
REDIRECT_CMD_REC *rec;
|
REDIRECT_CMD_REC *rec;
|
||||||
|
|
||||||
@ -85,7 +89,7 @@ void server_redirect_initv(SERVER_REC *server, const char *command, int last, GS
|
|||||||
g_return_if_fail(last > 0);
|
g_return_if_fail(last > 0);
|
||||||
|
|
||||||
if (g_hash_table_lookup(server->cmdtable, command) != NULL) {
|
if (g_hash_table_lookup(server->cmdtable, command) != NULL) {
|
||||||
/* already in hash table. list of events SHOULD be the same... */
|
/* already in hash table. list of events SHOULD be the same. */
|
||||||
g_slist_foreach(list, (GFunc) g_free, NULL);
|
g_slist_foreach(list, (GFunc) g_free, NULL);
|
||||||
g_slist_free(list);
|
g_slist_free(list);
|
||||||
return;
|
return;
|
||||||
@ -97,7 +101,8 @@ void server_redirect_initv(SERVER_REC *server, const char *command, int last, GS
|
|||||||
g_hash_table_insert(server->cmdtable, g_strdup(command), rec);
|
g_hash_table_insert(server->cmdtable, g_strdup(command), rec);
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_redirect_init(SERVER_REC *server, const char *command, int last, ...)
|
void server_redirect_init(SERVER_REC *server, const char *command,
|
||||||
|
int last, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
GSList *list;
|
GSList *list;
|
||||||
@ -112,8 +117,9 @@ void server_redirect_init(SERVER_REC *server, const char *command, int last, ...
|
|||||||
server_redirect_initv(server, command, last, list);
|
server_redirect_initv(server, command, last, list);
|
||||||
}
|
}
|
||||||
|
|
||||||
int server_redirect_single_event(SERVER_REC *server, const char *arg, int last, int group,
|
int server_redirect_single_event(SERVER_REC *server, const char *arg,
|
||||||
const char *event, const char *signal, int argpos)
|
int last, int group, const char *event,
|
||||||
|
const char *signal, int argpos)
|
||||||
{
|
{
|
||||||
REDIRECT_REC *rec;
|
REDIRECT_REC *rec;
|
||||||
GSList *list, *grouplist;
|
GSList *list, *grouplist;
|
||||||
@ -133,21 +139,28 @@ int server_redirect_single_event(SERVER_REC *server, const char *arg, int last,
|
|||||||
rec->group = group;
|
rec->group = group;
|
||||||
rec->last = last;
|
rec->last = last;
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(server->eventtable, event, (gpointer *) &origkey, (gpointer *) &list))
|
if (g_hash_table_lookup_extended(server->eventtable, event,
|
||||||
|
(gpointer *) &origkey,
|
||||||
|
(gpointer *) &list)) {
|
||||||
g_hash_table_remove(server->eventtable, origkey);
|
g_hash_table_remove(server->eventtable, origkey);
|
||||||
else {
|
} else {
|
||||||
list = NULL;
|
list = NULL;
|
||||||
origkey = g_strdup(event);
|
origkey = g_strdup(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
grouplist = g_hash_table_lookup(server->eventgrouptable, GINT_TO_POINTER(group));
|
grouplist = g_hash_table_lookup(server->eventgrouptable,
|
||||||
if (grouplist != NULL) g_hash_table_remove(server->eventgrouptable, GINT_TO_POINTER(group));
|
GINT_TO_POINTER(group));
|
||||||
|
if (grouplist != NULL) {
|
||||||
|
g_hash_table_remove(server->eventgrouptable,
|
||||||
|
GINT_TO_POINTER(group));
|
||||||
|
}
|
||||||
|
|
||||||
list = g_slist_append(list, rec);
|
list = g_slist_append(list, rec);
|
||||||
grouplist = g_slist_append(grouplist, g_strdup(event));
|
grouplist = g_slist_append(grouplist, g_strdup(event));
|
||||||
|
|
||||||
g_hash_table_insert(server->eventtable, origkey, list);
|
g_hash_table_insert(server->eventtable, origkey, list);
|
||||||
g_hash_table_insert(server->eventgrouptable, GINT_TO_POINTER(group), grouplist);
|
g_hash_table_insert(server->eventgrouptable,
|
||||||
|
GINT_TO_POINTER(group), grouplist);
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
@ -167,7 +180,9 @@ void server_redirect_event(SERVER_REC *server, const char *arg, int last, ...)
|
|||||||
signal = va_arg(args, gchar *);
|
signal = va_arg(args, gchar *);
|
||||||
argpos = va_arg(args, gint);
|
argpos = va_arg(args, gint);
|
||||||
|
|
||||||
group = server_redirect_single_event(server, arg, last > 0, group, event, signal, argpos);
|
group = server_redirect_single_event(server, arg, last > 0,
|
||||||
|
group, event, signal,
|
||||||
|
argpos);
|
||||||
last--;
|
last--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,12 +208,14 @@ void server_redirect_default(SERVER_REC *server, const char *command)
|
|||||||
|
|
||||||
/* add all events used by command to eventtable and eventgrouptable */
|
/* add all events used by command to eventtable and eventgrouptable */
|
||||||
redirect_group++; grouplist = NULL; last = cmdrec->last;
|
redirect_group++; grouplist = NULL; last = cmdrec->last;
|
||||||
for (events = cmdrec->events; events != NULL; events = events->next, last--) {
|
for (events = cmdrec->events; events != NULL; events = events->next) {
|
||||||
event = events->data;
|
event = events->data;
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(server->eventtable, event, (gpointer *) &origkey, (gpointer *) &list))
|
if (g_hash_table_lookup_extended(server->eventtable, event,
|
||||||
|
(gpointer *) &origkey,
|
||||||
|
(gpointer *) &list)) {
|
||||||
g_hash_table_remove(server->eventtable, origkey);
|
g_hash_table_remove(server->eventtable, origkey);
|
||||||
else {
|
} else {
|
||||||
list = NULL;
|
list = NULL;
|
||||||
origkey = g_strdup(event);
|
origkey = g_strdup(event);
|
||||||
}
|
}
|
||||||
@ -212,12 +229,16 @@ void server_redirect_default(SERVER_REC *server, const char *command)
|
|||||||
grouplist = g_slist_append(grouplist, g_strdup(event));
|
grouplist = g_slist_append(grouplist, g_strdup(event));
|
||||||
list = g_slist_append(list, rec);
|
list = g_slist_append(list, rec);
|
||||||
g_hash_table_insert(server->eventtable, origkey, list);
|
g_hash_table_insert(server->eventtable, origkey, list);
|
||||||
|
|
||||||
|
last--;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_insert(server->eventgrouptable, GINT_TO_POINTER(redirect_group), grouplist);
|
g_hash_table_insert(server->eventgrouptable,
|
||||||
|
GINT_TO_POINTER(redirect_group), grouplist);
|
||||||
}
|
}
|
||||||
|
|
||||||
void server_redirect_remove_next(SERVER_REC *server, const char *event, GSList *item)
|
void server_redirect_remove_next(SERVER_REC *server, const char *event,
|
||||||
|
GSList *item)
|
||||||
{
|
{
|
||||||
REDIRECT_REC *rec;
|
REDIRECT_REC *rec;
|
||||||
GSList *grouplist, *list, *events, *tmp;
|
GSList *grouplist, *list, *events, *tmp;
|
||||||
@ -227,7 +248,9 @@ void server_redirect_remove_next(SERVER_REC *server, const char *event, GSList *
|
|||||||
g_return_if_fail(server != NULL);
|
g_return_if_fail(server != NULL);
|
||||||
g_return_if_fail(event != NULL);
|
g_return_if_fail(event != NULL);
|
||||||
|
|
||||||
if (!g_hash_table_lookup_extended(server->eventtable, event, (gpointer *) &origkey, (gpointer *) &list))
|
if (!g_hash_table_lookup_extended(server->eventtable, event,
|
||||||
|
(gpointer *) &origkey,
|
||||||
|
(gpointer *) &list))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rec = item == NULL ? list->data : item->data;
|
rec = item == NULL ? list->data : item->data;
|
||||||
@ -238,14 +261,19 @@ void server_redirect_remove_next(SERVER_REC *server, const char *event, GSList *
|
|||||||
group = rec->group;
|
group = rec->group;
|
||||||
|
|
||||||
/* get list of events from this group */
|
/* get list of events from this group */
|
||||||
grouplist = g_hash_table_lookup(server->eventgrouptable, GINT_TO_POINTER(group));
|
grouplist = g_hash_table_lookup(server->eventgrouptable,
|
||||||
|
GINT_TO_POINTER(group));
|
||||||
|
|
||||||
/* remove all of them */
|
/* remove all of them */
|
||||||
for (list = grouplist; list != NULL; list = list->next) {
|
for (list = grouplist; list != NULL; list = list->next) {
|
||||||
char *event = list->data;
|
char *event = list->data;
|
||||||
|
|
||||||
if (!g_hash_table_lookup_extended(server->eventtable, event, (gpointer *) &origkey, (gpointer *) &events)) {
|
if (!g_hash_table_lookup_extended(server->eventtable, event,
|
||||||
g_warning("server_redirect_remove_next() : event in eventgrouptable but not in eventtable");
|
(gpointer *) &origkey,
|
||||||
|
(gpointer *) &events)) {
|
||||||
|
g_warning("server_redirect_remove_next() : "
|
||||||
|
"event in eventgrouptable but not in "
|
||||||
|
"eventtable");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,7 +286,9 @@ void server_redirect_remove_next(SERVER_REC *server, const char *event, GSList *
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rec == NULL) {
|
if (rec == NULL) {
|
||||||
g_warning("server_redirect_remove_next() : event in eventgrouptable but not in eventtable (group)");
|
g_warning("server_redirect_remove_next() : "
|
||||||
|
"event in eventgrouptable but not in "
|
||||||
|
"eventtable (group)");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,15 +303,18 @@ void server_redirect_remove_next(SERVER_REC *server, const char *event, GSList *
|
|||||||
g_hash_table_remove(server->eventtable, origkey);
|
g_hash_table_remove(server->eventtable, origkey);
|
||||||
if (events == NULL)
|
if (events == NULL)
|
||||||
g_free(origkey);
|
g_free(origkey);
|
||||||
else
|
else {
|
||||||
g_hash_table_insert(server->eventtable, origkey, events);
|
g_hash_table_insert(server->eventtable,
|
||||||
|
origkey, events);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_remove(server->eventgrouptable, GINT_TO_POINTER(group));
|
g_hash_table_remove(server->eventgrouptable, GINT_TO_POINTER(group));
|
||||||
g_slist_free(grouplist);
|
g_slist_free(grouplist);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList *server_redirect_getqueue(SERVER_REC *server, const char *event, const char *args)
|
GSList *server_redirect_getqueue(SERVER_REC *server, const char *event,
|
||||||
|
const char *args)
|
||||||
{
|
{
|
||||||
REDIRECT_REC *rec;
|
REDIRECT_REC *rec;
|
||||||
GSList *list;
|
GSList *list;
|
||||||
|
@ -129,6 +129,7 @@ static void server_connect_callback_readpipe(SERVER_REC *server)
|
|||||||
{
|
{
|
||||||
SERVER_CONNECT_REC *conn;
|
SERVER_CONNECT_REC *conn;
|
||||||
RESOLVED_IP_REC iprec;
|
RESOLVED_IP_REC iprec;
|
||||||
|
const char *errormsg;
|
||||||
int handle;
|
int handle;
|
||||||
|
|
||||||
g_source_remove(server->connect_tag);
|
g_source_remove(server->connect_tag);
|
||||||
@ -157,21 +158,33 @@ static void server_connect_callback_readpipe(SERVER_REC *server)
|
|||||||
other error in nameserver */
|
other error in nameserver */
|
||||||
server->connection_lost = TRUE;
|
server->connection_lost = TRUE;
|
||||||
}
|
}
|
||||||
server_cant_connect(server,
|
|
||||||
iprec.error == 0 ? g_strerror(errno) : /* connect() failed */
|
if (iprec.error == 0) {
|
||||||
(iprec.errorstr != NULL ? iprec.errorstr : "Host lookup failed")); /* gethostbyname() failed */
|
/* connect() failed */
|
||||||
|
errormsg = g_strerror(errno);
|
||||||
|
} else {
|
||||||
|
/* gethostbyname() failed */
|
||||||
|
errormsg = iprec.errorstr != NULL ? iprec.errorstr :
|
||||||
|
"Host lookup failed";
|
||||||
|
}
|
||||||
|
server_cant_connect(server, rrormsg);
|
||||||
g_free_not_null(iprec.errorstr);
|
g_free_not_null(iprec.errorstr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->handle = net_sendbuffer_create(handle, 0);
|
server->handle = net_sendbuffer_create(handle, 0);
|
||||||
server->connect_tag = g_input_add(handle, G_INPUT_WRITE|G_INPUT_READ|G_INPUT_EXCEPTION,
|
server->connect_tag =
|
||||||
(GInputFunction) server_connect_callback_init, server);
|
g_input_add(handle, G_INPUT_WRITE | G_INPUT_READ |
|
||||||
|
G_INPUT_EXCEPTION,
|
||||||
|
(GInputFunction) server_connect_callback_init,
|
||||||
|
server);
|
||||||
signal_emit("server connecting", 2, server, &iprec.ip);
|
signal_emit("server connecting", 2, server, &iprec.ip);
|
||||||
}
|
}
|
||||||
|
|
||||||
int server_connect(SERVER_REC *server)
|
int server_connect(SERVER_REC *server)
|
||||||
{
|
{
|
||||||
|
const char *connect_address;
|
||||||
|
|
||||||
g_return_val_if_fail(server != NULL, FALSE);
|
g_return_val_if_fail(server != NULL, FALSE);
|
||||||
|
|
||||||
MODULE_DATA_INIT(server);
|
MODULE_DATA_INIT(server);
|
||||||
@ -182,9 +195,11 @@ int server_connect(SERVER_REC *server)
|
|||||||
}
|
}
|
||||||
|
|
||||||
server->tag = server_create_tag(server->connrec);
|
server->tag = server_create_tag(server->connrec);
|
||||||
|
|
||||||
|
connect_address = server->connrec->proxy != NULL ?
|
||||||
|
server->connrec->proxy : server->connrec->address;
|
||||||
server->connect_pid =
|
server->connect_pid =
|
||||||
net_gethostbyname_nonblock(server->connrec->proxy != NULL ?
|
net_gethostbyname_nonblock(connect_address,
|
||||||
server->connrec->proxy : server->connrec->address,
|
|
||||||
server->connect_pipe[1]);
|
server->connect_pipe[1]);
|
||||||
server->connect_tag =
|
server->connect_tag =
|
||||||
g_input_add(server->connect_pipe[0], G_INPUT_READ,
|
g_input_add(server->connect_pipe[0], G_INPUT_READ,
|
||||||
|
@ -32,7 +32,7 @@ typedef struct {
|
|||||||
int connected:1; /* connected to server */
|
int connected:1; /* connected to server */
|
||||||
int connection_lost:1; /* Connection lost unintentionally */
|
int connection_lost:1; /* Connection lost unintentionally */
|
||||||
|
|
||||||
int handle; /* socket handle */
|
void *handle; /* NET_SENDBUF_REC socket */
|
||||||
int readtag; /* input tag */
|
int readtag; /* input tag */
|
||||||
|
|
||||||
/* for net_connect_nonblock() */
|
/* for net_connect_nonblock() */
|
||||||
|
@ -42,7 +42,8 @@ static const char *settings_get_default_str(const char *key)
|
|||||||
|
|
||||||
rec = g_hash_table_lookup(settings, key);
|
rec = g_hash_table_lookup(settings, key);
|
||||||
if (rec == NULL) {
|
if (rec == NULL) {
|
||||||
g_warning("settings_get_default_str(%s) : unknown setting", key);
|
g_warning("settings_get_default_str(%s) : "
|
||||||
|
"unknown setting", key);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +58,8 @@ static int settings_get_default_int(const char *key)
|
|||||||
|
|
||||||
rec = g_hash_table_lookup(settings, key);
|
rec = g_hash_table_lookup(settings, key);
|
||||||
if (rec == NULL) {
|
if (rec == NULL) {
|
||||||
g_warning("settings_get_default_int(%s) : unknown setting", key);
|
g_warning("settings_get_default_int(%s) : "
|
||||||
|
"unknown setting", key);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +78,8 @@ const int settings_get_int(const char *key)
|
|||||||
|
|
||||||
const int settings_get_bool(const char *key)
|
const int settings_get_bool(const char *key)
|
||||||
{
|
{
|
||||||
return iconfig_get_bool("settings", key, settings_get_default_int(key));
|
return iconfig_get_bool("settings", key,
|
||||||
|
settings_get_default_int(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
void settings_add_str(const char *section, const char *key, const char *def)
|
void settings_add_str(const char *section, const char *key, const char *def)
|
||||||
@ -180,9 +183,11 @@ static int settings_compare(SETTINGS_REC *v1, SETTINGS_REC *v2)
|
|||||||
return strcmp(v1->section, v2->section);
|
return strcmp(v1->section, v2->section);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void settings_hash_get(const char *key, SETTINGS_REC *rec, GSList **list)
|
static void settings_hash_get(const char *key, SETTINGS_REC *rec,
|
||||||
|
GSList **list)
|
||||||
{
|
{
|
||||||
*list = g_slist_insert_sorted(*list, rec, (GCompareFunc) settings_compare);
|
*list = g_slist_insert_sorted(*list, rec,
|
||||||
|
(GCompareFunc) settings_compare);
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList *settings_get_sorted(void)
|
GSList *settings_get_sorted(void)
|
||||||
@ -215,14 +220,9 @@ static CONFIG_REC *parse_configfile(const char *fname)
|
|||||||
g_strdup_printf("%s/.irssi/config", g_get_home_dir());
|
g_strdup_printf("%s/.irssi/config", g_get_home_dir());
|
||||||
config = config_open(real_fname, -1);
|
config = config_open(real_fname, -1);
|
||||||
|
|
||||||
if (config == NULL && fname != NULL) {
|
|
||||||
g_free(real_fname);
|
|
||||||
return NULL; /* specified config file not found */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (config != NULL)
|
if (config != NULL)
|
||||||
config_parse(config);
|
config_parse(config);
|
||||||
else {
|
else if (fname == NULL) {
|
||||||
/* user configuration file not found, use the default one
|
/* user configuration file not found, use the default one
|
||||||
from sysconfdir */
|
from sysconfdir */
|
||||||
config = config_open(SYSCONFDIR"/irssi/config", -1);
|
config = config_open(SYSCONFDIR"/irssi/config", -1);
|
||||||
@ -245,7 +245,8 @@ static CONFIG_REC *parse_configfile(const char *fname)
|
|||||||
static void sig_print_config_error(void)
|
static void sig_print_config_error(void)
|
||||||
{
|
{
|
||||||
signal_emit("gui dialog", 2, "error", last_error_msg);
|
signal_emit("gui dialog", 2, "error", last_error_msg);
|
||||||
signal_remove("irssi init finished", (SIGNAL_FUNC) sig_print_config_error);
|
signal_remove("irssi init finished",
|
||||||
|
(SIGNAL_FUNC) sig_print_config_error);
|
||||||
|
|
||||||
g_free_and_null(last_error_msg);
|
g_free_and_null(last_error_msg);
|
||||||
}
|
}
|
||||||
@ -258,12 +259,14 @@ static void init_configfile(void)
|
|||||||
str = g_strdup_printf("%s/.irssi", g_get_home_dir());
|
str = g_strdup_printf("%s/.irssi", g_get_home_dir());
|
||||||
if (stat(str, &statbuf) != 0) {
|
if (stat(str, &statbuf) != 0) {
|
||||||
/* ~/.irssi not found, create it. */
|
/* ~/.irssi not found, create it. */
|
||||||
if (mkdir(str, 0700) != 0)
|
if (mkdir(str, 0700) != 0) {
|
||||||
g_error(_("Couldn't create %s/.irssi directory"), g_get_home_dir());
|
g_error(_("Couldn't create %s/.irssi directory"),
|
||||||
} else {
|
g_get_home_dir());
|
||||||
if (!S_ISDIR(statbuf.st_mode)) {
|
|
||||||
g_error(_("%s/.irssi is not a directory.\nYou should remove it with command: rm ~/.irssi"), g_get_home_dir());
|
|
||||||
}
|
}
|
||||||
|
} else if (!S_ISDIR(statbuf.st_mode)) {
|
||||||
|
g_error(_("%s/.irssi is not a directory.\n"
|
||||||
|
"You should remove it with command: rm ~/.irssi"),
|
||||||
|
g_get_home_dir());
|
||||||
}
|
}
|
||||||
g_free(str);
|
g_free(str);
|
||||||
|
|
||||||
@ -271,9 +274,12 @@ static void init_configfile(void)
|
|||||||
|
|
||||||
/* any errors? */
|
/* any errors? */
|
||||||
if (config_last_error(mainconfig) != NULL) {
|
if (config_last_error(mainconfig) != NULL) {
|
||||||
last_error_msg = g_strdup_printf(_("Ignored errors in configuration file:\n%s"),
|
last_error_msg =
|
||||||
|
g_strdup_printf(_("Ignored errors in configuration "
|
||||||
|
"file:\n%s"),
|
||||||
config_last_error(mainconfig));
|
config_last_error(mainconfig));
|
||||||
signal_add("irssi init finished", (SIGNAL_FUNC) sig_print_config_error);
|
signal_add("irssi init finished",
|
||||||
|
(SIGNAL_FUNC) sig_print_config_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
signal(SIGTERM, sig_term);
|
signal(SIGTERM, sig_term);
|
||||||
@ -296,11 +302,11 @@ void settings_reread(const char *fname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (config_last_error(tempconfig) != NULL) {
|
if (config_last_error(tempconfig) != NULL) {
|
||||||
/* error */
|
|
||||||
str = g_strdup_printf(_("Errors in configuration file:\n%s"),
|
str = g_strdup_printf(_("Errors in configuration file:\n%s"),
|
||||||
config_last_error(tempconfig));
|
config_last_error(tempconfig));
|
||||||
signal_emit("gui dialog", 2, "error", str);
|
signal_emit("gui dialog", 2, "error", str);
|
||||||
g_free(str);
|
g_free(str);
|
||||||
|
|
||||||
config_close(tempconfig);
|
config_close(tempconfig);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -328,7 +334,8 @@ void settings_save(const char *fname)
|
|||||||
|
|
||||||
void settings_init(void)
|
void settings_init(void)
|
||||||
{
|
{
|
||||||
settings = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
|
settings = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
|
(GCompareFunc) g_str_equal);
|
||||||
|
|
||||||
init_configfile();
|
init_configfile();
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,8 @@ static SIGNAL_REC *first_signal_rec, *last_signal_rec; /* "signal" and "last sig
|
|||||||
static SIGNAL_REC *current_emitted_signal;
|
static SIGNAL_REC *current_emitted_signal;
|
||||||
|
|
||||||
/* bind a signal */
|
/* bind a signal */
|
||||||
void signal_add_to(const char *module, int pos, const char *signal, SIGNAL_FUNC func)
|
void signal_add_to(const char *module, int pos, const char *signal,
|
||||||
|
SIGNAL_FUNC func)
|
||||||
{
|
{
|
||||||
SIGNAL_REC *rec;
|
SIGNAL_REC *rec;
|
||||||
int signal_id;
|
int signal_id;
|
||||||
@ -104,7 +105,8 @@ static int signal_list_find(GPtrArray *array, void *data)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void signal_remove_from_list(SIGNAL_REC *rec, int signal_id, int list, int index)
|
static void signal_remove_from_list(SIGNAL_REC *rec, int signal_id,
|
||||||
|
int list, int index)
|
||||||
{
|
{
|
||||||
if (rec->emitting) {
|
if (rec->emitting) {
|
||||||
g_ptr_array_index(rec->siglist[list], index) = NULL;
|
g_ptr_array_index(rec->siglist[list], index) = NULL;
|
||||||
@ -118,7 +120,8 @@ static void signal_remove_from_list(SIGNAL_REC *rec, int signal_id, int list, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Remove signal from emit lists */
|
/* Remove signal from emit lists */
|
||||||
static int signal_remove_from_lists(SIGNAL_REC *rec, int signal_id, SIGNAL_FUNC func)
|
static int signal_remove_from_lists(SIGNAL_REC *rec, int signal_id,
|
||||||
|
SIGNAL_FUNC func)
|
||||||
{
|
{
|
||||||
int n, index;
|
int n, index;
|
||||||
|
|
||||||
@ -149,9 +152,13 @@ void signal_remove(const char *signal, SIGNAL_FUNC func)
|
|||||||
signal_id = signal_get_uniq_id(signal);
|
signal_id = signal_get_uniq_id(signal);
|
||||||
|
|
||||||
rec = g_hash_table_lookup(signals, GINT_TO_POINTER(signal_id));
|
rec = g_hash_table_lookup(signals, GINT_TO_POINTER(signal_id));
|
||||||
found = rec == NULL ? 0 : signal_remove_from_lists(rec, signal_id, func);
|
found = rec == NULL ? 0 :
|
||||||
|
signal_remove_from_lists(rec, signal_id, func);
|
||||||
|
|
||||||
if (!found) g_warning("signal_remove() : signal \"%s\" isn't grabbed for %p", signal, func);
|
if (!found) {
|
||||||
|
g_warning("signal_remove() : signal \"%s\" isn't "
|
||||||
|
"grabbed for %p", signal, func);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove all NULL functions from signal list */
|
/* Remove all NULL functions from signal list */
|
||||||
|
@ -99,7 +99,8 @@ static char *get_internal_setting(const char *key, int type, int *free_ret)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_long_variable_value(const char *key, void *server, void *item, int *free_ret)
|
static char *get_long_variable_value(const char *key, void *server,
|
||||||
|
void *item, int *free_ret)
|
||||||
{
|
{
|
||||||
EXPANDO_FUNC func;
|
EXPANDO_FUNC func;
|
||||||
char *ret;
|
char *ret;
|
||||||
@ -125,7 +126,8 @@ static char *get_long_variable_value(const char *key, void *server, void *item,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_long_variable(char **cmd, void *server, void *item, int *free_ret)
|
static char *get_long_variable(char **cmd, void *server,
|
||||||
|
void *item, int *free_ret)
|
||||||
{
|
{
|
||||||
char *start, *var, *ret;
|
char *start, *var, *ret;
|
||||||
|
|
||||||
@ -140,7 +142,8 @@ static char *get_long_variable(char **cmd, void *server, void *item, int *free_r
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* return the value of the variable found from `cmd' */
|
/* return the value of the variable found from `cmd' */
|
||||||
static char *get_variable(char **cmd, void *server, void *item, char **arglist, int *free_ret, int *arg_used)
|
static char *get_variable(char **cmd, void *server, void *item,
|
||||||
|
char **arglist, int *free_ret, int *arg_used)
|
||||||
{
|
{
|
||||||
if (isdigit(**cmd) || **cmd == '*' || **cmd == '-' || **cmd == '~') {
|
if (isdigit(**cmd) || **cmd == '*' || **cmd == '-' || **cmd == '~') {
|
||||||
/* argument */
|
/* argument */
|
||||||
@ -180,7 +183,8 @@ static char *get_history(char **cmd, void *item, int *free_ret)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_special_value(char **cmd, void *server, void *item, char **arglist, int *free_ret, int *arg_used)
|
static char *get_special_value(char **cmd, void *server, void *item,
|
||||||
|
char **arglist, int *free_ret, int *arg_used)
|
||||||
{
|
{
|
||||||
char command, *value, *p;
|
char command, *value, *p;
|
||||||
int len;
|
int len;
|
||||||
@ -309,7 +313,8 @@ static char *get_alignment(const char *text, int align, int flags, char pad)
|
|||||||
|
|
||||||
/* Parse and expand text after '$' character. return value has to be
|
/* Parse and expand text after '$' character. return value has to be
|
||||||
g_free()'d if `free_ret' is TRUE. */
|
g_free()'d if `free_ret' is TRUE. */
|
||||||
char *parse_special(char **cmd, void *server, void *item, char **arglist, int *free_ret, int *arg_used)
|
char *parse_special(char **cmd, void *server, void *item,
|
||||||
|
char **arglist, int *free_ret, int *arg_used)
|
||||||
{
|
{
|
||||||
static char **nested_orig_cmd = NULL; /* FIXME: KLUDGE! */
|
static char **nested_orig_cmd = NULL; /* FIXME: KLUDGE! */
|
||||||
char command, *value;
|
char command, *value;
|
||||||
@ -326,8 +331,8 @@ char *parse_special(char **cmd, void *server, void *item, char **arglist, int *f
|
|||||||
switch (command) {
|
switch (command) {
|
||||||
case '[':
|
case '[':
|
||||||
/* alignment */
|
/* alignment */
|
||||||
if (!get_alignment_args(cmd, &align, &align_flags, &align_pad) ||
|
if (!get_alignment_args(cmd, &align, &align_flags,
|
||||||
**cmd == '\0') {
|
&align_pad) || **cmd == '\0') {
|
||||||
(*cmd)--;
|
(*cmd)--;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -349,12 +354,14 @@ char *parse_special(char **cmd, void *server, void *item, char **arglist, int *f
|
|||||||
nest_value = *cmd;
|
nest_value = *cmd;
|
||||||
} else {
|
} else {
|
||||||
(*cmd)++;
|
(*cmd)++;
|
||||||
nest_value = parse_special(cmd, server, item, arglist, &nest_free, arg_used);
|
nest_value = parse_special(cmd, server, item, arglist,
|
||||||
|
&nest_free, arg_used);
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((*nested_orig_cmd)[1] != '\0') {
|
while ((*nested_orig_cmd)[1] != '\0') {
|
||||||
(*nested_orig_cmd)++;
|
(*nested_orig_cmd)++;
|
||||||
if (**nested_orig_cmd == ')') break;
|
if (**nested_orig_cmd == ')')
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
cmd = &nest_value;
|
cmd = &nest_value;
|
||||||
|
|
||||||
@ -369,7 +376,8 @@ char *parse_special(char **cmd, void *server, void *item, char **arglist, int *f
|
|||||||
brackets = TRUE;
|
brackets = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
value = get_special_value(cmd, server, item, arglist, free_ret, arg_used);
|
value = get_special_value(cmd, server, item, arglist,
|
||||||
|
free_ret, arg_used);
|
||||||
if (**cmd == '\0')
|
if (**cmd == '\0')
|
||||||
g_error("parse_special() : buffer overflow!");
|
g_error("parse_special() : buffer overflow!");
|
||||||
|
|
||||||
@ -397,7 +405,8 @@ char *parse_special(char **cmd, void *server, void *item, char **arglist, int *f
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parse the whole string. $ and \ chars are replaced */
|
/* parse the whole string. $ and \ chars are replaced */
|
||||||
char *parse_special_string(const char *cmd, void *server, void *item, const char *data, int *arg_used)
|
char *parse_special_string(const char *cmd, void *server, void *item,
|
||||||
|
const char *data, int *arg_used)
|
||||||
{
|
{
|
||||||
char code, **arglist, *ret;
|
char code, **arglist, *ret;
|
||||||
GString *str;
|
GString *str;
|
||||||
@ -428,7 +437,8 @@ char *parse_special_string(const char *cmd, void *server, void *item, const char
|
|||||||
} else if (code == '$') {
|
} else if (code == '$') {
|
||||||
char *ret;
|
char *ret;
|
||||||
|
|
||||||
ret = parse_special((char **) &cmd, server, item, arglist, &need_free, arg_used);
|
ret = parse_special((char **) &cmd, server, item,
|
||||||
|
arglist, &need_free, arg_used);
|
||||||
if (ret != NULL) {
|
if (ret != NULL) {
|
||||||
g_string_append(str, ret);
|
g_string_append(str, ret);
|
||||||
if (need_free) g_free(ret);
|
if (need_free) g_free(ret);
|
||||||
@ -450,8 +460,13 @@ char *parse_special_string(const char *cmd, void *server, void *item, const char
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define is_split_char(str, start) \
|
||||||
|
((str)[0] == ';' && ((start) == (str) || \
|
||||||
|
((str)[-1] != '\\' && (str)[-1] != '$')))
|
||||||
|
|
||||||
/* execute the commands in string - commands can be split with ';' */
|
/* execute the commands in string - commands can be split with ';' */
|
||||||
void eval_special_string(const char *cmd, const char *data, void *server, void *item)
|
void eval_special_string(const char *cmd, const char *data,
|
||||||
|
void *server, void *item)
|
||||||
{
|
{
|
||||||
const char *cmdchars;
|
const char *cmdchars;
|
||||||
char *orig, *str, *start, *ret;
|
char *orig, *str, *start, *ret;
|
||||||
@ -460,14 +475,15 @@ void eval_special_string(const char *cmd, const char *data, void *server, void *
|
|||||||
cmdchars = settings_get_str("cmdchars");
|
cmdchars = settings_get_str("cmdchars");
|
||||||
orig = start = str = g_strdup(cmd);
|
orig = start = str = g_strdup(cmd);
|
||||||
do {
|
do {
|
||||||
if (*str == ';' && (start == str || (str[-1] != '\\' && str[-1] != '$')))
|
if (is_split_char(str, start))
|
||||||
*str++ = '\0';
|
*str++ = '\0';
|
||||||
else if (*str != '\0') {
|
else if (*str != '\0') {
|
||||||
str++;
|
str++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = parse_special_string(start, server, item, data, &arg_used);
|
ret = parse_special_string(start, server, item,
|
||||||
|
data, &arg_used);
|
||||||
if (strchr(cmdchars, *ret) == NULL) {
|
if (strchr(cmdchars, *ret) == NULL) {
|
||||||
/* no command char - let's put it there.. */
|
/* no command char - let's put it there.. */
|
||||||
char *old = ret;
|
char *old = ret;
|
||||||
@ -505,7 +521,8 @@ void expando_create(const char *key, EXPANDO_FUNC func)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(expandos, key, &origkey, &origvalue)) {
|
if (g_hash_table_lookup_extended(expandos, key, &origkey,
|
||||||
|
&origvalue)) {
|
||||||
g_free(origkey);
|
g_free(origkey);
|
||||||
g_hash_table_remove(expandos, key);
|
g_hash_table_remove(expandos, key);
|
||||||
}
|
}
|
||||||
@ -527,7 +544,8 @@ void expando_destroy(const char *key, EXPANDO_FUNC func)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_hash_table_lookup_extended(expandos, key, &origkey, &origvalue)) {
|
if (g_hash_table_lookup_extended(expandos, key, &origkey,
|
||||||
|
&origvalue)) {
|
||||||
g_free(origkey);
|
g_free(origkey);
|
||||||
g_hash_table_remove(expandos, key);
|
g_hash_table_remove(expandos, key);
|
||||||
}
|
}
|
||||||
@ -618,7 +636,8 @@ void special_vars_init(void)
|
|||||||
client_start_time = time(NULL);
|
client_start_time = time(NULL);
|
||||||
|
|
||||||
memset(char_expandos, 0, sizeof(char_expandos));
|
memset(char_expandos, 0, sizeof(char_expandos));
|
||||||
expandos = g_hash_table_new((GHashFunc) g_str_hash, (GCompareFunc) g_str_equal);
|
expandos = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
|
(GCompareFunc) g_str_equal);
|
||||||
history_func = NULL;
|
history_func = NULL;
|
||||||
|
|
||||||
char_expandos['F'] = expando_clientstarted;
|
char_expandos['F'] = expando_clientstarted;
|
||||||
|
@ -122,8 +122,7 @@ static void cmd_connect(const char *data)
|
|||||||
|
|
||||||
static void cmd_disconnect(const char *data, IRC_SERVER_REC *server)
|
static void cmd_disconnect(const char *data, IRC_SERVER_REC *server)
|
||||||
{
|
{
|
||||||
IRC_SERVER_REC *ircserver;
|
char *tag, *msg, *str;
|
||||||
char *tag, *msg;
|
|
||||||
void *free_arg;
|
void *free_arg;
|
||||||
|
|
||||||
g_return_if_fail(data != NULL);
|
g_return_if_fail(data != NULL);
|
||||||
@ -142,15 +141,10 @@ static void cmd_disconnect(const char *data, IRC_SERVER_REC *server)
|
|||||||
if (*msg == '\0') msg = (char *) settings_get_str("quit_message");
|
if (*msg == '\0') msg = (char *) settings_get_str("quit_message");
|
||||||
signal_emit("server quit", 2, server, msg);
|
signal_emit("server quit", 2, server, msg);
|
||||||
|
|
||||||
ircserver = (IRC_SERVER_REC *) server;
|
if (server->handle != NULL && server->buffer != NULL) {
|
||||||
if (ircserver->handle != -1 && ircserver->buffer != NULL) {
|
str = g_strdup_printf("QUIT :%s", msg);
|
||||||
/* flush transmit queue */
|
irc_send_cmd_now(server, str);
|
||||||
g_slist_foreach(ircserver->cmdqueue, (GFunc) g_free, NULL);
|
g_free(str);
|
||||||
g_slist_free(ircserver->cmdqueue);
|
|
||||||
ircserver->cmdqueue = NULL;
|
|
||||||
ircserver->cmdcount = 0;
|
|
||||||
|
|
||||||
irc_send_cmdv(ircserver, "QUIT :%s", msg);
|
|
||||||
}
|
}
|
||||||
cmd_params_free(free_arg);
|
cmd_params_free(free_arg);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user