X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/dff9e15c44ab6340d27215957c56fa72fad246a2..2738cbeaa7d9227b472a16fe30ef72b0a0e88a01:/src/gras/Transport/transport_plugin_tcp.c diff --git a/src/gras/Transport/transport_plugin_tcp.c b/src/gras/Transport/transport_plugin_tcp.c index de76134c83..ad90f80ca9 100644 --- a/src/gras/Transport/transport_plugin_tcp.c +++ b/src/gras/Transport/transport_plugin_tcp.c @@ -1,8 +1,7 @@ -/* $Id$ */ - /* buf trp (transport) - buffered transport using the TCP one */ -/* Copyright (c) 2004 Martin Quinson. All rights reserved. */ +/* Copyright (c) 2004, 2005, 2006, 2007, 2009, 2010. The SimGrid Team. + * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -35,6 +34,13 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(gras_trp_tcp, gras_trp, *** Specific socket part ***/ +typedef struct { + int port; /* port on this side */ + int peer_port; /* port on the other side */ + char *peer_name; /* hostname of the other side */ + char *peer_proc; /* process on the other side */ +} s_gras_trp_tcp_sock_data_t, *gras_trp_tcp_sock_data_t; + typedef enum { buffering_buf, buffering_iov } buffering_kind; typedef struct { @@ -64,7 +70,8 @@ struct gras_trp_bufdata_ { /*****************************/ /* we exchange port number on client side on socket creation, so we need to be able to talk right now. */ -static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock, const char *data, +static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock, + const char *data, unsigned long int size); static int gras_trp_tcp_recv(gras_socket_t sock, char *data, unsigned long int size); @@ -72,23 +79,33 @@ static int gras_trp_tcp_recv(gras_socket_t sock, char *data, static int _gras_tcp_proto_number(void); -static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, - gras_socket_t sock) +static XBT_INLINE +void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, + const char *host, + int port, + /*OUT*/gras_socket_t sock) { + gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1); + sockdata->port = port; + sockdata->peer_proc = NULL; + sockdata->peer_port = port; + sockdata->peer_name = (char *) strdup(host ? host : "localhost"); + sock->data = sockdata; struct sockaddr_in addr; struct hostent *he; struct in_addr *haddr; int size = sock->buf_size; uint32_t myport = htonl(((gras_trp_procdata_t) - gras_libdata_by_id(gras_trp_libdata_id))->myport); + gras_libdata_by_id + (gras_trp_libdata_id))->myport); sock->incoming = 1; /* TCP sockets are duplex'ed */ sock->sd = socket(AF_INET, SOCK_STREAM, 0); if (sock->sd < 0) { - THROW1(system_error, 0, "Failed to create socket: %s", + THROWF(system_error, 0, "Failed to create socket: %s", sock_errstr(sock_errno)); } @@ -96,14 +113,14 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, (sock->sd, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof(size)) || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size))) { - VERB1("setsockopt failed, cannot set buffer size: %s", + XBT_VERB("setsockopt failed, cannot set buffer size: %s", sock_errstr(sock_errno)); } - he = gethostbyname(sock->peer_name); + he = gethostbyname(sockdata->peer_name); if (he == NULL) { - THROW2(system_error, 0, "Failed to lookup hostname %s: %s", - sock->peer_name, sock_errstr(sock_errno)); + THROWF(system_error, 0, "Failed to lookup hostname %s: %s", + sockdata->peer_name, sock_errstr(sock_errno)); } haddr = ((struct in_addr *) (he->h_addr_list)[0]); @@ -111,20 +128,20 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, memset(&addr, 0, sizeof(struct sockaddr_in)); memcpy(&addr.sin_addr, haddr, sizeof(struct in_addr)); addr.sin_family = AF_INET; - addr.sin_port = htons(sock->peer_port); + addr.sin_port = htons(sockdata->peer_port); if (connect(sock->sd, (struct sockaddr *) &addr, sizeof(addr)) < 0) { tcp_close(sock->sd); - THROW3(system_error, 0, + THROWF(system_error, 0, "Failed to connect socket to %s:%d (%s)", - sock->peer_name, sock->peer_port, sock_errstr(sock_errno)); + sockdata->peer_name, sockdata->peer_port, sock_errstr(sock_errno)); } gras_trp_tcp_send(sock, (char *) &myport, sizeof(uint32_t)); - DEBUG1("peerport sent to %d", sock->peer_port); + XBT_DEBUG("peerport sent to %d", sockdata->peer_port); - VERB4("Connect to %s:%d (sd=%d, port %d here)", - sock->peer_name, sock->peer_port, sock->sd, sock->port); + XBT_VERB("Connect to %s:%d (sd=%d, port %d here)", + sockdata->peer_name, sockdata->peer_port, sock->sd, sockdata->port); } /** @@ -132,25 +149,34 @@ static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t ignored, * * Open a socket used to receive messages. */ -static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t ignored, - gras_socket_t sock) +static XBT_INLINE +void gras_trp_sock_socket_server(gras_trp_plugin_t ignored, + int port, + gras_socket_t sock) { int size = sock->buf_size; int on = 1; struct sockaddr_in server; + gras_trp_tcp_sock_data_t sockdata = xbt_new(s_gras_trp_tcp_sock_data_t,1); + sockdata->port = port; + sockdata->peer_port = -1; + sockdata->peer_name = NULL; + sockdata->peer_proc = NULL; + sock->data=sockdata; + sock->outgoing = 1; /* TCP => duplex mode */ - server.sin_port = htons((u_short) sock->port); + server.sin_port = htons((u_short) sockdata->port); server.sin_addr.s_addr = INADDR_ANY; server.sin_family = AF_INET; if ((sock->sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) - THROW1(system_error, 0, "Socket allocation failed: %s", + THROWF(system_error, 0, "Socket allocation failed: %s", sock_errstr(sock_errno)); if (setsockopt (sock->sd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof(on))) - THROW1(system_error, 0, + THROWF(system_error, 0, "setsockopt failed, cannot condition the socket: %s", sock_errstr(sock_errno)); @@ -158,25 +184,27 @@ static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t ignored, (char *) &size, sizeof(size)) || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, (char *) &size, sizeof(size))) { - VERB1("setsockopt failed, cannot set buffer size: %s", + XBT_VERB("setsockopt failed, cannot set buffer size: %s", sock_errstr(sock_errno)); } if (bind(sock->sd, (struct sockaddr *) &server, sizeof(server)) == -1) { tcp_close(sock->sd); - THROW2(system_error, 0, - "Cannot bind to port %d: %s", sock->port, sock_errstr(sock_errno)); + THROWF(system_error, 0, + "Cannot bind to port %d: %s", sockdata->port, + sock_errstr(sock_errno)); } - DEBUG2("Listen on port %d (sd=%d)", sock->port, sock->sd); + XBT_DEBUG("Listen on port %d (sd=%d)", sockdata->port, sock->sd); if (listen(sock->sd, 5) < 0) { tcp_close(sock->sd); - THROW2(system_error, 0, + THROWF(system_error, 0, "Cannot listen on port %d: %s", - sock->port, sock_errstr(sock_errno)); + sockdata->port, sock_errstr(sock_errno)); } - VERB2("Openned a server socket on port %d (sd=%d)", sock->port, sock->sd); + XBT_VERB("Openned a server socket on port %d (sd=%d)", sockdata->port, + sock->sd); } static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) @@ -195,7 +223,9 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) uint32_t hisport; - XBT_IN; + int failed=0; + + XBT_IN(""); gras_trp_socket_new(1, &res); sd = accept(sock->sd, (struct sockaddr *) &peer_in, &peer_in_len); @@ -203,23 +233,29 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) if (sd == -1) { gras_socket_close(sock); - THROW1(system_error, 0, + THROWF(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, + if (_gras_tcp_proto_number()!=-1) + if (setsockopt(sd, _gras_tcp_proto_number(), TCP_NODELAY, (char *) &i,s)) + failed=1; + + if (setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &i, s)) + failed=1; + + if (failed) + THROWF(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))) - VERB1("setsockopt failed, cannot set buffer size: %s", + || 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; @@ -227,15 +263,18 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) res->outgoing = sock->outgoing; res->accepting = 0; res->sd = sd; - res->port = -1; + 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)); - res->peer_port = ntohl(hisport); - DEBUG1("peerport %d received", res->peer_port); + 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) { - res->peer_name = (char *) strdup("unknown"); + sockdata->peer_name = (char *) strdup("unknown"); } else { struct in_addr addrAsInAddr; char *tmp; @@ -244,17 +283,17 @@ static gras_socket_t gras_trp_sock_socket_accept(gras_socket_t sock) tmp = inet_ntoa(addrAsInAddr); if (tmp != NULL) { - res->peer_name = (char *) strdup(tmp); + sockdata->peer_name = (char *) strdup(tmp); } else { - res->peer_name = (char *) strdup("unknown"); + sockdata->peer_name = (char *) strdup("unknown"); } } - VERB3("Accepted from %s:%d (sd=%d)", res->peer_name, res->peer_port, sd); + XBT_VERB("Accepted from %s:%d (sd=%d)", sockdata->peer_name, sockdata->peer_port, sd); xbt_dynar_push(((gras_trp_procdata_t) gras_libdata_by_id(gras_trp_libdata_id))->sockets, &res); - XBT_OUT; + XBT_OUT(); return res; } @@ -264,7 +303,11 @@ static void gras_trp_sock_socket_close(gras_socket_t sock) if (!sock) return; /* close only once */ - VERB1("close tcp connection %d", sock->sd); + if (((gras_trp_tcp_sock_data_t)sock->data)->peer_name) + free(((gras_trp_tcp_sock_data_t)sock->data)->peer_name); + free(sock->data); + + XBT_VERB("close tcp connection %d", sock->sd); /* ask the listener to close the socket */ gras_msg_listener_close_socket(sock->sd); @@ -289,7 +332,7 @@ static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock, int status = 0; status = tcp_write(sock->sd, data, (size_t) size); - DEBUG3("write(%d, %p, %ld);", sock->sd, data, size); + XBT_DEBUG("write(%d, %p, %ld);", sock->sd, data, size); if (status < 0) { #ifdef EWOULDBLOCK @@ -299,7 +342,7 @@ static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock, #endif continue; - THROW4(system_error, 0, "write(%d,%p,%ld) failed: %s", + THROWF(system_error, 0, "write(%d,%p,%ld) failed: %s", sock->sd, data, size, sock_errstr(sock_errno)); } @@ -307,7 +350,7 @@ static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock, size -= status; data += status; } else { - THROW1(system_error, 0, "file descriptor closed (%s)", + THROWF(system_error, 0, "file descriptor closed (%s)", sock_errstr(sock_errno)); } } @@ -332,26 +375,27 @@ gras_trp_tcp_recv_withbuffer(gras_socket_t sock, while (size > got) { int status = 0; - DEBUG5("read(%d, %p, %ld) got %d so far (%s)", + XBT_DEBUG("read(%d, %p, %ld) got %d so far (%s)", sock->sd, data + got, bufsize, got, hexa_str((unsigned char *) data, got, 0)); status = tcp_read(sock->sd, data + got, (size_t) bufsize); if (status < 0) { - THROW7(system_error, 0, - "read(%d,%p,%d) from %s:%d failed: %s; got %d so far", sock->sd, - data + got, (int) size, gras_socket_peer_name(sock), + THROWF(system_error, 0, + "read(%d,%p,%d) from %s:%d failed: %s; got %d so far", + sock->sd, data + got, (int) size, gras_socket_peer_name(sock), gras_socket_peer_port(sock), sock_errstr(sock_errno), got); } - DEBUG2("Got %d more bytes (%s)", status, + XBT_DEBUG("Got %d more bytes (%s)", status, hexa_str((unsigned char *) data + got, status, 0)); if (status) { bufsize -= status; got += status; } else { - THROW1(system_error, errno, - "Socket closed by remote side (got %d bytes before this)", got); + THROWF(system_error, errno, + "Socket closed by remote side (got %d bytes before this)", + got); } } @@ -381,27 +425,27 @@ static void gras_trp_bufiov_flush(gras_socket_t sock) int size; #endif gras_trp_bufdata_t *data = sock->bufdata; - XBT_IN; + XBT_IN(""); - DEBUG0("Flush"); + XBT_DEBUG("Flush"); if (data->out == buffering_buf) { if (XBT_LOG_ISENABLED(gras_trp_tcp, xbt_log_priority_debug)) hexa_print("chunk to send ", (unsigned char *) data->out_buf.data, data->out_buf.size); if ((data->out_buf.size - data->out_buf.pos) != 0) { - DEBUG3("Send the chunk (size=%d) to %s:%d", data->out_buf.size, + XBT_DEBUG("Send the chunk (size=%d) to %s:%d", data->out_buf.size, gras_socket_peer_name(sock), gras_socket_peer_port(sock)); gras_trp_tcp_send(sock, data->out_buf.data, data->out_buf.size); - VERB1("Chunk sent (size=%d)", data->out_buf.size); + XBT_VERB("Chunk sent (size=%d)", data->out_buf.size); data->out_buf.size = 0; } } #ifdef HAVE_READV if (data->out == buffering_iov) { - DEBUG0("Flush out iov"); + XBT_DEBUG("Flush out iov"); vect = sock->bufdata->out_buf_v; if ((size = xbt_dynar_length(vect))) { - DEBUG1("Flush %d chunks out of this socket", size); + XBT_DEBUG("Flush %d chunks out of this socket", size); writev(sock->sd, xbt_dynar_get_ptr(vect, 0), size); xbt_dynar_reset(vect); } @@ -409,10 +453,10 @@ static void gras_trp_bufiov_flush(gras_socket_t sock) } if (data->in == buffering_iov) { - DEBUG0("Flush in iov"); + XBT_DEBUG("Flush in iov"); vect = sock->bufdata->in_buf_v; if ((size = xbt_dynar_length(vect))) { - DEBUG1("Get %d chunks from of this socket", size); + XBT_DEBUG("Get %d chunks from of this socket", size); readv(sock->sd, xbt_dynar_get_ptr(vect, 0), size); xbt_dynar_reset(vect); } @@ -429,13 +473,13 @@ gras_trp_buf_send(gras_socket_t sock, gras_trp_bufdata_t *data = (gras_trp_bufdata_t *) sock->bufdata; int chunk_pos = 0; - XBT_IN; + XBT_IN(""); while (chunk_pos < size) { /* size of the chunk to receive in that shot */ long int thissize = - min(size - chunk_pos, data->buffsize - data->out_buf.size); - DEBUG4("Set the chars %d..%ld into the buffer; size=%ld, ctn=(%s)", + min(size - chunk_pos, data->buffsize - data->out_buf.size); + XBT_DEBUG("Set the chars %d..%ld into the buffer; size=%ld, ctn=(%s)", (int) data->out_buf.size, ((int) data->out_buf.size) + thissize - 1, size, hexa_str((unsigned char *) chunk, thissize, 0)); @@ -445,7 +489,7 @@ gras_trp_buf_send(gras_socket_t sock, data->out_buf.size += thissize; chunk_pos += thissize; - DEBUG4("New pos = %d; Still to send = %ld of %ld; ctn sofar=(%s)", + XBT_DEBUG("New pos = %d; Still to send = %ld of %ld; ctn sofar=(%s)", data->out_buf.size, size - chunk_pos, size, hexa_str((unsigned char *) chunk, chunk_pos, 0)); @@ -453,7 +497,7 @@ gras_trp_buf_send(gras_socket_t sock, gras_trp_bufiov_flush(sock); } - XBT_OUT; + XBT_OUT(); } static int @@ -463,7 +507,7 @@ gras_trp_buf_recv(gras_socket_t sock, char *chunk, unsigned long int size) gras_trp_bufdata_t *data = sock->bufdata; long int chunk_pos = 0; - XBT_IN; + XBT_IN(""); while (chunk_pos < size) { /* size of the chunk to receive in that shot */ @@ -471,33 +515,35 @@ gras_trp_buf_recv(gras_socket_t sock, char *chunk, unsigned long int size) if (data->in_buf.size == data->in_buf.pos) { /* out of data. Get more */ - DEBUG2("Get more data (size=%d,bufsize=%d)", + XBT_DEBUG("Get more data (size=%d,bufsize=%d)", (int) MIN(size - chunk_pos, data->buffsize), (int) data->buffsize); data->in_buf.size = - gras_trp_tcp_recv_withbuffer(sock, data->in_buf.data, - MIN(size - chunk_pos, data->buffsize), - data->buffsize); + gras_trp_tcp_recv_withbuffer(sock, data->in_buf.data, + MIN(size - chunk_pos, + data->buffsize), + data->buffsize); data->in_buf.pos = 0; } thissize = min(size - chunk_pos, data->in_buf.size - data->in_buf.pos); - memcpy(chunk + chunk_pos, data->in_buf.data + data->in_buf.pos, thissize); + memcpy(chunk + chunk_pos, data->in_buf.data + data->in_buf.pos, + thissize); data->in_buf.pos += thissize; chunk_pos += thissize; - DEBUG4("New pos = %d; Still to receive = %ld of %ld. Ctn so far=(%s)", + XBT_DEBUG("New pos = %d; Still to receive = %ld of %ld. Ctn so far=(%s)", data->in_buf.pos, size - chunk_pos, size, hexa_str((unsigned char *) chunk, chunk_pos, 0)); } /* indicate on need to the gras_select function that there is more to read on this socket so that it does not actually select */ sock->moredata = (data->in_buf.size > data->in_buf.pos); - DEBUG1("There is %smore data", (sock->moredata ? "" : "no ")); + XBT_DEBUG("There is %smore data", (sock->moredata ? "" : "no ")); - XBT_OUT; + XBT_OUT(); return chunk_pos; } @@ -517,7 +563,7 @@ gras_trp_iov_send(gras_socket_t sock, gras_trp_bufdata_t *data = (gras_trp_bufdata_t *) sock->bufdata; - DEBUG1("Buffer one chunk to be sent later (%s)", + XBT_DEBUG("Buffer one chunk to be sent later (%s)", hexa_str((char *) chunk, size, 0)); elm.iov_len = (size_t) size; @@ -556,7 +602,7 @@ gras_trp_iov_recv(gras_socket_t sock, char *chunk, unsigned long int size) { struct iovec elm; - DEBUG0("Buffer one chunk to be received later"); + XBT_DEBUG("Buffer one chunk to be received later"); elm.iov_base = (void *) chunk; elm.iov_len = (size_t) size; xbt_dynar_push(sock->bufdata->in_buf_v, &elm); @@ -574,8 +620,13 @@ gras_trp_iov_recv(gras_socket_t sock, char *chunk, unsigned long int size) *** Prototypes of BUFFERED ***/ -void gras_trp_buf_socket_client(gras_trp_plugin_t self, gras_socket_t sock); -void gras_trp_buf_socket_server(gras_trp_plugin_t self, gras_socket_t sock); +void gras_trp_buf_socket_client(gras_trp_plugin_t self, + const char *host, + int port, + gras_socket_t sock); +void gras_trp_buf_socket_server(gras_trp_plugin_t self, + int port, + gras_socket_t sock); gras_socket_t gras_trp_buf_socket_accept(gras_socket_t sock); void gras_trp_buf_socket_close(gras_socket_t sd); @@ -610,12 +661,43 @@ gras_socket_t gras_trp_buf_init_sock(gras_socket_t sock) return sock; } +/*** + *** Info about who's speaking + ***/ +static int gras_trp_tcp_my_port(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->port; +} +static int gras_trp_tcp_peer_port(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_port; +} +static const char* gras_trp_tcp_peer_name(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_name; +} +static const char* gras_trp_tcp_peer_proc(gras_socket_t s) { + gras_trp_tcp_sock_data_t sockdata = s->data; + return sockdata->peer_proc; +} +static void gras_trp_tcp_peer_proc_set(gras_socket_t s,char *name) { + gras_trp_tcp_sock_data_t sockdata = s->data; + sockdata->peer_proc = xbt_strdup(name); +} + /*** *** Code ***/ void gras_trp_tcp_setup(gras_trp_plugin_t plug) { + plug->my_port = gras_trp_tcp_my_port; + plug->peer_port = gras_trp_tcp_peer_port; + plug->peer_name = gras_trp_tcp_peer_name; + plug->peer_proc = gras_trp_tcp_peer_proc; + plug->peer_proc_set = gras_trp_tcp_peer_proc_set; + + plug->socket_client = gras_trp_buf_socket_client; plug->socket_server = gras_trp_buf_socket_server; plug->socket_accept = gras_trp_buf_socket_accept; @@ -638,10 +720,12 @@ void gras_trp_tcp_setup(gras_trp_plugin_t plug) } void gras_trp_buf_socket_client(gras_trp_plugin_t self, + const char *host, + int port, /* OUT */ gras_socket_t sock) { - gras_trp_sock_socket_client(NULL, sock); + gras_trp_sock_socket_client(NULL, host,port,sock); gras_trp_buf_init_sock(sock); } @@ -651,10 +735,11 @@ void gras_trp_buf_socket_client(gras_trp_plugin_t self, * Open a socket used to receive messages. */ void gras_trp_buf_socket_server(gras_trp_plugin_t self, + int port, /* OUT */ gras_socket_t sock) { - gras_trp_sock_socket_server(NULL, sock); + gras_trp_sock_socket_server(NULL, port, sock); gras_trp_buf_init_sock(sock); } @@ -668,7 +753,7 @@ void gras_trp_buf_socket_close(gras_socket_t sock) gras_trp_bufdata_t *data = sock->bufdata; if (data->in_buf.size != data->in_buf.pos) { - WARN3("Socket closed, but %d bytes were unread (size=%d,pos=%d)", + XBT_WARN("Socket closed, but %d bytes were unread (size=%d,pos=%d)", data->in_buf.size - data->in_buf.pos, data->in_buf.size, data->in_buf.pos); } @@ -676,7 +761,7 @@ void gras_trp_buf_socket_close(gras_socket_t sock) free(data->in_buf.data); if (data->out_buf.size != data->out_buf.pos) { - DEBUG2("Flush the socket before closing (in=%d,out=%d)", + XBT_DEBUG("Flush the socket before closing (in=%d,out=%d)", data->in_buf.size, data->out_buf.size); gras_trp_bufiov_flush(sock); } @@ -686,12 +771,12 @@ void gras_trp_buf_socket_close(gras_socket_t sock) #ifdef HAVE_READV if (data->in_buf_v) { if (xbt_dynar_length(data->in_buf_v)) - WARN0("Socket closed, but some bytes were unread"); + XBT_WARN("Socket closed, but some bytes were unread"); xbt_dynar_free(&data->in_buf_v); } if (data->out_buf_v) { if (xbt_dynar_length(data->out_buf_v)) { - DEBUG0("Flush the socket before closing"); + XBT_DEBUG("Flush the socket before closing"); gras_trp_bufiov_flush(sock); } xbt_dynar_free(&data->out_buf_v); @@ -707,7 +792,7 @@ void gras_trp_buf_socket_close(gras_socket_t sock) /****************************/ /* - * Returns the tcp protocol number from the network protocol data base. + * Returns the tcp protocol number from the network protocol data base, or -1 if not found * * getprotobyname() is not thread safe. We need to lock it. */ @@ -718,8 +803,12 @@ static int _gras_tcp_proto_number(void) if (returnValue == 0) { fetchedEntry = getprotobyname("tcp"); - xbt_assert0(fetchedEntry, "getprotobyname(tcp) gave NULL"); - returnValue = fetchedEntry->p_proto; + if (fetchedEntry == NULL) { + XBT_VERB("getprotobyname(tcp) gave NULL"); + returnValue = -1; + } else { + returnValue = fetchedEntry->p_proto; + } } return returnValue; @@ -790,7 +879,7 @@ const char *gras_wsa_err2string(int err) RETSTR(WSA_E_NO_MORE); RETSTR(WSA_E_CANCELLED); RETSTR(WSAEREFUSED); -#endif /* HAVE_WINSOCK2 */ +#endif /* HAVE_WINSOCK2 */ RETSTR(WSAHOST_NOT_FOUND); RETSTR(WSATRY_AGAIN); @@ -799,7 +888,7 @@ const char *gras_wsa_err2string(int err) } return "unknown WSA error"; } -#endif /* HAVE_WINSOCK_H */ +#endif /* HAVE_WINSOCK_H */ /***********************************/ /****[ end of HELPER FUNCTIONS ]****/