diff options
author | ailin-nemui <ailin-nemui@users.noreply.github.com> | 2018-03-31 13:04:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-31 13:04:35 +0200 |
commit | 0c1db8f2aee4aa5040a16518adb71f57dc953985 (patch) | |
tree | 4c51838a1b7aa278727b9de7f3b1663120b75e62 /src/core/network.c | |
parent | 9fa8c32b9e2f80e308d1ed780490f6d2dfd6bb05 (diff) | |
parent | 0b2f5b0a1e30932b07245c508a673eb0e9b6ab37 (diff) | |
download | irssi-0c1db8f2aee4aa5040a16518adb71f57dc953985.zip |
Merge pull request #854 from irssi/ahf/otr
OTR support, take 2
Diffstat (limited to 'src/core/network.c')
-rw-r--r-- | src/core/network.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/core/network.c b/src/core/network.c index d280b463..0e326e22 100644 --- a/src/core/network.c +++ b/src/core/network.c @@ -48,6 +48,39 @@ GIOChannel *g_io_channel_new(int handle) return chan; } +int g_io_channel_write_block(GIOChannel *channel, void *data, int len) +{ + gsize ret; + int sent; + GIOStatus status; + + sent = 0; + do { + status = g_io_channel_write_chars(channel, (char *) data + sent, len - sent, &ret, NULL); + sent += ret; + } while (sent < len && status != G_IO_STATUS_ERROR); + + return sent < len ? -1 : 0; +} + +int g_io_channel_read_block(GIOChannel *channel, void *data, int len) +{ + time_t maxwait; + gsize ret; + int received; + GIOStatus status; + + maxwait = time(NULL)+2; + received = 0; + do { + status = g_io_channel_read_chars(channel, (char *) data + received, len - received, &ret, NULL); + received += ret; + } while (received < len && time(NULL) < maxwait && + status != G_IO_STATUS_ERROR && status != G_IO_STATUS_EOF); + + return received < len ? -1 : 0; +} + IPADDR ip4_any = { AF_INET, #if defined(IN6ADDR_ANY_INIT) |