Mercurial > irccd
diff irccdctl/main.c @ 956:5e682f1cebcc
irccd: improve SSL support and add basic whois
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 21 Jan 2021 09:49:42 +0100 |
parents | ab43ba409f9d |
children | 533639ec5e9c |
line wrap: on
line diff
--- a/irccdctl/main.c Wed Jan 20 17:01:51 2021 +0100 +++ b/irccdctl/main.c Thu Jan 21 09:49:42 2021 +0100 @@ -51,9 +51,10 @@ while (!(nl = strstr(in, "\n"))) { char buf[IRC_BUF_MAX] = {0}; + ssize_t nr; - if (recv(sock, buf, sizeof (buf) - 1, 0) <= 0) - err(1, "abort"); + if ((nr = recv(sock, buf, sizeof (buf) - 1, 0)) <= 0) + errc(1, nr == 0 ? ECONNRESET : errno, "abort"); if (strlcat(in, buf, sizeof (in)) >= sizeof (in)) errc(1, EMSGSIZE, "abort"); } @@ -236,16 +237,80 @@ } static void +show_connect(char *line) +{ + const char *args[2] = {0}; + + if (irc_util_split(line, args, 2) == 2) { + printf("event: onConnect\n"); + printf("server: %s\n", args[0]); + } +} + +static void +show_disconnect(char *line) +{ + const char *args[2] = {0}; + + if (irc_util_split(line, args, 2) == 2) { + printf("event: onDisonnect\n"); + printf("server: %s\n", args[0]); + } +} + +static void show_invite(char *line) { const char *args[5] = {0}; if (irc_util_split(line, args, 5) == 5) { printf("event: onInvite\n"); - printf("server: %s", args[1]); - printf("origin: %s", args[2]); - printf("channel: %s", args[3]); - printf("nickname: %s", args[4]); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("nickname: %s\n", args[4]); + } +} + +static void +show_join(char *line) +{ + const char *args[4] = {0}; + + if (irc_util_split(line, args, 4) == 4) { + printf("event: onJoin\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + } +} + +static void +show_kick(char *line) +{ + const char *args[6] = {0}; + + if (irc_util_split(line, args, 6) >= 5) { + printf("event: onKick\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("target: %s\n", args[4]); + printf("reason: %s\n", args[5] ? args[5] : ""); + } +} + +static void +show_me(char *line) +{ + const char *args[5] = {0}; + + if (irc_util_split(line, args, 5) == 5) { + printf("event: onMe\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("message: %s\n", args[4]); } } @@ -263,12 +328,114 @@ } } +static void +show_mode(char *line) +{ + const char *args[8] = {0}; + + if (irc_util_split(line, args, 8) >= 5) { + printf("event: onMode\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("mode: %s\n", args[4]); + printf("limit: %s\n", (args[5] ? args[5] : "")); + printf("user: %s\n", (args[6] ? args[6] : "")); + printf("mask: %s\n", (args[7] ? args[7] : "")); + } +} + +static void +show_nick(char *line) +{ + const char *args[4] = {0}; + + if (irc_util_split(line, args, 4) == 4) { + printf("event: onNick\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("nickname: %s\n", args[3]); + } +} + +static void +show_notice(char *line) +{ + const char *args[5] = {0}; + + if (irc_util_split(line, args, 5) == 5) { + printf("event: onNotice\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("message: %s\n", args[4]); + } +} + +static void +show_part(char *line) +{ + const char *args[5] = {0}; + + if (irc_util_split(line, args, 5) >= 4) { + printf("event: onPart\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("reason: %s\n", (args[4] ? args[4] : "")); + } +} + +static void +show_topic(char *line) +{ + const char *args[5] = {0}; + + if (irc_util_split(line, args, 5) >= 4) { + printf("event: onTopic\n"); + printf("server: %s\n", args[1]); + printf("origin: %s\n", args[2]); + printf("channel: %s\n", args[3]); + printf("topic: %s\n", args[4]); + } +} + +static void +show_whois(char *line) +{ + const char *args[6] = {0}; + char *p, *token; + + if (irc_util_split(line, args, 6) >= 4) { + printf("event: onWhois\n"); + printf("server: %s\n", args[1]); + printf("nickname: %s\n", args[2]); + printf("username: %s\n", args[3]); + printf("hostname: %s\n", args[4]); + printf("username: %s\n", args[5]); + printf("channels: "); + + + } +} + static const struct { const char *event; void (*show)(char *); } watchtable[] = { - { "EVENT-INVITE", show_invite }, - { "EVENT-MESSAGE", show_message } + { "EVENT-CONNECT", show_connect }, + { "EVENT-DISCONNECT", show_disconnect }, + { "EVENT-INVITE", show_invite }, + { "EVENT-JOIN", show_join }, + { "EVENT-KICK", show_kick }, + { "EVENT-MESSAGE", show_message }, + { "EVENT-ME", show_me }, + { "EVENT-MODE", show_mode }, + { "EVENT-NICK", show_nick }, + { "EVENT-NOTICE", show_notice }, + { "EVENT-PART", show_part }, + { "EVENT-TOPIC", show_topic }, + { "EVENT-WHOIS", show_whois } }; static void @@ -277,6 +444,7 @@ for (size_t i = 0; i < IRC_UTIL_SIZE(watchtable); ++i) { if (strncmp(watchtable[i].event, ev, strlen(watchtable[i].event)) == 0) { watchtable[i].show(ev); + printf("\n"); break; } }