mirror of
https://github.com/irssi/irssi.git
synced 2025-02-02 15:08:01 -05:00
fixes for isupport-draft-incompatible servers sending 005 events..
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3223 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
ca62a55590
commit
dae4b7e2dd
@ -165,8 +165,8 @@ static void server_init(IRC_SERVER_REC *server)
|
|||||||
(GCompareFunc) g_istr_equal);
|
(GCompareFunc) g_istr_equal);
|
||||||
|
|
||||||
/* set the standards */
|
/* set the standards */
|
||||||
g_hash_table_insert(server->isupport, "CHANMODES", "beI,k,l,imnpst");
|
g_hash_table_insert(server->isupport, g_strdup("CHANMODES"), g_strdup("beI,k,l,imnpst"));
|
||||||
g_hash_table_insert(server->isupport, "PREFIX", "(ohv)@%+");
|
g_hash_table_insert(server->isupport, g_strdup("PREFIX"), g_strdup("(ohv)@%+"));
|
||||||
|
|
||||||
server->cmdcount = 0;
|
server->cmdcount = 0;
|
||||||
}
|
}
|
||||||
@ -313,11 +313,9 @@ static void sig_disconnected(IRC_SERVER_REC *server)
|
|||||||
g_slist_free(server->cmdqueue);
|
g_slist_free(server->cmdqueue);
|
||||||
server->cmdqueue = NULL;
|
server->cmdqueue = NULL;
|
||||||
|
|
||||||
if (server->isupport_sent) {
|
/* these are dynamically allocated only if isupport was sent */
|
||||||
/* these are dynamically allocated only if isupport was sent */
|
g_hash_table_foreach(server->isupport,
|
||||||
g_hash_table_foreach(server->isupport,
|
(GHFunc) isupport_destroy_hash, server);
|
||||||
(GHFunc) isupport_destroy_hash, server);
|
|
||||||
}
|
|
||||||
g_hash_table_destroy(server->isupport);
|
g_hash_table_destroy(server->isupport);
|
||||||
server->isupport = NULL;
|
server->isupport = NULL;
|
||||||
|
|
||||||
@ -596,15 +594,11 @@ static void parse_prefix(IRC_SERVER_REC *server, const char *sptr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean hash_clear(gpointer key, gpointer value, gpointer user_data)
|
|
||||||
{
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
||||||
{
|
{
|
||||||
char **item, *sptr, *eptr;
|
char **item, *sptr, *eptr;
|
||||||
char **isupport;
|
char **isupport;
|
||||||
|
gpointer key, value;
|
||||||
|
|
||||||
g_return_if_fail(server != NULL);
|
g_return_if_fail(server != NULL);
|
||||||
|
|
||||||
@ -615,14 +609,10 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
|||||||
return;
|
return;
|
||||||
sptr++;
|
sptr++;
|
||||||
|
|
||||||
/* remove defaults */
|
|
||||||
g_hash_table_foreach_remove(server->isupport, hash_clear, NULL);
|
|
||||||
|
|
||||||
isupport = g_strsplit(sptr, " ", -1);
|
isupport = g_strsplit(sptr, " ", -1);
|
||||||
|
|
||||||
for(item = isupport; *item != NULL; item++) {
|
for(item = isupport; *item != NULL; item++) {
|
||||||
int removed = FALSE;
|
int removed = FALSE;
|
||||||
gpointer key = NULL, value = NULL;
|
|
||||||
|
|
||||||
if (**item == ':')
|
if (**item == ':')
|
||||||
break;
|
break;
|
||||||
@ -639,6 +629,7 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
|||||||
eptr++;
|
eptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
key = value = NULL;
|
||||||
if (!g_hash_table_lookup_extended(server->isupport, eptr,
|
if (!g_hash_table_lookup_extended(server->isupport, eptr,
|
||||||
&key, &value) && removed)
|
&key, &value) && removed)
|
||||||
continue;
|
continue;
|
||||||
@ -663,7 +654,21 @@ static void event_isupport(IRC_SERVER_REC *server, const char *data)
|
|||||||
parse_chanmodes(server, sptr);
|
parse_chanmodes(server, sptr);
|
||||||
|
|
||||||
/* This is after chanmode because some servers define modes in both */
|
/* This is after chanmode because some servers define modes in both */
|
||||||
if ((sptr = g_hash_table_lookup(server->isupport, "PREFIX")) == NULL) {
|
if (g_hash_table_lookup_extended(server->isupport, "PREFIX",
|
||||||
|
&key, &value)) {
|
||||||
|
sptr = value;
|
||||||
|
if (*sptr != '(') {
|
||||||
|
/* server incompatible with isupport draft */
|
||||||
|
g_hash_table_remove(server->isupport, key);
|
||||||
|
g_free(key);
|
||||||
|
g_free(value);
|
||||||
|
sptr = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sptr = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sptr == NULL) {
|
||||||
sptr = g_strdup("(ohv)@%+");
|
sptr = g_strdup("(ohv)@%+");
|
||||||
g_hash_table_insert(server->isupport, g_strdup("PREFIX"), sptr);
|
g_hash_table_insert(server->isupport, g_strdup("PREFIX"), sptr);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user