void BluetoothDaemonConnectionIO::OnSocketCanReceiveWithoutBlocking() { ssize_t res = ReceiveData(GetFd()); if (res < 0) { /* I/O error */ RemoveWatchers(READ_WATCHER|WRITE_WATCHER); } else if (!res) { /* EOF or peer shutdown */ RemoveWatchers(READ_WATCHER); } }
void ConnectionOrientedSocketIO::OnSocketCanReceiveWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_CONNECTED); // see bug 990984 ssize_t res = ReceiveData(GetFd()); if (res < 0) { /* I/O error */ RemoveWatchers(READ_WATCHER|WRITE_WATCHER); } else if (!res) { /* EOF or peer shutdown */ RemoveWatchers(READ_WATCHER); } }
void ListenSocketIO::OnSocketCanAcceptWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_LISTENING); MOZ_ASSERT(mCOSocketIO); RemoveWatchers(READ_WATCHER|WRITE_WATCHER); struct sockaddr_storage storage; socklen_t addressLength = sizeof(storage); int fd; nsresult rv = mConnector->AcceptStreamSocket( GetFd(), reinterpret_cast<struct sockaddr*>(&storage), &addressLength, fd); if (NS_FAILED(rv)) { FireSocketError(); return; } mCOSocketIO->Accept(fd, reinterpret_cast<struct sockaddr*>(&storage), addressLength); }
void UnixSocketConsumerIO::OnAccepted(int aFd, const sockaddr_any* aAddr, socklen_t aAddrLen) { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_LISTENING); MOZ_ASSERT(aAddr); MOZ_ASSERT(aAddrLen <= sizeof(mAddr)); memcpy (&mAddr, aAddr, aAddrLen); mAddrSize = aAddrLen; if (!mConnector->SetUp(aFd)) { NS_WARNING("Could not set up socket!"); return; } RemoveWatchers(READ_WATCHER|WRITE_WATCHER); Close(); if (!SetSocketFlags(aFd)) { return; } SetSocket(aFd, SOCKET_IS_CONNECTED); nsRefPtr<nsRunnable> r = new SocketIOEventRunnable<UnixSocketConsumerIO>( this, SocketIOEventRunnable<UnixSocketConsumerIO>::CONNECT_SUCCESS); NS_DispatchToMainThread(r); AddWatchers(READ_WATCHER, true); if (HasPendingData()) { AddWatchers(WRITE_WATCHER, false); } }
void ListenSocketIO::OnAccepted(int aFd, const sockaddr_any* aAddr, socklen_t aAddrLen) { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_LISTENING); MOZ_ASSERT(mCOSocketIO); RemoveWatchers(READ_WATCHER|WRITE_WATCHER); nsRefPtr<nsRunnable> runnable; if (NS_SUCCEEDED(mCOSocketIO->Accept(aFd, aAddr, aAddrLen))) { runnable = new SocketIOEventRunnable<ListenSocketIO>( this, SocketIOEventRunnable<ListenSocketIO>::CONNECT_SUCCESS); return; } else { runnable = new SocketIOEventRunnable<ListenSocketIO>( this, SocketIOEventRunnable<ListenSocketIO>::CONNECT_ERROR); } NS_DispatchToMainThread(runnable); }
void BluetoothDaemonConnectionIO::OnSocketCanReceiveWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_CONNECTED); MOZ_ASSERT(!IsShutdownOnIOThread()); ssize_t res = ReceiveData(GetFd()); if (res < 0) { /* I/O error */ RemoveWatchers(READ_WATCHER|WRITE_WATCHER); } else if (!res) { /* EOF or peer shutdown */ RemoveWatchers(READ_WATCHER); } }
void ShutdownOnIOThread() { MOZ_ASSERT(!NS_IsMainThread()); MOZ_ASSERT(!mShuttingDownOnIOThread); RemoveWatchers(READ_WATCHER|WRITE_WATCHER); mShuttingDownOnIOThread = true; }
void BluetoothDaemonConnectionIO::OnSocketCanSendWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_CONNECTED); MOZ_ASSERT(!IsShutdownOnIOThread()); if (NS_WARN_IF(NS_FAILED(SendPendingData(GetFd())))) { RemoveWatchers(WRITE_WATCHER); } }
void UnixSocketConsumerIO::OnSocketCanReceiveWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_CONNECTED); // see bug 990984 nsresult rv = ReceiveData(GetFd(), this); if (NS_FAILED(rv)) { RemoveWatchers(READ_WATCHER|WRITE_WATCHER); return; } }
void ListenSocketIO::OnSocketCanAcceptWithoutBlocking() { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(GetConnectionStatus() == SOCKET_IS_LISTENING); MOZ_ASSERT(mCOSocketIO); struct sockaddr_storage addr; socklen_t addrLen = sizeof(addr); int fd = TEMP_FAILURE_RETRY(accept(GetFd(), reinterpret_cast<struct sockaddr*>(&addr), &addrLen)); if (fd < 0) { OnError("accept", errno); return; } RemoveWatchers(READ_WATCHER|WRITE_WATCHER); mCOSocketIO->Accept(fd, reinterpret_cast<union sockaddr_any*>(&addr), addrLen); }
void UnixSocketWatcher::OnFileCanWriteWithoutBlocking(int aFd) { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(aFd == GetFd()); if (mConnectionStatus == SOCKET_IS_CONNECTED) { OnSocketCanSendWithoutBlocking(); } else if (mConnectionStatus == SOCKET_IS_CONNECTING) { RemoveWatchers(WRITE_WATCHER); int error = 0; socklen_t len = sizeof(error); if (getsockopt(GetFd(), SOL_SOCKET, SO_ERROR, &error, &len) < 0) { OnError("getsockopt", errno); } else if (error) { OnError("connect", error); } else { mConnectionStatus = SOCKET_IS_CONNECTED; OnConnected(); } } else { NS_NOTREACHED("invalid connection state for writing"); } }