bool_t iaddr_equal(const union iaddr *ia, const union iaddr *ib);
int iaddr_socklen(const union iaddr *ia);
+void text2iaddr(const item_t *item, uint16_t port, union iaddr *ia,
+ const char *desc);
+
+
+/*----- line-buffered asynch input -----*/
+
+enum async_linebuf_result {
+ async_linebuf_nothing,
+ async_linebuf_ok,
+ async_linebuf_eof,
+ async_linebuf_broken,
+};
+
+enum async_linebuf_result
+async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf,
+ const char **emsg_out);
+ /* Implements reading whole lines, asynchronously. Use like
+ * this:
+ * - set up the fd, which should be readable, O_NONBLOCK
+ * - set up and initialise buffer, which should be big enough
+ * for one lines plus its trailing newline, and be empty
+ * with start==base
+ * - in your beforepoll_fn, be interested in POLLIN
+ * - in your afterpoll_fn, repeatedly call this function
+ * until it doesn't return `nothing'
+ * - after you're done, simply close fd and free or reset buf
+ * State on exit depends on return value:
+ * nothing: don't touch buf, return from beforepoll
+ * ok: buf->base contains a input line
+ * as a nul-terminated string (\n replaced by \0);
+ * *emsg_out==0.
+ * eof: buf->base contains any partial
+ * (non-newline-terminated) line;
+ * *emsg_out!=0 iff there was such a line.
+ * broken: *emsg_out is the error message describing the problem.
+ * this may be stored in buf
+ * buf contents is undefined
+ * While using this function, do not look at buf->start or ->size.
+ */
+
+/*----- some handy macros -----*/
+
#define MINMAX(ae,be,op) ({ \
typeof((ae)) a=(ae); \
typeof((be)) b=(be); \
#define MAX(a,b) MINMAX((a),(b),>)
#define MIN(a,b) MINMAX((a),(b),<)
+static inline bool_t iswouldblock(int e)
+ { return e==EWOULDBLOCK || e==EAGAIN; }
+
#endif /* util_h */