Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Skalierbare serielle Konsole?

43 views
Skip to first unread message

Sven Geggus

unread,
Jul 25, 2011, 11:04:04 AM7/25/11
to
Moin zusammen,

Ich greife mit screen auf die serielle Konsole eines embedded Debian Systems
zu:

screen /dev/ttyS0 38400

Der screen läuft in einem xterm, rxvt oder ähnlichem.

Nun ist es so, dass der Wert von COLUMNS immer 80 ist und der Wert von LINES
immer 24 unabhängig davon wie groß mein Terminalfenster wirklich ist und
ändert sich nicht durch skalieren des xterm.

Wenn ich statt "screen" "minicom" verwende tritt das selbe Problem auf.

Die Frage ist nun wie man das ändern kann. Ich vermute ein serverseitiges
Problem.

Muss ich dem getty eventuell einen anderen Terminaltyp als vt100 mitgeben?
Das System selbst beherscht die dynamische Skalierung von Terminalfenstern
prinzipiell, denn wenn ich mich per ssh einlogge ändert sich die Werte von
LINES und COLUMNS beim skalieren dynamisch.

Gruss

Sven

--
"Das Einzige wovor wir Angst haben müssen ist die Angst selbst"
(Franklin D. Roosevelt)

/me is giggls@ircnet, http://sven.gegg.us/ on the Web

Rainer Weikusat

unread,
Jul 25, 2011, 1:52:52 PM7/25/11
to
Sven Geggus <use...@fuchsschwanzdomain.de> writes:
> Ich greife mit screen auf die serielle Konsole eines embedded Debian Systems
> zu:
>
> screen /dev/ttyS0 38400
>
> Der screen läuft in einem xterm, rxvt oder ähnlichem.
>
> Nun ist es so, dass der Wert von COLUMNS immer 80 ist und der Wert von LINES
> immer 24 unabhängig davon wie groß mein Terminalfenster wirklich ist und
> ändert sich nicht durch skalieren des xterm.
>
> Wenn ich statt "screen" "minicom" verwende tritt das selbe Problem auf.
>
> Die Frage ist nun wie man das ändern kann. Ich vermute ein serverseitiges
> Problem.
>
> Muss ich dem getty eventuell einen anderen Terminaltyp als vt100 mitgeben?
> Das System selbst beherscht die dynamische Skalierung von Terminalfenstern
> prinzipiell, denn wenn ich mich per ssh einlogge ändert sich die Werte von
> LINES und COLUMNS beim skalieren dynamisch.

Unten angehaengtes Programm uebersetzen und bei Login via seriell
ausfuehren lassen, Beispiel:

if expr `tty` : '.*S.' >/dev/null 2>&1;
then
rows=`stty -F /dev/tty -a | sed -n 's/^.*rows *//; s/;.*$//; p; q'`
test "$rows" = 0 && resize
fi

----------------
/* This version of resize.c has been modified from the original, which
* came with X11/xterm. It no longer tries to emit shell commands for
* setting LINES, COLUMNS, or TERMCAP. It assumes an ANSI terminal,
* and the availability of the TIOCGWINSZ ioctl. The portability
* ifdefs were also removed -- posix termios access is assumed.
* Paul Fox, June 2006
*
* original copyright messages preserved below...
*/

/*
* $Xorg: resize.c,v 1.3 2000/08/17 19:55:09 cpqbld Exp $
*/

/* $XFree86: xc/programs/xterm/resize.c,v 3.51 2001/10/09 21:52:40 alanh Exp $ */

/*
* Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
*
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation, and that the name of Digital Equipment
* Corporation not be used in advertising or publicity pertaining to
* distribution of the software without specific, written prior permission.
*
*
* DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
* DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
* ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
* WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
* SOFTWARE.
*/


/* resize.c */

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <termio.h>
#include <termios.h>


#include <signal.h>
#include <pwd.h>

#define ESC "\033"


#define TIMEOUT 10


char *myname;

char getsize[] = ESC "7" ESC "[r" ESC "[999;999H" ESC "[6n";
char restore[] = ESC "8";

struct termios tioorig;

char size[] = ESC "[%d;%dR";

int tty;
FILE *ttyfp;

static void onintr (int sig);
static void resize_timeout (int sig);
static void Usage (void);
static void readstring (FILE *fp, char *buf, char *str);

char *
x_basename(char *name)
{
char *cp;

cp = strrchr(name, '/');
return (cp ? cp + 1 : name);
}


/*
tells tty driver to reflect current screen size
*/

