X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=secnet.h;h=16d49596ba0baa2609c2431894fa6cd199524afe;hp=44b180f043d04baa27ac6cc8155f13cbc69067e6;hb=12fc2c3186aef381820305e290981d620da47fe1;hpb=ff1dcd860a6176d24ad1dd7c3b8756c685ca90c6 diff --git a/secnet.h b/secnet.h index 44b180f..16d4959 100644 --- a/secnet.h +++ b/secnet.h @@ -9,10 +9,19 @@ #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; @@ -136,6 +145,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; @@ -272,9 +284,10 @@ 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); 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; @@ -333,6 +346,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. */ @@ -344,6 +360,11 @@ 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 @@ -494,7 +515,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 *****/ @@ -541,4 +562,17 @@ extern void log_from_fd(int fd, cstring_t prefix, struct log_if *log); #define FILLZERO(obj) (memset(&(obj),0,sizeof((obj)))) +/* + * void COPY_OBJ( OBJECT& dst, const OBJECT& src); + * void COPY_ARRAY(OBJECT *dst, const OBJECT *src, INTEGER count); + * // Typesafe: we check that the type OBJECT is the same in both cases. + * // It is OK to use COPY_OBJ on an array object, proviced it's + * // _actually_ the whole array object and not decayed into a + * // pointer (e.g. a formal parameter). + */ +#define COPY_OBJ(dst,src) \ + (&(dst)==&(src), memcpy(&(dst),&(src),sizeof((dst)))) +#define COPY_ARRAY(dst,src,count) \ + (&(dst)[0]==&(src)[0], memcpy((dst),(src),sizeof((dst)[0])*(count))) + #endif /* secnet_h */