From: Lennart Poettering Date: Tue, 24 Jul 2018 15:15:33 +0000 (+0200) Subject: ptyfwd: optionally override terminal width/height X-Git-Tag: v240~168^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d435a18244ff52132d873859126e7a3ece66a9ba;p=thirdparty%2Fsystemd.git ptyfwd: optionally override terminal width/height --- diff --git a/src/shared/ptyfwd.c b/src/shared/ptyfwd.c index 1cb7ea3a197..fe17b3781aa 100644 --- a/src/shared/ptyfwd.c +++ b/src/shared/ptyfwd.c @@ -392,11 +392,14 @@ int pty_forward_new( struct winsize ws; int r; - f = new0(PTYForward, 1); + f = new(PTYForward, 1); if (!f) return -ENOMEM; - f->flags = flags; + *f = (struct PTYForward) { + .flags = flags, + .master = -1, + }; if (event) f->event = sd_event_ref(event); @@ -587,3 +590,42 @@ int pty_forward_set_priority(PTYForward *f, int64_t priority) { return 0; } + +int pty_forward_set_width_height(PTYForward *f, unsigned width, unsigned height) { + struct winsize ws; + + assert(f); + + if (width == (unsigned) -1 && height == (unsigned) -1) + return 0; /* noop */ + + if (width != (unsigned) -1 && + (width == 0 || width > USHRT_MAX)) + return -ERANGE; + + if (height != (unsigned) -1 && + (height == 0 || height > USHRT_MAX)) + return -ERANGE; + + if (width == (unsigned) -1 || height == (unsigned) -1) { + if (ioctl(f->master, TIOCGWINSZ, &ws) < 0) + return -errno; + + if (width != (unsigned) -1) + ws.ws_col = width; + if (height != (unsigned) -1) + ws.ws_row = height; + } else + ws = (struct winsize) { + .ws_row = height, + .ws_col = width, + }; + + if (ioctl(f->master, TIOCSWINSZ, &ws) < 0) + return -errno; + + /* Make sure we ignore SIGWINCH window size events from now on */ + f->sigwinch_event_source = sd_event_source_unref(f->sigwinch_event_source); + + return 0; +} diff --git a/src/shared/ptyfwd.h b/src/shared/ptyfwd.h index e4a083ac241..4ebddcd7201 100644 --- a/src/shared/ptyfwd.h +++ b/src/shared/ptyfwd.h @@ -37,4 +37,6 @@ bool pty_forward_drain(PTYForward *f); int pty_forward_set_priority(PTYForward *f, int64_t priority); +int pty_forward_set_width_height(PTYForward *f, unsigned width, unsigned height); + DEFINE_TRIVIAL_CLEANUP_FUNC(PTYForward*, pty_forward_free);