diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-04-22 21:59:50 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-04-22 21:59:50 +0200 |
commit | f2a2206e49627f81918df89ef682d56736177ad6 (patch) | |
tree | d7e3b4d1fae4ea8543c94575c027878a8e5612ca /degesch.c | |
parent | a7ccdc78bec660f8173a31242ccad029018f9b6f (diff) | |
download | xK-f2a2206e49627f81918df89ef682d56736177ad6.tar.gz xK-f2a2206e49627f81918df89ef682d56736177ad6.tar.xz xK-f2a2206e49627f81918df89ef682d56736177ad6.zip |
degesch: parse user@host from RPL_WELCOME
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -2256,6 +2256,39 @@ irc_handler_cmp_by_name (const void *a, const void *b) return strcasecmp_ascii (first->name, second->name); } +static bool +irc_try_parse_word_for_userhost (struct app_context *ctx, const char *word) +{ + regex_t re; + int err = regcomp (&re, "^[^!@]+!([^!@]+@[^!@]+)$", REG_EXTENDED); + if (!soft_assert (!err)) + return false; + + regmatch_t matches[2]; + bool result = false; + if (!regexec (&re, word, 2, matches, 0)) + { + free (ctx->irc_user_host); + ctx->irc_user_host = xstrndup (word + matches[1].rm_so, + matches[1].rm_eo - matches[1].rm_so); + result = true; + } + regfree (&re); + return result; +} + +static void +irc_try_parse_welcome_for_userhost (struct app_context *ctx, const char *m) +{ + struct str_vector v; + str_vector_init (&v); + split_str_ignore_empty (m, ' ', &v); + for (size_t i = 0; i < v.len; i++) + if (irc_try_parse_word_for_userhost (ctx, v.vector[i])) + break; + str_vector_free (&v); +} + static void irc_process_numeric (struct app_context *ctx, const struct irc_message *msg, unsigned long numeric) @@ -2279,6 +2312,11 @@ irc_process_numeric (struct app_context *ctx, switch (numeric) { + case IRC_RPL_WELCOME: + // We still issue a USERHOST anyway as this is in general unreliable + if (msg->params.len == 1) + irc_try_parse_welcome_for_userhost (ctx, msg->params.vector[0]); + break; case IRC_RPL_ISUPPORT: // TODO: parse this, mainly PREFIX; see // http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt |