#include <assert.h>
#include <fcntl.h>
#include <unistd.h>
+#include <errno.h>
#include <sys/poll.h>
#include <sys/types.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#include <bsd/sys/queue.h>
+
#define MAX_PEER_ADDRS 5
/* send at most this many copies; honour at most that many addresses */
/* 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;
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);
+extern void *safe_realloc_ary(void *p, 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 */
int *timeout_io);
typedef void afterpoll_fn(void *st, struct pollfd *fds, int nfds);
+/* void BEFOREPOLL_WANT_FDS(int want);
+ * Expects: int *nfds_io;
+ * Can perform non-local exit.
+ * Checks whether there is space for want fds. If so, sets *nfds_io.
+ * If not, sets *nfds_io and returns. */
+#define BEFOREPOLL_WANT_FDS(want) do{ \
+ if (*nfds_io<(want)) { *nfds_io=(want); return ERANGE; } \
+ *nfds_io=(want); \
+ }while(0)
+
/* Register interest in the main loop of the program. Before a call
to poll() your supplied beforepoll function will be called. After
- the call to poll() the supplied afterpoll function will be called.
- max_nfds is a _hint_ about the maximum number of struct pollfd
- structures you may require - you can always ask for more in
- *nfds_io. */
-extern void register_for_poll(void *st, beforepoll_fn *before,
- afterpoll_fn *after, int32_t max_nfds,
- cstring_t desc);
+ the call to poll() the supplied afterpoll function will be called. */
+struct poll_interest *register_for_poll(void *st, beforepoll_fn *before,
+ afterpoll_fn *after, cstring_t desc);
+void deregister_for_poll(struct poll_interest *i);
/***** END of scheduling support */
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);
+ int naddrs, int was_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);