aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--kirc.c38
2 files changed, 29 insertions, 11 deletions
diff --git a/README.md b/README.md
index 86065cc..4295687 100644
--- a/README.md
+++ b/README.md
@@ -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'
```
diff --git a/kirc.c b/kirc.c
index 1c43bef..4e9cb24 100644
--- a/kirc.c
+++ b/kirc.c
@@ -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;