From eba198a2441fbb5e1f6316919083e8bfadb69132 Mon Sep 17 00:00:00 2001 From: Egor Date: Sun, 15 Jun 2025 10:57:48 +0300 Subject: [PATCH] irc: use a macro for command matching --- src/irc.cpp | 80 ++++++++++++++++++++++++++++------------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/irc.cpp b/src/irc.cpp index c32f144..24dfaad 100644 --- a/src/irc.cpp +++ b/src/irc.cpp @@ -235,17 +235,18 @@ static void cont_pass(Client *client, int res) { newUser(client); } } +#define MATCH_COMMAND(s) else if(strcmp(command, s) == 0) int irc_process_line(Client *client, char *source, char *command, int argc, char *args[]) { (void)source; databuf.clear(); - if(strcmp(command, "") == 0) { + if (command[0] == '\0') { return 0; - } else if(strcmp(command, "PING") == 0) { + } MATCH_COMMAND("PING") { if (!args[0]) return err_needmoreparams(client, command), sendbuf(client), 0; msg_pong(args[0]); sendbuf(client); - } else if(strcmp(command, "CAP") == 0) { + } MATCH_COMMAND("CAP") { static const struct cap { const char *name; unsigned caps; @@ -321,7 +322,7 @@ int irc_process_line(Client *client, char *source, char *command, int argc, char // FIXME: error 410 goto unknown; } - } else if(strcmp(command, "AUTHENTICATE") == 0) { + } MATCH_COMMAND("AUTHENTICATE") { if (!args[0]) return err_needmoreparams(client, command), sendbuf(client), 0; if (client->username && client->username[0] != '~') @@ -447,7 +448,7 @@ saslcleanup: return 0; } } - } else if(strcmp(command, "NICK") == 0) { + } MATCH_COMMAND("NICK") { // User now registered if (!args[0]) return err_needmoreparams(client, command), sendbuf(client), 0; @@ -460,7 +461,7 @@ saslcleanup: abortf("strdup fail (nick_reg)\n"); newUser(client); } - } else if(strcmp(command, "USER") == 0) { + } MATCH_COMMAND("USER") { if (argc < 4) return err_needmoreparams(client, command), sendbuf(client), 0; if (is_registered(client)) @@ -477,7 +478,7 @@ saslcleanup: abortf("strdup fail (realname)\n"); // proceed with registration newUser(client); - } else if(strcmp(command, "PASS") == 0) { + } MATCH_COMMAND("PASS") { if (is_registered(client)) return err_alreadyregistered(client), sendbuf(client), 0; if (client->umode & UMODE_REGISTERED || client->passwait) @@ -492,7 +493,7 @@ saslcleanup: memset(args[0], 0, strlen(args[0])); if (!client->pass_reg) abortf("strdup fail (pass_reg)\n"); - } else if(strcmp(command, "WEBIRC") == 0) { + } MATCH_COMMAND("WEBIRC") { if (is_registered(client)) return err_alreadyregistered(client), sendbuf(client), 0; if (argc < 4) @@ -514,7 +515,7 @@ saslcleanup: job_password_check(client, args[1], args[0], getdatafile("webirc.txt"), cont_webirc); memset(args[0], 0, strlen(args[0])); } - } else if(strcmp(command, "OPER") == 0) { + } MATCH_COMMAND("OPER") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc < 2) @@ -522,7 +523,7 @@ saslcleanup: stringlower(args[0]); job_password_check(client, args[0], args[1], getdatafile("ops.txt"), cont_oper); memset(args[1], 0, strlen(args[1])); - } else if(strcmp(command, "NEWACC") == 0) { + } MATCH_COMMAND("NEWACC") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc < 2) @@ -540,7 +541,7 @@ saslcleanup: msg_notice_server(hostname, client->nick, "Your information has been recorded. Contact IRCops for assistance with registration."); sendbuf(client); - } else if(strcmp(command, "GHOST") == 0) { + } MATCH_COMMAND("GHOST") { if (!(client->umode & UMODE_REGISTERED)) return 0; // FIXME: error message const char *desired_nick = client->username; @@ -559,7 +560,7 @@ saslcleanup: if (client == cl) return err_nicknameinuse(client, desired_nick), sendbuf(client), 0; killConnection(cl, 0); - } else if(strcmp(command, "WALLOPS") == 0) { + } MATCH_COMMAND("WALLOPS") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc < 1) @@ -570,7 +571,7 @@ saslcleanup: for (auto cl : client_map) if (cl->umode & UMODE_WALLOPS) sendbuf(cl); - } else if(strcmp(command, "KILL") == 0) { + } MATCH_COMMAND("KILL") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!(client->umode & UMODE_OPER)) @@ -588,7 +589,7 @@ saslcleanup: sendbuf(cl2); // FIXME: add appropraite QUIT message killConnection(cl, 0); - } else if(strcmp(command, "JEDGAR") == 0) { + } MATCH_COMMAND("JEDGAR") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!(client->umode & UMODE_OPER)) @@ -603,7 +604,7 @@ saslcleanup: chan->o.add(client); copy_strf(&databuf, ":cia!cia@cia.gov MODE %s +o %s\r\n", chan->name, client->nick); sendbuf_chan(chan); - } else if(strcmp(command, "JOIN") == 0) { + } MATCH_COMMAND("JOIN") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!args[0]) @@ -624,7 +625,7 @@ saslcleanup: *q++ = '\0'; channel_join(client, channel, key); } while (p); - } else if(strcmp(command, "PART") == 0) { + } MATCH_COMMAND("PART") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!args[0]) @@ -639,7 +640,7 @@ saslcleanup: return err_nosuchchannel(client, args[0]), sendbuf(client), 0; channel_part(client, chan, args[1] ? args[1] : "", NULL); } while (p); - } else if(strcmp(command, "TOPIC") == 0) { + } MATCH_COMMAND("TOPIC") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!args[0]) @@ -656,7 +657,7 @@ saslcleanup: return 0; // FIXME: error 482 channel_topic(client, chan, args[1], client->nick, get_time()); } - } else if(strcmp(command, "INVITE") == 0) { + } MATCH_COMMAND("INVITE") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (!args[0]) { @@ -689,7 +690,7 @@ saslcleanup: msg_invite(client, cl, chan); sendbuf(cl); sendbuf_chan_caps(chan, CAP_INVITENOTIFY, 0); - } else if(strcmp(command, "KICK") == 0) { + } MATCH_COMMAND("KICK") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc < 2) @@ -712,7 +713,10 @@ saslcleanup: else channel_part(cl, chan, args[2], client); } while (p); - } else if(strcmp(command, "PRIVMSG") == 0 || strcmp(command, "NOTICE") == 0) { + } MATCH_COMMAND("PRIVMSG") { + goto privmsg_notice_common; + } MATCH_COMMAND("NOTICE") { +privmsg_notice_common: if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc < 2) @@ -784,22 +788,22 @@ saslcleanup: if (cl->away) rpl_away(client, cl), sendbuf(client); } - } else if(strcmp(command, "QUIT") == 0) { + } MATCH_COMMAND("QUIT") { msg_quit(client, "Quit: ", args[0] ? args[0] : ""); sendbuf_visible(client); killConnection(client, 1); return 1; - } else if(strcmp(command, "PONG") == 0) { + } MATCH_COMMAND("PONG") { // Do nothing // Server Queries and Commands - } else if(strcmp(command, "MOTD") == 0) { + } MATCH_COMMAND("MOTD") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (args[0] && strcmp(args[0], hostname) != 0) return err_nosuchserver(client, args[0]), sendbuf(client), 0; // Send welcome sendMOTD(client); - } else if(strcmp(command, "HELP") == 0) { + } MATCH_COMMAND("HELP") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; char line[512]; @@ -817,14 +821,14 @@ saslcleanup: } else { err_helpnotfound(client), sendbuf(client); } - } else if(strcmp(command, "VERSION") == 0) { + } MATCH_COMMAND("VERSION") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (args[0] && strcmp(args[0], hostname) != 0) return err_nosuchserver(client, args[0]), sendbuf(client), 0; rpl_version(client, PACKAGE_VERSION, PACKAGE_STRING), sendbuf(client); rpl_isupport(client), sendbuf(client); - } else if(strcmp(command, "ADMIN") == 0) { + } MATCH_COMMAND("ADMIN") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (args[0] && strcmp(args[0], hostname) != 0) @@ -854,17 +858,17 @@ saslcleanup: } else { goto unknown; } - } else if(strcmp(command, "LUSERS") == 0) { + } MATCH_COMMAND("LUSERS") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; sendLUSERS(client); - } else if(strcmp(command, "TIME") == 0) { + } MATCH_COMMAND("TIME") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (args[0] && strcmp(args[0], hostname) != 0) return err_nosuchserver(client, args[0]), sendbuf(client), 0; rpl_time(client, get_time()), sendbuf(client); - } else if(strcmp(command, "MODE") == 0) { + } MATCH_COMMAND("MODE") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -982,7 +986,7 @@ saslcleanup: channel_mode(client, chan, args+1); } } - } else if(strcmp(command, "LIST") == 0) { + } MATCH_COMMAND("LIST") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; rpl_liststart(client), sendbuf(client); @@ -990,7 +994,7 @@ saslcleanup: if (client->umode & UMODE_OPER || !(chan->dmode & DMODE_SECRET) || chan->members.has(client)) rpl_list(client, chan), sendbuf(client); rpl_listend(client), sendbuf(client); - } else if(strcmp(command, "NAMES") == 0) { + } MATCH_COMMAND("NAMES") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1008,7 +1012,7 @@ saslcleanup: sendbuf(client); } } while (p); - } else if(strcmp(command, "USERHOST") == 0) { + } MATCH_COMMAND("USERHOST") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1024,7 +1028,7 @@ saslcleanup: rpl_userhost(client, cls, (int)(p - cls)); sendbuf(client); // User-Based Queries - } else if(strcmp(command, "WHO") == 0) { + } MATCH_COMMAND("WHO") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1059,7 +1063,7 @@ saslcleanup: } } rpl_endofwho(client, args[0]), sendbuf(client); - } else if(strcmp(command, "WHOIS") == 0) { + } MATCH_COMMAND("WHOIS") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1102,7 +1106,7 @@ saslcleanup: err_nosuchnick(client, nick); sendbuf(client); } - } else if(strcmp(command, "AWAY") == 0) { + } MATCH_COMMAND("AWAY") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (args[0]) { @@ -1119,7 +1123,7 @@ saslcleanup: msg_away(client); int cookie = sendbuf_visible_caps(client, CAP_AWAYNOTIFY, 0); sendbuf_monitor(client->key, cookie, CAP_AWAYNOTIFY|CAP_EXTENDEDMONITOR, 0); - } else if(strcmp(command, "MONITOR") == 0) { + } MATCH_COMMAND("MONITOR") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1186,7 +1190,7 @@ saslcleanup: default: return err_needmoreparams(client, command), sendbuf(client), 0; /* FIXME: wrong error */ } - } else if(strcmp(command, "SETNAME") == 0) { + } MATCH_COMMAND("SETNAME") { if (!is_registered(client)) return err_notregistered(client), sendbuf(client), 0; if (argc == 0) @@ -1199,7 +1203,7 @@ saslcleanup: if (client->cookie != cookie) sendbuf(client); #ifdef HAVE_LUA - } else if(strcmp(command, "LUA") == 0) { + } MATCH_COMMAND("LUA") { if (argc < 1) return err_needmoreparams(client, command), sendbuf(client), 0; return admin_command(client, source, args[0], argc-1, args+1); -- 2.56.0