%PDF- %PDF-
Direktori : /backups/router/usr/local/include/syslog-ng/logproto/ |
Current File : //backups/router/usr/local/include/syslog-ng/logproto/logproto-client.h |
/* * Copyright (c) 2002-2012 Balabit * Copyright (c) 1998-2012 Balázs Scheidler * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, 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 LOGPROTO_CLIENT_H_INCLUDED #define LOGPROTO_CLIENT_H_INCLUDED #include "logproto.h" #include "persist-state.h" typedef struct _LogProtoClient LogProtoClient; #define LOG_PROTO_CLIENT_OPTIONS_SIZE 128 typedef struct _LogProtoClientOptions { gboolean drop_input; gint timeout; } LogProtoClientOptions; typedef union _LogProtoClientOptionsStorage { LogProtoClientOptions super; gchar __padding[LOG_PROTO_CLIENT_OPTIONS_SIZE]; } LogProtoClientOptionsStorage; typedef void (*LogProtoClientAckCallback)(gint num_msg_acked, gpointer user_data); typedef void (*LogProtoClientRewindCallback)(gpointer user_data); typedef struct { LogProtoClientAckCallback ack_callback; LogProtoClientRewindCallback rewind_callback; gpointer user_data; } LogProtoClientFlowControlFuncs; void log_proto_client_options_set_drop_input(LogProtoClientOptions *options, gboolean drop_input); void log_proto_client_options_set_timeout(LogProtoClientOptions *options, gint timeout); gint log_proto_client_options_get_timeout(LogProtoClientOptions *options); void log_proto_client_options_defaults(LogProtoClientOptions *options); void log_proto_client_options_init(LogProtoClientOptions *options, GlobalConfig *cfg); void log_proto_client_options_destroy(LogProtoClientOptions *options); struct _LogProtoClient { LogProtoStatus status; const LogProtoClientOptions *options; LogTransport *transport; /* FIXME: rename to something else */ gboolean (*prepare)(LogProtoClient *s, gint *fd, GIOCondition *cond, gint *timeout); LogProtoStatus (*post)(LogProtoClient *s, LogMessage *logmsg, guchar *msg, gsize msg_len, gboolean *consumed); LogProtoStatus (*process_in)(LogProtoClient *s); LogProtoStatus (*flush)(LogProtoClient *s); gboolean (*validate_options)(LogProtoClient *s); gboolean (*handshake_in_progess)(LogProtoClient *s); LogProtoStatus (*handshake)(LogProtoClient *s); gboolean (*restart_with_state)(LogProtoClient *s, PersistState *state, const gchar *persist_name); void (*free_fn)(LogProtoClient *s); LogProtoClientFlowControlFuncs flow_control_funcs; }; static inline void log_proto_client_set_client_flow_control(LogProtoClient *self, LogProtoClientFlowControlFuncs *flow_control_funcs) { self->flow_control_funcs.ack_callback = flow_control_funcs->ack_callback; self->flow_control_funcs.rewind_callback = flow_control_funcs->rewind_callback; self->flow_control_funcs.user_data = flow_control_funcs->user_data; } static inline void log_proto_client_msg_ack(LogProtoClient *self, gint num_msg_acked) { if (self->flow_control_funcs.ack_callback) self->flow_control_funcs.ack_callback(num_msg_acked, self->flow_control_funcs.user_data); } static inline void log_proto_client_msg_rewind(LogProtoClient *self) { if (self->flow_control_funcs.rewind_callback) self->flow_control_funcs.rewind_callback(self->flow_control_funcs.user_data); } static inline void log_proto_client_set_options(LogProtoClient *self, const LogProtoClientOptions *options) { self->options = options; } static inline gboolean log_proto_client_validate_options(LogProtoClient *self) { return self->validate_options(self); } static inline gboolean log_proto_client_handshake_in_progress(LogProtoClient *s) { if (s->handshake_in_progess) { return s->handshake_in_progess(s); } return FALSE; } static inline LogProtoStatus log_proto_client_handshake(LogProtoClient *s) { if (s->handshake) { return s->handshake(s); } return LPS_SUCCESS; } static inline gboolean log_proto_client_prepare(LogProtoClient *s, gint *fd, GIOCondition *cond, gint *timeout) { return s->prepare(s, fd, cond, timeout); } static inline LogProtoStatus log_proto_client_flush(LogProtoClient *s) { if (s->flush) return s->flush(s); else return LPS_SUCCESS; } static inline LogProtoStatus log_proto_client_process_in(LogProtoClient *s) { if (s->process_in) return s->process_in(s); else if (s->flush) /* * In some clients, flush is used for input processing, but it should not be. * Fix these clients, than remove the flush call here. * * SSL_ERROR_WANT_READ in the TLS transport is also built upon this. */ return s->flush(s); else return LPS_SUCCESS; } static inline LogProtoStatus log_proto_client_post(LogProtoClient *s, LogMessage *logmsg, guchar *msg, gsize msg_len, gboolean *consumed) { return s->post(s, logmsg, msg, msg_len, consumed); } static inline gint log_proto_client_get_fd(LogProtoClient *s) { /* FIXME: Layering violation */ return s->transport->fd; } static inline void log_proto_client_reset_error(LogProtoClient *s) { s->status = LPS_SUCCESS; } static inline gboolean log_proto_client_restart_with_state(LogProtoClient *s, PersistState *state, const gchar *persist_name) { if (s->restart_with_state) return s->restart_with_state(s, state, persist_name); return FALSE; } gboolean log_proto_client_validate_options(LogProtoClient *self); void log_proto_client_init(LogProtoClient *s, LogTransport *transport, const LogProtoClientOptions *options); void log_proto_client_free(LogProtoClient *s); void log_proto_client_free_method(LogProtoClient *s); #define DEFINE_LOG_PROTO_CLIENT(prefix, options...) \ static gpointer \ prefix ## _client_plugin_construct(Plugin *self) \ { \ static LogProtoClientFactory proto = { \ .construct = prefix ## _client_new, \ .stateful = FALSE, \ ##options \ }; \ return &proto; \ } #define LOG_PROTO_CLIENT_PLUGIN(prefix, __name) \ { \ .type = LL_CONTEXT_CLIENT_PROTO, \ .name = __name, \ .construct = prefix ## _client_plugin_construct, \ } #define LOG_PROTO_CLIENT_PLUGIN_WITH_GRAMMAR(__parser, __name) \ { \ .type = LL_CONTEXT_CLIENT_PROTO, \ .name = __name, \ .parser = &__parser, \ } typedef struct _LogProtoClientFactory LogProtoClientFactory; struct _LogProtoClientFactory { LogProtoClient *(*construct)(LogTransport *transport, const LogProtoClientOptions *options); gint default_inet_port; gboolean use_multitransport; gboolean stateful; }; static inline LogProtoClient * log_proto_client_factory_construct(LogProtoClientFactory *self, LogTransport *transport, const LogProtoClientOptions *options) { return self->construct(transport, options); } static inline gboolean log_proto_client_factory_is_proto_stateful(LogProtoClientFactory *self) { return self->stateful; } LogProtoClientFactory *log_proto_client_get_factory(PluginContext *context, const gchar *name); #endif