int
main (int argc, char **argv)
{

int rows, cols;
struct termios tio;
char buf[BUFSIZ];
struct winsize ws;
char *name_of_tty;

myname = x_basename(argv[0]);

if (argc > 1) Usage();

name_of_tty = "/dev/tty";

if ((ttyfp = fopen (name_of_tty, "r+")) == NULL) {
fprintf (stderr, "%s: can't open terminal %s\n",
myname, name_of_tty);
exit (1);
}
tty = fileno(ttyfp);

tcgetattr(tty, &tioorig);
tio = tioorig;
tio.c_iflag &= ~ICRNL;
tio.c_lflag &= ~(ICANON | ECHO);
tio.c_cflag |= CS8;
tio.c_cc[VMIN] = 6;
tio.c_cc[VTIME] = 1;
signal(SIGINT, onintr);
signal(SIGQUIT, onintr);
signal(SIGTERM, onintr);
tcsetattr(tty, TCSADRAIN, &tio);

write(tty, getsize, strlen(getsize));
readstring(ttyfp, buf, size);
if(sscanf (buf, size, &rows, &cols) != 2) {
fprintf(stderr, "%s: Can't get rows and columns\r\n", myname);
onintr(0);
}
write(tty, restore, strlen(restore));

if (ioctl (tty, TIOCGWINSZ, &ws) != -1) {
/* we don't have any way of directly finding out
the current height & width of the window in pixels. We try
our best by computing the font height and width from the "old"
struct winsize values, and multiplying by these ratios...*/
if (ws.ws_col != 0)
ws.ws_xpixel = cols * (ws.ws_xpixel / ws.ws_col);
if (ws.ws_row != 0)
ws.ws_ypixel = rows * (ws.ws_ypixel / ws.ws_row);
ws.ws_row = rows;
ws.ws_col = cols;
ioctl (tty, TIOCSWINSZ, &ws);
}

tcsetattr(tty, TCSADRAIN, &tioorig);
signal(SIGINT, SIG_DFL);
signal(SIGQUIT, SIG_DFL);
signal(SIGTERM, SIG_DFL);

exit(0);
}


static void
readstring(register FILE *fp, register char *buf, char *str)
{
register int last, c;

signal(SIGALRM, resize_timeout);
alarm (TIMEOUT);
if ((c = getc(fp)) == 0233) { /* meta-escape, CSI */
*buf++ = c = ESC[0];
*buf++ = '[';
} else {
*buf++ = c;
}
if(c != *str) {
fprintf(stderr, "%s: unknown character, exiting.\r\n", myname);
onintr(0);
}
last = str[strlen(str) - 1];
while((*buf++ = getc(fp)) != last)
;
alarm (0);
*buf = 0;
}

static void
Usage(void)
{
fprintf(stderr,
"Usage: %s\n"
" sets size via ioctl\n", myname);
exit(1);
}

static void
resize_timeout(int sig)
{
fprintf(stderr, "\n%s: timeout occurred\r\n", myname);
onintr(sig);
}

/* ARGSUSED */
static void
onintr(int sig)
{
tcsetattr (tty, TCSADRAIN, &tioorig);
exit(1);
}

Christian Weisgerber

unread,
Jul 25, 2011, 1:22:56 PM7/25/11
to
Sven Geggus <use...@fuchsschwanzdomain.de> wrote:

> Ich greife mit screen auf die serielle Konsole eines embedded Debian Systems
> zu:
>
> screen /dev/ttyS0 38400
>
> Der screen läuft in einem xterm, rxvt oder ähnlichem.
>
> Nun ist es so, dass der Wert von COLUMNS immer 80 ist und der Wert von LINES
> immer 24 unabhängig davon wie groß mein Terminalfenster wirklich ist und
> ändert sich nicht durch skalieren des xterm.

Wie denn auch? Es gibt keinen Mechanismus, um die Änderung der
Terminalgröße über eine serielle Leitung zu vermitteln.

(Außerdem: COLUMNS und LINES sind Environmentvariablen, die nicht
direkt an das TTY gekoppelt sind. Wenn etwas automatisch angepasst
wird, dann die columns/rows vom TTY, vgl. stty(1). Wenn sich COLUMNS
und LINES bei dir ändern, dann weil die Shell sie beim Empfang von
SIGWINCH diskret anpasst. Hier in BSD-Umgebung sind die beiden
normalerweise gar nicht gesetzt.)

> Das System selbst beherscht die dynamische Skalierung von Terminalfenstern
> prinzipiell, denn wenn ich mich per ssh einlogge ändert sich die Werte von
> LINES und COLUMNS beim skalieren dynamisch.

Das ist ein Pseudo-TTY unter Kontrolle von sshd(8), der entsprechende
Angaben auf einem separaten Signalisierungkanal von ssh(1) bekommt.

--
Christian "naddy" Weisgerber na...@mips.inka.de

Gernot Zander

unread,
Jul 25, 2011, 3:48:18 PM7/25/11
to
Hi,

in de.comp.os.unix.misc Sven Geggus <use...@fuchsschwanzdomain.de> wrote:
> Nun ist es so, dass der Wert von COLUMNS immer 80 ist und der Wert von LINES

> immer 24 unabhᅵngig davon wie groᅵ mein Terminalfenster wirklich ist und
> ᅵndert sich nicht durch skalieren des xterm.

> Wenn ich statt "screen" "minicom" verwende tritt das selbe Problem auf.

> Die Frage ist nun wie man das ᅵndern kann. Ich vermute ein serverseitiges
> Problem.

