aboutsummaryrefslogtreecommitdiffstats
path: root/irc.c
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-12-29 14:41:25 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-12-29 14:41:25 +0000
commitb897894d81184417f5d88b5bea8ef7f2b7da728d (patch)
tree0803f4d3437ad0e439cf5af882b0b49aaad65e20 /irc.c
downloadsircbot-b897894d81184417f5d88b5bea8ef7f2b7da728d.tar.bz2
sircbot-b897894d81184417f5d88b5bea8ef7f2b7da728d.tar.xz
initial commit
Diffstat (limited to 'irc.c')
-rw-r--r--irc.c85
1 files changed, 85 insertions, 0 deletions
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 <sys/socket.h>
+#include <sys/types.h>
+
+#include <netdb.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#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);
+}