diff --git a/src/core/net-sendbuffer.c b/src/core/net-sendbuffer.c index 04eab80a..fd1039d6 100644 --- a/src/core/net-sendbuffer.c +++ b/src/core/net-sendbuffer.c @@ -62,7 +62,7 @@ void net_sendbuffer_destroy(NET_SENDBUF_REC *rec, int close) g_free(rec); } -/* Transmit all data from buffer - return TRUE if successful */ +/* Transmit all data from buffer - return TRUE if the whole buffer was sent */ static int buffer_send(NET_SENDBUF_REC *rec) { int ret; @@ -140,6 +140,25 @@ int net_sendbuffer_send(NET_SENDBUF_REC *rec, const void *data, int size) return buffer_add(rec, data, size) ? 0 : -1; } +/* Flush the buffer, blocks until finished. */ +void net_sendbuffer_flush(NET_SENDBUF_REC *rec) +{ + int handle; + + if (rec->buffer == NULL) + return; + + /* set the socket blocking while doing this */ + handle = g_io_channel_unix_get_fd(rec->handle); +#ifndef WIN32 + fcntl(handle, F_SETFL, 0); +#endif + while (!buffer_send(rec)) ; +#ifndef WIN32 + fcntl(handle, F_SETFL, O_NONBLOCK); +#endif +} + /* Returns the socket handle */ GIOChannel *net_sendbuffer_handle(NET_SENDBUF_REC *rec) { diff --git a/src/core/net-sendbuffer.h b/src/core/net-sendbuffer.h index bb6d8e07..d2388b41 100644 --- a/src/core/net-sendbuffer.h +++ b/src/core/net-sendbuffer.h @@ -14,6 +14,9 @@ void net_sendbuffer_destroy(NET_SENDBUF_REC *rec, int close); occured. */ int net_sendbuffer_send(NET_SENDBUF_REC *rec, const void *data, int size); +/* Flush the buffer, blocks until finished. */ +void net_sendbuffer_flush(NET_SENDBUF_REC *rec); + /* Returns the socket handle */ GIOChannel *net_sendbuffer_handle(NET_SENDBUF_REC *rec);