fix: guard ioctl results with when to avoid partial values
ignore-errors + ioctl can return (values 80 nil) when the fd exists but isn't a terminal. or propagates partial values, causing nil in w or h. Wrap with multiple-value-bind + when to filter.
This commit is contained in:
@@ -175,10 +175,15 @@ as a fallback when a keyword is not in *named-colors*.")
|
||||
(sb-alien:deref winsize 0))) ;; rows
|
||||
(sb-alien:free-alien winsize)))))
|
||||
(or ;; Try ioctl on fd 0 first (stdin — stty uses this)
|
||||
(ignore-errors (ioctl-size 0))
|
||||
(multiple-value-bind (cols rows) (ignore-errors (ioctl-size 0))
|
||||
(when (and cols rows (> cols 0) (> rows 0))
|
||||
(values cols rows)))
|
||||
;; Then try the output stream's fd
|
||||
(ignore-errors
|
||||
(ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b))))
|
||||
(multiple-value-bind (cols rows)
|
||||
(ignore-errors
|
||||
(ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b))))
|
||||
(when (and cols rows (> cols 0) (> rows 0))
|
||||
(values cols rows)))
|
||||
;; $COLUMNS/$LINES fallback — set by every POSIX shell
|
||||
(ignore-errors
|
||||
(let* ((cstr (sb-ext:posix-getenv "COLUMNS"))
|
||||
|
||||
@@ -37,9 +37,14 @@
|
||||
(values (sb-alien:deref winsize 1)
|
||||
(sb-alien:deref winsize 0)))
|
||||
(sb-alien:free-alien winsize)))))
|
||||
(or (ignore-errors (ioctl-size 0))
|
||||
(ignore-errors
|
||||
(ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b))))
|
||||
(or (multiple-value-bind (cols rows) (ignore-errors (ioctl-size 0))
|
||||
(when (and cols rows (> cols 0) (> rows 0))
|
||||
(values cols rows)))
|
||||
(multiple-value-bind (cols rows)
|
||||
(ignore-errors
|
||||
(ioctl-size (sb-sys:fd-stream-fd (backend-output-stream b))))
|
||||
(when (and cols rows (> cols 0) (> rows 0))
|
||||
(values cols rows)))
|
||||
(ignore-errors
|
||||
(let* ((cstr (sb-ext:posix-getenv "COLUMNS"))
|
||||
(rstr (sb-ext:posix-getenv "LINES"))
|
||||
|
||||
Reference in New Issue
Block a user