aboutsummaryrefslogtreecommitdiff
path: root/src/pevent.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pevent.h')
-rw-r--r--src/pevent.h53
1 files changed, 47 insertions, 6 deletions
diff --git a/src/pevent.h b/src/pevent.h
index 714a7f8..9384405 100644
--- a/src/pevent.h
+++ b/src/pevent.h
@@ -35,13 +35,17 @@
#define POTD_EVENT_H 1
#include <stdio.h>
+#include <unistd.h>
#include <sys/epoll.h>
+#include <string.h>
#include "socket.h"
#define POTD_MAXFD 32
#define POTD_MAXEVENTS 64
#define POTD_EVENTBUF_REALLOCSIZ 5
+#define WRITE_BUF(fd) { fd, {0}, 0, NULL }
+#define EMPTY_BUF { -1, {0}, 0, NULL }
typedef enum forward_state {
CON_OK, CON_IN_TERMINATED, CON_OUT_TERMINATED,
@@ -70,10 +74,10 @@ typedef struct event_ctx {
size_t buffer_used;
} event_ctx;
-typedef int (*on_event_cb) (event_ctx *ev_ctx, event_buf *buf,
+typedef int (*on_event_cb) (event_ctx *ev_ctx, int src_fd,
void *user_data);
-typedef int (*on_data_cb) (event_ctx *ev_ctx, int src_fd, int dst_fd,
- char *buf, size_t siz, void *user_data);
+typedef int (*on_data_cb) (event_ctx *ev_ctx, event_buf *read_buf,
+ event_buf *write_buf, void *user_data);
void event_init(event_ctx **ctx);
@@ -94,8 +98,45 @@ forward_state
event_forward_connection(event_ctx *ctx, int dest_fd, on_data_cb on_data,
void *user_data);
-int event_buf_fill(event_buf *buf, unsigned char *data, size_t size);
-
-ssize_t event_buf_drain(event_buf *buf);
+int event_buf_fill(event_buf *buf, char *data, size_t size);
+
+ssize_t event_buf_drain(event_buf *write_buf);
+
+static inline size_t event_buf_avail(event_buf *buf)
+{
+ return sizeof(buf->buf) - buf->buf_used;
+}
+
+static inline ssize_t event_buf_read(event_buf *read_buf)
+{
+ ssize_t siz;
+
+ siz = read(read_buf->fd, read_buf->buf + read_buf->buf_used,
+ event_buf_avail(read_buf));
+ if (siz > 0)
+ read_buf->buf_used += siz;
+ return siz;
+}
+
+static inline void event_buf_discard(event_buf *input, size_t siz)
+{
+ if (siz <= input->buf_used) {
+ memmove(input->buf + siz, input->buf, input->buf_used - siz);
+ input->buf_used -= siz;
+ }
+}
+
+static inline void event_buf_discardall(event_buf *input)
+{
+ event_buf_discard(input, input->buf_used);
+}
+
+static inline int event_buf_dup(event_buf *input, event_buf *output)
+{
+ int rc = event_buf_fill(output, input->buf, input->buf_used);
+ if (!rc)
+ event_buf_discardall(input);
+ return rc;
+}
#endif