diff options
author | aabacchus <ben@bvnf.space> | 2023-05-27 19:21:23 +0100 |
---|---|---|
committer | aabacchus <ben@bvnf.space> | 2023-05-27 19:21:23 +0100 |
commit | 72925c599a0870ada9100a69aa6500b04d0fd84e (patch) | |
tree | 79753fa2ca781fe43f150645aa4a4fe971bbe89f | |
parent | 191856c5a614e9765dfe0308125bf395557bea21 (diff) | |
download | cbot-72925c599a0870ada9100a69aa6500b04d0fd84e.tar.gz |
write from client to irc
-rw-r--r-- | receive.c | 47 |
1 files changed, 34 insertions, 13 deletions
diff --git a/receive.c b/receive.c index d85a1ac..9b620e1 100644 --- a/receive.c +++ b/receive.c @@ -1,3 +1,5 @@ +#define _POSIX_C_SOURCE +#include <assert.h> #include <err.h> #include <errno.h> #include <netdb.h> @@ -15,26 +17,45 @@ #define SOCK_PATH "/tmp/kissbot" #define IRC_HOST "irc.libera.chat" #define IRC_PORT "6667" -#define IRC_NICK "_kissbot_" +#define IRC_NICK "kissbot_" +#define IRC_CHANNEL "#test" int sock_write(int s, char *msg, ...); int -read_print(int s) { +handle_client(int client, int irc) { char buf[0x1000]; ssize_t n; - n = recv(s, buf, sizeof buf, 0); - if (n > 0) - write(1, buf, n); - if (n < 0) + n = recv(client, buf, (sizeof buf) - 1, 0); + if (n < 0) { perror("recv"); + return 1; + } + assert((size_t)n < sizeof buf); + char *b = buf; + while (1) { + char *l = memchr(b, '\n', n - (b - buf)); + if (l == NULL) + buf[n+1] = '\0'; + else + *l = '\0'; + + sock_write(irc, "PRIVMSG " IRC_CHANNEL " :%s\n", b); + + if (l == NULL) + break; + else + b = l + 1; + if (l - buf >= n - 1) /* -1 because the end of the line became \0 */ + break; + } return 0; } int parse_irc(int s, char *p, size_t len) { /* look for the beginning of lines and handle some commands */ - fprintf(stderr, "parse_irc got '%s'\n", p); + //fprintf(stderr, "parse_irc got %zu bytes '%s'\n", len, p); while (1) { char *e = memchr(p, '\n', len); size_t off = len; @@ -70,10 +91,11 @@ parse_irc(int s, char *p, size_t len) { int handle_irc(int s) { - char buf[0x1000]; - ssize_t n = recv(s, buf, sizeof buf, 0); + char buf[0x1001]; + ssize_t n = recv(s, buf, (sizeof buf)-1, 0); if (n <= 0) return 1; + buf[n] = '\0'; return parse_irc(s, buf, n); } @@ -116,7 +138,7 @@ sock_write(int s, char *msg, ...) { int irc_identify(int s) { - return sock_write(s, "NICK %s\r\nUSER %s 8 x :%s\r\n", IRC_NICK, IRC_NICK, IRC_NICK); + return sock_write(s, "NICK %s\r\nUSER %s 8 x :%s\r\nJOIN :%s\r\n", IRC_NICK, IRC_NICK, IRC_NICK, IRC_CHANNEL); } int @@ -200,7 +222,7 @@ main(void) { errx(1, "unexpected error, quitting\n"); } if (fds[2].revents & POLLIN) { - read_print(fds[2].fd); + handle_client(fds[2].fd, fds[1].fd); } if (fds[2].revents & POLLHUP) { close(fds[2].fd); @@ -230,8 +252,7 @@ int main(void) { {strdup("PING :ih"), 8}, {strdup(""), 0}, {strdup("PING no colon\n"), 14}, - {strdup("PING :too short len"), 10}, - {strdup("PING :too long len"), 20}, + {strdup("PING :first line\nPING :second\nASDF :not a ping\nPING :3rd ping\n"), 62}, }; printf("%s", s[0].s); for (size_t i = 0; i < sizeof(s)/sizeof(s[0]); i++) { |