chiark / gitweb /
ipv6: introduce union iaddr
[secnet.git] / secnet.h
index 6b20045709bbe51190c40c4096e27ea4f1e9837a..f458f8a345724e3cdb78b2dcf25b7ac1b873261f 100644 (file)
--- a/secnet.h
+++ b/secnet.h
 #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;
@@ -23,6 +30,11 @@ 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)
 
@@ -275,11 +287,14 @@ struct buffer_if;
 
 /* Answers to queries are delivered to a function of this
    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);
+   will be freed once resolve_answer_fn returns.  naddrs is the actual
+   size of the array at addrs; was_naddrs is the number of addresses
+   actually found in the DNS, which may be bigger if addrs is equal
+   to MAX_PEER_ADDRS (ie there were too many). */
+typedef void resolve_answer_fn(void *st, const struct comm_addr *addrs,
+                              int naddrs, int was_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;
@@ -325,7 +340,7 @@ struct comm_addr {
        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
@@ -338,6 +353,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. */