summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2012-03-14 20:31:38 +0000
committerArthur de Jong <arthur@arthurdejong.org>2012-03-14 20:31:38 +0000
commit15498aca67bc96b1ac5dbd35be40d8c69a0e2d73 (patch)
tree8b6f423140943cddd0a808a39c4e8cf20eb72a57 /common
parentc4d9aa9908c7551968660b34791f48cdbf6acb1f (diff)
read any remaining available data from the stream when closing the connection in a normal way to prevent Broken pipe messages in nslcd
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1637 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'common')
-rw-r--r--common/tio.c33
-rw-r--r--common/tio.h6
2 files changed, 35 insertions, 4 deletions
diff --git a/common/tio.c b/common/tio.c
index 34002d4..67caed8 100644
--- a/common/tio.c
+++ b/common/tio.c
@@ -317,10 +317,39 @@ int tio_read(TFILE *fp, void *buf, size_t count)
}
}
-/* Read and discard the specified number of bytes from the stream. */
+/* Read and discard the specified number of bytes from the stream.
+ If count is 0 reads and discards any data that can be read and empties
+ the read buffer. */
int tio_skip(TFILE *fp, size_t count)
{
- return tio_read(fp,NULL,count);
+ int rv;
+ size_t len;
+ /* for simple cases just read */
+ if (count>0)
+ {
+ return tio_read(fp,NULL,count);
+ }
+ /* clear the read buffer */
+ fp->readbuffer.start=0;
+ fp->readbuffer.len=0;
+ fp->read_resettable=0;
+ /* read until we can't read no more */
+ len=fp->readbuffer.size;
+#ifdef SSIZE_MAX
+ if (len>SSIZE_MAX)
+ len=SSIZE_MAX;
+#endif /* SSIZE_MAX */
+ while (1)
+ {
+ rv=read(fp->fd,fp->readbuffer.buffer,len);
+ /* check for errors */
+ if (rv==0)
+ return 0; /* end-of-file */
+ if ((rv<0)&&(errno==EWOULDBLOCK))
+ return 0; /* we've ready everything we can without blocking */
+ if ((rv<0)&&(errno!=EINTR)&&(errno!=EAGAIN))
+ return -1; /* something went wrong with the read */
+ }
}
/* the caller has assured us that we can write to the file descriptor
diff --git a/common/tio.h b/common/tio.h
index 22c099c..832367b 100644
--- a/common/tio.h
+++ b/common/tio.h
@@ -2,7 +2,7 @@
tio.h - timed io functions
This file is part of the nss-pam-ldapd library.
- Copyright (C) 2007, 2008 Arthur de Jong
+ Copyright (C) 2007, 2008, 2010, 2012 Arthur de Jong
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -56,7 +56,9 @@ TFILE *tio_fdopen(int fd,struct timeval *readtimeout,struct timeval *writetimeou
/* Read the specified number of bytes from the stream. */
int tio_read(TFILE *fp,void *buf,size_t count);
-/* Read and discard the specified number of bytes from the stream. */
+/* Read and discard the specified number of bytes from the stream.
+ If count is 0 reads and discards any data that can be read and empties
+ the read buffer. */
int tio_skip(TFILE *fp,size_t count);
/* Write the specified buffer to the stream. */