esound r498 - trunk



Author: fejj
Date: Wed Jul 30 15:35:40 2008
New Revision: 498
URL: http://svn.gnome.org/viewvc/esound?rev=498&view=rev

Log:
2008-07-30  Jeffrey Stedfast  <fejj novell com>

	* esdlib.c (write_timeout): Check for the existence of POLLERR or
	POLLHUP first. If either is set, abort the write(). We can't
	assume that POLLOUT won't be set if a hang-up occurred.



Modified:
   trunk/ChangeLog
   trunk/esdlib.c

Modified: trunk/esdlib.c
==============================================================================
--- trunk/esdlib.c	(original)
+++ trunk/esdlib.c	Wed Jul 30 15:35:40 2008
@@ -140,18 +140,20 @@
 			rv = poll (pfd, 1, 100);
 		} while (rv == -1 && errno == EINTR);
 		
-		if (rv < 1 || !(pfd[0].revents & POLLOUT)) {
+		if (rv < 1 || (pfd[0].revents & (POLLERR | POLLHUP))) {
 			fcntl (fd, F_SETFL, flags);
 			errno = ETIMEDOUT;
 			return -1;
 		}
 		
-		do {
-			n = write (fd, buf + nwritten, buflen - nwritten);
-		} while (n == -1 && errno == EINTR);
-		
-		if (n > 0)
-			nwritten += n;
+		if (pfd[0].revents & POLLOUT) {
+			do {
+				n = write (fd, buf + nwritten, buflen - nwritten);
+			} while (n == -1 && errno == EINTR);
+			
+			if (n > 0)
+				nwritten += n;
+		}
 	} while (nwritten < buflen);
 	
 	fcntl (fd, F_SETFL, flags);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]