From 9338f06e900a459cbd5f33fe5e45234f5e541bbd Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Sun, 5 Jun 2016 13:10:52 +0200
Subject: [PATCH] socket_send does not crash anymore but returns an error

The application (enb.c basically) will now monitor the socket
and reconnect if it dies. See following commits.
---
 common/utils/T/tracer/enb.c     | 7 ++++---
 common/utils/T/tracer/textlog.c | 7 ++++---
 common/utils/T/tracer/utils.c   | 5 +++--
 common/utils/T/tracer/utils.h   | 3 ++-
 common/utils/T/tracer/vcd.c     | 7 ++++---
 5 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/common/utils/T/tracer/enb.c b/common/utils/T/tracer/enb.c
index eeaa0ff31f..1d97b428d3 100644
--- a/common/utils/T/tracer/enb.c
+++ b/common/utils/T/tracer/enb.c
@@ -39,9 +39,10 @@ void is_on_changed(void *_d)
   if (d->socket == -1) goto no_connection;
 
   t = 1;
-  socket_send(d->socket, &t, 1);
-  socket_send(d->socket, &d->nevents, sizeof(int));
-  socket_send(d->socket, d->is_on, d->nevents * sizeof(int));
+  if (socket_send(d->socket, &t, 1) == -1 ||
+      socket_send(d->socket, &d->nevents, sizeof(int)) == -1 ||
+      socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1)
+    abort();
 
 no_connection:
   if (pthread_mutex_unlock(&d->lock)) abort();
diff --git a/common/utils/T/tracer/textlog.c b/common/utils/T/tracer/textlog.c
index f7bde62a43..362ff8103e 100644
--- a/common/utils/T/tracer/textlog.c
+++ b/common/utils/T/tracer/textlog.c
@@ -33,9 +33,10 @@ void is_on_changed(void *_d)
   if (d->socket == -1) goto no_connection;
 
   t = 1;
-  socket_send(d->socket, &t, 1);
-  socket_send(d->socket, &d->nevents, sizeof(int));
-  socket_send(d->socket, d->is_on, d->nevents * sizeof(int));
+  if (socket_send(d->socket, &t, 1) == -1 ||
+      socket_send(d->socket, &d->nevents, sizeof(int)) == -1 ||
+      socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1)
+    abort();
 
 no_connection:
   if (pthread_mutex_unlock(&d->lock)) abort();
diff --git a/common/utils/T/tracer/utils.c b/common/utils/T/tracer/utils.c
index cb2e123fce..f285a71fb1 100644
--- a/common/utils/T/tracer/utils.c
+++ b/common/utils/T/tracer/utils.c
@@ -68,16 +68,17 @@ list *list_append(list *l, void *data)
 /* socket                                                                   */
 /****************************************************************************/
 
-void socket_send(int socket, void *buffer, int size)
+int socket_send(int socket, void *buffer, int size)
 {
   char *x = buffer;
   int ret;
   while (size) {
     ret = write(socket, x, size);
-    if (ret <= 0) abort();
+    if (ret <= 0) return -1;
     size -= ret;
     x += ret;
   }
+  return 0;
 }
 
 int get_connection(char *addr, int port)
diff --git a/common/utils/T/tracer/utils.h b/common/utils/T/tracer/utils.h
index 00193b9eeb..a5b1f1b9f6 100644
--- a/common/utils/T/tracer/utils.h
+++ b/common/utils/T/tracer/utils.h
@@ -20,7 +20,8 @@ list *list_append(list *l, void *data);
 /* socket                                                                   */
 /****************************************************************************/
 
-void socket_send(int socket, void *buffer, int size);
+/* socket_send: return 0 if okay, -1 on error */
+int socket_send(int socket, void *buffer, int size);
 int get_connection(char *addr, int port);
 int fullread(int fd, void *_buf, int count);
 int connect_to(char *addr, int port);
diff --git a/common/utils/T/tracer/vcd.c b/common/utils/T/tracer/vcd.c
index 46187f751b..d4972d15fc 100644
--- a/common/utils/T/tracer/vcd.c
+++ b/common/utils/T/tracer/vcd.c
@@ -30,9 +30,10 @@ void is_on_changed(void *_d)
   if (d->socket == -1) goto no_connection;
 
   t = 1;
-  socket_send(d->socket, &t, 1);
-  socket_send(d->socket, &d->nevents, sizeof(int));
-  socket_send(d->socket, d->is_on, d->nevents * sizeof(int));
+  if (socket_send(d->socket, &t, 1) == -1 ||
+      socket_send(d->socket, &d->nevents, sizeof(int)) == -1 ||
+      socket_send(d->socket, d->is_on, d->nevents * sizeof(int)) == -1)
+    abort();
 
 no_connection:
   if (pthread_mutex_unlock(&d->lock)) abort();
-- 
GitLab