/* * Copyright (c) 2022 joshua stein * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef __IRC_H__ #define __IRC_H__ #include "chatter.h" #include "tcp.h" #include "util.h" enum { IRC_STATE_DISCONNECTED = 0, IRC_STATE_DEAD, IRC_STATE_CONNECTING, IRC_STATE_CONNECTED }; #define IRC_MSG_MAX_ARGS 6 struct irc_msg { short code; char cmd[16]; char source[64]; char msg[512]; char arg[IRC_MSG_MAX_ARGS][64]; }; struct irc_user { char nick[32]; char username[32]; char hostname[128]; }; struct irc_channel_nick { char nick[32]; char flags; #define IRC_NICK_FLAG_OP (7 << 0) #define IRC_NICK_FLAG_VOICE (6 << 0) short next_nick; }; struct irc_channel { SLIST_ENTRY(irc_channel) list; struct chatter *chatter; struct irc_connection *connection; struct irc_channel_nick *nicks; size_t nnicks; size_t nicks_size; short first_nick; char name[64]; char topic[400]; }; SLIST_HEAD(irc_channels_head, irc_channel); struct irc_connection { SLIST_ENTRY(irc_connection) list; short state; struct chatter *chatter; char *hostname; short port; char *password; char *nick; char *ident; char *realname; char *channel_autojoin; bool did_autojoin; struct irc_channels_head channels_list; short nchannels; TCPiopb rcv_pb, send_pb, close_pb; TCPStatusPB status_pb; StreamPtr stream; wdsEntry wds[2]; char obuf[512]; char ibuf[512]; /* RFC2812 says max line will be 512 */ char line[512]; short ibuflen; short linelen; /* docs say 4*MTU+1024, but MTU will probably be <1500 */ unsigned char tcp_buf[(4 * 1500) + 1024]; }; SLIST_HEAD(irc_connections_head, irc_connection); extern struct irc_connections_head irc_connections_list; struct irc_connection * irc_connect(struct chatter *chatter, const char *server, const unsigned short port, const char *password, const char *nick, const char *ident, const char *realname, const char *channel); void irc_close_connection(struct irc_connection *conn); void irc_dealloc_connection(struct irc_connection *conn); void irc_process(struct irc_connection *conn); void irc_abort(struct irc_connection *conn); void irc_close(struct irc_connection *conn); void irc_process_input(struct irc_connection *conn, struct irc_channel *channel, char *input); #endif