THREAD_PROC ThreadedSocketAcceptor::socketAcceptorThread( void* p ) { AcceptorThreadInfo * info = reinterpret_cast < AcceptorThreadInfo* > ( p ); ThreadedSocketAcceptor* pAcceptor = info->m_pAcceptor; int s = info->m_socket; int port = info->m_port; delete info; int noDelay = 0; int sendBufSize = 0; int rcvBufSize = 0; socket_getsockopt( s, TCP_NODELAY, noDelay ); socket_getsockopt( s, SO_SNDBUF, sendBufSize ); socket_getsockopt( s, SO_RCVBUF, rcvBufSize ); int socket = 0; while ( ( !pAcceptor->isStopped() && ( socket = socket_accept( s ) ) >= 0 ) ) { if( noDelay ) socket_setsockopt( socket, TCP_NODELAY ); if( sendBufSize ) socket_setsockopt( socket, SO_SNDBUF, sendBufSize ); if( rcvBufSize ) socket_setsockopt( socket, SO_RCVBUF, rcvBufSize ); Sessions sessions = pAcceptor->m_portToSessions[port]; ThreadedSocketConnection * pConnection = new ThreadedSocketConnection ( socket, sessions, pAcceptor->getLog() ); ConnectionThreadInfo* info = new ConnectionThreadInfo( pAcceptor, pConnection ); { Locker l( pAcceptor->m_mutex ); std::stringstream stream; stream << "Accepted connection from " << socket_peername( socket ) << " on port " << port; if( pAcceptor->getLog() ) pAcceptor->getLog()->onEvent( stream.str() ); thread_id thread; if ( !thread_spawn( &socketConnectionThread, info, thread ) ) { delete info; delete pConnection; } else pAcceptor->addThread( socket, thread ); } } if( !pAcceptor->isStopped() ) pAcceptor->removeThread( s ); return 0; }
int ksocket_getsockopt(ksocket_t ks, int level, int optname, void *optval, int *optlen, struct cred *cr) { struct sonode *so; /* All Solaris components should pass a cred for this operation. */ ASSERT(cr != NULL); if (!KSOCKET_VALID(ks)) return (ENOTSOCK); so = KSTOSO(ks); if (optlen == NULL) return (EFAULT); if (*optlen > SO_MAXARGSIZE) return (EINVAL); return (socket_getsockopt(so, level, optname, optval, (socklen_t *)optlen, 0, cr)); }
int ksocket_sendmblk(ksocket_t ks, struct nmsghdr *msg, int flags, mblk_t **mpp, cred_t *cr) { struct sonode *so; int i_val; socklen_t val_len; mblk_t *mp = *mpp; int error; /* All Solaris components should pass a cred for this operation. */ ASSERT(cr != NULL); if (!KSOCKET_VALID(ks)) return (ENOTSOCK); so = KSTOSO(ks); if (flags & MSG_MBLK_QUICKRELE) { error = socket_getsockopt(so, SOL_SOCKET, SO_SND_COPYAVOID, &i_val, &val_len, 0, cr); if (error != 0) return (error); /* Zero copy is not enable */ if (i_val == 0) return (ECANCELED); for (; mp != NULL; mp = mp->b_cont) mp->b_datap->db_struioflag |= STRUIO_ZC; } error = socket_sendmblk(so, msg, flags, cr, mpp); return (error); }