chiark / gitweb /
polypath: Provide Linux interface monitor
[secnet.git] / util.h
diff --git a/util.h b/util.h
index 29b68e73d0a906c083b5c116b2a582b960b3c6a7..e6b586d46d52e1df44f48a12918a9855dd7b7511 100644 (file)
--- a/util.h
+++ b/util.h
@@ -31,7 +31,7 @@ extern void *buf_unprepend(struct buffer_if *buf, int32_t amount);
 
 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);
@@ -56,6 +56,52 @@ extern void send_nak(const struct comm_addr *dest, uint32_t our_index,
 
 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);                    \
@@ -64,4 +110,7 @@ extern int consttime_memeq(const void *s1, const void *s2, size_t n);
 #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 */