- {
- m_state = Ready;
- m_socketObservable->maskObserver(this, YAZ_SOCKET_OBSERVE_READ|
- YAZ_SOCKET_OBSERVE_EXCEPT);
- m_PDU_Observer->connectNotify();
- flush_PDU();
- }
- }
- else if (m_state == Listen)
- {
- if (event & YAZ_SOCKET_OBSERVE_READ)
- {
- int res;
- COMSTACK new_line;
-
- if ((res = cs_listen(m_cs, 0, 0)) == 1)
- return;
- if (res < 0)
- {
- logf(LOG_FATAL, "cs_listen failed");
- return;
- }
- if (!(new_line = cs_accept(m_cs)))
- return;
-
- /* 1. create socket-manager
+ {
+ unsigned mask = 0;
+ if (m_cs->io_pending & CS_WANT_WRITE)
+ mask |= SOCKET_OBSERVE_WRITE;
+ if (m_cs->io_pending & CS_WANT_READ)
+ mask |= SOCKET_OBSERVE_READ;
+ if (!mask)
+ { // accept is complete. turn to ready state and write if needed
+ m_state = Ready;
+ flush_PDU();
+ }
+ else
+ { // accept still incomplete.
+ yaz_log(m_log, "maskObserver 2");
+ m_socketObservable->maskObserver(this,
+ mask|SOCKET_OBSERVE_EXCEPT);
+ }
+ }
+ break;
+ case Connecting:
+ if (event & SOCKET_OBSERVE_READ &&
+ event & SOCKET_OBSERVE_WRITE)
+ {
+ // For Unix: if both read and write is set, then connect failed.
+ shutdown();
+ m_PDU_Observer->failNotify();
+ }
+ else
+ {
+ yaz_log (m_log, "cs_rcvconnect");
+ int res = cs_rcvconnect (m_cs);
+ if (res == 1)
+ {
+ unsigned mask = SOCKET_OBSERVE_EXCEPT;
+ if (m_cs->io_pending & CS_WANT_WRITE)
+ mask |= SOCKET_OBSERVE_WRITE;
+ if (m_cs->io_pending & CS_WANT_READ)
+ mask |= SOCKET_OBSERVE_READ;
+ yaz_log(m_log, "maskObserver 3");
+ m_socketObservable->maskObserver(this, mask);
+ }
+ else
+ {
+ m_state = Ready;
+ if (m_PDU_Observer)
+ m_PDU_Observer->connectNotify();
+ flush_PDU();
+ }
+ }
+ break;
+ case Listen:
+ if (event & SOCKET_OBSERVE_READ)
+ {
+ int res;
+ COMSTACK new_line;
+
+ if ((res = cs_listen(m_cs, 0, 0)) == 1)
+ return;
+ if (res < 0)
+ {
+ yaz_log(YLOG_FATAL|YLOG_ERRNO, "cs_listen failed");
+ return;
+ }
+ if (!(new_line = cs_accept(m_cs)))
+ return;
+ /* 1. create socket-manager