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

View File

@ -1034,7 +1034,10 @@ always a positive integer."
(fall-back))) (fall-back)))
(lambda args (lambda args
(let ((errno (system-error-errno 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) (fall-back)
(apply throw args)))))) (apply throw args))))))

View File

@ -259,15 +259,16 @@
(#f #f) (#f #f)
(lo (interface-address lo))))))) (lo (interface-address lo)))))))
(test-equal "terminal-window-size ENOTTY" (test-assert "terminal-window-size ENOTTY"
ENOTTY
(call-with-input-file "/dev/null" (call-with-input-file "/dev/null"
(lambda (port) (lambda (port)
(catch 'system-error (catch 'system-error
(lambda () (lambda ()
(terminal-window-size port)) (terminal-window-size port))
(lambda args (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" (test-assert "terminal-columns"
(> (terminal-columns) 0)) (> (terminal-columns) 0))