syscalls: 'terminal-columns' catches EINVAL on the TIOCGWINSZ ioctl.

Reported by Mark H Weaver <mhw@netris.org>.

* guix/build/syscalls.scm (terminal-columns): Tolerate EINVAL.
* tests/syscalls.scm ("terminal-window-size ENOTTY"): Likewise.
This commit is contained in:
Ludovic Courtès 2016-04-25 23:22:45 +02:00
parent 0054e47036
commit 5cd25aad3c
No known key found for this signature in database
GPG Key ID: 090B11993D9AEBB5
2 changed files with 8 additions and 4 deletions

@ -1034,7 +1034,10 @@ always a positive integer."
(fall-back)))
(lambda args
(let ((errno (system-error-errno args)))
(if (= errno ENOTTY)
;; ENOTTY is what we're after but 2012-and-earlier Linux versions
;; would return EINVAL instead in some cases:
;; <https://bugs.ruby-lang.org/issues/10494>.
(if (or (= errno ENOTTY) (= errno EINVAL))
(fall-back)
(apply throw args))))))

@ -259,15 +259,16 @@
(#f #f)
(lo (interface-address lo)))))))
(test-equal "terminal-window-size ENOTTY"
ENOTTY
(test-assert "terminal-window-size ENOTTY"
(call-with-input-file "/dev/null"
(lambda (port)
(catch 'system-error
(lambda ()
(terminal-window-size port))
(lambda args
(system-error-errno args))))))
;; Accept EINVAL, which some old Linux versions might return.
(memv (system-error-errno args)
(list ENOTTY EINVAL)))))))
(test-assert "terminal-columns"
(> (terminal-columns) 0))