summaryrefslogtreecommitdiffstats
path: root/nexus/nexctl.c
diff options
context:
space:
mode:
authorSan Mehat <san@google.com>2009-05-10 09:27:07 -0700
committerSan Mehat <san@google.com>2009-05-12 14:02:32 -0700
commit69772dc644e1ccc12b6394267f010100470f3c95 (patch)
tree687e8fa9015bb4dbd176a21553c16f2803e8cc9e /nexus/nexctl.c
parentd768066ef54270a0d3ccfccd50ae8238db5a2cdd (diff)
downloadcore-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.c89
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);
-
}