Merged latest from irssi.org CVS.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 28 Oct 2002 19:58:51 +0000 (19:58 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 28 Oct 2002 19:58:51 +0000 (19:58 +0000)
13 files changed:
CHANGES
apps/irssi/src/core/expandos.c
apps/irssi/src/core/expandos.h
apps/irssi/src/core/network-openssl.c
apps/irssi/src/core/special-vars.c
apps/irssi/src/lib-config/get.c
apps/irssi/src/perl/Makefile.am
apps/irssi/src/perl/common/Irssi.xs
apps/irssi/src/perl/common/Server.xs
apps/irssi/src/perl/perl-common.c
apps/irssi/src/perl/perl-signals.c
apps/irssi/src/perl/textui/Statusbar.xs
apps/irssi/src/perl/ui/Formats.xs

diff --git a/CHANGES b/CHANGES
index e367886ead5ca43720d48437bfeb5615313529f7..cc84c3de637f3125b31aeed81783b0fdcf76b088 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,8 @@ Mon Oct 28 21:23:39 EET 2002  Pekka Riikonen <priikone@silcnet.org>
          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 <priikone@silcnet.org>
 
        * Merged c0ffee's /set heartbeat patch to Irssi SILC client.
index 8f97836a69ee3e1555a2d8f67023b18d78ddc21b..7ebc4f208db1022c55b55b83a95aa43b211a4edb 100644 (file)
@@ -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];
index cf057994e7c814f2c7c200a7b8613713fb82361b..45608a264984c194a062ed858f50f107115a5eb4 100644 (file)
@@ -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 */
index b9b7b4a019c5a9614d5d6057b6d55049a2b1a522..c88b5050de51a36d14dfbdb25017ce31a4c25744 100644 (file)
 #include <openssl/ssl.h>
 #include <openssl/err.h>
 
-/* 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;
index 7291f469a7e94f2f87302e600104d82c5ac29141..f7d69728c466d4fe41c60d02f2506d0c233cef72 100644 (file)
@@ -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)
index 2df0cc901a6690e98db2ae306f563191fc5b55e7..ccc8c689a6cba07e3ae40361ce979bbc7c65b844 100644 (file)
@@ -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 */
index 2725d72d0fbcbaf278e8520c8cd97ceeeef78193..a38ead71df556051e164552afc462d462091c31f 100644 (file)
@@ -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 \
index 67d5e96cda6911a2985635918cedb75b10ebc7f7..328e32d33e0d70f86a01bc542dca20e3094ea1c2 100644 (file)
@@ -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);
index adcabb162d48515c20ab3c3084efeb253eef52b6..facf1da0084f01b37327bc13ca4825b9159d3c3b 100644 (file)
@@ -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
index cad117fcdd1e8abe06aa4ea56c57a8bbbf81d70f..f7cd87da8f2a4060b2b05c7b2da3fce5e0ab0075 100644 (file)
@@ -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);
index 3c423a648e48a4de7902f8d41696c51030f66adc..6dcde221143e936c86d2d99bd63c3ce3c3d88f0e 100644 (file)
@@ -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)
index 67b88e40ab509d0ed2ad604653393aef14bf1850..522a93ee6eadb5e83ceb736f0b9844bd87407bc0 100644 (file)
@@ -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);
 }
index 42376f8a64652788f302917c18700931097db871..11a2951c32832d550f9701435d7bf5e51881fc1c 100644 (file)
@@ -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);