// SPDX-License-Identifier: ISC
/*
 * Copyright (c) 2019-22  David Lamparter, for NetDEF, Inc.
 */

#ifndef _FRR_ZLOG_LIVE_H
#define _FRR_ZLOG_LIVE_H

#include "printfrr.h"

struct zlog_live_hdr {
	/* timestamp (CLOCK_REALTIME) */
	uint64_t ts_sec;
	uint32_t ts_nsec;

	/* length of zlog_live_hdr, including variable length bits and
	 * possible future extensions - aka start of text
	 */
	uint32_t hdrlen;

	/* process & thread ID, meaning depends on OS */
	int64_t pid;
	int64_t tid;

	/* number of lost messages due to best-effort non-blocking mode */
	uint32_t lost_msgs;
	/* syslog priority value */
	uint32_t prio;
	/* flags: currently unused */
	uint32_t flags;
	/* length of message text - extra data (e.g. future key/value metadata)
	 * may follow after it
	 */
	uint32_t textlen;
	/* length of "[XXXXX-XXXXX][EC 0] " header; consumer may want to skip
	 * over it if using the raw values below.  Note that this text may be
	 * absent depending on "log error-category" and "log unique-id"
	 * settings
	 */
	uint32_t texthdrlen;

	/* xref unique identifier, "XXXXX-XXXXX\0" = 12 bytes */
	char uid[12];
	/* EC value */
	uint32_t ec;

	/* recorded printf formatting argument positions (variable length) */
	uint32_t n_argpos;
	struct fmt_outpos argpos[0];
};

struct zlt_live;

struct zlog_live_cfg {
	struct zlt_live *target;

	/* nothing else here */
};

extern void zlog_live_open(struct zlog_live_cfg *cfg, int prio_min,
			   int *other_fd);
extern void zlog_live_open_fd(struct zlog_live_cfg *cfg, int prio_min, int fd);

static inline bool zlog_live_is_null(struct zlog_live_cfg *cfg)
{
	return cfg->target == NULL;
}

extern void zlog_live_close(struct zlog_live_cfg *cfg);
extern void zlog_live_disown(struct zlog_live_cfg *cfg);

#endif /* _FRR_ZLOG_5424_H */
