#include "irc.h" #include "unix.h" #include #include int unix_handle(int fd, char chname[]) { // PRIVMSG #{chname} :{message} // 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 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_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; } struct pollfd pfs[2]; pfs[0].fd = g_ircsock; pfs[0].events = POLLIN; pfs[1].fd = unixfd; pfs[1].events = POLLIN; for (;;) { 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; } 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; }