aboutsummaryrefslogtreecommitdiff
path: root/nscd/connections.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2008-12-03 04:23:18 +0000
committerUlrich Drepper <drepper@redhat.com>2008-12-03 04:23:18 +0000
commitf93fc0b75a50d3ba8d4d69313e3c84ac0b62905b (patch)
tree4199d6969f17f2e0c78e46383bd1fcfe7a2cf06f /nscd/connections.c
parent9744268c10e9ddea5972aa50ac9bf7f778bbf7e7 (diff)
downloadglibc-f93fc0b75a50d3ba8d4d69313e3c84ac0b62905b.zip
glibc-f93fc0b75a50d3ba8d4d69313e3c84ac0b62905b.tar.gz
glibc-f93fc0b75a50d3ba8d4d69313e3c84ac0b62905b.tar.bz2
* socket/sys/socket.h: Declare accept4.
* socket/accept4.c: New file. * sysdeps/unix/sysv/linux/accept4.c: New file. * sysdeps/unix/sysv/linux/i386/accept4.S: New file. * socket/Makefile (routines): Add accept4. * socket/Versions: Export accept4 with version GLIBC_2.10. * socket/paccept.c: Removed. * sysdeps/unix/sysv/linux/paccept.c: Removed. * sysdeps/unix/sysv/linux/i386/paccept.S: Removed. * Versions.def: Define GLIBC_2.10 for libc. * sysdeps/unix/sysv/linux/kernel-features.h: Define __ASSUME_ACCEPT4. * nscd/connections.c: Use accept4. * sysdeps/unix/sysv/linux/i386/socket.S: Fix comment.
Diffstat (limited to 'nscd/connections.c')
-rw-r--r--nscd/connections.c55
1 files changed, 36 insertions, 19 deletions
diff --git a/nscd/connections.c b/nscd/connections.c
index e3a6738..2b79549 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -238,8 +238,9 @@ static int resolv_conf_descr = -1;
/* Negative if SOCK_CLOEXEC is not supported, positive if it is, zero
before be know the result. */
static int have_sock_cloexec;
-/* The paccept syscall was introduced at the same time as SOCK_CLOEXEC. */
-# define have_paccept -1 // XXX For the time being there is no such call
+#endif
+#ifndef __ASSUME_ACCEPT4
+static int have_accept4;
#endif
/* Number of times clients had to wait. */
@@ -1609,8 +1610,8 @@ nscd_run_worker (void *p)
/* We are done with the list. */
pthread_mutex_unlock (&readylist_lock);
-#ifndef __ASSUME_SOCK_CLOEXEC
- if (have_sock_cloexec < 0)
+#ifndef __ASSUME_ACCEPT4
+ if (have_accept4 < 0)
{
/* We do not want to block on a short read or so. */
int fl = fcntl (fd, F_GETFL);
@@ -1819,22 +1820,20 @@ main_loop_poll (void)
/* We have a new incoming connection. Accept the connection. */
int fd;
-#ifndef __ASSUME_PACCEPT
+#ifndef __ASSUME_ACCEPT4
fd = -1;
- if (have_paccept >= 0)
+ if (have_accept4 >= 0)
#endif
{
-#if 0
- fd = TEMP_FAILURE_RETRY (paccept (sock, NULL, NULL, NULL,
+ fd = TEMP_FAILURE_RETRY (accept4 (sock, NULL, NULL,
SOCK_NONBLOCK));
-#ifndef __ASSUME_PACCEPT
- if (have_paccept == 0)
- have_paccept = fd != -1 || errno != ENOSYS ? 1 : -1;
-#endif
+#ifndef __ASSUME_ACCEPT4
+ if (have_accept4 == 0)
+ have_accept4 = fd != -1 || errno != ENOSYS ? 1 : -1;
#endif
}
-#ifndef __ASSUME_PACCEPT
- if (have_paccept < 0)
+#ifndef __ASSUME_ACCEPT4
+ if (have_accept4 < 0)
fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL));
#endif
@@ -2000,7 +1999,7 @@ main_loop_epoll (int efd)
/* We cannot use epoll. */
return;
-#ifdef HAVE_INOTIFY
+# ifdef HAVE_INOTIFY
if (inotify_fd != -1)
{
ev.events = EPOLLRDNORM;
@@ -2010,7 +2009,7 @@ main_loop_epoll (int efd)
return;
nused = 2;
}
-#endif
+# endif
while (1)
{
@@ -2025,8 +2024,26 @@ main_loop_epoll (int efd)
if (revs[cnt].data.fd == sock)
{
/* A new connection. */
- int fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL));
+ int fd;
+
+# ifndef __ASSUME_ACCEPT4
+ fd = -1;
+ if (have_accept4 >= 0)
+# endif
+ {
+ fd = TEMP_FAILURE_RETRY (accept4 (sock, NULL, NULL,
+ SOCK_NONBLOCK));
+# ifndef __ASSUME_ACCEPT4
+ if (have_accept4 == 0)
+ have_accept4 = fd != -1 || errno != ENOSYS ? 1 : -1;
+# endif
+ }
+# ifndef __ASSUME_ACCEPT4
+ if (have_accept4 < 0)
+ fd = TEMP_FAILURE_RETRY (accept (sock, NULL, NULL));
+# endif
+ /* Use the descriptor if we have not reached the limit. */
if (fd >= 0)
{
/* Try to add the new descriptor. */
@@ -2048,7 +2065,7 @@ main_loop_epoll (int efd)
}
}
}
-#ifdef HAVE_INOTIFY
+# ifdef HAVE_INOTIFY
else if (revs[cnt].data.fd == inotify_fd)
{
bool to_clear[lastdb] = { false, };
@@ -2104,7 +2121,7 @@ main_loop_epoll (int efd)
pthread_cond_signal (&dbs[dbcnt].prune_cond);
}
}
-#endif
+# endif
else
{
/* Remove the descriptor from the epoll descriptor. */