#ifndef __LOGSYSLOGFAST_H__
#define __LOGSYSLOGFAST_H__

#include <time.h>

#define LOG_RFC3164 0
#define LOG_RFC5424 1
#define LOG_RFC3164_LOCAL 2

typedef struct {

    /* configuration */
    int    priority;            /* RFC3164/4.1.1 PRI Part */
    char*  sender;              /* sender hostname */
    char*  name;                /* sending program name */
    int    pid;                 /* sending program pid */
    int    format;              /* RFC3164 or RFC5424 or RFC3164_LOCAL */

    /* resource handles */
    int    sock;                /* socket fd */

    /* internal state */
    time_t last_time;           /* time when the prefix was last generated */
    char*  linebuf;             /* log line, including prefix and message */
    int    bufsize;             /* current size of linebuf */
    size_t prefix_len;          /* length of the prefix string */
    char*  msg_start;           /* pointer into linebuf after end of prefix */
    const char* time_format;    /* strftime format string */
    const char* msg_format;     /* snprintf format string */

    /* error reporting */
    const char* err;            /* error string */

} LogSyslogFast;

LogSyslogFast* LSF_alloc();
int LSF_init(LogSyslogFast* logger, int proto, const char* hostname, int port, int facility, int severity, const char* sender, const char* name);
int LSF_destroy(LogSyslogFast* logger);

int LSF_set_receiver(LogSyslogFast* logger, int proto, const char* hostname, int port);

void LSF_set_priority(LogSyslogFast* logger, int facility, int severity);
void LSF_set_facility(LogSyslogFast* logger, int facility);
void LSF_set_severity(LogSyslogFast* logger, int severity);
int LSF_set_sender(LogSyslogFast* logger, const char* sender);
int LSF_set_name(LogSyslogFast* logger, const char* name);
void LSF_set_pid(LogSyslogFast* logger, int pid);
int LSF_set_format(LogSyslogFast* logger, int format);

int LSF_get_priority(LogSyslogFast* logger);
int LSF_get_facility(LogSyslogFast* logger);
int LSF_get_severity(LogSyslogFast* logger);
const char* LSF_get_sender(LogSyslogFast* logger);
const char* LSF_get_name(LogSyslogFast* logger);
int LSF_get_pid(LogSyslogFast* logger);
int LSF_get_format(LogSyslogFast* logger);

int LSF_get_sock(LogSyslogFast* logger);

int LSF_send(LogSyslogFast* logger, const char* msg, int len, time_t t);

#endif