+ int size;
+
+ int i = 1;
+ socklen_t s = sizeof(int);
+
+ uint32_t hisport;
+
+ XBT_IN("");
+ gras_trp_socket_new(1, &res);
+
+ sd = accept(sock->sd, (struct sockaddr *) &peer_in, &peer_in_len);
+ tmp_errno = sock_errno;
+
+ if (sd == -1) {
+ gras_socket_close(sock);
+ THROW1(system_error, 0,
+ "Accept failed (%s). Droping server socket.",
+ sock_errstr(tmp_errno));
+ }
+
+ if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, s)
+ || setsockopt(sd, _gras_tcp_proto_number(), TCP_NODELAY, (char *) &i,
+ s))
+ THROW1(system_error, 0,
+ "setsockopt failed, cannot condition the socket: %s",
+ sock_errstr(tmp_errno));
+
+ res->buf_size = sock->buf_size;
+ size = sock->buf_size;
+ if (setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size))
+ || setsockopt(sd, SOL_SOCKET, SO_SNDBUF, (char *) &size,
+ sizeof(size)))
+ XBT_VERB("setsockopt failed, cannot set buffer size: %s",
+ sock_errstr(tmp_errno));
+
+ res->plugin = sock->plugin;
+ res->incoming = sock->incoming;
+ res->outgoing = sock->outgoing;
+ res->accepting = 0;
+ res->sd = sd;
+ gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1);
+ sockdata->port = -1;
+ res->data=sockdata;
+
+
+ gras_trp_tcp_recv(res, (char *) &hisport, sizeof(hisport));
+ sockdata->peer_port = ntohl(hisport);
+ XBT_DEBUG("peerport %d received", sockdata->peer_port);
+
+ /* FIXME: Lock to protect inet_ntoa */
+ if (((struct sockaddr *) &peer_in)->sa_family != AF_INET) {
+ sockdata->peer_name = (char *) strdup("unknown");