syslog-ng source
logproto-server.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2002-2012 Balabit
3  * Copyright (c) 1998-2012 Balázs Scheidler
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19  * As an additional exemption you are allowed to compile & link against the
20  * OpenSSL libraries as published by the OpenSSL project. See the file
21  * COPYING for details.
22  *
23  */
24 
25 #ifndef LOGPROTO_SERVER_H_INCLUDED
26 #define LOGPROTO_SERVER_H_INCLUDED
27 
28 #include "logproto.h"
29 #include "persist-state.h"
31 #include "ack-tracker/bookmark.h"
33 
34 typedef struct _LogProtoServer LogProtoServer;
35 typedef struct _LogProtoServerOptions LogProtoServerOptions;
36 typedef union _LogProtoServerOptionsStorage LogProtoServerOptionsStorage;
37 
38 typedef enum
39 {
44 
45 #define LOG_PROTO_SERVER_OPTIONS_SIZE 160
46 
48 {
49  void (*init)(LogProtoServerOptionsStorage *self, GlobalConfig *cfg);
50  void (*destroy)(LogProtoServerOptionsStorage *self);
51  gboolean (*validate)(LogProtoServerOptionsStorage *self);
52  gboolean initialized;
53 
54  gchar *encoding;
55  /* maximum message length in bytes */
61  AckTrackerFactory *ack_tracker_factory;
63 };
64 
65 /* See logproto-file-reader.h and logreader.c - log_reader_options_defaults for the details of the options mess */
67 {
68  LogProtoServerOptions super;
70 };
71 // _Static_assert() is a C11 feature, so we use a typedef trick to perform the static assertion
73  LOG_PROTO_SERVER_OPTIONS_SIZE >= sizeof(LogProtoServerOptions) ? 1 : -1];
74 
75 gboolean log_proto_server_options_set_encoding(LogProtoServerOptionsStorage *s, const gchar *encoding);
76 void log_proto_server_options_set_ack_tracker_factory(LogProtoServerOptionsStorage *s, AckTrackerFactory *factory);
77 void log_proto_server_options_defaults(LogProtoServerOptionsStorage *options);
78 void log_proto_server_options_init(LogProtoServerOptionsStorage *options, GlobalConfig *cfg);
79 gboolean log_proto_server_options_validate(LogProtoServerOptionsStorage *options);
80 void log_proto_server_options_destroy(LogProtoServerOptionsStorage *options);
81 
82 typedef void (*LogProtoServerWakeupFunc)(gpointer user_data);
83 typedef struct _LogProtoServerWakeupCallback
84 {
86  gpointer user_data;
88 
90 {
92  const LogProtoServerOptionsStorage *options;
93  LogTransportStack transport_stack;
94  AckTracker *ack_tracker;
95 
97  LogProtoPrepareAction (*poll_prepare)(LogProtoServer *s, GIOCondition *cond, gint *timeout);
98  gboolean (*restart_with_state)(LogProtoServer *s, PersistState *state, const gchar *persist_name);
99  LogProtoStatus (*fetch)(LogProtoServer *s, const guchar **msg, gsize *msg_len, gboolean *may_read,
100  LogTransportAuxData *aux, Bookmark *bookmark);
101  gboolean (*validate_options)(LogProtoServer *s);
102  LogProtoStatus (*handshake)(LogProtoServer *s, gboolean *handshake_finished, LogProtoServer **proto_replacement);
103  void (*free_fn)(LogProtoServer *s);
104 };
105 
106 static inline gboolean
107 log_proto_server_validate_options(LogProtoServer *self)
108 {
109  return self->validate_options(self);
110 }
111 
112 static inline LogProtoStatus
113 log_proto_server_handshake(LogProtoServer *s, gboolean *handshake_finished, LogProtoServer **proto_replacement)
114 {
115  if (s->handshake)
116  {
117  LogProtoStatus status;
118 
119  g_assert(*proto_replacement == NULL);
120  status = s->handshake(s, handshake_finished, proto_replacement);
121  if (*proto_replacement)
122  {
123  g_assert(status == LPS_SUCCESS || status == LPS_AGAIN);
124  }
125  return status;
126  }
127  *handshake_finished = TRUE;
128  return LPS_SUCCESS;
129 }
130 
131 static inline void
132 log_proto_server_set_options(LogProtoServer *self, const LogProtoServerOptionsStorage *options)
133 {
134  self->options = options;
135 }
136 
137 static inline const LogProtoServerOptionsStorage *
138 log_proto_server_get_options(LogProtoServer *self)
139 {
140  return self->options;
141 }
142 
143 static inline const MultiLineOptions *
144 log_proto_server_get_multi_line_options(LogProtoServer *self)
145 {
146  return &self->options->super.multi_line_options;
147 }
148 
149 static inline LogProtoPrepareAction
150 log_proto_server_poll_prepare(LogProtoServer *s, GIOCondition *cond, gint *timeout)
151 {
152  LogProtoPrepareAction result = s->poll_prepare(s, cond, timeout);
153 
154  if (result == LPPA_POLL_IO && *timeout < 0)
155  *timeout = s->options->super.idle_timeout;
156  return result;
157 }
158 
159 static inline gboolean
160 log_proto_server_restart_with_state(LogProtoServer *s, PersistState *state, const gchar *persist_name)
161 {
162  if (s->restart_with_state)
163  return s->restart_with_state(s, state, persist_name);
164  return FALSE;
165 }
166 
167 static inline LogProtoStatus
168 log_proto_server_fetch(LogProtoServer *s, const guchar **msg, gsize *msg_len, gboolean *may_read,
169  LogTransportAuxData *aux, Bookmark *bookmark)
170 {
171  if (s->status == LPS_SUCCESS)
172  return s->fetch(s, msg, msg_len, may_read, aux, bookmark);
173  return s->status;
174 }
175 
176 static inline gint
177 log_proto_server_get_fd(LogProtoServer *s)
178 {
179  /* FIXME: Layering violation, as transport may not be fd based at all.
180  * But LogReader assumes it is. */
181 
182  return s->transport_stack.fd;
183 }
184 
185 static inline void
186 log_proto_server_reset_error(LogProtoServer *s)
187 {
188  s->status = LPS_SUCCESS;
189 }
190 
191 static inline void
192 log_proto_server_set_wakeup_cb(LogProtoServer *s, LogProtoServerWakeupFunc wakeup, gpointer user_data)
193 {
194  s->wakeup_callback.user_data = user_data;
195  s->wakeup_callback.func = wakeup;
196 }
197 
198 static inline void
199 log_proto_server_wakeup_cb_call(LogProtoServerWakeupCallback *wakeup_callback)
200 {
201  if (wakeup_callback->func)
202  wakeup_callback->func(wakeup_callback->user_data);
203 }
204 
205 AckTrackerFactory *log_proto_server_get_ack_tracker_factory(LogProtoServer *s);
206 gboolean log_proto_server_is_position_tracked(LogProtoServer *s);
207 
208 gboolean log_proto_server_validate_options_method(LogProtoServer *s);
209 void log_proto_server_init(LogProtoServer *s, LogTransport *transport, const LogProtoServerOptionsStorage *options);
210 void log_proto_server_free_method(LogProtoServer *s);
211 void log_proto_server_free(LogProtoServer *s);
212 
213 static inline void
214 log_proto_server_set_ack_tracker(LogProtoServer *s, AckTracker *ack_tracker)
215 {
216  g_assert(ack_tracker);
217  s->ack_tracker = ack_tracker;
218 }
219 
220 #define DEFINE_LOG_PROTO_SERVER(prefix, options...) \
221  static gpointer \
222  prefix ## _server_plugin_construct(Plugin *self) \
223  { \
224  static LogProtoServerFactory proto = { \
225  .construct = prefix ## _server_new, \
226  ##options \
227  }; \
228  return &proto; \
229  }
230 
231 #define LOG_PROTO_SERVER_PLUGIN(prefix, __name) \
232  { \
233  .type = LL_CONTEXT_SERVER_PROTO, \
234  .name = __name, \
235  .construct = prefix ## _server_plugin_construct, \
236  }
237 
238 #define LOG_PROTO_SERVER_PLUGIN_WITH_GRAMMAR(__parser, __name) \
239  { \
240  .type = LL_CONTEXT_SERVER_PROTO, \
241  .name = __name, \
242  .parser = &__parser, \
243  }
244 
245 typedef struct _LogProtoServerFactory LogProtoServerFactory;
246 
248 {
249  LogProtoServer *(*construct)(LogTransport *transport, const LogProtoServerOptionsStorage *options);
251 };
252 
253 static inline LogProtoServer *
254 log_proto_server_factory_construct(LogProtoServerFactory *self, LogTransport *transport,
255  const LogProtoServerOptionsStorage *options)
256 {
257  return self->construct(transport, options);
258 }
259 
260 LogProtoServerFactory *log_proto_server_get_factory(PluginContext *context, const gchar *name);
261 
262 const guchar *find_eom(const guchar *s, gsize n);
263 
264 #endif
const gchar * name
Definition: debugger.c:265
void log_proto_server_options_set_ack_tracker_factory(LogProtoServerOptionsStorage *s, AckTrackerFactory *factory)
Definition: logproto-server.c:165
void log_proto_server_options_init(LogProtoServerOptionsStorage *options, GlobalConfig *cfg)
Definition: logproto-server.c:184
void log_proto_server_free(LogProtoServer *s)
Definition: logproto-server.c:132
LogProtoPrepareAction
Definition: logproto-server.h:39
@ LPPA_FORCE_SCHEDULE_FETCH
Definition: logproto-server.h:41
@ LPPA_SUSPEND
Definition: logproto-server.h:42
@ LPPA_POLL_IO
Definition: logproto-server.h:40
gboolean log_proto_server_is_position_tracked(LogProtoServer *s)
Definition: logproto-server.c:111
void log_proto_server_free_method(LogProtoServer *s)
Definition: logproto-server.c:125
void log_proto_server_options_defaults(LogProtoServerOptionsStorage *options)
Definition: logproto-server.c:172
gboolean log_proto_server_options_set_encoding(LogProtoServerOptionsStorage *s, const gchar *encoding)
Definition: logproto-server.c:149
LogProtoServerFactory * log_proto_server_get_factory(PluginContext *context, const gchar *name)
Definition: logproto-server.c:248
void(* LogProtoServerWakeupFunc)(gpointer user_data)
Definition: logproto-server.h:82
AckTrackerFactory * log_proto_server_get_ack_tracker_factory(LogProtoServer *s)
Definition: logproto-server.c:105
const guchar * find_eom(const guchar *s, gsize n)
Definition: logproto-server.c:45
void log_proto_server_options_destroy(LogProtoServerOptionsStorage *options)
Definition: logproto-server.c:235
gboolean log_proto_server_options_validate(LogProtoServerOptionsStorage *options)
Definition: logproto-server.c:223
char static_assert_size_check_LogProtoServerOptions[LOG_PROTO_SERVER_OPTIONS_SIZE >=sizeof(LogProtoServerOptions) ? 1 :-1]
Definition: logproto-server.h:73
#define LOG_PROTO_SERVER_OPTIONS_SIZE
Definition: logproto-server.h:45
gboolean log_proto_server_validate_options_method(LogProtoServer *s)
Definition: logproto-server.c:119
void log_proto_server_init(LogProtoServer *s, LogTransport *transport, const LogProtoServerOptionsStorage *options)
Definition: logproto-server.c:140
LogProtoStatus
Definition: logproto.h:33
@ LPS_SUCCESS
Definition: logproto.h:34
@ LPS_AGAIN
Definition: logproto.h:38
Definition: logproto-server.h:84
gpointer user_data
Definition: logproto-server.h:86
LogProtoServerWakeupFunc func
Definition: logproto-server.h:85
Definition: transport-aux-data.h:30
Definition: multi-line-factory.h:43
Definition: logproto-server.h:248
gint default_inet_port
Definition: logproto-server.h:250
Definition: logproto-server.h:48
gint max_msg_size
Definition: logproto-server.h:56
gint init_buffer_size
Definition: logproto-server.h:58
gboolean trim_large_messages
Definition: logproto-server.h:57
gboolean(* validate)(LogProtoServerOptionsStorage *self)
Definition: logproto-server.h:51
gchar * encoding
Definition: logproto-server.h:54
gint idle_timeout
Definition: logproto-server.h:60
MultiLineOptions multi_line_options
Definition: logproto-server.h:62
gboolean initialized
Definition: logproto-server.h:52
AckTrackerFactory * ack_tracker_factory
Definition: logproto-server.h:61
gint max_buffer_size
Definition: logproto-server.h:59
void(* destroy)(LogProtoServerOptionsStorage *self)
Definition: logproto-server.h:50
void(* init)(LogProtoServerOptionsStorage *self, GlobalConfig *cfg)
Definition: logproto-server.h:49
Definition: logproto-server.h:90
LogProtoStatus(* fetch)(LogProtoServer *s, const guchar **msg, gsize *msg_len, gboolean *may_read, LogTransportAuxData *aux, Bookmark *bookmark)
Definition: logproto-server.h:99
void(* free_fn)(LogProtoServer *s)
Definition: logproto-server.h:103
gboolean(* validate_options)(LogProtoServer *s)
Definition: logproto-server.h:101
const LogProtoServerOptionsStorage * options
Definition: logproto-server.h:92
AckTracker * ack_tracker
Definition: logproto-server.h:94
LogProtoStatus status
Definition: logproto-server.h:91
gboolean(* restart_with_state)(LogProtoServer *s, PersistState *state, const gchar *persist_name)
Definition: logproto-server.h:98
LogProtoPrepareAction(* poll_prepare)(LogProtoServer *s, GIOCondition *cond, gint *timeout)
Definition: logproto-server.h:97
LogTransportStack transport_stack
Definition: logproto-server.h:93
LogProtoStatus(* handshake)(LogProtoServer *s, gboolean *handshake_finished, LogProtoServer **proto_replacement)
Definition: logproto-server.h:102
LogProtoServerWakeupCallback wakeup_callback
Definition: logproto-server.h:96
LogTransportAuxData * aux
Definition: test_aux_data.c:28
GlobalConfig * cfg
Definition: test_batched_ack_tracker.c:34
CSVScannerOptions options
Definition: test_csv_scanner.c:30
GString * result
Definition: test_lexer_block.c:34
LogMessage * msg
Definition: test_rename.c:35
struct @95 state
Definition: logproto-server.h:67
gchar __padding[LOG_PROTO_SERVER_OPTIONS_SIZE]
Definition: logproto-server.h:69
LogProtoServerOptions super
Definition: logproto-server.h:68