+
+(defclass sb-posix::termios ()
+ ((sb-posix::iflag :initarg :iflag :accessor sb-posix::termios-iflag)
+ (sb-posix::oflag :initarg :oflag :accessor sb-posix::termios-oflag)
+ (sb-posix::cflag :initarg :cflag :accessor sb-posix::termios-cflag)
+ (sb-posix::lflag :initarg :lflag :accessor sb-posix::termios-lflag)
+ (sb-posix::cc :initarg :cc :accessor sb-posix::termios-cc)))
+
+(export 'sb-posix::tcsetattr :sb-posix)
+(declaim (inline sb-posix::tcsetattr))
+(defun sb-posix::tcsetattr (fd actions termios)
+ (sb-posix::with-alien-termios a-termios ()
+ (protocol-class-to-alien termios 'sb-posix::termios
+ a-termios 'sb-posix::alien-termios
+ '(sb-posix::iflag sb-posix::oflag
+ sb-posix::cflag sb-posix::lflag))
+ (loop with ccs = (sb-posix::alien-termios-cc a-termios)
+ for i from 0 below sb-posix::nccs
+ do (setf (sb-alien:deref ccs i)
+ (aref (sb-posix::termios-cc termios) i)))
+ (let ((fd (sb-posix::file-descriptor fd)))
+ (let* ((r (alien-funcall
+ (extern-alien "tcsetattr" (function int int int sb-posix::alien-termios))
+ fd actions termios)))
+ (when (minusp r)
+ (syscall-error)))
+ (values))))
+(export 'sb-posix::tcgetattr :sb-posix)
+(declaim (inline sb-posix::tcgetattr))
+(defun sb-posix::tcgetattr (fd &optional termios)
+ (sb-posix::with-alien-termios a-termios ()
+ (let ((r (alien-funcall
+ (extern-alien "tcgetattr" (function int int sb-posix::alien-termios))
+ (sb-posix::file-descriptor fd)
+ a-termios)))
+ (when (minusp r)
+ (syscall-error))
+ (setf termios
+ (alien-to-protocol-class a-termios 'alien-termios
+ termios 'termios
+ '(sb-posix::iflag sb-posix::oflag
+ sb-posix::cflag sb-posix::lflag)))
+ (setf (sb-posix::termios-cc termios) (make-array sb-posix::nccs))
+ (loop with ccs = (sb-posix::alien-termios-cc a-termios)
+ for i from 0 below sb-posix::nccs
+ do (setf (aref (sb-posix::termios-cc termios) i)
+ (sb-alien:deref ccs i)))))
+ termios)