/* prints a info about socket in the form sourceIP:sourcePort:destinationIP:destinationPort*/ void pair_info(passive_sock, sock, port){ char return_str[46]; memset(return_str,0,sizeof(return_str)); /* Side is currently passive */ if (passive_sock != -1){ /*if side has accepted a connection */ if (sock != -1) strcat(return_str,peer_info(sock)); else strcat(return_str,"-:-"); strcat(return_str,":"); strcat(return_str,my_info(passive_sock,port)); strcat(return_str, "\n");} /*Side is active connection */ else if (sock != -1){ strcat(return_str,my_info(sock,port)); strcat(return_str,":"); strcat(return_str,peer_info(sock)); strcat(return_str,"\n");} else strcat(return_str,"-:-:-:-\n"); wAddstr(IO,return_str); }
void operator()(jvb::environment e, jvb::Object obj BOOST_PP_ENUM_TRAILING_BINARY_PARAMS(BOOST_PP_ITERATION(), A, a)) const { assert(obj.raw() != 0); BOOST_MPL_ASSERT((boost::mpl::bool_<(sizeof(void*) <= sizeof(::jlong))>)); // typename Allocator::template rebind<T>::other allocator; std::cout << "constructor wrapper" << std::endl; // void* p = allocator.allocate(1, 0); // T* object = new (p) T; binding::virtual_table<N>const* vtable; ::jclass c = obj.class_(e).raw(); { const char* d = "J"; assert(c != 0); jfieldID fid = e.raw()->GetStaticFieldID (c, javabind_vtable_field_name, d); assert(fid != 0); jlong rl = e.raw()->GetStaticLongField(c, fid); void* p = 0; std::memcpy(&p, &rl, sizeof(void*)); vtable = static_cast<binding::virtual_table<N>*>(p); } void* fp = vtable->methods[I].function_object.get(); assert(fp != 0); boost::function<Result(jvb::environment BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), A))>* f = static_cast<boost::function<Result(jvb::environment BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), A))>*>(fp); std::auto_ptr<binding::peer_info<T, N> > peer_info(new binding::peer_info<T, N> (*vtable, (*f)(e BOOST_PP_ENUM_TRAILING_PARAMS(BOOST_PP_ITERATION(), a)) )); { ::jlong rl = 0; void* p = peer_info.release(); std::memcpy(&rl, &p, sizeof(void*)); const char* d = "J"; assert(c != 0); jfieldID fid = e.raw()->GetFieldID (c, binding::javabind_peer_info_field_name, d); assert(fid != 0); e.raw()->SetLongField(obj.raw(), fid, rl); } }
RTP *rtp_accept(RTP *server) { RTP *rtp; struct sockaddr_in cli_addr; int client, len = sizeof(cli_addr); static CHAR *fid = "rtp_accept"; /* Create/fill the handle */ if ((rtp = (RTP *) malloc(sizeof(RTP))) == (RTP *) NULL) { rtp_log(RTP_ERR, "%s: malloc: %s", fid, strerror(errno)); return (RTP *) NULL; } rtp->sd = server->sd; rtp->port = server->port; rtp->attr = server->attr; rtp->soh.sh_tstamp = -1; rtp->soh.sh_nslot = RTP_DEFNSLOT; rtp->soh.sh_ndas = 0; rtp->soh.sh_index = -1; rtp->soh.sh_stat = (struct rtp_stat *) malloc(sizeof(struct rtp_stat)*rtp->soh.sh_nslot); if (rtp->soh.sh_stat == (struct rtp_stat *) NULL) { rtp_log(RTP_ERR, "%s: malloc: %s", fid, strerror(errno)); free(rtp); return (RTP *) NULL; } /* Accept a new connection */ client = INVALID_SOCKET; while (client == INVALID_SOCKET) { client = accept(server->sd, (struct sockaddr *) &cli_addr, &len); if (client == INVALID_SOCKET && errno != EINTR) { rtp_log(RTP_ERR, "%s: accept: %s", fid, strerror(errno)); free(rtp->soh.sh_stat); free(rtp); return (RTP *) NULL; } } /* Complete the handle */ rtp->sd = client; MUTEX_INIT(&rtp->rcv.mutex); MUTEX_INIT(&rtp->snd.mutex); if (!peer_info(rtp)) { rtp_log(RTP_DEBUG, "%s: peer_info failed", fid); free(rtp->soh.sh_stat); free(rtp); return (RTP *) NULL; } /* Windows NT defaults non-blocking */ #ifndef WINNT if (fcntl(rtp->sd, F_SETFL, O_NONBLOCK) == -1) { rtp_log(RTP_ERR, "%s: fcntl: %s", fid, strerror(errno)); free(rtp->soh.sh_stat); free(rtp); return (RTP *) NULL; } #endif rtp_log(RTP_DEBUG, "%s: incoming connection from %s:%hu", fid, rtp->peer, rtp->port ); /* Do the handshake */ if (!handshake(rtp)) { rtp_log(RTP_ERR, "%s: handshake failed", fid); free(rtp->soh.sh_stat); free(rtp); return (RTP *) NULL; } /* Return handle for this connection */ return rtp; }