changeset 20351:f3e249261abd

lib: Implemented net_set_send_buffer_size() and net_set_recv_buffer_size(). These functions allow manipulating the kernel socket buffer sizes for a socket file descriptor.
author Stephan Bosch <stephan@dovecot.fi>
date Fri, 20 May 2016 00:02:49 +0200
parents 08038ef67fbd
children ebdd1bc4dc16
files src/lib/net.c src/lib/net.h
diffstat 2 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/net.c	Thu May 19 23:42:14 2016 +0200
+++ b/src/lib/net.c	Fri May 20 00:02:49 2016 +0200
@@ -374,6 +374,30 @@
 #endif
 }
 
+int net_set_send_buffer_size(int fd, size_t size)
+{
+	int opt;
+
+	if (size > INT_MAX) {
+		errno = EINVAL;
+		return -1;
+	}
+	opt = (int)size;
+	return setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(opt));
+}
+
+int net_set_recv_buffer_size(int fd, size_t size)
+{
+	int opt;
+
+	if (size > INT_MAX) {
+		errno = EINVAL;
+		return -1;
+	}
+	opt = (int)size;
+	return setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt));
+}
+
 void net_get_ip_any4(struct ip_addr *ip)
 {
 	ip->family = AF_INET;
--- a/src/lib/net.h	Thu May 19 23:42:14 2016 +0200
+++ b/src/lib/net.h	Fri May 20 00:02:49 2016 +0200
@@ -93,6 +93,10 @@
    Returns 0 if ok, -1 if failed. */
 int net_set_cork(int fd, bool cork) ATTR_NOWARN_UNUSED_RESULT;
 
+/* Set socket kernel buffer sizes */
+int net_set_send_buffer_size(int fd, size_t size);
+int net_set_recv_buffer_size(int fd, size_t size);
+
 /* Set IP to contain INADDR_ANY for IPv4 or IPv6. The IPv6 any address may
    include IPv4 depending on the system (Linux yes, BSD no). */
 void net_get_ip_any4(struct ip_addr *ip);