diff options
Diffstat (limited to '')
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | kirc.c | 38 |
2 files changed, 29 insertions, 11 deletions
@@ -94,7 +94,7 @@ There is no native [TLS/SSL](https://en.m.wikipedia.org/wiki/Transport_Layer_Sec * _socat_ example: ```shell -socat -v tcp-listen:6667,reuseaddr,fork,bind=127.0.0.1 ssl:<irc-server>:669 +socat tcp-listen:6667,reuseaddr,fork,bind=127.0.0.1 ssl:<irc-server>:6697 kirc -s 127.0.0.1 -c 'channel' -n 'name' -r 'realname' ``` @@ -10,11 +10,13 @@ #include <fcntl.h> #include <poll.h> #include <errno.h> +#include <termios.h> #include <sys/socket.h> +#include <sys/ioctl.h> #define MSG_MAX 512 /* guaranteed max message length */ #define CHA_MAX 200 /* guaranteed max channel length */ -#define VERSION "0.0.9" /* software version */ +#define VERSION "0.1.0" /* software version */ #define USAGE "kirc [-s hostname] [-p port] [-c channel] [-n nick] \ [-r real name] [-u username] [-k password] [-x init command] [-w columns] \ [-W columns] [-o path] [-h|v|V]" @@ -120,7 +122,10 @@ connection_initialize(void) { return -1; } - fcntl(conn, F_SETFL, O_NONBLOCK); + int flags = fcntl(conn, F_GETFL, 0); + flags |= O_NONBLOCK; + fcntl(conn, F_SETFL, flags); + return 0; } @@ -231,30 +236,45 @@ handle_server_message(void) { static void handle_user_input(void) { char usrin[MSG_MAX], v1[MSG_MAX - CHA_MAX], v2[CHA_MAX], c1; - if (fgets(usrin, MSG_MAX, stdin) != NULL && - (sscanf(usrin, "/%[m] %s %[^\n]\n", &c1, v2, v1) > 2 || - sscanf(usrin, "/%[a-zA-Z] %[^\n]\n", &c1, v1) > 0)) { + fgets(usrin, MSG_MAX, stdin); + if (sscanf(usrin, "/%[m] %s %[^\n]\n", &c1, v2, v1) > 2 || + sscanf(usrin, "/%[a-zA-Z] %[^\n]\n", &c1, v1) > 0) { switch (c1) { case 'x': raw("%s\r\n", v1); break; case 'q': raw("quit\r\n"); break; - case 'u': strcpy(chan, v1); break; case 'Q': raw("quit %s\r\n", v1); break; case 'j': raw("join %s\r\n", v1); break; case 'p': raw("part %s\r\n", v1); break; case 'n': raw("names #%s\r\n", chan); break; case 'M': raw("privmsg nickserv :%s\r\n", v1); break; case 'm': raw("privmsg %s :%s\r\n", v2, v1); break; + case 'u': strcpy(chan, v1); break; default : puts(HELP); break; } } else { size_t msg_len = strlen(usrin); if (usrin[msg_len - 1] == '\n') { usrin[msg_len - 1] = '\0'; - } + } raw("privmsg #%s :%s\r\n", chan, usrin); } } +static int +keyboardhit() { + struct termios save, tp; + int byteswaiting; + + tcgetattr(STDIN_FILENO, &tp); + save = tp; + tp.c_lflag &= ~ICANON; + tcsetattr(STDIN_FILENO, TCSANOW, &tp); + ioctl(STDIN_FILENO, FIONREAD, &byteswaiting); + tcsetattr(STDIN_FILENO, TCSANOW, &save); + + return byteswaiting; +} + int main(int argc, char **argv) { @@ -303,13 +323,11 @@ main(int argc, char **argv) { for (;;) { int poll_res = poll(fds, 2, -1); - if (poll_res != -1) { if (fds[0].revents & POLLIN) { handle_user_input(); } - - if (fds[1].revents & POLLIN) { + if (fds[1].revents & POLLIN && (keyboardhit() < 1)) { int rc = handle_server_message(); if (rc != 0) { if (rc == -2) return EXIT_FAILURE; |