move buffer code into own file

This commit is contained in:
Thomas Lindner 2022-10-19 21:26:20 +02:00
parent aec240b777
commit aede6a1e93
4 changed files with 53 additions and 26 deletions

View file

@ -1,6 +1,7 @@
add_executable(${PROJECT_NAME} add_executable(${PROJECT_NAME}
main.c main.c
network.c connection.c
buffer.c
) )
target_link_libraries(${PROJECT_NAME} target_link_libraries(${PROJECT_NAME}
libev::ev libev::ev

34
src/buffer.c Normal file
View file

@ -0,0 +1,34 @@
#include <buffer.h>
#include <string.h>
#if INTERFACE
#include <stdlib.h>
struct Buffer {
size_t size;
char data[4096];
};
#define buffer_size(buffer) ((buffer)->size)
#define buffer_capacity(buffer) (sizeof(buffer)->data)
#define buffer_data(buffer) ((buffer)->data)
#endif
void buffer_consume(Buffer *buffer, size_t n) {
buffer->size -= n;
memmove(buffer->data, &buffer->data[n], buffer->size);
}
void buffer_provide(Buffer *buffer, size_t n) {
buffer->size += n;
}
size_t buffer_size_remaining(Buffer *buffer) {
return buffer_capacity(buffer) - buffer_size(buffer);
}
char *buffer_data_remaining(Buffer *buffer) {
return &buffer->data[buffer_size(buffer)];
}

View file

@ -1,5 +1,5 @@
#include <assert.h> #include <assert.h>
#include <network.h> #include <connection.h>
#include <unistd.h> #include <unistd.h>
#if INTERFACE #if INTERFACE
@ -18,20 +18,6 @@ struct Connection {
Buffer write_buf; Buffer write_buf;
}; };
struct Buffer {
size_t size;
char data[4096];
};
#endif
void connection_init(EV_P_ Connection *connection, struct tls_config *config) {
(void)(EV_A_ 0);
ev_io_init(&connection->watcher, NULL, STDIN_FILENO, 0);
connection->ctx = tls_client();
tls_configure(connection->ctx, config);
}
#define connection_set_failure_cb(connection, callback) \ #define connection_set_failure_cb(connection, callback) \
do { \ do { \
(connection)->failure_cb = callback; \ (connection)->failure_cb = callback; \
@ -45,6 +31,15 @@ void connection_init(EV_P_ Connection *connection, struct tls_config *config) {
#define connection_read_buf(connection) &((connection)->read_buf) #define connection_read_buf(connection) &((connection)->read_buf)
#define connection_write_buf(connection) &((connection)->write_buf) #define connection_write_buf(connection) &((connection)->write_buf)
#endif
void connection_init(EV_P_ Connection *connection, struct tls_config *config) {
(void)(EV_A_ 0);
ev_io_init(&connection->watcher, NULL, STDIN_FILENO, 0);
connection->ctx = tls_client();
tls_configure(connection->ctx, config);
}
void connection_read_some(EV_P_ Connection *connection) { void connection_read_some(EV_P_ Connection *connection) {
assert(connection->success_cb && connection->failure_cb); assert(connection->success_cb && connection->failure_cb);
ev_set_cb(&connection->watcher, connection_read_some_cb); ev_set_cb(&connection->watcher, connection_read_some_cb);
@ -57,9 +52,8 @@ static void connection_read_some_cb(EV_P_ ev_io *watcher, int revents) {
(void)revents; (void)revents;
ev_io_stop(EV_A_ watcher); ev_io_stop(EV_A_ watcher);
n = tls_read(connection->ctx, n = tls_read(connection->ctx, buffer_data_remaining(&connection->read_buf),
&connection->read_buf.data[connection->read_buf.size], buffer_size_remaining(&connection->read_buf));
sizeof(connection->read_buf.data) - connection->read_buf.size);
if (n == TLS_WANT_POLLIN) { if (n == TLS_WANT_POLLIN) {
ev_io_modify(watcher, EV_READ); ev_io_modify(watcher, EV_READ);
ev_io_start(EV_A_ watcher); ev_io_start(EV_A_ watcher);
@ -69,7 +63,7 @@ static void connection_read_some_cb(EV_P_ ev_io *watcher, int revents) {
} else if (n == -1) { } else if (n == -1) {
connection->failure_cb(EV_A_ connection); connection->failure_cb(EV_A_ connection);
} else { } else {
connection->read_buf.size += n; buffer_provide(&connection->read_buf, n);
connection->success_cb(EV_A_ connection); connection->success_cb(EV_A_ connection);
} }
} }
@ -86,8 +80,8 @@ static void connection_write_some_cb(EV_P_ ev_io *watcher, int revents) {
(void)revents; (void)revents;
ev_io_stop(EV_A_ watcher); ev_io_stop(EV_A_ watcher);
n = tls_write(connection->ctx, connection->write_buf.data, n = tls_write(connection->ctx, buffer_data(&connection->write_buf),
connection->write_buf.size); buffer_size(&connection->write_buf));
if (n == TLS_WANT_POLLIN) { if (n == TLS_WANT_POLLIN) {
ev_io_modify(watcher, EV_READ); ev_io_modify(watcher, EV_READ);
ev_io_start(EV_A_ watcher); ev_io_start(EV_A_ watcher);
@ -97,9 +91,7 @@ static void connection_write_some_cb(EV_P_ ev_io *watcher, int revents) {
} else if (n == -1) { } else if (n == -1) {
connection->failure_cb(EV_A_ connection); connection->failure_cb(EV_A_ connection);
} else { } else {
connection->write_buf.size -= n; buffer_consume(&connection->write_buf, n);
memmove(connection->write_buf.data, &connection->write_buf.data[n],
connection->write_buf.size);
connection->success_cb(EV_A_ connection); connection->success_cb(EV_A_ connection);
} }
} }

View file

@ -6,7 +6,7 @@ int main(int argc, char **argv) {
struct tls_config *config; struct tls_config *config;
Connection connection; Connection connection;
(void) argc, (void) argv; (void)argc, (void)argv;
tls_init(); tls_init();
config = tls_config_new(); config = tls_config_new();
connection_init(EV_DEFAULT_ & connection, config); connection_init(EV_DEFAULT_ & connection, config);