%PDF- %PDF-
Direktori : /backups/router/usr/local/include/syslog-ng/logproto/ |
Current File : //backups/router/usr/local/include/syslog-ng/logproto/logproto-server.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_SERVER_H_INCLUDED #define LOGPROTO_SERVER_H_INCLUDED #include "logproto.h" #include "persist-state.h" #include "transport/transport-aux-data.h" #include "ack-tracker/bookmark.h" typedef struct _LogProtoServer LogProtoServer; typedef struct _LogProtoServerOptions LogProtoServerOptions; typedef enum { LPPA_POLL_IO, LPPA_FORCE_SCHEDULE_FETCH, LPPA_SUSPEND } LogProtoPrepareAction; #define LOG_PROTO_SERVER_OPTIONS_SIZE 128 struct _LogProtoServerOptions { void (*destroy)(LogProtoServerOptions *self); gboolean initialized; gchar *encoding; /* maximum message length in bytes */ gint max_msg_size; gboolean trim_large_messages; gint max_buffer_size; gint init_buffer_size; AckTrackerFactory *ack_tracker_factory; }; typedef union LogProtoServerOptionsStorage { LogProtoServerOptions super; gchar __padding[LOG_PROTO_SERVER_OPTIONS_SIZE]; } LogProtoServerOptionsStorage; gboolean log_proto_server_options_set_encoding(LogProtoServerOptions *s, const gchar *encoding); void log_proto_server_options_set_ack_tracker_factory(LogProtoServerOptions *s, AckTrackerFactory *factory); void log_proto_server_options_defaults(LogProtoServerOptions *options); void log_proto_server_options_init(LogProtoServerOptions *options, GlobalConfig *cfg); void log_proto_server_options_destroy(LogProtoServerOptions *options); typedef void (*LogProtoServerWakeupFunc)(gpointer user_data); typedef struct _LogProtoServerWakeupCallback { LogProtoServerWakeupFunc func; gpointer user_data; } LogProtoServerWakeupCallback; struct _LogProtoServer { LogProtoStatus status; const LogProtoServerOptions *options; LogTransport *transport; AckTracker *ack_tracker; LogProtoServerWakeupCallback wakeup_callback; /* FIXME: rename to something else */ LogProtoPrepareAction (*prepare)(LogProtoServer *s, GIOCondition *cond, gint *timeout); gboolean (*restart_with_state)(LogProtoServer *s, PersistState *state, const gchar *persist_name); LogProtoStatus (*fetch)(LogProtoServer *s, const guchar **msg, gsize *msg_len, gboolean *may_read, LogTransportAuxData *aux, Bookmark *bookmark); gboolean (*validate_options)(LogProtoServer *s); gboolean (*handshake_in_progess)(LogProtoServer *s); LogProtoStatus (*handshake)(LogProtoServer *s); void (*free_fn)(LogProtoServer *s); }; static inline gboolean log_proto_server_validate_options(LogProtoServer *self) { return self->validate_options(self); } static inline gboolean log_proto_server_handshake_in_progress(LogProtoServer *s) { if (s->handshake_in_progess) { return s->handshake_in_progess(s); } return FALSE; } static inline LogProtoStatus log_proto_server_handshake(LogProtoServer *s) { if (s->handshake) { return s->handshake(s); } return LPS_SUCCESS; } static inline void log_proto_server_set_options(LogProtoServer *self, const LogProtoServerOptions *options) { self->options = options; } static inline gboolean log_proto_server_prepare(LogProtoServer *s, GIOCondition *cond, gint *timeout) { return s->prepare(s, cond, timeout); } static inline gboolean log_proto_server_restart_with_state(LogProtoServer *s, PersistState *state, const gchar *persist_name) { if (s->restart_with_state) return s->restart_with_state(s, state, persist_name); return FALSE; } static inline LogProtoStatus log_proto_server_fetch(LogProtoServer *s, const guchar **msg, gsize *msg_len, gboolean *may_read, LogTransportAuxData *aux, Bookmark *bookmark) { if (s->status == LPS_SUCCESS) return s->fetch(s, msg, msg_len, may_read, aux, bookmark); return s->status; } static inline gint log_proto_server_get_fd(LogProtoServer *s) { /* FIXME: Layering violation, as transport may not be fd based at all. * But LogReader assumes it is. */ return s->transport->fd; } static inline void log_proto_server_reset_error(LogProtoServer *s) { s->status = LPS_SUCCESS; } static inline void log_proto_server_set_wakeup_cb(LogProtoServer *s, LogProtoServerWakeupFunc wakeup, gpointer user_data) { s->wakeup_callback.user_data = user_data; s->wakeup_callback.func = wakeup; } static inline void log_proto_server_wakeup_cb_call(LogProtoServerWakeupCallback *wakeup_callback) { if (wakeup_callback->func) wakeup_callback->func(wakeup_callback->user_data); } AckTrackerFactory *log_proto_server_get_ack_tracker_factory(LogProtoServer *s); gboolean log_proto_server_is_position_tracked(LogProtoServer *s); gboolean log_proto_server_validate_options_method(LogProtoServer *s); void log_proto_server_init(LogProtoServer *s, LogTransport *transport, const LogProtoServerOptions *options); void log_proto_server_free_method(LogProtoServer *s); void log_proto_server_free(LogProtoServer *s); static inline void log_proto_server_set_ack_tracker(LogProtoServer *s, AckTracker *ack_tracker) { g_assert(ack_tracker); s->ack_tracker = ack_tracker; } #define DEFINE_LOG_PROTO_SERVER(prefix, options...) \ static gpointer \ prefix ## _server_plugin_construct(Plugin *self) \ { \ static LogProtoServerFactory proto = { \ .construct = prefix ## _server_new, \ ##options \ }; \ return &proto; \ } #define LOG_PROTO_SERVER_PLUGIN(prefix, __name) \ { \ .type = LL_CONTEXT_SERVER_PROTO, \ .name = __name, \ .construct = prefix ## _server_plugin_construct, \ } #define LOG_PROTO_SERVER_PLUGIN_WITH_GRAMMAR(__parser, __name) \ { \ .type = LL_CONTEXT_SERVER_PROTO, \ .name = __name, \ .parser = &__parser, \ } typedef struct _LogProtoServerFactory LogProtoServerFactory; struct _LogProtoServerFactory { LogProtoServer *(*construct)(LogTransport *transport, const LogProtoServerOptions *options); gint default_inet_port; gboolean use_multitransport; }; static inline LogProtoServer * log_proto_server_factory_construct(LogProtoServerFactory *self, LogTransport *transport, const LogProtoServerOptions *options) { return self->construct(transport, options); } LogProtoServerFactory *log_proto_server_get_factory(PluginContext *context, const gchar *name); const guchar *find_eom(const guchar *s, gsize n); #endif