diff options
-rw-r--r-- | toys/pending/stty.c | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/toys/pending/stty.c b/toys/pending/stty.c index 4ab6b805..8c937696 100644 --- a/toys/pending/stty.c +++ b/toys/pending/stty.c @@ -196,11 +196,11 @@ static void show_speed(struct termios *t, int verbose) out(fmt, ispeed, ospeed); } -static int get_arg(int *i, long long low, long long high) +static int get_arg(int *i, long long high) { (*i)++; if (!toys.optargs[*i]) error_exit("missing arg"); - return atolx_range(toys.optargs[*i], low, high); + return atolx_range(toys.optargs[*i], 0, high); } static int set_flag(tcflag_t *f, const struct flag *flags, int len, @@ -314,11 +314,17 @@ static void xtcgetattr(struct termios *t) if (tcgetattr(TT.fd, t)) perror_exit("tcgetattr %s", TT.device); } -static void do_stty() +void stty_main(void) { struct termios old, sane; int i, j, n; + if (toys.optflags&(FLAG_a|FLAG_g) && *toys.optargs) + error_exit("no settings with -a/-g"); + + if (!TT.device) TT.device = "standard input"; + else TT.fd = xopen(TT.device, (O_RDWR*!!*toys.optargs)|O_NOCTTY|O_NONBLOCK); + xtcgetattr(&old); if (*toys.optargs) { @@ -329,9 +335,9 @@ static void do_stty() if (!strcmp(arg, "size")) show_size(0); else if (!strcmp(arg, "speed")) show_speed(&old, 0); - else if (!strcmp(arg, "line")) new.c_line = get_arg(&i, N_TTY, NR_LDISCS); - else if (!strcmp(arg, "min")) new.c_cc[VMIN] = get_arg(&i, 0, 255); - else if (!strcmp(arg, "time")) new.c_cc[VTIME] = get_arg(&i, 0, 255); + else if (!strcmp(arg, "line")) new.c_line = get_arg(&i, NR_LDISCS); + else if (!strcmp(arg, "min")) new.c_cc[VMIN] = get_arg(&i, 255); + else if (!strcmp(arg, "time")) new.c_cc[VTIME] = get_arg(&i, 255); else if (sscanf(arg, "%x:%x:%x:%x:%n", &new.c_iflag, &new.c_oflag, &new.c_cflag, &new.c_lflag, &n) == 4) { @@ -349,12 +355,12 @@ static void do_stty() cfsetispeed(&new, new_speed); cfsetospeed(&new, new_speed); } else if (!strcmp(arg, "ispeed")) - cfsetispeed(&new, speed(get_arg(&i, 0, 4000000))); + cfsetispeed(&new, speed(get_arg(&i, 4000000))); else if (!strcmp(arg, "ospeed")) - cfsetospeed(&new, speed(get_arg(&i, 0, 4000000))); - else if (!strcmp(arg, "rows")) set_size(1, get_arg(&i, 0, USHRT_MAX)); + cfsetospeed(&new, speed(get_arg(&i, 4000000))); + else if (!strcmp(arg, "rows")) set_size(1, get_arg(&i, USHRT_MAX)); else if (!strcmp(arg, "cols") || !strcmp(arg, "columns")) - set_size(0, get_arg(&i, 0, USHRT_MAX)); + set_size(0, get_arg(&i, USHRT_MAX)); else if (set_special_character(&new, &i, arg)); // Already done as a side effect. else if (!strcmp(arg, "cooked")) @@ -393,6 +399,7 @@ static void do_stty() set_option(&new, arg); } } + tcsetattr(TT.fd, TCSAFLUSH, &new); xtcgetattr(&old); if (memcmp(&old, &new, sizeof(old))) @@ -414,18 +421,17 @@ static void do_stty() if (toys.optflags&FLAG_a) show_size(1); out("line = %d;\n", old.c_line); - for (i=j=0;i<ARRAY_LEN(chars);i++) { + for (i=j=0; i<ARRAY_LEN(chars); i++) { char vis[16] = {}; cc_t ch = old.c_cc[chars[i].value]; if (ch == sane.c_cc[chars[i].value] && (toys.optflags&FLAG_a)==0) continue; - if (chars[i].value == VMIN || chars[i].value == VTIME) { + if (chars[i].value == VMIN || chars[i].value == VTIME) snprintf(vis, sizeof(vis), "%u", ch); - } else if (ch == _POSIX_VDISABLE) { - strcat(vis, "<undef>"); - } else { + else if (ch == _POSIX_VDISABLE) strcat(vis, "<undef>"); + else { if (ch > 0x7f) { strcat(vis, "M-"); ch -= 128; @@ -443,17 +449,6 @@ static void do_stty() show_flags(old.c_iflag, sane.c_iflag, iflags, ARRAY_LEN(iflags)); show_flags(old.c_oflag, sane.c_oflag, oflags, ARRAY_LEN(oflags)); show_flags(old.c_lflag, sane.c_lflag, lflags, ARRAY_LEN(lflags)); -} - -void stty_main(void) -{ - if (toys.optflags&(FLAG_a|FLAG_g) && *toys.optargs) - error_exit("can't make settings with -a/-g"); - - if (!TT.device) TT.device = "standard input"; - else TT.fd=xopen(TT.device, (O_RDWR*!!*toys.optargs)|O_NOCTTY|O_NONBLOCK); - - do_stty(); if (CFG_TOYBOX_FREE && TT.device) close(TT.fd); } |