- Fixed delays in lpd backend (Issue #741)
- Fixed extensive looping in scheduler (Issue #604)
- Fixed hanging of `lpstat` on IBM AIX (Issue #773)
+- Fixed hanging of `lpstat` on Solaris (Issue #156)
- Fixed segfault in `cupsGetNamedDest()` when trying to get default printer, but
the default printer is not set (Issue #719)
- Fixed RFC 1179 port reserving behavior in LPD backend (Issue #743)
for (i = 0; i < nfds; i ++)
{
DEBUG_printf("pfds[%d].revents=%x\n", i, pfds[i].revents);
+# ifdef __sun
+ // Solaris connect runs asynchronously returning EINPROGRESS. Following
+ // poll() does not detect the socket is not connected and returns
+ // POLLIN|POLLOUT. Check the connection status and update error flag.
+ int sres, serr;
+ socklen_t slen = sizeof(serr);
+ sres = getsockopt(fds[i], SOL_SOCKET, SO_ERROR, &serr, &slen);
+ if (sres || serr)
+ {
+ pfds[i].revents |= POLLERR;
+# ifdef DEBUG
+ DEBUG_printf(("1httpAddrConnect2: getsockopt returned: %d with error: %s", sres, strerror(serr)));
+# endif
+ }
+# endif // __sun
+
+
if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP)))
{
*sock = fds[i];
}
else if (pfds[i].revents & (POLLERR | POLLHUP))
{
-# ifdef __sun
- // Solaris incorrectly returns errors when you poll() a socket that is
- // still connecting. This check prevents us from removing the socket
- // from the pool if the "error" is EINPROGRESS...
- int sockerr; // Current error on socket
- socklen_t socklen = sizeof(sockerr);
- // Size of error variable
-
- if (!getsockopt(fds[i], SOL_SOCKET, SO_ERROR, &sockerr, &socklen) && (!sockerr || sockerr == EINPROGRESS))
- continue; // Not an error
-# endif // __sun
-
/*
* Error on socket, remove from the "pool"...
*/