Mercurial > irccd
view lib/irccd/server.h @ 947:95201fd9ad88
irccd: servers are now linked lists
- Add reference counting to be shared with Javascript.
- Implement server-disconnect command.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 16 Jan 2021 09:45:33 +0100 |
parents | 8ddeceeee0f2 |
children | b4e8551e2064 |
line wrap: on
line source
/* * server.h -- an IRC server * * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> * * Permission to use, copy, modify, and/or 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 IRCCD_SERVER_H #define IRCCD_SERVER_H #include <stdbool.h> #include <stddef.h> #if defined(IRC_HAVE_SSL) # include <openssl/ssl.h> #endif #include "limits.h" struct pollfd; struct irc_channel; struct irc_event; enum irc_server_state { IRC_SERVER_STATE_DISCONNECTED, IRC_SERVER_STATE_CONNECTING, IRC_SERVER_STATE_HANDSHAKING, IRC_SERVER_STATE_CONNECTED, IRC_SERVER_STATE_WAITING, IRC_SERVER_STATE_NUM }; enum irc_server_flags { IRC_SERVER_FLAGS_SSL = (1 << 0), IRC_SERVER_FLAGS_AUTO_REJOIN = (1 << 1), IRC_SERVER_FLAGS_IPV4 = (1 << 2), IRC_SERVER_FLAGS_IPV6 = (1 << 3) }; struct irc_server_prefix { char mode; char token; }; #if defined(IRCCD_HAVE_SSL) enum irc_server_ssl_state { IRC_SERVER_SSL_NONE, IRC_SERVER_SSL_NEED_READ, IRC_SERVER_SSL_NEED_WRITE, }; #endif struct irc_server { /* Connection settings. */ char name[IRC_NAME_MAX]; char hostname[IRC_HOST_MAX]; unsigned short port; enum irc_server_flags flags; /* Plugin prefix. */ char commandchar[IRC_COMMANDCHAR_MAX]; /* IRC identity. */ char nickname[IRC_NICKNAME_MAX]; char username[IRC_USERNAME_MAX]; char realname[IRC_REALNAME_MAX]; char ctcpversion[IRC_CTCPVERSION_MAX]; /* Joined channels. */ struct irc_channel *channels; size_t channelsz; /* Network connectivity. */ int fd; struct addrinfo *ai; struct addrinfo *aip; char in[IRC_BUF_MAX]; char out[IRC_BUF_MAX]; enum irc_server_state state; /* OpenSSL support. */ #if defined(IRCCD_HAVE_SSL) SSL_CTX *ctx; SSL *ssl; enum irc_server_ssl_state ssl_state; #endif /* Reference count. */ size_t refc; struct irc_server *next; /* IRC server settings. */ char chantypes[8]; struct irc_server_prefix prefixes[16]; }; void irc_server_connect(struct irc_server *); void irc_server_disconnect(struct irc_server *); void irc_server_prepare(const struct irc_server *, struct pollfd *); void irc_server_flush(struct irc_server *, const struct pollfd *); bool irc_server_poll(struct irc_server *, struct irc_event *); struct irc_channel * irc_server_find(struct irc_server *, const char *); bool irc_server_send(struct irc_server *, const char *, ...); bool irc_server_invite(struct irc_server *, const char *, const char *); bool irc_server_join(struct irc_server *, const char *, const char *); bool irc_server_kick(struct irc_server *, const char *, const char *, const char *); bool irc_server_part(struct irc_server *, const char *, const char *); bool irc_server_topic(struct irc_server *, const char *, const char *); bool irc_server_message(struct irc_server *, const char *, const char *); bool irc_server_me(struct irc_server *, const char *, const char *); bool irc_server_mode(struct irc_server *, const char *, const char *, const char *, const char *, const char *); bool irc_server_names(struct irc_server *, const char *); bool irc_server_nick(struct irc_server *, const char *); bool irc_server_notice(struct irc_server *, const char *, const char *); void irc_server_incref(struct irc_server *); void irc_server_decref(struct irc_server *); #endif /* !IRCCD_SERVER_H */