summaryrefslogtreecommitdiff
path: root/src/include/skalibs/textmessage.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/skalibs/textmessage.h')
-rw-r--r--src/include/skalibs/textmessage.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/include/skalibs/textmessage.h b/src/include/skalibs/textmessage.h
new file mode 100644
index 0000000..9904534
--- /dev/null
+++ b/src/include/skalibs/textmessage.h
@@ -0,0 +1,96 @@
+/* ISC license. */
+
+#ifndef SKALIBS_TEXTMESSAGE_H
+#define SKALIBS_TEXTMESSAGE_H
+
+#include <sys/uio.h>
+#include <stdint.h>
+#include <skalibs/gccattributes.h>
+#include <skalibs/allreadwrite.h>
+#include <skalibs/bufalloc.h>
+#include <skalibs/buffer.h>
+#include <skalibs/stralloc.h>
+#include <skalibs/tai.h>
+
+#define TEXTMESSAGE_MAXREADS 128
+
+
+ /* Sender */
+
+typedef struct textmessage_sender_s textmessage_sender_t, *textmessage_sender_t_ref ;
+struct textmessage_sender_s
+{
+ bufalloc out ;
+} ;
+#define TEXTMESSAGE_SENDER_ZERO { .out = BUFALLOC_ZERO }
+extern textmessage_sender_t const textmessage_sender_zero ;
+#define TEXTMESSAGE_SENDER_INIT(fd) { .out = BUFALLOC_INIT(&fd_write, (fd)) }
+
+#define textmessage_sender_init(ts, fd) bufalloc_init(&(ts)->out, &fd_write, fd)
+#define textmessage_sender_free(ts) bufalloc_free(&(ts)->out)
+#define textmessage_sender_fd(ts) bufalloc_fd(&(ts)->out)
+extern int textmessage_sender_getfd (textmessage_sender_t const *) gccattr_pure ;
+#define textmessage_sender_isempty(ts) bufalloc_isempty(&(ts)->out)
+
+extern int textmessage_put (textmessage_sender_t *, char const *, size_t) ;
+extern int textmessage_putv (textmessage_sender_t *, struct iovec const *, unsigned int) ;
+
+extern int textmessage_sender_flush (textmessage_sender_t *) ;
+extern int unixmessage_sender_timed_flush (textmessage_sender_t *, tain_t const *, tain_t *) ;
+#define textmessage_sender_timed_flush_g(ts, deadline) textmessage_sender_timed_flush(ts, (deadline), &STAMP)
+
+#define textmessage_send(ts, s, len) (textmessage_put(ts, s, len) && textmessage_sender_flush(ts))
+#define textmessage_sendv(ts, v, n) (textmessage_putv(ts, v, n) && textmessage_sender_flush(ts))
+#define textmessage_timed_send(ts, s, len, deadline, stamp) (textmessage_put(ts, s, len) && texxtmessage_sender_timed_flush(ts, deadline, stamp))
+#define textmessage_timed_sendv(ts, v, n, deadline, stamp) (textmessage_putv(ts, v, n) && texxtmessage_sender_timed_flush(ts, deadline, stamp))
+#define textmessage_timed_send_g(ts, s, len, deadline) textmessage_timed_send(ts, s, len, (deadline), &STAMP)
+#define textmessage_timed_sendv_g(ts, v, n, deadline) textmessage_timed_sendv(ts, v, n, (deadline), &STAMP)
+
+
+ /* Receiver */
+
+typedef struct textmessage_receiver_s textmessage_receiver_t, *textmessage_receiver_t_ref ;
+struct textmessage_receiver_s
+{
+ buffer in ;
+ stralloc indata ;
+ uint32_t wanted ;
+ uint32_t max ;
+} ;
+#define TEXTMESSAGE_RECEIVER_ZERO { .in = BUFFER_ZERO, .indata = STRALLOC_ZERO, .wanted = 0, .max = 0 }
+extern textmessage_receiver_t const textmessage_receiver_zero ;
+#define TEXTMESSAGE_RECEIVER_INIT(fd, buf, len, n) { .in = BUFFER_INIT(&buffer_read, (fd), buf, len), .indata = STRALLOC_ZERO, .wanted = 0, .max = n }
+
+extern int textmessage_receiver_init (textmessage_receiver_t *, int, char *, size_t, uint32_t) ;
+extern void textmessage_receiver_free (textmessage_receiver_t *) ;
+#define textmessage_receiver_fd(tr) buffer_fd(&(tr)->in)
+#define textmessage_receiver_isempty(tr) buffer_isempty(&(tr)->in)
+#define textmessage_receiver_isfull(tr) buffer_isfull(&(tr)->in)
+
+extern int textmessage_receiver_hasmsginbuf (textmessage_receiver_t const *) gccattr_pure ;
+
+extern int textmessage_receive (textmessage_receiver_t *, struct iovec *) ;
+extern int textmessage_timed_receive (textmessage_receiver_t *, struct iovec *, tain_t const *, tain_t *) ;
+#define textmessage_timed_receive_g(tr, s, max, deadline) textmessage_timed_receive(tr, s, max, (deadline), &STAMP)
+
+typedef int textmessage_handler_func_t (struct iovec const *, void *) ;
+typedef textmessage_handler_func_t *textmessage_handler_func_t_ref ;
+
+extern int textmessage_handle (textmessage_receiver_t *, textmessage_handler_func_t_ref, void *) ;
+extern int textmessage_timed_handle (textmessage_receiver_t *, textmessage_handler_func_t_ref, void *, tain_t const *, tain_t *) ;
+#define textmessage_timed_handle_g(tr, f, p, deadline) unixmessage_timed_handle(tr, f, p, (deadline), &STAMP)
+
+
+
+ /* Globals */
+
+extern textmessage_receiver_t textmessage_receiver_0_ ;
+#define textmessage_receiver_0 (&textmessage_receiver_0_)
+
+extern textmessage_sender_t textmessage_sender_1_ ;
+#define textmessage_sender_1 (&textmessage_sender_1_)
+
+extern textmessage_sender_t textmessage_sender_x_ ;
+#define textmessage_sender_x (&textmessage_sender_x_)
+
+#endif