acpid in 1.16.2 doesn't build on SLES 10.

Denys Vlasenko vda.linux at googlemail.com
Tue Jul 20 03:08:00 UTC 2010


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?

-- 
vda


More information about the busybox mailing list