X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/a0fac2f1c903f765c8b8596f1ec93beb52b72c7a..refs/heads/master:/util.h diff --git a/util.h b/util.h index b44b911..85de6df 100644 --- a/util.h +++ b/util.h @@ -1,3 +1,22 @@ +/* + * This file is part of secnet. + * See README for full list of copyright holders. + * + * secnet is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * secnet is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 3 along with secnet; if not, see + * https://www.gnu.org/licenses/gpl.html. + */ + #ifndef util_h #define util_h @@ -23,6 +42,7 @@ extern void buffer_assert_used(struct buffer_if *buffer, cstring_t file, int line); extern void buffer_new(struct buffer_if *buffer, int32_t len); extern void buffer_init(struct buffer_if *buffer, int32_t max_start_pad); +extern void buffer_destroy(struct buffer_if *buffer); extern void buffer_copy(struct buffer_if *dst, const struct buffer_if *src); extern void *buf_append(struct buffer_if *buf, int32_t amount); extern void *buf_prepend(struct buffer_if *buf, int32_t amount); @@ -88,6 +108,21 @@ void string_item_to_iaddr(const item_t *item, uint16_t port, union iaddr *ia, const char *desc); +/* + * SBUF_DEFINE(int nbufs, size_t size); + * // Generates a number of definitions and statements organising + * // nbufs rotating char[size] buffers such that subsequent code + * // may refer to: + * char *const SBUF; + */ +#define SBUF_DEFINE(nbufs, size) \ + static int static_bufs__bufnum; \ + static char static_bufs__bufs[(nbufs)][(size)]; \ + static_bufs__bufnum++; \ + static_bufs__bufnum %= (nbufs); \ + static_bufs__bufs[static_bufs__bufnum] +#define SBUF (static_bufs__bufs[static_bufs__bufnum]) + /*----- line-buffered asynch input -----*/ enum async_linebuf_result { @@ -97,6 +132,8 @@ enum async_linebuf_result { async_linebuf_broken, }; +const char *pollbadbit(int revents); /* returns 0, or bad bit description */ + enum async_linebuf_result async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf, const char **emsg_out); @@ -161,6 +198,9 @@ async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf, #define MAX(a,b) MINMAX((a),(b),>) #define MIN(a,b) MINMAX((a),(b),<) +#define MAX_RAW(a,b) ((a)>(b)?(a):(b)) +#define MIN_RAW(a,b) ((a)<(b)?(a):(b)) + static inline bool_t iswouldblock(int e) { return e==EWOULDBLOCK || e==EAGAIN; }