diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2009-12-29 14:41:25 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2009-12-29 14:41:25 +0000 |
commit | b897894d81184417f5d88b5bea8ef7f2b7da728d (patch) | |
tree | 0803f4d3437ad0e439cf5af882b0b49aaad65e20 /irc.c | |
download | sircbot-b897894d81184417f5d88b5bea8ef7f2b7da728d.tar.bz2 sircbot-b897894d81184417f5d88b5bea8ef7f2b7da728d.tar.xz |
initial commit
Diffstat (limited to 'irc.c')
-rw-r--r-- | irc.c | 85 |
1 files changed, 85 insertions, 0 deletions
@@ -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); +} |