From: Pekka Riikonen Date: Mon, 28 Oct 2002 19:58:51 +0000 (+0000) Subject: Merged latest from irssi.org CVS. X-Git-Tag: silc.server.0.9.8~40 X-Git-Url: http://git.silcnet.org/gitweb/?a=commitdiff_plain;h=9d665582a12e897776a7fb7c917780926ab1bf85;p=silc.git Merged latest from irssi.org CVS. --- diff --git a/CHANGES b/CHANGES index e367886e..cc84c3de 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,8 @@ Mon Oct 28 21:23:39 EET 2002 Pekka Riikonen always Client ID, others are not allowed. Affected file silcd/server_query.c. + * Merged latest changes from irssi.org CVS. + Sun Oct 27 11:44:32 EET 2002 Pekka Riikonen * Merged c0ffee's /set heartbeat patch to Irssi SILC client. diff --git a/apps/irssi/src/core/expandos.c b/apps/irssi/src/core/expandos.c index 8f97836a..7ebc4f20 100644 --- a/apps/irssi/src/core/expandos.c +++ b/apps/irssi/src/core/expandos.c @@ -46,6 +46,8 @@ typedef struct { int signal_args[MAX_EXPANDO_SIGNALS]; } EXPANDO_REC; +const char *current_expando = NULL; + static int timer_tag; static EXPANDO_REC *char_expandos[255]; diff --git a/apps/irssi/src/core/expandos.h b/apps/irssi/src/core/expandos.h index cf057994..45608a26 100644 --- a/apps/irssi/src/core/expandos.h +++ b/apps/irssi/src/core/expandos.h @@ -16,6 +16,8 @@ typedef enum { typedef char* (*EXPANDO_FUNC) (SERVER_REC *server, void *item, int *free_ret); +extern const char *current_expando; + /* Create expando - overrides any existing ones. ... = signal, type, ..., NULL - list of signals that might change the value of this expando */ diff --git a/apps/irssi/src/core/network-openssl.c b/apps/irssi/src/core/network-openssl.c index b9b7b4a0..c88b5050 100644 --- a/apps/irssi/src/core/network-openssl.c +++ b/apps/irssi/src/core/network-openssl.c @@ -29,23 +29,6 @@ #include #include -/* ssl read */ -GIOError irssi_ssl_read(GIOChannel *, gchar *, guint, guint *); -/* ssl write */ -GIOError irssi_ssl_write(GIOChannel *, gchar *, guint, guint*); -/* ssl seek */ -GIOError irssi_ssl_seek(GIOChannel *, gint, GSeekType); -/* ssl close */ -void irssi_ssl_close(GIOChannel *); -#if GLIB_MAJOR_VERSION < 2 -/* ssl create watch */ -guint irssi_ssl_create_watch(GIOChannel *, gint, GIOCondition, GIOFunc, gpointer, GDestroyNotify); -#else -GSource *irssi_ssl_create_watch(GIOChannel *, GIOCondition); -#endif -/* ssl free */ -void irssi_ssl_free(GIOChannel *); - /* ssl i/o channel object */ typedef struct { @@ -56,23 +39,22 @@ typedef struct X509 *cert; } GIOSSLChannel; -/* ssl function pointers */ -GIOFuncs irssi_ssl_channel_funcs = +static void irssi_ssl_free(GIOChannel *handle) { - irssi_ssl_read, - irssi_ssl_write, - irssi_ssl_seek, - irssi_ssl_close, - irssi_ssl_create_watch, - irssi_ssl_free -}; + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + g_io_channel_unref(chan->giochan); + SSL_free(chan->ssl); + g_free(chan); +} -SSL_CTX *ssl_ctx = NULL; +#if GLIB_MAJOR_VERSION < 2 #ifdef G_CAN_INLINE G_INLINE_FUNC +#else +static #endif -gint ssl_errno(gint e) +GIOError ssl_errno(gint e) { switch(e) { @@ -85,10 +67,10 @@ gint ssl_errno(gint e) return G_IO_ERROR_INVAL; } /*UNREACH*/ - return -1; + return G_IO_ERROR_INVAL; } -gboolean irssi_ssl_cert_step(GIOSSLChannel *chan) +static GIOError irssi_ssl_cert_step(GIOSSLChannel *chan) { gint err; switch(err = SSL_do_handshake(chan->ssl)) @@ -106,10 +88,10 @@ gboolean irssi_ssl_cert_step(GIOSSLChannel *chan) return ssl_errno(errno); } /*UNREACH*/ - return -1; + return G_IO_ERROR_INVAL; } -GIOError irssi_ssl_read(GIOChannel *handle, gchar *buf, guint len, guint *ret) +static GIOError irssi_ssl_read(GIOChannel *handle, gchar *buf, guint len, guint *ret) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; gint err; @@ -138,7 +120,7 @@ GIOError irssi_ssl_read(GIOChannel *handle, gchar *buf, guint len, guint *ret) return -1; } -GIOError irssi_ssl_write(GIOChannel *handle, gchar *buf, guint len, guint *ret) +static GIOError irssi_ssl_write(GIOChannel *handle, gchar *buf, guint len, guint *ret) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; gint err; @@ -165,10 +147,10 @@ GIOError irssi_ssl_write(GIOChannel *handle, gchar *buf, guint len, guint *ret) return G_IO_ERROR_NONE; } /*UNREACH*/ - return -1; + return G_IO_ERROR_INVAL; } -GIOError irssi_ssl_seek(GIOChannel *handle, gint offset, GSeekType type) +static GIOError irssi_ssl_seek(GIOChannel *handle, gint offset, GSeekType type) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; GIOError e; @@ -176,38 +158,186 @@ GIOError irssi_ssl_seek(GIOChannel *handle, gint offset, GSeekType type) return (e == G_IO_ERROR_NONE) ? G_IO_ERROR_NONE : G_IO_ERROR_INVAL; } -void irssi_ssl_close(GIOChannel *handle) +static void irssi_ssl_close(GIOChannel *handle) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; g_io_channel_close(chan->giochan); } -#if GLIB_MAJOR_VERSION < 2 -guint irssi_ssl_create_watch(GIOChannel *handle, gint priority, GIOCondition cond, +static guint irssi_ssl_create_watch(GIOChannel *handle, gint priority, GIOCondition cond, GIOFunc func, gpointer data, GDestroyNotify notify) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; return chan->giochan->funcs->io_add_watch(handle, priority, cond, func, data, notify); } + +/* ssl function pointers */ +static GIOFuncs irssi_ssl_channel_funcs = +{ + irssi_ssl_read, + irssi_ssl_write, + irssi_ssl_seek, + irssi_ssl_close, + irssi_ssl_create_watch, + irssi_ssl_free +}; + +#else /* GLIB_MAJOR_VERSION < 2 */ + +#ifdef G_CAN_INLINE +G_INLINE_FUNC #else -GSource *irssi_ssl_create_watch(GIOChannel *handle, GIOCondition cond) +static +#endif +GIOStatus ssl_errno(gint e) +{ + switch(e) + { + case EINVAL: + return G_IO_STATUS_ERROR; + case EINTR: + case EAGAIN: + return G_IO_STATUS_AGAIN; + default: + return G_IO_STATUS_ERROR; + } + /*UNREACH*/ + return G_IO_STATUS_ERROR; +} + +static GIOStatus irssi_ssl_cert_step(GIOSSLChannel *chan) +{ + gint err; + switch(err = SSL_do_handshake(chan->ssl)) + { + case 1: + if(!(chan->cert = SSL_get_peer_certificate(chan->ssl))) + { + g_warning("SSL server supplied no certificate"); + return G_IO_STATUS_ERROR; + } + return G_IO_STATUS_NORMAL; + default: + if(SSL_get_error(chan->ssl, err) == SSL_ERROR_WANT_READ) + return G_IO_STATUS_AGAIN; + return ssl_errno(errno); + } + /*UNREACH*/ + return G_IO_STATUS_ERROR; +} + +static GIOStatus irssi_ssl_read(GIOChannel *handle, gchar *buf, guint len, guint *ret, GError **gerr) +{ + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + gint err; + + if(chan->cert == NULL) + { + gint cert_err = irssi_ssl_cert_step(chan); + if(cert_err != G_IO_STATUS_NORMAL) + return cert_err; + } + + err = SSL_read(chan->ssl, buf, len); + if(err < 0) + { + *ret = 0; + if(SSL_get_error(chan->ssl, err) == SSL_ERROR_WANT_READ) + return G_IO_STATUS_AGAIN; + return ssl_errno(errno); + } + else + { + *ret = err; + return G_IO_STATUS_NORMAL; + } + /*UNREACH*/ + return G_IO_STATUS_ERROR; +} + +static GIOStatus irssi_ssl_write(GIOChannel *handle, const gchar *buf, gsize len, gsize *ret, GError **gerr) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; + gint err; - return chan->giochan->funcs->io_create_watch(handle, cond); + if(chan->cert == NULL) + { + gint cert_err = irssi_ssl_cert_step(chan); + if(cert_err != G_IO_STATUS_NORMAL) + return cert_err; + } + + err = SSL_write(chan->ssl, (const char *)buf, len); + if(err < 0) + { + *ret = 0; + if(SSL_get_error(chan->ssl, err) == SSL_ERROR_WANT_READ) + return G_IO_STATUS_AGAIN; + return ssl_errno(errno); + } + else + { + *ret = err; + return G_IO_STATUS_NORMAL; + } + /*UNREACH*/ + return G_IO_STATUS_ERROR; } -#endif -void irssi_ssl_free(GIOChannel *handle) +static GIOStatus irssi_ssl_seek(GIOChannel *handle, gint64 offset, GSeekType type, GError **gerr) { GIOSSLChannel *chan = (GIOSSLChannel *)handle; - g_io_channel_unref(chan->giochan); - SSL_free(chan->ssl); - g_free(chan); + GIOError e; + e = g_io_channel_seek(chan->giochan, offset, type); + return (e == G_IO_ERROR_NONE) ? G_IO_STATUS_NORMAL : G_IO_STATUS_ERROR; } -gboolean irssi_ssl_init(void) +static GIOStatus irssi_ssl_close(GIOChannel *handle, GError **gerr) +{ + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + g_io_channel_close(chan->giochan); + + return G_IO_STATUS_NORMAL; +} + +static GSource *irssi_ssl_create_watch(GIOChannel *handle, GIOCondition cond) +{ + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + + return chan->giochan->funcs->io_create_watch(handle, cond); +} + +static GIOStatus irssi_ssl_set_flags(GIOChannel *handle, GIOFlags flags, GError **gerr) +{ + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + + return chan->giochan->funcs->io_set_flags(handle, flags, gerr); +} + +static GIOFlags irssi_ssl_get_flags(GIOChannel *handle) +{ + GIOSSLChannel *chan = (GIOSSLChannel *)handle; + + return chan->giochan->funcs->io_get_flags(handle); +} + +static GIOFuncs irssi_ssl_channel_funcs = { + irssi_ssl_read, + irssi_ssl_write, + irssi_ssl_seek, + irssi_ssl_close, + irssi_ssl_create_watch, + irssi_ssl_free, + irssi_ssl_set_flags, + irssi_ssl_get_flags +}; + +#endif + +static SSL_CTX *ssl_ctx = NULL; + +static gboolean irssi_ssl_init(void) { SSL_library_init(); SSL_load_error_strings(); @@ -223,7 +353,7 @@ gboolean irssi_ssl_init(void) } -GIOChannel *irssi_ssl_get_iochannel(GIOChannel *handle) +static GIOChannel *irssi_ssl_get_iochannel(GIOChannel *handle) { GIOSSLChannel *chan; GIOChannel *gchan; diff --git a/apps/irssi/src/core/special-vars.c b/apps/irssi/src/core/special-vars.c index 7291f469..f7d69728 100644 --- a/apps/irssi/src/core/special-vars.c +++ b/apps/irssi/src/core/special-vars.c @@ -113,8 +113,10 @@ static char *get_long_variable_value(const char *key, SERVER_REC *server, /* expando? */ func = expando_find_long(key); - if (func != NULL) + if (func != NULL) { + current_expando = key; return func(server, item, free_ret); + } /* internal setting? */ type = settings_get_type(key); @@ -176,7 +178,15 @@ static char *get_variable(char **cmd, SERVER_REC *server, void *item, } *free_ret = FALSE; func = expando_find_char(**cmd); - return func == NULL ? NULL : func(server, item, free_ret); + if (func == NULL) + return NULL; + else { + char str[2]; + + str[0] = **cmd; str[1] = '\0'; + current_expando = str; + return func(server, item, free_ret); + } } static char *get_history(char **cmd, void *item, int *free_ret) diff --git a/apps/irssi/src/lib-config/get.c b/apps/irssi/src/lib-config/get.c index 2df0cc90..ccc8c689 100644 --- a/apps/irssi/src/lib-config/get.c +++ b/apps/irssi/src/lib-config/get.c @@ -276,9 +276,14 @@ CONFIG_NODE *config_node_nth(CONFIG_NODE *node, int index) g_return_val_if_fail(node != NULL, NULL); g_return_val_if_fail(is_node_list(node), NULL); - for (tmp = node->value; tmp != NULL; tmp = tmp->next, index--) { - if (index == 0) - return tmp->data; + for (tmp = node->value; tmp != NULL; tmp = tmp->next) { + CONFIG_NODE *node = tmp->data; + + if (node->type != NODE_TYPE_COMMENT) { + if (index == 0) + return node; + index--; + } } return NULL; @@ -288,6 +293,8 @@ CONFIG_NODE *config_node_nth(CONFIG_NODE *node, int index) int config_node_index(CONFIG_NODE *parent, const char *key) { CONFIG_NODE *node; + GSList *tmp; + int index; g_return_val_if_fail(parent != NULL, -1); g_return_val_if_fail(key != NULL, -1); @@ -296,7 +303,18 @@ int config_node_index(CONFIG_NODE *parent, const char *key) if (node == NULL) return -1; - return g_slist_index(parent->value, node); + index = 0; + for (tmp = parent->value; tmp != NULL; tmp = tmp->next) { + CONFIG_NODE *tmpnode = tmp->data; + + if (tmpnode == node) + return index; + + if (tmpnode->type != NODE_TYPE_COMMENT) + index++; + } + + return -1; } /* Returns the first non-comment node in list */ diff --git a/apps/irssi/src/perl/Makefile.am b/apps/irssi/src/perl/Makefile.am index 2725d72d..a38ead71 100644 --- a/apps/irssi/src/perl/Makefile.am +++ b/apps/irssi/src/perl/Makefile.am @@ -81,6 +81,7 @@ common_sources = \ common/Irssi.pm \ common/Channel.xs \ common/Core.xs \ + common/Expandos.xs \ common/Ignore.xs \ common/Log.xs \ common/Masks.xs \ diff --git a/apps/irssi/src/perl/common/Irssi.xs b/apps/irssi/src/perl/common/Irssi.xs index 67d5e96c..328e32d3 100644 --- a/apps/irssi/src/perl/common/Irssi.xs +++ b/apps/irssi/src/perl/common/Irssi.xs @@ -14,16 +14,19 @@ CODE: initialized = TRUE; perl_settings_init(); + perl_expando_init(); void deinit() CODE: if (!initialized) return; + perl_expando_deinit(); perl_settings_deinit(); BOOT: irssi_boot(Channel); irssi_boot(Core); + irssi_boot(Expando); irssi_boot(Ignore); irssi_boot(Log); irssi_boot(Masks); diff --git a/apps/irssi/src/perl/common/Server.xs b/apps/irssi/src/perl/common/Server.xs index adcabb16..facf1da0 100644 --- a/apps/irssi/src/perl/common/Server.xs +++ b/apps/irssi/src/perl/common/Server.xs @@ -31,7 +31,7 @@ PPCODE: } Irssi::Connect -server_create_conn(chat_type, dest, port=6667, chatnet=NULL, password=NULL, nick=NULL) +server_create_conn(chat_type, dest, port, chatnet=NULL, password=NULL, nick=NULL) int chat_type char *dest int port diff --git a/apps/irssi/src/perl/perl-common.c b/apps/irssi/src/perl/perl-common.c index cad117fc..f7cd87da 100644 --- a/apps/irssi/src/perl/perl-common.c +++ b/apps/irssi/src/perl/perl-common.c @@ -106,13 +106,13 @@ SV *irssi_bless_iobject(int type, int chat_type, void *object) GINT_TO_POINTER(type | (chat_type << 16))); if (rec == NULL) { /* unknown iobject */ - return newSViv(GPOINTER_TO_INT(object)); + return newSViv((IV)object); } stash = gv_stashpv(rec->stash, 1); hv = newHV(); - hv_store(hv, "_irssi", 6, newSViv(GPOINTER_TO_INT(object)), 0); + hv_store(hv, "_irssi", 6, newSViv((IV)object), 0); rec->fill_func(hv, object); return sv_bless(newRV_noinc((SV*)hv), stash); } @@ -125,7 +125,7 @@ SV *irssi_bless_plain(const char *stash, void *object) fill_func = g_hash_table_lookup(plain_stashes, stash); hv = newHV(); - hv_store(hv, "_irssi", 6, newSViv(GPOINTER_TO_INT(object)), 0); + hv_store(hv, "_irssi", 6, newSViv((IV)object), 0); if (fill_func != NULL) fill_func(hv, object); return sv_bless(newRV_noinc((SV*)hv), gv_stashpv((char *)stash, 1)); @@ -298,7 +298,7 @@ void perl_server_fill_hash(HV *hv, SERVER_REC *server) hv_store(hv, "connection_lost", 15, newSViv(server->connection_lost), 0); stash = gv_stashpv("Irssi::Rawlog", 0); - hv_store(hv, "rawlog", 6, sv_bless(newRV_noinc(newSViv(GPOINTER_TO_INT(server->rawlog))), stash), 0); + hv_store(hv, "rawlog", 6, sv_bless(newRV_noinc(newSViv((IV)server->rawlog)), stash), 0); hv_store(hv, "version", 7, new_pv(server->version), 0); hv_store(hv, "away_reason", 11, new_pv(server->away_reason), 0); diff --git a/apps/irssi/src/perl/perl-signals.c b/apps/irssi/src/perl/perl-signals.c index 3c423a64..6dcde221 100644 --- a/apps/irssi/src/perl/perl-signals.c +++ b/apps/irssi/src/perl/perl-signals.c @@ -97,7 +97,7 @@ static void perl_call_signal(PERL_SCRIPT_REC *script, SV *func, if (strcmp(rec->args[n], "string") == 0) perlarg = new_pv(arg); else if (strcmp(rec->args[n], "int") == 0) - perlarg = newSViv(GPOINTER_TO_INT(arg)); + perlarg = newSViv((IV)arg); else if (strcmp(rec->args[n], "ulongptr") == 0) perlarg = newSViv(*(unsigned long *) arg); else if (strcmp(rec->args[n], "intptr") == 0) diff --git a/apps/irssi/src/perl/textui/Statusbar.xs b/apps/irssi/src/perl/textui/Statusbar.xs index 67b88e40..522a93ee 100644 --- a/apps/irssi/src/perl/textui/Statusbar.xs +++ b/apps/irssi/src/perl/textui/Statusbar.xs @@ -31,6 +31,7 @@ void perl_statusbar_init(void) static void statusbar_item_def_destroy(void *key, void *value) { + statusbar_item_unregister(key); g_free(key); g_free(value); } diff --git a/apps/irssi/src/perl/ui/Formats.xs b/apps/irssi/src/perl/ui/Formats.xs index 42376f8a..11a2951c 100644 --- a/apps/irssi/src/perl/ui/Formats.xs +++ b/apps/irssi/src/perl/ui/Formats.xs @@ -1,6 +1,6 @@ #include "module.h" -static int magic_free_text_dest(SV *sv, MAGIC *mg) +static int magic_free_text_dest(pTHX_ SV *sv, MAGIC *mg) { TEXT_DEST_REC *dest = (TEXT_DEST_REC *) mg->mg_ptr; g_free((char *) dest->target);