void UnixSocketImpl::Connect() { MOZ_ASSERT(!NS_IsMainThread()); if (!mConnector) { NS_WARNING("No connector object available!"); return; } if (mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } } int ret; if (!mConnector->CreateAddr(false, mAddrSize, mAddr, mAddress.get())) { NS_WARNING("Cannot create socket address!"); return; } ret = connect(mFd.get(), (struct sockaddr*)&mAddr, mAddrSize); if (ret) { #if DEBUG LOG("Socket connect errno=%d\n", errno); #endif mFd.reset(-1); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } if (!SetSocketFlags()) { return; } if (!mConnector->SetUp(mFd)) { NS_WARNING("Could not set up socket!"); return; } nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); SetUpIO(); }
void UnixSocketImpl::Connect() { if(mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } } int ret; socklen_t addr_sz; struct sockaddr addr; mConnector->CreateAddr(false, addr_sz, &addr, mAddress.get()); ret = connect(mFd.get(), &addr, addr_sz); if (ret) { #if DEBUG LOG("Socket connect errno=%d\n", errno); #endif mFd.reset(-1); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } if (!mConnector->SetUp(mFd)) { NS_WARNING("Could not set up socket!"); return; } nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); // Due to the fact that we've dispatched our OnConnectSuccess message before // starting reading, we're guaranteed that any subsequent read tasks will // happen after the object has been notified of a successful connect. XRE_GetIOMessageLoop()->PostTask(FROM_HERE, new StartImplReadingTask(this)); }
void UnixSocketImpl::Accept() { MOZ_ASSERT(!NS_IsMainThread()); if (!mConnector) { NS_WARNING("No connector object available!"); return; } // This will set things we don't particularly care about, but it will hand // back the correct structure size which is what we do care about. if (!mConnector->CreateAddr(true, mAddrSize, mAddr, nullptr)) { NS_WARNING("Cannot create socket address!"); return; } if (mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } if (!SetSocketFlags()) { return; } if (bind(mFd.get(), (struct sockaddr*)&mAddr, mAddrSize)) { #ifdef DEBUG LOG("...bind(%d) gave errno %d", mFd.get(), errno); #endif return; } if (listen(mFd.get(), 1)) { #ifdef DEBUG LOG("...listen(%d) gave errno %d", mFd.get(), errno); #endif return; } } SetUpIO(); }
void ListenSocketIO::Listen(ConnectionOrientedSocketIO* aCOSocketIO) { MOZ_ASSERT(MessageLoopForIO::current() == GetIOLoop()); MOZ_ASSERT(mConnector); MOZ_ASSERT(aCOSocketIO); if (!IsOpen()) { int fd = mConnector->Create(); if (fd < 0) { NS_WARNING("Cannot create socket fd!"); FireSocketError(); return; } if (!SetSocketFlags(fd)) { NS_WARNING("Cannot set socket flags!"); FireSocketError(); return; } if (!mConnector->SetUpListenSocket(GetFd())) { NS_WARNING("Could not set up listen socket!"); FireSocketError(); return; } // This will set things we don't particularly care about, but // it will hand back the correct structure size which is what // we do care about. if (!mConnector->CreateAddr(true, mAddrSize, mAddr, nullptr)) { NS_WARNING("Cannot create socket address!"); FireSocketError(); return; } SetFd(fd); } mCOSocketIO = aCOSocketIO; // calls OnListening on success, or OnError otherwise nsresult rv = UnixSocketWatcher::Listen( reinterpret_cast<struct sockaddr*>(&mAddr), mAddrSize); NS_WARN_IF(NS_FAILED(rv)); }
void UnixSocketImpl::Connect() { MOZ_ASSERT(!NS_IsMainThread()); if (!mConnector) { NS_WARNING("No connector object available!"); return; } if(mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } } int ret; if (!mConnector->CreateAddr(false, mAddrSize, mAddr, mAddress.get())) { NS_WARNING("Cannot create socket address!"); return; } // Select non-blocking IO. if (!SetNonblockFlags()) { nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } ret = connect(mFd.get(), (struct sockaddr*)&mAddr, mAddrSize); if (ret) { if (errno == EINPROGRESS) { // Select blocking IO again, since we've now at least queue'd the connect // as nonblock. int current_opts = fcntl(mFd.get(), F_GETFL, 0); if (-1 == current_opts) { NS_WARNING("Cannot get socket opts!"); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } if (-1 == fcntl(mFd.get(), F_SETFL, current_opts & ~O_NONBLOCK)) { NS_WARNING("Cannot set socket opts to blocking!"); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } // Set up a write watch to make sure we receive the connect signal MessageLoopForIO::current()->WatchFileDescriptor( mFd.get(), false, MessageLoopForIO::WATCH_WRITE, &mWriteWatcher, this); #ifdef DEBUG LOG("UnixSocket Connection delayed!"); #endif return; } #if DEBUG LOG("Socket connect errno=%d\n", errno); #endif mFd.reset(-1); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_ERROR); NS_DispatchToMainThread(t); return; } if (!mConnector->SetUp(mFd)) { NS_WARNING("Could not set up socket!"); return; } nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); SetUpIO(); }
void UnixSocketImpl::Accept() { MOZ_ASSERT(!NS_IsMainThread()); mTask = nullptr; if (!mConnector) { NS_WARNING("No connector object available!"); return; } // This will set things we don't particularly care about, but it will hand // back the correct structure size which is what we do care about. if (!mConnector->CreateAddr(true, mAddrSize, mAddr, nullptr)) { NS_WARNING("Cannot create socket address!"); return; } if (mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } if (!SetNonblockFlags()) { return; } if (bind(mFd.get(), (struct sockaddr*)&mAddr, mAddrSize)) { #ifdef DEBUG LOG("...bind(%d) gave errno %d", mFd.get(), errno); #endif return; } if (listen(mFd.get(), 1)) { #ifdef DEBUG LOG("...listen(%d) gave errno %d", mFd.get(), errno); #endif return; } } int client_fd; client_fd = accept(mFd.get(), (struct sockaddr*)&mAddr, &mAddrSize); if (client_fd < 0) { EnqueueTask(SOCKET_RETRY_TIME_MS, new SocketAcceptTask(this)); return; } if (!mConnector->SetUp(client_fd)) { NS_WARNING("Could not set up socket!"); return; } mFd.reset(client_fd); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); SetUpIO(); }
void UnixSocketImpl::Accept() { socklen_t addr_sz; struct sockaddr addr; if (!mConnector) { NS_WARNING("No connector object available!"); return; } // This will set things we don't particularly care about, but it will hand // back the correct structure size which is what we do care about. mConnector->CreateAddr(true, addr_sz, &addr, nullptr); if(mFd.get() < 0) { mFd = mConnector->Create(); if (mFd.get() < 0) { return; } if (!SetNonblockFlags()) { return; } if (bind(mFd.get(), &addr, addr_sz)) { #ifdef DEBUG LOG("...bind(%d) gave errno %d", mFd.get(), errno); #endif return; } if (listen(mFd.get(), 1)) { #ifdef DEBUG LOG("...listen(%d) gave errno %d", mFd.get(), errno); #endif return; } } int client_fd; client_fd = accept(mFd.get(), &addr, &addr_sz); if (client_fd < 0) { EnqueueTask(SOCKET_RETRY_TIME_MS, new SocketAcceptTask(this)); return; } if (!mConnector->SetUp(client_fd)) { NS_WARNING("Could not set up socket!"); return; } mFd.reset(client_fd); nsRefPtr<OnSocketEventTask> t = new OnSocketEventTask(this, OnSocketEventTask::CONNECT_SUCCESS); NS_DispatchToMainThread(t); // Due to the fact that we've dispatched our OnConnectSuccess message before // starting reading, we're guaranteed that any subsequent read tasks will // happen after the object has been notified of a successful connect. XRE_GetIOMessageLoop()->PostTask(FROM_HERE, new StartImplReadingTask(this)); }