diff options
author | Ludovic Courtès <ludo@gnu.org> | 2016-04-25 23:22:45 +0200 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2016-04-25 23:34:20 +0200 |
commit | 5cd25aad3cdb6c970a76542e328a3beba8c1f2c9 (patch) | |
tree | c2edfdb472236ea9145756b7da82ce32174da22e | |
parent | 0054e47036b13d46f0f026bbc04d19770c2ecbad (diff) | |
download | guix-5cd25aad3cdb6c970a76542e328a3beba8c1f2c9.tar.gz |
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.
-rw-r--r-- | guix/build/syscalls.scm | 5 | ||||
-rw-r--r-- | tests/syscalls.scm | 7 |
2 files changed, 8 insertions, 4 deletions
diff --git a/guix/build/syscalls.scm b/guix/build/syscalls.scm index d168293ee4..6cdf65304d 100644 --- a/guix/build/syscalls.scm +++ b/guix/build/syscalls.scm @@ -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)))))) diff --git a/tests/syscalls.scm b/tests/syscalls.scm index 895f90f4d8..71bcbc4d32 100644 --- a/tests/syscalls.scm +++ b/tests/syscalls.scm @@ -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)) |