On Tuesday 20 July 2010 05:08, Denys Vlasenko wrote: > On Tuesday 20 July 2010 03:19, Rob Landley wrote: > > > http://busybox.net/downloads/fixes-1.17.0/busybox-1.17.0-ask_terminal.patch > > > > > > This patch will make e.g. hush to query window width using ESC [ 6 n > > > only if ioctl(TIOCGWINSZ) fails or returns bogus value of 0. > > > > > > You need to not only confirm that it builds, but also try it > > > on the serial line and let me know whether it actually > > > does the trick. It may fail to work if ctl(TIOCGWINSZ) on the serial > > > line lies, that is, returns some invented nonzero width and height > > > and doesnt indicate the error. > > > > Ok, let's see.... > > > > Nope, vi still thinks it's 80x25. (Which is odd because > > CONFIG_FEATURE_VI_ASK_TERMINAL is enabled.) > > > > Let's see... the ioctl is returning 0 (success) but leaving win.ws_row and > > win.ws_col at 0 if they were initialized to 0. And your code is washing > > that > > through: > > > > static int wh_helper(int value, int def_val, const char *env_name, int *err) > > { > > if (value == 0) { > > char *s = getenv(env_name); > > if (s) { > > value = atoi(s); > > /* If LINES/COLUMNS are set, pretent that there is > > * no error getting w/h, this prevents some ugly > > * cursor tricks by our callers */ > > *err = 0; > ** note that this *err = 0 thing happens _only_ > if LINES/COLUMNS are overridded in environment. > > } > > } > > if (value <= 1 || value >= 30000) > > value = def_val; > > return value; > > } > > > > Which is helpfully overwriting those 0 values with a default value. > > Hmmm, it should be a bug then, but I don't see where: > > int FAST_FUNC get_terminal_width_height(int fd, unsigned *width, unsigned > *height) > { > struct winsize win; > int err; > > win.ws_row = 0; > win.ws_col = 0; > err = ioctl(fd, TIOCGWINSZ, &win) != 0 || win.ws_row == 0; > ** we get err = 1 here, since win.ws_row == 0 > if (height) > *height = wh_helper(win.ws_row, 24, "LINES", &err); > if (width) > *width = wh_helper(win.ws_col, 80, "COLUMNS", &err); > ** and here wh_helper() should NOT reset err to 0, unless you have > $COLUMNS defined in environment. > return err; > ** we return 1 > } > > ... > > static void win_changed(int nsig) > { > int sv_errno = errno; > unsigned width; > IF_FEATURE_EDITING_ASK_TERMINAL(S.unknown_width =) > get_terminal_width_height(0, &width, NULL); > ** and here S.unknown_width should be set to 1 > cmdedit_setwidth(width, nsig /* - just a yes/no flag */); > if (nsig == SIGWINCH) > signal(SIGWINCH, win_changed); /* rearm ourself */ > errno = sv_errno; > } > > Apparently it doesn't happen. Where is my mistake?
Ah, FEATURE_**VI**_ASK_TERMINAL. I thought you test it with shell... FEATURE_VI_ASK_TERMINAL case is similar: # if ENABLE_FEATURE_VI_ASK_TERMINAL if (!G.get_rowcol_error) G.get_rowcol_error = # endif get_terminal_width_height(STDIN_FILENO, &columns, &rows); I need to know whether here G.get_rowcol_error gets set to 1, and if not, why... can you take a look? -- vda _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox