nexus: Move to a line based protocol (similar to FTP) + fix bugs

Signed-off-by: San Mehat <san@google.com>
diff --git a/nexus/nexctl.c b/nexus/nexctl.c
index c326558..4ad73c4 100644
--- a/nexus/nexctl.c
+++ b/nexus/nexctl.c
@@ -31,10 +31,6 @@
 
 #include <private/android_filesystem_config.h>
 
-static void signal_handler(int sig) {
-    fprintf(stdout, "{ interrupt! }\n");
-}
-
 int main(int argc, char **argv) {
     int sock;
 
@@ -47,56 +43,81 @@
 
     printf("Connected to nexus\n");
 
+    char line[255];
+    char *buffer = malloc(4096);
+    int cursor = 0;
+    int col = 0;
+
     while(1) {
         fd_set read_fds;
         struct timeval to;
         int rc = 0;
 
-        signal(SIGINT, SIG_DFL);
-
-        printf("-> ");
-        fflush(stdout);
-
-        char buffer[255];
-        if (!fgets(buffer, sizeof(buffer) -1, stdin)) {
-            printf("Exiting...\n");
-            exit(0);
-        }
-
-        buffer[strlen(buffer) -1] = 0;
-
-        if (write(sock, buffer, strlen(buffer) +1) < 0) {
-            fprintf(stderr, "Error writing data (%s)\n", strerror(errno));
-            exit(2);
-        }
-
-wait:
         to.tv_sec = 10;
         to.tv_usec = 0;
+
         FD_ZERO(&read_fds);
         FD_SET(sock, &read_fds);
+        FD_SET(0, &read_fds);
+
+        if (col == 0) {
+            fprintf(stdout, "-> ");
+            fflush(stdout);
+            col = 3;
+        }
     
-        signal(SIGINT, signal_handler);
-     
         if ((rc = select(sock +1, &read_fds, NULL, NULL, &to)) < 0) {
-            if (errno == EINTR)
-                continue;
             fprintf(stderr, "Error in select (%s)\n", strerror(errno));
             exit(2);
         } else if (!rc) {
-            printf("{response timeout}\n");
             continue;
         } else if (FD_ISSET(sock, &read_fds)) {
-             if ((rc = read(sock, buffer, sizeof(buffer)-1)) <= 0) {
+            memset(buffer, 0, 4096);
+            if ((rc = read(sock, buffer, 4096)) <= 0) {
                  fprintf(stderr, "Error reading response (%s)\n", strerror(errno));
                  exit(2);
-             }
-            printf(" %s\n", buffer);
-            goto wait;
+            }
+            int i;
+            for (i = 0; i < col; i++) {
+                fprintf(stdout, "%c", 8);
+            }
+
+            printf("%s", buffer);
+            printf("-> ");
+            for (i = 0; i < cursor; i++) {
+                fprintf(stdout, "%c", line[i]);
+            }
+            fflush(stdout);
+        } else if (FD_ISSET(0, &read_fds)) {
+            char c;
+
+            if ((rc = read(0, &c, 1)) < 0) {
+                fprintf(stderr, "Error reading from terminal (%s)\n", strerror(errno));
+                exit(2);
+            } else if (!rc) {
+                fprintf(stderr, "0 length read from terminal\n");
+                exit(2);
+            }
+
+            fprintf(stdout, "%c", c);
+            fflush(stdout);
+
+            line[cursor] = c;
+
+            if (c == '\n') {
+                if ((rc = write(sock, line, strlen(line))) < 0) {
+                    fprintf(stderr, "Error writing to nexus (%s)\n", strerror(errno));
+                    exit(2);
+                }
+                memset(line, 0, sizeof(line));
+                cursor = 0;
+                col = 0;
+            } else {
+                cursor++;
+                col++;
+            }
         }
     }
 
-
     exit(0);
-
 }