1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
/*
* Copyright (c) 2002-2010 BalaBit IT Ltd, Budapest, Hungary
* Copyright (c) 1998-2010 Balázs Scheidler
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* As an additional exemption you are allowed to compile & link against the
* OpenSSL libraries as published by the OpenSSL project. See the file
* COPYING for details.
*
*/
#ifndef AFSOCKET_H_INCLUDED
#define AFSOCKET_H_INCLUDED
#include "driver.h"
#include "logreader.h"
#include "logwriter.h"
#if ENABLE_SSL
#include "tlscontext.h"
#endif
#include <iv.h>
#define AFSOCKET_DGRAM 0x0001
#define AFSOCKET_STREAM 0x0002
#define AFSOCKET_LOCAL 0x0004
#define AFSOCKET_SYSLOG_PROTOCOL 0x0008
#define AFSOCKET_KEEP_ALIVE 0x0100
#define AFSOCKET_REQUIRE_TLS 0x0200
#define AFSOCKET_WNDSIZE_INITED 0x10000
typedef enum
{
AFSOCKET_DIR_RECV = 0x01,
AFSOCKET_DIR_SEND = 0x02,
} AFSocketDirection;
typedef struct _AFSocketSourceDriver AFSocketSourceDriver;
typedef struct _AFSocketDestDriver AFSocketDestDriver;
typedef struct _SocketOptions
{
gint sndbuf;
gint rcvbuf;
gint broadcast;
gint keepalive;
} SocketOptions;
gboolean afsocket_setup_socket(gint fd, SocketOptions *sock_options, AFSocketDirection dir);
struct _AFSocketSourceDriver
{
LogSrcDriver super;
guint32 flags;
struct iv_fd listen_fd;
gint fd;
LogReaderOptions reader_options;
#if ENABLE_SSL
TLSContext *tls_context;
#endif
gint address_family;
GSockAddr *bind_addr;
gchar *transport;
gint max_connections;
gint num_connections;
gint listen_backlog;
GList *connections;
SocketOptions *sock_options_ptr;
/*
* Apply transport options, set up bind_addr based on the
* information processed during parse time. This used to be
* constructed during the parser, however that made the ordering of
* various options matter and behave incorrectly when the port() was
* specified _after_ transport(). Now, it collects the information,
* and then applies them with a separate call to apply_transport()
* during init().
*/
gboolean (*apply_transport)(AFSocketSourceDriver *s);
/* optionally acquire a socket from the runtime environment (e.g. systemd) */
gboolean (*acquire_socket)(AFSocketSourceDriver *s, gint *fd);
/* once the socket is opened, set up socket related options (IP_TTL,
IP_TOS, SO_RCVBUF etc) */
gboolean (*setup_socket)(AFSocketSourceDriver *s, gint fd);
};
void afsocket_sd_set_transport(LogDriver *s, const gchar *transport);
void afsocket_sd_set_keep_alive(LogDriver *self, gint enable);
void afsocket_sd_set_max_connections(LogDriver *self, gint max_connections);
#if ENABLE_SSL
void afsocket_sd_set_tls_context(LogDriver *s, TLSContext *tls_context);
#else
#define afsocket_sd_set_tls_context(s, t)
#endif
static inline gboolean
afsocket_sd_acquire_socket(AFSocketSourceDriver *s, gint *fd)
{
if (s->acquire_socket)
return s->acquire_socket(s, fd);
*fd = -1;
return TRUE;
}
static inline gboolean
afsocket_sd_apply_transport(AFSocketSourceDriver *s)
{
return s->apply_transport(s);
}
gboolean afsocket_sd_init(LogPipe *s);
gboolean afsocket_sd_deinit(LogPipe *s);
void afsocket_sd_init_instance(AFSocketSourceDriver *self, SocketOptions *sock_options, gint family, guint32 flags);
void afsocket_sd_free(LogPipe *self);
struct _AFSocketDestDriver
{
LogDestDriver super;
guint32 flags;
gint fd;
LogPipe *writer;
LogWriterOptions writer_options;
#if ENABLE_SSL
TLSContext *tls_context;
#endif
gint address_family;
gchar *hostname;
gchar *transport;
GSockAddr *bind_addr;
GSockAddr *dest_addr;
gchar *dest_name;
gint time_reopen;
struct iv_fd connect_fd;
struct iv_timer reconnect_timer;
SocketOptions *sock_options_ptr;
/*
* Apply transport options, set up bind_addr/dest_addr based on the
* information processed during parse time. This used to be
* constructed during the parser, however that made the ordering of
* various options matter and behave incorrectly when the port() was
* specified _after_ transport(). Now, it collects the information,
* and then applies them with a separate call to apply_transport()
* during init().
*/
gboolean (*apply_transport)(AFSocketDestDriver *s);
/* once the socket is opened, set up socket related options (IP_TTL,
IP_TOS, SO_RCVBUF etc) */
gboolean (*setup_socket)(AFSocketDestDriver *s, gint fd);
};
#if ENABLE_SSL
void afsocket_dd_set_tls_context(LogDriver *s, TLSContext *tls_context);
#else
#define afsocket_dd_set_tls_context(s, t)
#endif
static inline gboolean
afsocket_dd_apply_transport(AFSocketDestDriver *s)
{
return s->apply_transport(s);
}
void afsocket_dd_set_transport(LogDriver *s, const gchar *transport);
void afsocket_dd_set_keep_alive(LogDriver *self, gint enable);
void afsocket_dd_init_instance(AFSocketDestDriver *self, SocketOptions *sock_options, gint family, const gchar *hostname, guint32 flags);
gboolean afsocket_dd_init(LogPipe *s);
void afsocket_dd_free(LogPipe *s);
#endif
|