diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2014-08-05 23:08:29 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2014-08-05 23:08:29 +0200 |
commit | 68303ed788d3f92acc1bdf6798ab727228e0a190 (patch) | |
tree | 7f1466835de15edff6f6241613b165055669578b /src/kike.c | |
parent | 9b2b3844e2e8f8ff1f22fc0fcb804615214f9a7a (diff) | |
download | xK-68303ed788d3f92acc1bdf6798ab727228e0a190.tar.gz xK-68303ed788d3f92acc1bdf6798ab727228e0a190.tar.xz xK-68303ed788d3f92acc1bdf6798ab727228e0a190.zip |
kike: fix wildcard matching
It wasn't IRC case-insensitive.
Diffstat (limited to 'src/kike.c')
-rw-r--r-- | src/kike.c | 29 |
1 files changed, 18 insertions, 11 deletions
@@ -507,6 +507,17 @@ irc_get_text (struct server_context *ctx, int id, const char *def) return catgets (ctx->catalog, 1, id, def); } +static int +irc_fnmatch (const char *pattern, const char *string) +{ + size_t pattern_size = strlen (pattern) + 1; + size_t string_size = strlen (string) + 1; + char x_pattern[pattern_size], x_string[string_size]; + irc_strxfrm (x_pattern, pattern, pattern_size); + irc_strxfrm (x_string, string, string_size); + return fnmatch (x_pattern, x_string, 0); +} + // --- Channels ---------------------------------------------------------------- static struct channel_user * @@ -709,20 +720,16 @@ irc_close_link (struct client *c, const char *reason) static bool client_in_mask_list (const struct client *c, const struct str_vector *mask) { - struct str client; - str_init (&client); - str_append_printf (&client, "%s!%s@%s", + char *client = xstrdup_printf ("%s!%s@%s", c->nickname, c->username, c->hostname); - irc_strxfrm (client.str, client.str, client.len); bool result = false; for (size_t i = 0; i < mask->len; i++) - // FIXME: irc_strxfrm() for the mask (save in canonical format?) - if (!fnmatch (client.str, mask->vector[i], 0)) + if (!irc_fnmatch (client, mask->vector[i])) { result = true; break; } - str_free (&client); + free (client); return result; } @@ -1507,10 +1514,10 @@ irc_match_send_rpl_whoreply (struct client *c, struct client *target, if ((target->mode & IRC_USER_MODE_INVISIBLE) && !is_roommate) return; - if (fnmatch (mask, target->hostname, 0) - && fnmatch (mask, target->nickname, 0) - && fnmatch (mask, target->realname, 0) - && fnmatch (mask, c->ctx->server_name, 0)) + if (irc_fnmatch (mask, target->hostname) + && irc_fnmatch (mask, target->nickname) + && irc_fnmatch (mask, target->realname) + && irc_fnmatch (mask, c->ctx->server_name)) return; // Try to find a channel they're on that's visible to us |