lists.arthurdejong.org
RSS feed

nss-pam-ldapd commit: r1637 - in nss-pam-ldapd: common nss

[Date Prev][Date Next] [Thread Prev][Thread Next]

nss-pam-ldapd commit: r1637 - in nss-pam-ldapd: common nss



Author: arthur
Date: Wed Mar 14 21:31:38 2012
New Revision: 1637
URL: http://arthurdejong.org/viewvc/nss-pam-ldapd?revision=1637&view=revision

Log:
read any remaining available data from the stream when closing the connection 
in a normal way to prevert Broken pipe messages in nslcd

Modified:
   nss-pam-ldapd/common/tio.c
   nss-pam-ldapd/common/tio.h
   nss-pam-ldapd/nss/common.h

Modified: nss-pam-ldapd/common/tio.c
==============================================================================
--- nss-pam-ldapd/common/tio.c  Wed Mar 14 21:26:03 2012        (r1636)
+++ nss-pam-ldapd/common/tio.c  Wed Mar 14 21:31:38 2012        (r1637)
@@ -317,10 +317,39 @@
   }
 }
 
-/* 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

Modified: nss-pam-ldapd/common/tio.h
==============================================================================
--- nss-pam-ldapd/common/tio.h  Wed Mar 14 21:26:03 2012        (r1636)
+++ nss-pam-ldapd/common/tio.h  Wed Mar 14 21:31:38 2012        (r1637)
@@ -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 @@
 /* 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. */

Modified: nss-pam-ldapd/nss/common.h
==============================================================================
--- nss-pam-ldapd/nss/common.h  Wed Mar 14 21:26:03 2012        (r1636)
+++ nss-pam-ldapd/nss/common.h  Wed Mar 14 21:31:38 2012        (r1637)
@@ -2,7 +2,7 @@
    common.h - common functions for NSS lookups
 
    Copyright (C) 2006 West Consulting
-   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Arthur de Jong
+   Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 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
@@ -147,6 +147,7 @@
   retv=readfn; \
   /* close socket and we're done */ \
   if ((retv==NSS_STATUS_SUCCESS)||(retv==NSS_STATUS_TRYAGAIN)) \
+    (void)tio_skip(fp,0); /* read any buffered data */ \
     (void)tio_close(fp); \
   return retv;
 
@@ -213,12 +214,13 @@
     fp=NULL; /* file should be closed by now */ \
   return retv;
 
-/* This macro generates a endent() function body. This just closes
+/* This macro generates an endent() function body. This just closes
    the stream. */
 #define NSS_ENDENT(fp) \
   NSS_AVAILCHECK; \
   if (fp!=NULL) \
   { \
+    (void)tio_skip(fp,0); /* read any buffered data */ \
     (void)tio_close(fp); \
     fp=NULL; \
   } \
-- 
To unsubscribe send an email to
nss-pam-ldapd-commits-unsubscribe@lists.arthurdejong.org or see
http://lists.arthurdejong.org/nss-pam-ldapd-commits/