Importing all of DRL, including ulogd and all of its files.
[distributedratelimiting.git] / include / ulogd / ulogd.h
diff --git a/include/ulogd/ulogd.h b/include/ulogd/ulogd.h
new file mode 100644 (file)
index 0000000..e1e4e6d
--- /dev/null
@@ -0,0 +1,162 @@
+#ifndef _ULOGD_H
+#define _ULOGD_H
+/* ulogd, Version $Revision: 5369 $
+ *
+ * userspace logging daemon for netfilter ULOG target
+ * of the linux 2.4 netfilter subsystem.
+ *
+ * (C) 2000 by Harald Welte <laforge@gnumonks.org>
+ *
+ * this code is released under the terms of GNU GPL
+ *
+ * $Id: ulogd.h 5369 2005-05-04 01:16:57Z laforge $
+ */
+
+#include <libipulog/libipulog.h>
+#include <stdio.h>
+#include <signal.h>    /* need this because of extension-sighandler */
+
+/* All types with MSB = 1 make use of value.ptr
+ * other types use one of the union's member */
+
+/* types without length */
+#define ULOGD_RET_NONE         0x0000
+
+#define ULOGD_RET_INT8         0x0001
+#define ULOGD_RET_INT16                0x0002
+#define ULOGD_RET_INT32                0x0003
+#define ULOGD_RET_INT64                0x0004
+
+#define ULOGD_RET_UINT8                0x0011
+#define ULOGD_RET_UINT16       0x0012
+#define ULOGD_RET_UINT32       0x0013
+#define ULOGD_RET_UINT64       0x0014
+
+#define ULOGD_RET_BOOL         0x0050
+
+#define ULOGD_RET_IPADDR       0x0100
+
+/* types with length field */
+#define ULOGD_RET_STRING       0x8020
+#define ULOGD_RET_RAW          0x8030
+
+
+/* FLAGS */
+#define ULOGD_RETF_NONE                0x0000
+#define ULOGD_RETF_VALID       0x0001  /* contains a valid result */
+#define ULOGD_RETF_FREE                0x0002  /* ptr needs to be free()d */
+
+
+/* maximum length of ulogd key */
+#define ULOGD_MAX_KEYLEN 32
+
+#define ULOGD_DEBUG    1       /* debugging information */
+#define ULOGD_INFO     3
+#define ULOGD_NOTICE   5       /* abnormal/unexpected condition */
+#define ULOGD_ERROR    7       /* error condition, requires user action */
+#define ULOGD_FATAL    8       /* fatal, program aborted */
+
+typedef struct ulog_iret {
+       /* next interpreter return (key) in the global list */
+       struct ulog_iret *next;
+       /* next interpreter in linked list for current result */
+       struct ulog_iret *cur_next;
+       /* length of the returned value (only for lengthed types */
+       u_int32_t len;
+       /* type of the returned value (ULOGD_IRET_...) */
+       u_int16_t type;
+       /* flags (i.e. free, ...) */
+       u_int16_t flags;
+       /* name of this key */
+       char key[ULOGD_MAX_KEYLEN];
+       /* and finally the returned value */
+       union {
+               u_int8_t        b;
+               u_int8_t        ui8;
+               u_int16_t       ui16;
+               u_int32_t       ui32;
+               u_int64_t       ui64;
+               int8_t          i8;
+               int16_t         i16;
+               int32_t         i32;
+               int64_t         i64;
+               void            *ptr;
+       } value;
+} ulog_iret_t;
+
+typedef struct ulog_interpreter {
+       /* next interpreter in old-style linked list */
+       struct ulog_interpreter *next;
+       /* name of this interpreter (predefined by plugin) */
+       char name[ULOGD_MAX_KEYLEN];
+       /* ID for this interpreter (dynamically assigned) */
+       unsigned int id;
+       /* function to call for each packet */
+       ulog_iret_t* (*interp)(struct ulog_interpreter *ip, 
+                               ulog_packet_msg_t *pkt);
+       /* number of keys this interpreter has */
+       unsigned int key_num;
+       /* keys of this particular interpreter */
+       ulog_iret_t *result;
+} ulog_interpreter_t;
+
+typedef struct ulog_output {
+       /* next output in the linked list */
+       struct ulog_output *next;
+       /* name of this ouput plugin */
+       char name[ULOGD_MAX_KEYLEN];
+       /* callback for initialization */
+       int (*init)(void);
+       /* callback for de-initialization */
+       void (*fini)(void);
+       /* callback function */
+       int (*output)(ulog_iret_t *ret);
+       /* callback function for signals (SIGHUP, ..) */
+       void (*signal)(int signal);
+} ulog_output_t;
+
+/* entries of the key hash */
+struct ulogd_keyh_entry {
+       ulog_interpreter_t *interp;     /* interpreter for this key */
+       unsigned int offset;            /* offset within interpreter */
+       const char *name;               /* name of this particular key */
+};
+
+/***********************************************************************
+ * PUBLIC INTERFACE 
+ ***********************************************************************/
+
+/* register a new interpreter plugin */
+void register_interpreter(ulog_interpreter_t *me);
+
+/* register a new output target */
+void register_output(ulog_output_t *me);
+
+/* allocate a new ulog_iret_t */
+ulog_iret_t *alloc_ret(const u_int16_t type, const char*);
+
+/* write a message to the daemons' logfile */
+void __ulogd_log(int level, char *file, int line, const char *message, ...);
+/* macro for logging including filename and line number */
+#define ulogd_log(level, format, args...) \
+       __ulogd_log(level, __FILE__, __LINE__, format, ## args)
+/* backwards compatibility */
+#define ulogd_error(format, args...) ulogd_log(ULOGD_ERROR, format, ## args)
+
+/* get an interpreter hash id by name */
+unsigned int interh_getid(const char *name);
+
+/* get a key id if you have the name */
+unsigned int keyh_getid(const char *name);
+
+/* get a result for a given key id */
+ulog_iret_t *keyh_getres(unsigned int id);
+
+/* the key hash itself */
+extern struct ulogd_keyh_entry *ulogd_keyh;
+
+#define IS_VALID(x)    (x.flags & ULOGD_RETF_VALID)
+
+#define SET_VALID(x)   (x.flags |= ULOGD_RETF_VALID)
+
+#endif /* _ULOGD_H */