unlink(d_local.sun_path);
}
+static void setSocketBuffer(int fd, int optname, uint32_t size)
+{
+ uint32_t psize=0;
+ socklen_t len=sizeof(psize);
+
+ if (getsockopt(fd, SOL_SOCKET, optname, (void*)&psize, &len))
+ throw PDNSException("Unable to getsocket buffer size: "+stringerror());
+
+ if (psize > size)
+ return;
+
+ // failure to raise is not fatal
+ setsockopt(fd, SOL_SOCKET, optname, (const void*)&size, sizeof(size));
+}
+
+
+static void setSocketReceiveBuffer(int fd, uint32_t size)
+{
+ setSocketBuffer(fd, SO_RCVBUF, size);
+}
+
+static void setSocketSendBuffer(int fd, uint32_t size)
+{
+ setSocketBuffer(fd, SO_SNDBUF, size);
+}
+
int RecursorControlChannel::listen(const string& fname)
{
d_fd=socket(AF_UNIX,SOCK_DGRAM,0);
if(bind(d_fd, (sockaddr*)&d_local,sizeof(d_local))<0)
throw PDNSException("Unable to bind to controlsocket '"+fname+"': "+stringerror());
+ // receive buf should be size of max datagram plus address size
+ setSocketReceiveBuffer(d_fd, 60 * 1024);
+ setSocketSendBuffer(d_fd, 64 * 1024);
+
return d_fd;
}
throw PDNSException("Unable to connect to remote '"+string(remote.sun_path)+"': "+stringerror());
}
+ // receive buf should be size of max datagram plus address size
+ setSocketReceiveBuffer(d_fd, 60 * 1024);
+ setSocketSendBuffer(d_fd, 64 * 1024);
+
} catch (...) {
close(d_fd);
d_fd=-1;