/*
 * include/types/sink.h
 * This file provides definitions for event sinks
 *
 * Copyright (C) 2000-2019 Willy Tarreau - w@1wt.eu
 *
 * 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, version 2.1
 * exclusively.
 *
 * 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 Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef _TYPES_SINK_H
#define _TYPES_SINK_H

#include <common/buffer.h>
#include <common/compat.h>
#include <common/config.h>
#include <common/ist.h>

/* A sink may be of 4 distinct types :
 *   - file descriptor (such as stdout)
 *   - ring buffer, readable from CLI
 */
enum sink_type {
	SINK_TYPE_NEW,      // not yet initialized
	SINK_TYPE_FD,       // events sent to a file descriptor
	SINK_TYPE_BUFFER,   // events sent to a ring buffer
};

/* This indicates the default event format, which is the destination's
 * preferred format, but may be overridden by the source.
 */
enum sink_fmt {
	SINK_FMT_RAW,       // raw text sent as-is
	SINK_FMT_SHORT,     // raw text prefixed with a syslog level
	SINK_FMT_ISO,       // raw text prefixed with ISO time
	SINK_FMT_TIMED,     // syslog level then ISO
	SINK_FMT_RFC3164,   // regular syslog
	SINK_FMT_RFC5424,   // extended syslog
};

struct sink_forward_target {
	struct server *srv;    // used server
	struct appctx *appctx; // appctx of current session
	size_t ofs;            // ring buffer reader offset
	__decl_hathreads(HA_SPINLOCK_T lock); // lock to protect current struct
	struct sink_forward_target *next;
};

/* describes the configuration and current state of an event sink */
struct sink {
	struct list sink_list;     // position in the sink list
	char *name;                // sink name
	char *desc;                // sink description
	enum sink_fmt fmt;         // format expected by the sink
	enum sink_type type;       // type of storage
	uint32_t maxlen;           // max message length (truncated above)
	struct proxy* forward_px;  // proxy used to forward
	struct sink_forward_target *sft; // sink forward targets
	struct task *forward_task; // task to handle forward targets conns
	struct sig_handler *forward_sighandler; /* signal handler */
	struct {
		__decl_hathreads(HA_RWLOCK_T lock); // shared/excl for dropped
		struct ring *ring;    // used by ring buffer and STRM sender
		unsigned int dropped; // dropped events since last one.
		int fd;               // fd num for FD type sink
	} ctx;
};

#endif /* _TYPES_SINK_H */

/*
 * Local variables:
 *  c-indent-level: 8
 *  c-basic-offset: 8
 * End:
 */