"resize" eintippen. Das fragt das Terminal mit irgendwelchen
ESC-Sequenzen nach seiner Grᅵᅵe und setzt dann die Envirinment-
Varieblen. (Bzw. eval `resize`).
Inwieweit das hinter Screen noch funktioniert/~ soll, weiᅵ ich
nicht.
(Die Bash im xterm merkt das irgendwie von selbst.)

mfg.
Gernot

--
<hi...@gmx.de> (Gernot Zander) *Keine Mailkopien bitte!*
Wenn alle das tᅵten, was sie mich kᅵnnten, kᅵme ich nicht mehr
zum Sitzen.

en...@starfleet.inka.de

unread,
Jul 25, 2011, 5:47:52 PM7/25/11
to
Hi Sven,

In ka.comp.linux Sven Geggus <use...@fuchsschwanzdomain.de> wrote:
> Ich greife mit screen auf die serielle Konsole eines embedded Debian Systems
> zu:
>
> screen /dev/ttyS0 38400
>

> Der screen lᅵuft in einem xterm, rxvt oder ᅵhnlichem.


>
> Nun ist es so, dass der Wert von COLUMNS immer 80 ist und der Wert von LINES

> immer 24 unabhᅵngig davon wie groᅵ mein Terminalfenster wirklich ist und
> ᅵndert sich nicht durch skalieren des xterm.


>
> Wenn ich statt "screen" "minicom" verwende tritt das selbe Problem auf.
>

> Die Frage ist nun wie man das ᅵndern kann. Ich vermute ein serverseitiges


> Problem.
>
> Muss ich dem getty eventuell einen anderen Terminaltyp als vt100 mitgeben?
> Das System selbst beherscht die dynamische Skalierung von Terminalfenstern

> prinzipiell, denn wenn ich mich per ssh einlogge ᅵndert sich die Werte von


> LINES und COLUMNS beim skalieren dynamisch.

telnet/ssh etc. ᅵbermitteln die Tatsache, dass die Grᅵᅵe sich geᅵndert
hat, "out-of-band" und generieren auf der Serverseite ein SIGWINCH. Der
Handler sorgt dann im Normalfall dafᅵr, dass die neue Grᅵᅵe abgefragt
wird etc.

Ich meine, im (seriellen) Terminallayer gibt es kein ᅵquivalent dazu.
Sicher bin ich mir aber nicht.

Gruᅵ,
Enrik

Sven Geggus

unread,
Jul 26, 2011, 5:55:49 AM7/26/11
to
In de.comp.os.unix.misc Sven Geggus <use...@fuchsschwanzdomain.de> wrote:

> Die Frage ist nun wie man das ändern kann. Ich vermute ein serverseitiges
> Problem.

FTR hier eine Zusammenfassung wie man das Problem elegant löst:

* Programm "resize" aus Rainers Posting compilieren und installieren
* Alternativ das Programm "resize" aus dem xterm Paket verwenden

Die serielle Konsole sendet offensichtlich kein SIGWINCH an das Programm das
im Terminal läuft. Daher muss man die zweitbeste Lösung wählen und einfach
immer vor dem Ausführen eines neuen Befehls die Fenstergröße richtig
einstellen. Dazu steckt man sowas in /etc/profile:

if [ "$PS1" ]; then
if [ $(tty) == '/dev/ttyS0' ]; then
trap resize DEBUG
fi
fi

Ein Problem das weiterhin bestehen bleibt ist die Änderung der Fenstergröße
während ein curses basiertes Programm läuft. Wegen fehlendem SIGWINCH kannd
as Programm natürlich nicht reagieren.

Gruss

Sven

BTW: 1:0 hier bei Usenet vs. Stackexchange :)

--
"Those who do not understand Unix are condemned to reinvent it, poorly"
(Henry Spencer)

Kai Burghardt

unread,
Jun 29, 2013, 6:23:07 PM6/29/13
to
Moin,

On 2011-07-25, Sven Geggus <use...@fuchsschwanzdomain.de> wrote:
> Wenn ich statt "screen" "minicom" verwende tritt das selbe Problem auf.
Das ist kein Problem, das ist gewollt so.

Drueck' mal Ctrl-Alt-F1, es erscheint (i. d. R.) tty1. Versuch das mal
zu skalieren. Jahaaa, tadaa.

Also ich seh' nur die Moeglichkeit, wenn 'n GRUB auf der Kiste ist,
diesem deine Lieblingsgroesse zu erzaehlen, oder es gibt wahrscheinlich
irgendwo'n Kernelparameter der vom Standard (80x24) abweichende Groessen
ermoeglicht. Frag' mich nicht wo. Skalieren ist jedenfalls nicht drin.

BTW davon abweichend screen-sessions sind keine _echten_ tty's. Kuckst Du
$ w
die lassen sich skalieren. Also vielleicht auf'r embedded-Kiste ein
screen anschmeissen und solche Pseudo-terminals skalieren versuchen.
--
Yours Sincerely
Kai Burghardt
0 new messages