SimObjects: Clean up handling of C++ namespaces.
[gem5.git] / src / dev / terminal.cc
index 47f280ad3b09831bed62ef224f08a2473a9d0cb5..fba0c61307faff21242f277fd518412e98ccc3ca 100644 (file)
 
 #include <sys/ioctl.h>
 #include <sys/termios.h>
-#include <sys/types.h>
 #include <errno.h>
 #include <poll.h>
 #include <unistd.h>
 
+#include <cctype>
 #include <iostream>
 #include <fstream>
 #include <sstream>
 #include <string>
 
+#include "base/atomicio.hh"
 #include "base/misc.hh"
 #include "base/output.hh"
 #include "base/socket.hh"
@@ -125,6 +126,11 @@ Terminal::~Terminal()
 void
 Terminal::listen(int port)
 {
+    if (ListenSocket::allDisabled()) {
+        warn_once("Sockets disabled, not accepting terminal connections");
+        return;
+    }
+
     while (!listener.listen(port, true)) {
         DPRINTF(Terminal,
                 ": can't bind address terminal port %d inuse PID %d\n",
@@ -151,7 +157,7 @@ Terminal::accept()
     int fd = listener.accept(true);
     if (data_fd != -1) {
         char message[] = "terminal already attached!\n";
-        ::write(fd, message, sizeof(message));
+        atomic_write(fd, message, sizeof(message));
         ::close(fd);
         return;
     }
@@ -233,16 +239,9 @@ Terminal::write(const uint8_t *buf, size_t len)
     if (data_fd < 0)
         panic("Terminal not properly attached.\n");
 
-    size_t ret;
-    for (;;) {
-      ret = ::write(data_fd, buf, len);
-
-      if (ret >= 0)
-        break;
-
-      if (errno != EINTR)
-      detach();
-    }
+    ssize_t ret = atomic_write(data_fd, buf, len);
+    if (ret < len)
+        detach();
 
     return ret;
 }
@@ -295,8 +294,7 @@ Terminal::out(char c)
     if (DTRACE(Terminal)) {
         static char last = '\0';
 
-        if (c != '\n' && c != '\r' ||
-            last != '\n' && last != '\r') {
+        if ((c != '\n' && c != '\r') || (last != '\n' && last != '\r')) {
             if (c == '\n' || c == '\r') {
                 int size = linebuf.size();
                 char *buffer = new char[size + 1];