summaryrefslogtreecommitdiff
path: root/nscd/connections.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2005-11-19 17:22:39 +0000
committerUlrich Drepper <drepper@redhat.com>2005-11-19 17:22:39 +0000
commiteac10791463c42ff4f6da20f548c046e300b3d6d (patch)
tree8061d956005bb5cee17eabe4d6473f1a1039b6fb /nscd/connections.c
parent74ac0a89d27d1bff7238ecb14dd0a5009c2f479b (diff)
* sysdeps/unix/sysv/linux/ia64/bits/shm.h (shmatt_t): New type.cvs/fedora-glibc-20051119T1959
(struct shmid_ds): Use it for shm_nattch field. 2005-11-18 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/futimesat.c (futimesat): If FILE is NULL, set access and modification times of the file referenced by FD. * sysdeps/generic/futimesat.c (futimesat): Don't return EINVAL if FILE is NULL. Don't check FD if FILE is absolute path. 2005-11-19 Ulrich Drepper <drepper@redhat.com> * nscd/nscd_gethst_r.c (nscd_gethst_r): Avoid unnecesary read call if there are no aliases. * sysdeps/unix/sysv/linux/Makefile (CFLAGS-connections.c, CFLAGS-pwdcache.c, CFLAGS-grpcache.c, CFLAGS-hstcache.c, CFLAGS-aicache.c, CFLAGS-initgrcache.c): Add -DHAVE_SENDFILE. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_SENDFILE): Define. * nscd/pwdcache.c [HAVE_SENDFILE]: Include <sys/sendfile.h> and <kernel-features.h>. [HAVE_SENDFILE] (cache_addpw): Use sendfile to transmit positive result. * nscd/grpcache.c: Likewise. * nscd/hstcache.c: Likewise. * nscd/aicache.c: Likewise. * nscd/initgrcache.c: Likewise. * nscd/connectionc.c: Likewise.
Diffstat (limited to 'nscd/connections.c')
-rw-r--r--nscd/connections.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/nscd/connections.c b/nscd/connections.c
index 137cfb239a..0a1ca77836 100644
--- a/nscd/connections.c
+++ b/nscd/connections.c
@@ -39,6 +39,9 @@
#include <sys/mman.h>
#include <sys/param.h>
#include <sys/poll.h>
+#ifdef HAVE_SENDFILE
+# include <sys/sendfile.h>
+#endif
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
@@ -46,6 +49,9 @@
#include "nscd.h"
#include "dbg_log.h"
#include "selinux.h"
+#ifdef HAVE_SENDFILE
+# include <kernel-features.h>
+#endif
/* Wrapper functions with error checking for standard functions. */
@@ -939,8 +945,33 @@ cannot handle old request version %d; current version is %d"),
if (cached != NULL)
{
/* Hurray it's in the cache. */
- if (writeall (fd, cached->data, cached->recsize)
- != cached->recsize
+ ssize_t nwritten;
+
+#ifdef HAVE_SENDFILE
+ if (db->mmap_used || !cached->notfound)
+ {
+ assert (db->wr_fd != -1);
+ assert ((char *) cached->data > (char *) db->data);
+ assert ((char *) cached->data - (char *) db->head
+ + cached->recsize
+ <= (sizeof (struct database_pers_head)
+ + db->head->module * sizeof (ref_t)
+ + db->head->data_size));
+ off_t off = (char *) cached->data - (char *) db->head;
+ nwritten = sendfile (fd, db->wr_fd, &off, cached->recsize);
+# ifndef __ASSUME_SENDFILE
+ if (nwritten == -1 && errno == ENOSYS)
+ goto use_write;
+# endif
+ }
+ else
+# ifndef __ASSUME_SENDFILE
+ use_write:
+# endif
+#endif
+ nwritten = writeall (fd, cached->data, cached->recsize);
+
+ if (nwritten != cached->recsize
&& __builtin_expect (debug_level, 0) > 0)
{
/* We have problems sending the result. */