Hi,
I'd like to share two quick'n dirty patches for cyrus-imapd.
The first one removes the attempt of setting the open file limit to
"unlimited", because -- afaik and speaking of linux -- this is simply
not supported.
The second patch skips setting ip or tcp flags on unix domain sockets.
It bugged me that my logs showed "unable to setsocketopt(IP_TOS)
service" and "unable to setsocketopt(TCP_KEEPIDLE)" for operations on
uds. Checking for SOCK_STREAM is probably not sufficient.
Discussons welcome.
Kind regards,
Philippe
setting the fd limit to "unlimited" is simply not supported in linux
--- cyrus-imapd-2.5.2/master/master.c.setrlimit
+++ cyrus-imapd-2.5.2/master/master.c
@@ -1875,21 +1875,14 @@ static void limit_fds(rlim_t x)
{
struct rlimit rl;
- rl.rlim_cur = x;
- rl.rlim_max = x;
- if (setrlimit(RLIMIT_NUMFDS, &rl) < 0) {
- syslog(LOG_ERR, "setrlimit: Unable to set file descriptors limit to %ld: %m", x);
-
#ifdef HAVE_GETRLIMIT
if (!getrlimit(RLIMIT_NUMFDS, &rl)) {
- syslog(LOG_ERR, "retrying with %ld (current max)", rl.rlim_max);
rl.rlim_cur = rl.rlim_max;
if (setrlimit(RLIMIT_NUMFDS, &rl) < 0) {
syslog(LOG_ERR, "setrlimit: Unable to set file descriptors limit to %ld: %m", x);
}
}
- }
if (verbose > 1) {
@@ -1897,8 +1890,6 @@ static void limit_fds(rlim_t x)
syslog(LOG_DEBUG, "set maximum file descriptors to %ld/%ld", rl.rlim_cur,
rl.rlim_max);
}
-#else
- }
#endif /* HAVE_GETRLIMIT */
}
#else
do not set tcp flags on unix domain sockets
--- cyrus-imapd-2.5.3/master/master.c.uds
+++ cyrus-imapd-2.5.3/master/master.c
@@ -586,12 +586,14 @@ static void service_create(struct servic
/* set IP ToS if supported */
#if defined(SOL_IP) && defined(IP_TOS)
+ if (s->family == AF_INET || s->family == AF_INET6) {
r = setsockopt(s->socket, SOL_IP, IP_TOS,
(void *) &config_qosmarking, sizeof(config_qosmarking));
if (r < 0) {
syslog(LOG_WARNING, "unable to setsocketopt(IP_TOS) service %s/%s: %m",
s->name, s->familyname);
}
+ }
#endif
oldumask = umask((mode_t) 0); /* for linux */
--- cyrus-imapd-2.5.3/master/service.c.uds
+++ cyrus-imapd-2.5.3/master/service.c
@@ -289,6 +289,8 @@ int main(int argc, char **argv, char **e
int reuse_timeout = REUSE_TIMEOUT;
int soctype;
socklen_t typelen = sizeof(soctype);
+ struct sockaddr socname;
+ socklen_t sockaddr_len = sizeof(struct sockaddr);
strarray_t newargv = STRARRAY_INITIALIZER;
int id;
char path[PATH_MAX];
@@ -406,6 +408,13 @@ int main(int argc, char **argv, char **e
return 1;
}
+ if (getsockname(LISTEN_FD, &socname, &sockaddr_len) < 0) {
+ syslog(LOG_ERR, "getsockname failed");
+ if (MESSAGE_MASTER_ON_EXIT)
+ notify_master(STATUS_FD, MASTER_SERVICE_UNAVAILABLE);
+ return 1;
+ }
+
/* figure out what sort of socket this is */
if (getsockopt(LISTEN_FD, SOL_SOCKET, SO_TYPE,
(char *) &soctype, &typelen) < 0) {
@@ -545,7 +554,7 @@ int main(int argc, char **argv, char **e
alarm(0);
/* tcp only */
- if(soctype == SOCK_STREAM) {
+ if(soctype == SOCK_STREAM && socname.sa_family != AF_UNIX) {
libwrap_init(&request, service);
if (!libwrap_ask(&request, fd)) {