xin/pkgs/icbirc.diff
2022-08-25 12:21:35 -06:00

213 lines
6.3 KiB
Diff

diff --git a/Makefile b/Makefile
index 60b96d5..d894cc9 100644
--- a/Makefile
+++ b/Makefile
@@ -4,6 +4,7 @@ PROG= icbirc
SRCS= icbirc.c icb.c irc.c
MAN= icbirc.8
-CFLAGS+= -Wall -Werror -Wstrict-prototypes -ansi
+CFLAGS+= -Wall -Wstrict-prototypes -std=gnu99
+LDFLAGS+= -lbsd
.include <bsd.prog.mk>
diff --git a/irc.c b/irc.c
index 239b7eb..2cb47c7 100644
--- a/irc.c
+++ b/irc.c
@@ -42,7 +42,7 @@ extern void scan(const char **, char *, size_t, const char *,
const char *);
extern int sync_write(int, const char *, int);
-static void irc_cmd(const char *, int, int);
+static void irc_cmd(char *, int, int);
static void irc_send_pong(int, const char *);
@@ -93,44 +93,55 @@ irc_recv(const char *buf, unsigned len, int client_fd, int server_fd)
}
static void
-irc_cmd(const char *cmd, int client_fd, int server_fd)
+irc_cmd(char *cmd, int client_fd, int server_fd)
{
- if (!strncasecmp(cmd, "PASS ", 5)) {
- cmd += 5;
- scan(&cmd, irc_pass, sizeof(irc_pass), " ", " ");
- } else if (!strncasecmp(cmd, "USER ", 5)) {
- cmd += 5;
- scan(&cmd, irc_ident, sizeof(irc_ident), " ", " ");
+ if (!strncasecmp(cmd, "RAWICB ", 7)) {
+ icb_send_raw(server_fd, cmd + 7);
+ return;
+ }
+
+ char *argv[10], *p;
+ int argc = 1;
+
+ for (p = cmd, argv[0] = p; argc < 10 && (p = strchr(p, ' ')) != NULL;
+ argc++) {
+ *p = 0;
+ p++;
+ while (*p == ' ')
+ p++;
+ if (*p == ':') {
+ argv[argc] = p + 1;
+ argc++;
+ break;
+ }
+ argv[argc] = p;
+ }
+
+ if (!strcasecmp(argv[0], "PASS")) {
+ strlcpy(irc_pass, argv[1], sizeof(irc_pass));
+ } else if (!strcasecmp(argv[0], "USER")) {
+ strlcpy(irc_ident, argv[1], sizeof(irc_ident));
if (!icb_logged_in && irc_nick[0] && irc_ident[0])
icb_send_login(server_fd, irc_nick,
irc_ident, irc_pass);
- } else if (!strncasecmp(cmd, "NICK ", 5)) {
- cmd += 5;
- scan(&cmd, irc_nick, sizeof(irc_nick), " ", " ");
+ } else if (!strcasecmp(argv[0], "NICK")) {
+ strlcpy(irc_nick, argv[1], sizeof(irc_nick));
if (icb_logged_in)
icb_send_name(server_fd, irc_nick);
else if (irc_nick[0] && irc_ident[0])
icb_send_login(server_fd, irc_nick,
irc_ident, irc_pass);
- } else if (!strncasecmp(cmd, "JOIN ", 5)) {
- char group[128];
-
- cmd += 5;
- if (*cmd == '#')
- cmd++;
- scan(&cmd, group, sizeof(group), " ", " ");
- icb_send_group(server_fd, group);
- } else if (!strncasecmp(cmd, "PART ", 5)) {
+ } else if (!strcasecmp(argv[0], "JOIN")) {
+ icb_send_group(server_fd,
+ argv[1] + (argv[1][0] == '#' ? 1 : 0));
+ } else if (!strcasecmp(argv[0], "PART")) {
in_irc_channel = 0;
- } else if (!strncasecmp(cmd, "PRIVMSG ", 8) ||
- !strncasecmp(cmd, "NOTICE ", 7)) {
- char dst[128];
+ } else if (!strcasecmp(argv[0], "PRIVMSG") ||
+ !strcasecmp(argv[0], "NOTICE")) {
char msg[8192];
unsigned i, j;
- cmd += strncasecmp(cmd, "NOTICE ", 7) ? 8 : 7;
- scan(&cmd, dst, sizeof(dst), " ", " ");
- scan(&cmd, msg, sizeof(msg), " ", "");
+ strlcpy(msg, argv[2], sizeof(msg));
/* strip \001 found in CTCP messages */
i = 0;
while (msg[i]) {
@@ -141,73 +152,52 @@ irc_cmd(const char *cmd, int client_fd, int server_fd)
} else
i++;
}
- if (!strcmp(dst, irc_channel))
- icb_send_openmsg(server_fd,
- msg + (msg[0] == ':' ? 1 : 0));
+ if (!strcmp(argv[1], irc_channel))
+ icb_send_openmsg(server_fd, msg);
else
- icb_send_privmsg(server_fd, dst,
- msg + (msg[0] == ':' ? 1 : 0));
- } else if (!strncasecmp(cmd, "MODE ", 5)) {
- cmd += 5;
- if (!strcmp(cmd, irc_channel))
+ icb_send_privmsg(server_fd, argv[1], msg);
+ } else if (!strcasecmp(argv[0], "MODE")) {
+ if (strcmp(argv[1], irc_channel))
+ return;
+ if (argc == 2)
icb_send_names(server_fd, irc_channel);
- else if (!strncmp(cmd, irc_channel, strlen(irc_channel))) {
- cmd += strlen(irc_channel);
- if (strncmp(cmd, " +o ", 4)) {
+ else {
+ if (strcmp(argv[2], "+o")) {
printf("irc_cmd: invalid MODE args '%s'\n",
- cmd);
+ argv[2]);
return;
}
- cmd += 4;
- icb_send_pass(server_fd, cmd);
+ icb_send_pass(server_fd, argv[3]);
}
- } else if (!strncasecmp(cmd, "TOPIC ", 6)) {
- cmd += 6;
- if (strncmp(cmd, irc_channel, strlen(irc_channel))) {
- printf("irc_cmd: invalid TOPIC args '%s'\n", cmd);
+ } else if (!strcasecmp(argv[0], "TOPIC")) {
+ if (strcmp(argv[1], irc_channel)) {
+ printf("irc_cmd: invalid TOPIC channel '%s'\n",
+ argv[1]);
return;
}
- cmd += strlen(irc_channel);
- if (strncmp(cmd, " :", 2)) {
- printf("irc_cmd: invalid TOPIC args '%s'\n", cmd);
- return;
- }
- cmd += 2;
- icb_send_topic(server_fd, cmd);
- } else if (!strcasecmp(cmd, "LIST")) {
+ icb_send_topic(server_fd, argv[2]);
+ } else if (!strcasecmp(argv[0], "LIST")) {
icb_send_list(server_fd);
- } else if (!strncasecmp(cmd, "NAMES ", 6)) {
- cmd += 6;
- icb_send_names(server_fd, cmd);
- } else if (!strncasecmp(cmd, "WHOIS ", 6)) {
- cmd += 6;
- icb_send_whois(server_fd, cmd);
- } else if (!strncasecmp(cmd, "WHO ", 4)) {
- cmd += 4;
- icb_send_who(server_fd, cmd);
- } else if (!strncasecmp(cmd, "KICK ", 5)) {
- char channel[128], nick[128];
-
- cmd += 5;
- scan(&cmd, channel, sizeof(channel), " ", " ");
- scan(&cmd, nick, sizeof(nick), " ", " ");
- if (strcmp(channel, irc_channel)) {
- printf("irc_cmd: invalid KICK args '%s'\n", cmd);
+ } else if (!strcasecmp(argv[0], "NAMES")) {
+ icb_send_names(server_fd, argv[1]);
+ } else if (!strcasecmp(argv[0], "WHOIS")) {
+ icb_send_whois(server_fd, argv[1]);
+ } else if (!strcasecmp(argv[0], "WHO")) {
+ icb_send_who(server_fd, argv[1]);
+ } else if (!strcasecmp(argv[0], "KICK")) {
+ if (strcmp(argv[1], irc_channel)) {
+ printf("irc_cmd: invalid KICK args '%s'\n", argv[1]);
return;
}
- icb_send_boot(server_fd, nick);
- } else if (!strncasecmp(cmd, "PING ", 5)) {
+ icb_send_boot(server_fd, argv[2]);
+ } else if (!strcasecmp(argv[0], "PING")) {
icb_send_noop(server_fd);
- cmd += 5;
- irc_send_pong(client_fd, cmd);
- } else if (!strncasecmp(cmd, "RAWICB ", 7)) {
- cmd += 7;
- icb_send_raw(server_fd, cmd);
- } else if (!strncasecmp(cmd, "QUIT ", 5)) {
+ irc_send_pong(client_fd, argv[1]);
+ } else if (!strcasecmp(argv[0], "QUIT")) {
printf("client QUIT\n");
terminate_client = 1;
} else
- printf("irc_cmd: unknown cmd '%s'\n", cmd);
+ printf("irc_cmd: unknown command '%s'\n", argv[0]);
}
void