Add resizewin -z. It makes resizewin not do anything if the terminal

size is already set to something other than zero. It's supposed to be
called from eg /etc/profile - it's not neccessary to query terminal
size when logging in over the network, because the protocol used already
takes care of this, but it's neccessary when logging over a serial line.

Reviewed by:	cem, Daniel O'Connor <darius@dons.net.au>
MFC after:	2 weeks
Sponsored by:	DARPA, AFRL
Differential Revision:	https://reviews.freebsd.org/D10637
This commit is contained in:
Edward Tomasz Napierala 2017-05-08 08:58:51 +00:00
parent 048fd859ce
commit f1504c0c26
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=317934
2 changed files with 43 additions and 3 deletions

View File

@ -27,17 +27,27 @@
.\"
.\" $FreeBSD$
.\"
.Dd July 9, 2016
.Dd May 8, 2017
.Dt RESIZEWIN 1
.Os
.Sh NAME
.Nm resizewin
.Nd update the kernel window size for the current TTY
.Sh SYNOPSIS
.Nm
.Op Fl z
.Sh DESCRIPTION
Query the terminal emulator window size with the
.Dv TIOCSWINSZ
ioctl and set the window size known by the kernel to the new values.
The terminal is assumed to be VT100/ANSI compatible.
.Pp
The following options are available:
.Bl -tag -width ".Fl z"
.It Fl z
Do nothing unless the current kernel terminal size is zero.
.El
.Pp
.Nm
is functionally similar to
.Xr resize 1 ,

View File

@ -47,20 +47,50 @@ static const char query[] =
"\033[999;999H" /* Move cursor */
"\033[6n" /* Get cursor position */
"\0338"; /* Restore cursor position */
static void
usage(void)
{
fprintf(stderr, "usage: resizewin [-z]\n");
exit(1);
}
int
main(__unused int argc, __unused char **argv)
main(int argc, char **argv)
{
struct termios old, new;
struct winsize w;
int ret, fd, cnt, error;
int ret, fd, ch, cnt, error, zflag;
char data[20];
struct timeval then, now;
error = 0;
zflag = 0;
while ((ch = getopt(argc, argv, "z")) != -1) {
switch (ch) {
case 'z':
zflag = 1;
break;
case '?':
default:
usage();
}
}
argc -= optind;
if (argc != 0)
usage();
if ((fd = open("/dev/tty", O_RDWR | O_NONBLOCK)) == -1)
exit(1);
if (zflag) {
if (ioctl(fd, TIOCGWINSZ, &w) == -1)
exit(1);
if (w.ws_row != 0 && w.ws_col != 0)
exit(0);
}
/* Disable echo */
if (tcgetattr(fd, &old) == -1)
exit(1);