chiark / gitweb /
Import release 0.1.14
[secnet.git] / secnet.h
index 3821b81cddf2386592409754f78f70a9d4ee75e1..f8062e6a81704b035299274a05c213f73969002e 100644 (file)
--- a/secnet.h
+++ b/secnet.h
@@ -6,6 +6,7 @@
 #include "config.h"
 #include <stdlib.h>
 #include <stdarg.h>
+#include <stdio.h>
 #include <sys/poll.h>
 #include <sys/types.h>
 #include <sys/time.h>
 typedef char *string_t;
 typedef enum {False,True} bool_t;
 
-#define ASSERT(x) do { if (!(x)) { fatal("assertion failed line " __LINE__ \
-                                        " file " __FILE__ "\n"); } while(0)
-
-/***** SHARED types *****/
-
-/* These are stored in HOST byte order */
-struct subnet {
-    uint32_t prefix;
-    uint32_t mask;
-    uint32_t len;
-};
-
-struct subnet_list {
-    uint32_t entries;
-    struct subnet *list;
-};
-
-/***** END of shared types *****/
+#define ASSERT(x) do { if (!(x)) { fatal("assertion failed line %d file " \
+                                        __FILE__,__LINE__); } } while(0)
 
 /***** CONFIGURATION support *****/
 
@@ -75,6 +60,8 @@ struct item {
     struct cloc loc;
 };
 
+/* Note that it is unwise to use this structure directly; use the list
+   manipulation functions instead. */
 struct list {
     item_t *item;
     struct list *next;
@@ -112,10 +99,6 @@ extern uint32_t dict_read_number(dict_t *dict, string_t key, bool_t required,
                                 string_t desc, struct cloc loc, uint32_t def);
 extern bool_t dict_read_bool(dict_t *dict, string_t key, bool_t required,
                             string_t desc, struct cloc loc, bool_t def);
-extern void dict_read_subnet_list(dict_t *dict, string_t key, bool_t required,
-                                 string_t desc, struct cloc loc,
-                                 struct subnet_list *sl);
-extern uint32_t string_to_ipaddr(item_t *i, string_t desc);
 struct flagstr {
     string_t name;
     uint32_t value;
@@ -127,28 +110,6 @@ extern uint32_t string_list_to_word(list_t *l, struct flagstr *f,
 
 /***** END of configuration support *****/
 
-/***** LOG functions *****/
-
-#define M_DEBUG_CONFIG 0x001
-#define M_DEBUG_PHASE  0x002
-#define M_DEBUG        0x004
-#define M_INFO        0x008
-#define M_NOTICE       0x010
-#define M_WARNING      0x020
-#define M_ERR         0x040
-#define M_SECURITY     0x080
-#define M_FATAL               0x100
-
-extern void fatal(char *message, ...);
-extern void fatal_perror(char *message, ...);
-extern void fatal_status(int status, char *message, ...);
-extern void fatal_perror_status(int status, char *message, ...);
-extern void cfgfatal(struct cloc loc, string_t facility, char *message, ...);
-
-extern void Message(uint32_t class, char *message, ...);
-
-/***** END of log functions *****/
-
 /***** UTILITY functions *****/
 
 extern char *safe_strdup(char *string, char *message);
@@ -205,12 +166,10 @@ bool_t remove_hook(uint32_t phase, hook_fn *f, void *state);
 extern uint32_t current_phase;
 extern void enter_phase(uint32_t new_phase);
 
-extern bool_t require_root_privileges; /* Some features (like netlink
-                                         'soft' routes) require that
-                                         secnet retain root
-                                         privileges.  They should
-                                         indicate that here when
-                                         appropriate. */
+/* Some features (like netlink 'soft' routes) require that secnet
+   retain root privileges.  They should indicate that here when
+   appropriate. */
+extern bool_t require_root_privileges;
 extern string_t require_root_privileges_explanation;
 
 /***** END of program lifetime support *****/
@@ -251,6 +210,7 @@ struct buffer_if;
    type. 'address' will be NULL if there was a problem with the query. It
    will be freed once resolve_answer_fn returns. It is in network byte
    order. */
+/* XXX extend to be able to provide multiple answers */
 typedef void resolve_answer_fn(void *st, struct in_addr *addr);
 typedef bool_t resolve_request_fn(void *st, string_t name,
                                  resolve_answer_fn *cb, void *cst);
@@ -301,6 +261,8 @@ typedef bool_t comm_sendmsg_fn(void *commst, struct buffer_if *buf,
                               struct sockaddr_in *dest);
 struct comm_if {
     void *st;
+    uint32_t min_start_pad;
+    uint32_t min_end_pad;
     comm_request_notify_fn *request_notify;
     comm_release_notify_fn *release_notify;
     comm_sendmsg_fn *sendmsg;
@@ -316,7 +278,8 @@ struct log_if {
     log_vmsg_fn *vlog;
 };
 /* (convenience function, defined in util.c) */
-extern void log(struct log_if *lf, int class, char *message, ...);
+extern void log(struct log_if *lf, int class, char *message, ...)
+FORMAT(printf,3,4);
 
 /* SITE interface */
 
@@ -386,12 +349,17 @@ typedef void netlink_link_quality_fn(void *st, uint32_t quality);
 typedef void netlink_register_fn(void *st, netlink_deliver_fn *deliver,
                                 void *dst, uint32_t max_start_pad,
                                 uint32_t max_end_pad);
-
+typedef void netlink_output_config_fn(void *st, struct buffer_if *buf);
+typedef bool_t netlink_check_config_fn(void *st, struct buffer_if *buf);
+typedef void netlink_set_mtu_fn(void *st, uint32_t new_mtu);
 struct netlink_if {
     void *st;
     netlink_register_fn *reg;
     netlink_deliver_fn *deliver;
     netlink_link_quality_fn *set_quality;
+    netlink_output_config_fn *output_config;
+    netlink_check_config_fn *check_config;
+    netlink_set_mtu_fn *set_mtu;
 };
 
 /* DH interface */
@@ -435,4 +403,36 @@ struct buffer_if {
     uint32_t len; /* Total length allocated at base */
 };
 
+/***** LOG functions *****/
+
+#define M_DEBUG_CONFIG 0x001
+#define M_DEBUG_PHASE  0x002
+#define M_DEBUG        0x004
+#define M_INFO        0x008
+#define M_NOTICE       0x010
+#define M_WARNING      0x020
+#define M_ERR         0x040
+#define M_SECURITY     0x080
+#define M_FATAL               0x100
+
+/* The fatal() family of functions require messages that do not end in '\n' */
+extern NORETURN(fatal(char *message, ...));
+extern NORETURN(fatal_perror(char *message, ...));
+extern NORETURN(fatal_status(int status, char *message, ...));
+extern NORETURN(fatal_perror_status(int status, char *message, ...));
+
+/* The cfgfatal() family of functions require messages that end in '\n' */
+extern NORETURN(cfgfatal(struct cloc loc, string_t facility, char *message,
+                        ...));
+extern void cfgfile_postreadcheck(struct cloc loc, FILE *f);
+extern NORETURN(vcfgfatal_maybefile(FILE *maybe_f, struct cloc loc,
+                                   string_t facility, char *message,
+                                   va_list));
+extern NORETURN(cfgfatal_maybefile(FILE *maybe_f, struct cloc loc,
+                                  string_t facility, char *message, ...));
+
+extern void Message(uint32_t class, char *message, ...) FORMAT(printf,2,3);
+
+/***** END of log functions *****/
+
 #endif /* secnet_h */