diff options
author | San Mehat <san@google.com> | 2009-05-10 09:27:07 -0700 |
---|---|---|
committer | San Mehat <san@google.com> | 2009-05-12 14:02:32 -0700 |
commit | 69772dc644e1ccc12b6394267f010100470f3c95 (patch) | |
tree | 687e8fa9015bb4dbd176a21553c16f2803e8cc9e /nexus/nexctl.c | |
parent | d768066ef54270a0d3ccfccd50ae8238db5a2cdd (diff) | |
download | core-69772dc644e1ccc12b6394267f010100470f3c95.tar.gz core-69772dc644e1ccc12b6394267f010100470f3c95.tar.bz2 core-69772dc644e1ccc12b6394267f010100470f3c95.zip |
nexus: Move to a line based protocol (similar to FTP) + fix bugs
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'nexus/nexctl.c')
-rw-r--r-- | nexus/nexctl.c | 89 |
1 files changed, 55 insertions, 34 deletions
diff --git a/nexus/nexctl.c b/nexus/nexctl.c index c326558af..4ad73c485 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 @@ int main(int argc, char **argv) { 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); - } |