#include #include #include #include #include #include #include #include "irc.h" static int tcp_connect(const char *host, int port) { struct sockaddr_in addr; struct hostent *h; int sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) return sock; h = gethostbyname(host); if (h == NULL) return -1; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(port); memcpy(&addr.sin_addr, h->h_addr, h->h_length); if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_in))) { close(sock); sock = -1; } return sock; } struct irc_session *irc_connect(const char* server, int port, const char *nick, const char *username, const char *pass) { char buf[256]; struct irc_session *sess; sess = malloc(sizeof(struct irc_session)); if (sess == NULL) return NULL; sess->nick = nick; sess->server = server; sess->fd = tcp_connect(server, port); if (sess->fd < 0) return NULL; /* login */ if (pass) irc_send(sess, "PASS", pass); irc_send(sess, "NICK", nick); snprintf(buf, sizeof(buf), "%s 0 * :%s", username, username); irc_send(sess, "USER", buf); return sess; } int irc_send(struct irc_session *s, const char *command, const char *args) { char buf[4096]; snprintf(buf, sizeof(buf), "%s %s\r\n", command, args); return write(s->fd, buf, strlen(buf)); } int irc_send_chan(struct irc_session *s, const char *chan, const char *msg) { char buf[4096]; snprintf(buf, sizeof(buf), "%s :%s", chan, msg); return irc_send(s, "PRIVMSG", buf); } int irc_send_ping(struct irc_session *s) { return irc_send(s, "PING", s->server); } int irc_close(struct irc_session *s, const char *msg) { if (s->fd > 0) { irc_send(s, "QUIT", msg ? msg : ""); close(s->fd); } free(s); return 0; }