static inline int32_t buf_remaining_space(const struct buffer_if *buf)
{
- return (buf->base + buf->alloclen) - buf->start;
+ return (buf->base + buf->alloclen) - (buf->start + buf->size);
}
extern void buffer_readonly_view(struct buffer_if *n, const void*, int32_t len);
extern int consttime_memeq(const void *s1, const void *s2, size_t n);
+const char *iaddr_to_string(const union iaddr *ia);
+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 */