From b897894d81184417f5d88b5bea8ef7f2b7da728d Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Tue, 29 Dec 2009 14:41:25 +0000 Subject: initial commit --- irc.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 irc.c (limited to 'irc.c') diff --git a/irc.c b/irc.c new file mode 100644 index 0000000..92a925e --- /dev/null +++ b/irc.c @@ -0,0 +1,85 @@ + +#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 *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 localhost %s :%s", nick, server, nick); + 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) +{ + irc_send(s, "QUIT", msg ? msg : ""); + close(s->fd); + free(s); +} -- cgit v1.2.3