#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#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;
#define True (_Bool)1
typedef _Bool bool_t;
+union iaddr {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+};
+
#define ASSERT(x) do { if (!(x)) { fatal("assertion failed line %d file " \
__FILE__,__LINE__); } } while(0)
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;
must start by memsetting it with FILLZERO, or some
equivalent. */
struct comm_if *comm;
- struct sockaddr_in sin;
+ union iaddr ia;
};
/* Return True if the packet was processed, and shouldn't be passed to
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. */