X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=secnet.h;h=8a60ee30546ed4382c191f872e2f9cc04f32dc90;hp=9bec310c1b8f280a54a0dec91377faad930780f4;hb=fbef1df1dba01447d6e28002a0d2885bf4192f34;hpb=3abd18e85781e00e2b7fc641f29c99e130238abf diff --git a/secnet.h b/secnet.h index 9bec310..8a60ee3 100644 --- a/secnet.h +++ b/secnet.h @@ -3,20 +3,42 @@ #ifndef secnet_h #define secnet_h +#define ADNS_FEATURE_MANYAF + #include "config.h" #include #include #include #include #include +#include +#include #include #include #include #include +#include + +#define MAX_PEER_ADDRS 5 +/* send at most this many copies; honour at most that many addresses */ + +struct comm_if; +struct comm_addr; typedef char *string_t; typedef const char *cstring_t; -typedef enum {False,True} bool_t; + +#define False (_Bool)0 +#define True (_Bool)1 +typedef _Bool bool_t; + +union iaddr { + struct sockaddr sa; + struct sockaddr_in sin; +#ifdef CONFIG_IPV6 + struct sockaddr_in6 sin6; +#endif +}; #define ASSERT(x) do { if (!(x)) { fatal("assertion failed line %d file " \ __FILE__,__LINE__); } } while(0) @@ -94,7 +116,7 @@ extern cstring_t *dict_keys(dict_t *dict); /* List-manipulation functions */ extern list_t *list_new(void); -extern int32_t list_length(list_t *a); +extern int32_t list_length(const list_t *a); extern list_t *list_append(list_t *a, item_t *i); extern list_t *list_append_list(list_t *a, list_t *b); /* Returns an item from the list (index starts at 0), or NULL */ @@ -116,6 +138,14 @@ extern uint32_t dict_read_number(dict_t *dict, cstring_t key, bool_t required, /* return value can safely be assigned to int32_t */ extern bool_t dict_read_bool(dict_t *dict, cstring_t key, bool_t required, cstring_t desc, struct cloc loc, bool_t def); +const char **dict_read_string_array(dict_t *dict, cstring_t key, + bool_t required, cstring_t desc, + struct cloc loc, const char *const *def); + /* Return value is a NULL-terminated array obtained from malloc; + * Individual string values are still owned by config file machinery + * and must not be modified or freed. Returns NULL if key not + * found. */ + struct flagstr { cstring_t name; uint32_t value; @@ -133,6 +163,9 @@ extern char *safe_strdup(const char *string, const char *message); extern void *safe_malloc(size_t size, const char *message); extern void *safe_malloc_ary(size_t size, size_t count, const char *message); +void setcloexec(int fd); /* cannot fail */ +void pipe_cloexec(int fd[2]); /* pipe(), setcloexec() twice; cannot fail */ + extern int sys_cmd(const char *file, const char *argc, ...); extern uint64_t now_global; @@ -269,9 +302,13 @@ 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 void resolve_answer_fn(void *st, const struct comm_addr *addrs, + int naddrs, const char *name, + const char *failwhy); + /* name is the same ptr as passed to request, so its lifetime must + * be suitable*/ typedef bool_t resolve_request_fn(void *st, cstring_t name, + int remoteport, struct comm_if *comm, resolve_answer_fn *cb, void *cst); struct resolver_if { void *st; @@ -317,7 +354,8 @@ struct comm_addr { must start by memsetting it with FILLZERO, or some equivalent. */ struct comm_if *comm; - struct sockaddr_in sin; + union iaddr ia; + int ix; }; /* Return True if the packet was processed, and shouldn't be passed to @@ -330,6 +368,9 @@ typedef void comm_release_notify_fn(void *commst, void *nst, comm_notify_fn *fn); typedef bool_t comm_sendmsg_fn(void *commst, struct buffer_if *buf, const struct comm_addr *dest); + /* Only returns false if (we know that) the local network + * environment is such that this address cannot work; transient + * or unknown/unexpected failures return true. */ typedef const char *comm_addr_to_string_fn(void *commst, const struct comm_addr *ca); /* Returned string is in a static buffer. */ @@ -341,15 +382,22 @@ struct comm_if { comm_addr_to_string_fn *addr_to_string; }; +static inline const char *comm_addr_to_string(const struct comm_addr *ca) +{ + return ca->comm->addr_to_string(ca->comm->st, ca); +} + /* LOG interface */ +#define LOG_MESSAGE_BUFLEN 1023 + typedef void log_msg_fn(void *st, int class, const char *message, ...); typedef void log_vmsg_fn(void *st, int class, const char *message, va_list args); struct log_if { void *st; - log_msg_fn *logfn; /* Do not call these directly - you don't get */ log_vmsg_fn *vlogfn; /* printf format checking. Use [v]slilog instead */ + char buff[LOG_MESSAGE_BUFLEN+1]; }; /* (convenience functions, defined in util.c) */ extern void slilog(struct log_if *lf, int class, const char *message, ...) @@ -357,6 +405,13 @@ FORMAT(printf,3,4); extern void vslilog(struct log_if *lf, int class, const char *message, va_list) FORMAT(printf,3,0); +/* Versions which take (parts of) (multiple) messages, using \n to + * distinguish one message from another. */ +extern void slilog_part(struct log_if *lf, int class, const char *message, ...) +FORMAT(printf,3,4); +extern void vslilog_part(struct log_if *lf, int class, const char *message, + va_list) FORMAT(printf,3,0); + /* SITE interface */ /* Pretty much a placeholder; allows starting and stopping of processing, @@ -431,7 +486,7 @@ typedef void netlink_deliver_fn(void *st, struct buffer_if *buf); #define MAXIMUM_LINK_QUALITY 3 typedef void netlink_link_quality_fn(void *st, uint32_t quality); typedef void netlink_register_fn(void *st, netlink_deliver_fn *deliver, - void *dst); + void *dst, uint32_t *localmtu_r /* NULL ok */); 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, int32_t new_mtu); @@ -482,7 +537,7 @@ struct buffer_if { uint8_t *base; uint8_t *start; int32_t size; /* Size of buffer contents */ - int32_t len; /* Total length allocated at base */ + int32_t alloclen; /* Total length allocated at base */ }; /***** LOG functions *****/ @@ -528,5 +583,6 @@ extern void log_from_fd(int fd, cstring_t prefix, struct log_if *log); #define STRING(x) STRING2(x) #define FILLZERO(obj) (memset(&(obj),0,sizeof((obj)))) +#define ARRAY_SIZE(ary) (sizeof(ary)/sizeof(ary[0])) #endif /* secnet_h */