diff options
Diffstat (limited to 'toys')
-rw-r--r-- | toys/net/microcom.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/toys/net/microcom.c b/toys/net/microcom.c index 6f88ad4f..62b020f2 100644 --- a/toys/net/microcom.c +++ b/toys/net/microcom.c @@ -2,7 +2,7 @@ * * Copyright 2017 The Android Open Source Project. -USE_MICROCOM(NEWTOY(microcom, "<1>1s:X", TOYFLAG_USR|TOYFLAG_BIN)) +USE_MICROCOM(NEWTOY(microcom, "<1>1s#=115200X", TOYFLAG_USR|TOYFLAG_BIN)) config MICROCOM bool "microcom" @@ -12,7 +12,7 @@ config MICROCOM Simple serial console. - -s Set baud rate to SPEED + -s Set baud rate to SPEED (default 115200) -X Ignore ^@ (send break) and ^] (exit) */ @@ -20,7 +20,7 @@ config MICROCOM #include "toys.h" GLOBALS( - char *s; + long s; int fd; struct termios original_stdin_state, original_fd_state; @@ -36,10 +36,7 @@ static void restore_states(int i) void microcom_main(void) { struct pollfd fds[2]; - int i, speed; - - if (!TT.s) speed = 115200; - else speed = atoi(TT.s); + int i; // Open with O_NDELAY, but switch back to blocking for reads. TT.fd = xopen(*toys.optargs, O_RDWR | O_NOCTTY | O_NDELAY); @@ -47,36 +44,33 @@ void microcom_main(void) perror_exit_raw(*toys.optargs); // Set both input and output to raw mode. - xset_terminal(TT.fd, 1, speed, &TT.original_fd_state); + xset_terminal(TT.fd, 1, TT.s, &TT.original_fd_state); set_terminal(0, 1, 0, &TT.original_stdin_state); // ...and arrange to restore things, however we may exit. sigatexit(restore_states); fds[0].fd = TT.fd; - fds[0].events = POLLIN; fds[1].fd = 0; - fds[1].events = POLLIN; + fds[0].events = fds[1].events = POLLIN; while (poll(fds, 2, -1) > 0) { - char buf[BUFSIZ]; // Read from connection, write to stdout. if (fds[0].revents) { - ssize_t n = read(TT.fd, buf, sizeof(buf)); - if (n > 0) xwrite(0, buf, n); + if (0 < (i = read(TT.fd, toybuf, sizeof(toybuf)))) xwrite(0, toybuf, i); else break; } // Read from stdin, write to connection. if (fds[1].revents) { - if (read(0, buf, 1) != 1) break; - if (!(toys.optflags & FLAG_X)) { - if (!*buf) { + if (read(0, toybuf, 1) != 1) break; + if (!FLAG(X)) { + if (!*toybuf) { tcsendbreak(TT.fd, 0); continue; - } else if (*buf == (']'-'@')) break; + } else if (*toybuf == (']'-'@')) break; } - xwrite(TT.fd, buf, 1); + xwrite(TT.fd, toybuf, 1); } } } |