#include "xbt/misc.h"
#include "xbt/sysdep.h"
#include "xbt/ex.h"
-#include "transport_private.h"
+#include "gras/Transport/transport_private.h"
/* FIXME maybe READV is sometime a good thing? */
#undef HAVE_READV
/*****************************/
/* we exchange port number on client side on socket creation,
so we need to be able to talk right now. */
-static 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);
static int _gras_tcp_proto_number(void);
-static inline void gras_trp_sock_socket_client(gras_trp_plugin_t ignored,
+static XBT_INLINE void gras_trp_sock_socket_client(gras_trp_plugin_t ignored,
gras_socket_t sock){
struct sockaddr_in addr;
*
* Open a socket used to receive messages.
*/
-static inline void gras_trp_sock_socket_server(gras_trp_plugin_t ignored,
+static XBT_INLINE void gras_trp_sock_socket_server(gras_trp_plugin_t ignored,
gras_socket_t sock){
int size = sock->buf_size;
int on = 1;
THROW1(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,"setsockopt failed, cannot condition the socket: %s",
+ THROW1(system_error,0,
+ "setsockopt failed, cannot condition the socket: %s",
sock_errstr(sock_errno));
- if (setsockopt(sock->sd, SOL_SOCKET, SO_RCVBUF, (char *)&size, sizeof(size)) ||
- setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF, (char *)&size, sizeof(size))) {
+ if ( setsockopt(sock->sd, SOL_SOCKET, SO_RCVBUF,
+ (char *)&size, sizeof(size))
+ || setsockopt(sock->sd, SOL_SOCKET, SO_SNDBUF,
+ (char *)&size, sizeof(size))) {
WARN1("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));
+ THROW2(system_error,0,
+ "Cannot bind to port %d: %s",
+ sock->port, sock_errstr(sock_errno));
}
DEBUG2("Listen on port %d (sd=%d)",sock->port, sock->sd);
if (listen(sock->sd, 5) < 0) {
tcp_close(sock->sd);
- THROW2(system_error,0,"Cannot listen on port %d: %s",sock->port,sock_errstr(sock_errno));
+ THROW2(system_error,0,
+ "Cannot listen on port %d: %s",
+ sock->port,sock_errstr(sock_errno));
}
VERB2("Openned a server socket on port %d (sd=%d)",sock->port,sock->sd);
}
VERB3("Accepted from %s:%d (sd=%d)", res->peer_name,res->peer_port,sd);
-
+ xbt_dynar_push(((gras_trp_procdata_t)
+ gras_libdata_by_id(gras_trp_libdata_id))->sockets,&res);
+
XBT_OUT;
return res;
}
/************************************/
/* Temptation to merge this with file data exchange is great,
but doesn't work on BillWare (see tcp_write() in portable.h) */
-static inline void gras_trp_tcp_send(gras_socket_t sock,
+static XBT_INLINE void gras_trp_tcp_send(gras_socket_t sock,
const char *data,
unsigned long int size) {
}
}
}
-static inline int
+static XBT_INLINE int
gras_trp_tcp_recv_withbuffer(gras_socket_t sock,
char *data,
unsigned long int size,
int got = 0;
+ if (sock->recvd) {
+ data[0] = sock->recvd_val;
+ sock->recvd = 0;
+ got++;
+ bufsize--;
+ }
+
while (size>got) {
int status = 0;
bufsize -= status;
got += status;
} else {
- THROW1(system_error,0,"Socket closed by remote side (got %d bytes before this)",
+ THROW1(system_error,errno,"Socket closed by remote side (got %d bytes before this)",
got);
}
}