#include "network.h"
#include "net-sendbuffer.h"
-struct _NET_SENDBUF_REC {
- GIOChannel *handle;
-
- int send_tag;
- int bufsize;
- int bufpos;
- char *buffer; /* Buffer is NULL until it's actually needed. */
-};
-
static GSList *buffers;
/* Create new buffer - if `bufsize' is zero or less, DEFAULT_BUFFER_SIZE
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;
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)
{