summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/io/console/console.c10
-rw-r--r--test/io/console/test_io_console.rb31
-rw-r--r--version.h2
3 files changed, 40 insertions, 3 deletions
diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index dbbfbb7463..6f45537e27 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -535,12 +535,18 @@ console_set_winsize(VALUE io, VALUE size)
VALUE row, col, xpixel, ypixel;
const VALUE *sz;
int fd;
+ long sizelen;
GetOpenFile(io, fptr);
size = rb_Array(size);
- rb_check_arity(RARRAY_LENINT(size), 2, 4);
+ if ((sizelen = RARRAY_LEN(size)) != 2 && sizelen != 4) {
+ rb_raise(rb_eArgError,
+ "wrong number of arguments (given %ld, expected 2 or 4)",
+ sizelen);
+ }
sz = RARRAY_CONST_PTR(size);
- row = sz[0], col = sz[1], xpixel = sz[2], ypixel = sz[3];
+ row = sz[0], col = sz[1], xpixel = ypixel = Qnil;
+ if (sizelen == 4) xpixel = sz[2], ypixel = sz[3];
fd = GetWriteFD(fptr);
#if defined TIOCSWINSZ
ws.ws_row = ws.ws_col = ws.ws_xpixel = ws.ws_ypixel = 0;
diff --git a/test/io/console/test_io_console.rb b/test/io/console/test_io_console.rb
index ff705f7d7c..581500dfd7 100644
--- a/test/io/console/test_io_console.rb
+++ b/test/io/console/test_io_console.rb
@@ -236,11 +236,42 @@ defined?(PTY) and defined?(IO.console) and TestIO_Console.class_eval do
begin
assert_equal([0, 0], s.winsize)
rescue Errno::EINVAL # OpenSolaris 2009.06 TIOCGWINSZ causes Errno::EINVAL before TIOCSWINSZ.
+ else
+ assert_equal([80, 25], s.winsize = [80, 25])
+ assert_equal([80, 25], s.winsize)
+ assert_equal([80, 25], m.winsize)
+ assert_equal([100, 40], m.winsize = [100, 40])
+ assert_equal([100, 40], s.winsize)
+ assert_equal([100, 40], m.winsize)
end
}
end
+ def test_set_winsize_invalid_dev
+ [IO::NULL, __FILE__].each do |path|
+ open(path) do |io|
+ begin
+ s = io.winsize
+ rescue SystemCallError => e
+ assert_raise(e.class) {io.winsize = [0, 0]}
+ else
+ assert(false, "winsize on #{path} succeed: #{s.inspect}")
+ end
+ assert_raise(ArgumentError) {io.winsize = [0, 0, 0]}
+ end
+ end
+ end
+
if IO.console
+ def test_set_winsize_console
+ s = IO.console.winsize
+ assert_kind_of(Array, s)
+ assert_equal(2, s.size)
+ assert_kind_of(Integer, s[0])
+ assert_kind_of(Integer, s[1])
+ assert_nothing_raised(TypeError) {IO.console.winsize = s}
+ end
+
def test_close
IO.console.close
assert_kind_of(IO, IO.console)
diff --git a/version.h b/version.h
index a2639797ba..0ef441e738 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.0"
#define RUBY_RELEASE_DATE "2017-03-11"
-#define RUBY_PATCHLEVEL 16
+#define RUBY_PATCHLEVEL 17
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 3