aboutsummaryrefslogtreecommitdiff
path: root/bee.c
diff options
context:
space:
mode:
authorubq323 <ubq323@ubq323.website>2022-10-29 03:51:48 +0100
committerubq323 <ubq323@ubq323.website>2022-10-29 03:51:54 +0100
commit86dac1e342e0b5b52dbd68152cdc8d5a60128ce8 (patch)
treefa8c383b468918b948a9fb5aadc3a1ef75a96b14 /bee.c
parent8e7e23110bc483ba647d33d6f46a7fac1302107c (diff)
functionality. (it is functionally equivalent to the old version now)
Diffstat (limited to 'bee.c')
-rw-r--r--bee.c109
1 files changed, 91 insertions, 18 deletions
diff --git a/bee.c b/bee.c
index 0cd3b13..9f7fb5d 100644
--- a/bee.c
+++ b/bee.c
@@ -2,41 +2,114 @@
#include "unix.h"
#include <stdio.h>
+#include <poll.h>
+
+int
+unix_handle(int fd, char chname[])
+{
+ // PRIVMSG #{chname} :{message}<CR><LF>
+ // 123456789 12 3 4
+ // 512 >= 13 + strlen(chname) + length of message
+ // chname can be max 16 bytes, so worst case
+ // 512 >= 13 + 16 + length of message
+ // 483 >= length of message
+ // 480 is slightly pessimistic but it's a rounder number.
+ // (one more byte for null terminator needed by snprintf)
+ unsigned char buf[481];
+
+ if (strlen(chname) > 16) {
+ fprintf(stderr,"channel name %s is longer than 16 bytes, ignoring\n",chname);
+ return -1;
+ }
+
+ ssize_t amt;
+ if ((amt = recv(fd, buf, sizeof buf-1,0)) == -1) {
+ perror("recv");
+ return -1;
+ } else if (amt == 0) {
+ fputs("unix eof\n",stderr);
+ return -1;
+ } else {
+ int i;
+ for (i=0;i<amt;i++) {
+ if (buf[i] < ' ') {
+ buf[i] = ' ';
+ }
+ }
+ buf[amt] = '\0';
+ char msg[512];
+ int s;
+ if ((s=snprintf(msg,512,"PRIVMSG #%s :%s\r\n",chname,buf)) > 512) {
+ fprintf(stderr,"irc message was somehow too long (this should never happen) (%d)/512\n",s);
+ return -1;
+ }
+ if (irc_sendall(msg, s) == -1) {
+ perror("sendall");
+ return -1;
+ };
+
+ return 0;
+ }
+}
int
main()
{
- /* if (irc_connect()) { fputs("falure in irc_connect\n",stderr); return 1; }
+ if (irc_connect()) { fputs("falure in irc_connect\n",stderr); return 1; }
if (irc_handshake()) { fputs("failure in irc_handshake\n",stderr); return 1; }
- */
int unixfd;
if ((unixfd = unix_setup("bees2.sock")) == -1) {
fputs("failure in unix_setup\n",stderr); return -1;
}
- char buf[128];
- ssize_t amt;
+ struct pollfd pfs[2];
+ pfs[0].fd = g_ircsock;
+ pfs[0].events = POLLIN;
+ pfs[1].fd = unixfd;
+ pfs[1].events = POLLIN;
+
for (;;) {
- if ((amt = recv(unixfd,buf,sizeof buf - 1,0)) == -1) {
- perror("recv");
+ if (poll(pfs, 2, -1) == -1) {
+ perror("poll");
+ return 1;
+ }
+
+ if (pfs[0].revents & POLLERR) {
+ fputs("irc socket error\n",stderr);
+ return 1;
+ }
+ if (pfs[0].revents & POLLHUP) {
+ fputs("irc hup\n",stderr);
+ return 1;
+ }
+ if (pfs[1].revents & POLLERR) {
+ fputs("unix sock err\n",stderr);
return 1;
- } else if (amt == 0) {
- puts("unix eof");
- return 0;
- } else {
- buf[amt] = 0;
- printf("got: %s\n",buf);
}
- }
-
- int x;
- do {
- x = irc_recv();
- } while (!x);
+ if (pfs[0].revents & POLLIN) {
+ int r = irc_recv();
+ if (r == -2) {
+ // don't currently try to reconnect
+ // maybe that could happen in the future.
+ fputs("disconnected from irc, exiting\n",stderr);
+ return 2;
+ } else if (r == -1) {
+ fputs("exiting due to irc error\n",stderr);
+ return 1;
+ }
+ }
+ if (pfs[1].revents & POLLIN) {
+ int r = unix_handle(unixfd,"a");
+ if (r==-1) {
+ fputs("exiting due to unix sock error\n",stderr);
+ return 1;
+ }
+ }
+ }
return 0;
}