diff options
author | ubq323 <ubq323@ubq323.website> | 2022-10-29 03:51:48 +0100 |
---|---|---|
committer | ubq323 <ubq323@ubq323.website> | 2022-10-29 03:51:54 +0100 |
commit | 86dac1e342e0b5b52dbd68152cdc8d5a60128ce8 (patch) | |
tree | fa8c383b468918b948a9fb5aadc3a1ef75a96b14 /bee.c | |
parent | 8e7e23110bc483ba647d33d6f46a7fac1302107c (diff) |
functionality. (it is functionally equivalent to the old version now)
Diffstat (limited to 'bee.c')
-rw-r--r-- | bee.c | 109 |
1 files changed, 91 insertions, 18 deletions
@@ -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; } |