{-# LINE 1 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LANGUAGE CApiFFI #-} {-# LANGUAGE Trustworthy #-} ----------------------------------------------------------------------------- -- | -- Module : System.Posix.Terminal.Common -- Copyright : (c) The University of Glasgow 2002 -- License : BSD-style (see the file libraries/base/LICENSE) -- -- Maintainer : libraries@haskell.org -- Stability : provisional -- Portability : non-portable (requires POSIX) -- -- POSIX Terminal support -- ----------------------------------------------------------------------------- -- see https://android.googlesource.com/platform/bionic/+/9ae59c0/libc/bionic/pathconf.c#37 {-# LINE 22 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} module System.Posix.Terminal.Common ( -- * Terminal support -- ** Terminal attributes TerminalAttributes, getTerminalAttributes, TerminalState(..), setTerminalAttributes, CTermios, TerminalMode(..), withoutMode, withMode, terminalMode, bitsPerByte, withBits, ControlCharacter(..), controlChar, withCC, withoutCC, inputTime, withTime, minInput, withMinInput, BaudRate(..), inputSpeed, withInputSpeed, outputSpeed, withOutputSpeed, -- ** Terminal operations sendBreak, drainOutput, QueueSelector(..), discardData, FlowAction(..), controlFlow, -- ** Process groups getTerminalProcessGroupID, setTerminalProcessGroupID, -- ** Testing a file descriptor queryTerminal, ) where import Data.Bits import Data.Char import Foreign.C.Error ( throwErrnoIfMinus1, throwErrnoIfMinus1_ ) import Foreign.C.Types import Foreign.ForeignPtr ( ForeignPtr, withForeignPtr, mallocForeignPtrBytes ) import Foreign.Marshal.Utils ( copyBytes ) import Foreign.Ptr ( Ptr, plusPtr ) import Foreign.Storable ( Storable(..) ) import System.IO.Unsafe ( unsafePerformIO ) import System.Posix.Types import System.Posix.Internals ( CTermios ) {-# LINE 91 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} -- ----------------------------------------------------------------------------- -- Terminal attributes newtype TerminalAttributes = TerminalAttributes (ForeignPtr CTermios) makeTerminalAttributes :: ForeignPtr CTermios -> TerminalAttributes makeTerminalAttributes = TerminalAttributes withTerminalAttributes :: TerminalAttributes -> (Ptr CTermios -> IO a) -> IO a withTerminalAttributes (TerminalAttributes termios) = withForeignPtr termios data TerminalMode -- input flags = InterruptOnBreak -- ^ @BRKINT@ - Signal interrupt on break | MapCRtoLF -- ^ @ICRNL@ - Map CR to NL on input | IgnoreBreak -- ^ @IGNBRK@ - Ignore break condition | IgnoreCR -- ^ @IGNCR@ - Ignore CR | IgnoreParityErrors -- ^ @IGNPAR@ - Ignore characters with parity errors | MapLFtoCR -- ^ @INLCR@ - Map NL to CR on input | CheckParity -- ^ @INPCK@ - Enable input parity check | StripHighBit -- ^ @ISTRIP@ - Strip character | RestartOnAny -- ^ @IXANY@ - Enable any character to restart output | StartStopInput -- ^ @IXOFF@ - Enable start/stop input control | StartStopOutput -- ^ @IXON@ - Enable start/stop output control | MarkParityErrors -- ^ @PARMRK@ - Mark parity errors -- output flags | ProcessOutput -- ^ @OPOST@ - Post-process output | MapLFtoCRLF -- ^ @ONLCR@ - (XSI) Map NL to CR-NL on output -- -- @since 2.8.0.0 | OutputMapCRtoLF -- ^ @OCRNL@ - (XSI) Map CR to NL on output -- -- @since 2.8.0.0 | NoCRAtColumnZero -- ^ @ONOCR@ - (XSI) No CR output at column 0 -- -- @since 2.8.0.0 | ReturnMeansLF -- ^ @ONLRET@ - (XSI) NL performs CR function -- -- @since 2.8.0.0 | TabDelayMask0 -- ^ @TABDLY(TAB0)@ - (XSI) Select horizontal-tab delays: type 0 -- -- @since 2.8.0.0 | TabDelayMask3 -- ^ @TABDLY(TAB3)@ - (XSI) Select horizontal-tab delays: type 3 -- -- @since 2.8.0.0 -- control flags | LocalMode -- ^ @CLOCAL@ - Ignore modem status lines | ReadEnable -- ^ @CREAD@ - Enable receiver | TwoStopBits -- ^ @CSTOPB@ - Send two stop bits, else one | HangupOnClose -- ^ @HUPCL@ - Hang up on last close | EnableParity -- ^ @PARENB@ - Parity enable | OddParity -- ^ @PARODD@ - Odd parity, else even -- local modes | EnableEcho -- ^ @ECHO@ - Enable echo | EchoErase -- ^ @ECHOE@ - Echo erase character as error-correcting backspace | EchoKill -- ^ @ECHOK@ - Echo KILL | EchoLF -- ^ @ECHONL@ - Echo NL | ProcessInput -- ^ @ICANON@ - Canonical input (erase and kill processing) | ExtendedFunctions -- ^ @IEXTEN@ - Enable extended input character processing | KeyboardInterrupts -- ^ @ISIG@ - Enable signals | NoFlushOnInterrupt -- ^ @NOFLSH@ - Disable flush after interrupt or quit | BackgroundWriteInterrupt -- ^ @TOSTOP@ - Send @SIGTTOU@ for background output withoutMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes withoutMode termios InterruptOnBreak = clearInputFlag (2) termios {-# LINE 161 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios MapCRtoLF = clearInputFlag (256) termios {-# LINE 162 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios IgnoreBreak = clearInputFlag (1) termios {-# LINE 163 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios IgnoreCR = clearInputFlag (128) termios {-# LINE 164 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios IgnoreParityErrors = clearInputFlag (4) termios {-# LINE 165 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios MapLFtoCR = clearInputFlag (64) termios {-# LINE 166 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios CheckParity = clearInputFlag (16) termios {-# LINE 167 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios StripHighBit = clearInputFlag (32) termios {-# LINE 168 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios RestartOnAny = clearInputFlag (2048) termios {-# LINE 169 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios StartStopInput = clearInputFlag (4096) termios {-# LINE 170 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios StartStopOutput = clearInputFlag (1024) termios {-# LINE 171 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios MarkParityErrors = clearInputFlag (8) termios {-# LINE 172 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios ProcessOutput = clearOutputFlag (1) termios {-# LINE 173 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios MapLFtoCRLF = clearOutputFlag (4) termios {-# LINE 174 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios OutputMapCRtoLF = clearOutputFlag (8) termios {-# LINE 175 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios NoCRAtColumnZero = clearOutputFlag (16) termios {-# LINE 176 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios ReturnMeansLF = clearOutputFlag (32) termios {-# LINE 177 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios TabDelayMask0 = clearOutputFlag (0) termios {-# LINE 178 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios TabDelayMask3 = clearOutputFlag (6144) termios {-# LINE 179 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios LocalMode = clearControlFlag (2048) termios {-# LINE 180 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios ReadEnable = clearControlFlag (128) termios {-# LINE 181 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios TwoStopBits = clearControlFlag (64) termios {-# LINE 182 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios HangupOnClose = clearControlFlag (1024) termios {-# LINE 183 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios EnableParity = clearControlFlag (256) termios {-# LINE 184 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios OddParity = clearControlFlag (512) termios {-# LINE 185 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios EnableEcho = clearLocalFlag (8) termios {-# LINE 186 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios EchoErase = clearLocalFlag (16) termios {-# LINE 187 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios EchoKill = clearLocalFlag (32) termios {-# LINE 188 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios EchoLF = clearLocalFlag (64) termios {-# LINE 189 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios ProcessInput = clearLocalFlag (2) termios {-# LINE 190 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios ExtendedFunctions = clearLocalFlag (32768) termios {-# LINE 191 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios KeyboardInterrupts = clearLocalFlag (1) termios {-# LINE 192 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios NoFlushOnInterrupt = setLocalFlag (128) termios {-# LINE 193 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withoutMode termios BackgroundWriteInterrupt = clearLocalFlag (256) termios {-# LINE 194 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes withMode termios InterruptOnBreak = setInputFlag (2) termios {-# LINE 197 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios MapCRtoLF = setInputFlag (256) termios {-# LINE 198 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios IgnoreBreak = setInputFlag (1) termios {-# LINE 199 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios IgnoreCR = setInputFlag (128) termios {-# LINE 200 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios IgnoreParityErrors = setInputFlag (4) termios {-# LINE 201 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios MapLFtoCR = setInputFlag (64) termios {-# LINE 202 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios CheckParity = setInputFlag (16) termios {-# LINE 203 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios StripHighBit = setInputFlag (32) termios {-# LINE 204 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios RestartOnAny = setInputFlag (2048) termios {-# LINE 205 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios StartStopInput = setInputFlag (4096) termios {-# LINE 206 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios StartStopOutput = setInputFlag (1024) termios {-# LINE 207 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios MarkParityErrors = setInputFlag (8) termios {-# LINE 208 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios ProcessOutput = setOutputFlag (1) termios {-# LINE 209 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios MapLFtoCRLF = setOutputFlag (4) termios {-# LINE 210 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios OutputMapCRtoLF = setOutputFlag (8) termios {-# LINE 211 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios NoCRAtColumnZero = setOutputFlag (16) termios {-# LINE 212 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios ReturnMeansLF = setOutputFlag (32) termios {-# LINE 213 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios TabDelayMask0 = setOutputFlag (0) termios {-# LINE 214 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios TabDelayMask3 = setOutputFlag (6144) termios {-# LINE 215 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios LocalMode = setControlFlag (2048) termios {-# LINE 216 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios ReadEnable = setControlFlag (128) termios {-# LINE 217 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios TwoStopBits = setControlFlag (64) termios {-# LINE 218 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios HangupOnClose = setControlFlag (1024) termios {-# LINE 219 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios EnableParity = setControlFlag (256) termios {-# LINE 220 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios OddParity = setControlFlag (512) termios {-# LINE 221 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios EnableEcho = setLocalFlag (8) termios {-# LINE 222 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios EchoErase = setLocalFlag (16) termios {-# LINE 223 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios EchoKill = setLocalFlag (32) termios {-# LINE 224 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios EchoLF = setLocalFlag (64) termios {-# LINE 225 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios ProcessInput = setLocalFlag (2) termios {-# LINE 226 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios ExtendedFunctions = setLocalFlag (32768) termios {-# LINE 227 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios KeyboardInterrupts = setLocalFlag (1) termios {-# LINE 228 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios NoFlushOnInterrupt = clearLocalFlag (128) termios {-# LINE 229 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withMode termios BackgroundWriteInterrupt = setLocalFlag (256) termios {-# LINE 230 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode :: TerminalMode -> TerminalAttributes -> Bool terminalMode InterruptOnBreak = testInputFlag (2) {-# LINE 233 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode MapCRtoLF = testInputFlag (256) {-# LINE 234 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode IgnoreBreak = testInputFlag (1) {-# LINE 235 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode IgnoreCR = testInputFlag (128) {-# LINE 236 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode IgnoreParityErrors = testInputFlag (4) {-# LINE 237 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode MapLFtoCR = testInputFlag (64) {-# LINE 238 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode CheckParity = testInputFlag (16) {-# LINE 239 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode StripHighBit = testInputFlag (32) {-# LINE 240 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode RestartOnAny = testInputFlag (2048) {-# LINE 241 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode StartStopInput = testInputFlag (4096) {-# LINE 242 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode StartStopOutput = testInputFlag (1024) {-# LINE 243 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode MarkParityErrors = testInputFlag (8) {-# LINE 244 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode ProcessOutput = testOutputFlag (1) {-# LINE 245 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode MapLFtoCRLF = testOutputFlag (4) {-# LINE 246 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode OutputMapCRtoLF = testOutputFlag (8) {-# LINE 247 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode NoCRAtColumnZero = testOutputFlag (16) {-# LINE 248 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode ReturnMeansLF = testOutputFlag (32) {-# LINE 249 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode TabDelayMask0 = testOutputFlag (0) {-# LINE 250 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode TabDelayMask3 = testOutputFlag (6144) {-# LINE 251 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode LocalMode = testControlFlag (2048) {-# LINE 252 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode ReadEnable = testControlFlag (128) {-# LINE 253 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode TwoStopBits = testControlFlag (64) {-# LINE 254 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode HangupOnClose = testControlFlag (1024) {-# LINE 255 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode EnableParity = testControlFlag (256) {-# LINE 256 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode OddParity = testControlFlag (512) {-# LINE 257 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode EnableEcho = testLocalFlag (8) {-# LINE 258 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode EchoErase = testLocalFlag (16) {-# LINE 259 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode EchoKill = testLocalFlag (32) {-# LINE 260 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode EchoLF = testLocalFlag (64) {-# LINE 261 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode ProcessInput = testLocalFlag (2) {-# LINE 262 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode ExtendedFunctions = testLocalFlag (32768) {-# LINE 263 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode KeyboardInterrupts = testLocalFlag (1) {-# LINE 264 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode NoFlushOnInterrupt = not . testLocalFlag (128) {-# LINE 265 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} terminalMode BackgroundWriteInterrupt = testLocalFlag (256) {-# LINE 266 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} bitsPerByte :: TerminalAttributes -> Int bitsPerByte termios = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do cflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p {-# LINE 271 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $! (word2Bits (cflag .&. (48))) {-# LINE 272 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} where word2Bits :: CTcflag -> Int word2Bits x = if x == (0) then 5 {-# LINE 276 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (16) then 6 {-# LINE 277 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (32) then 7 {-# LINE 278 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (48) then 8 {-# LINE 279 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else 0 withBits :: TerminalAttributes -> Int -> TerminalAttributes withBits termios bits = unsafePerformIO $ do withNewTermios termios $ \p -> do cflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p {-# LINE 285 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p {-# LINE 286 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((cflag .&. complement (48)) .|. mask bits) {-# LINE 287 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} where mask :: Int -> CTcflag mask 5 = (0) {-# LINE 290 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} mask 6 = (16) {-# LINE 291 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} mask 7 = (32) {-# LINE 292 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} mask 8 = (48) {-# LINE 293 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} mask _ = error "withBits bit value out of range [5..8]" data ControlCharacter = EndOfFile -- VEOF | EndOfLine -- VEOL | Erase -- VERASE | Interrupt -- VINTR | Kill -- VKILL | Quit -- VQUIT | Start -- VSTART | Stop -- VSTOP | Suspend -- VSUSP controlChar :: TerminalAttributes -> ControlCharacter -> Maybe Char controlChar termios cc = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do let c_cc = ((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p {-# LINE 310 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} val <- peekElemOff c_cc (cc2Word cc) if val == ((0)::CCc) {-# LINE 312 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} then return Nothing else return (Just (chr (fromEnum val))) withCC :: TerminalAttributes -> (ControlCharacter, Char) -> TerminalAttributes withCC termios (cc, c) = unsafePerformIO $ do withNewTermios termios $ \p -> do let c_cc = ((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p {-# LINE 321 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} pokeElemOff c_cc (cc2Word cc) (fromIntegral (ord c) :: CCc) withoutCC :: TerminalAttributes -> ControlCharacter -> TerminalAttributes withoutCC termios cc = unsafePerformIO $ do withNewTermios termios $ \p -> do let c_cc = ((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p {-# LINE 329 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} pokeElemOff c_cc (cc2Word cc) ((0) :: CCc) {-# LINE 330 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} inputTime :: TerminalAttributes -> Int inputTime termios = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do c <- peekElemOff (((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p) (5) {-# LINE 335 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return (fromEnum (c :: CCc)) withTime :: TerminalAttributes -> Int -> TerminalAttributes withTime termios time = unsafePerformIO $ do withNewTermios termios $ \p -> do let c_cc = ((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p {-# LINE 341 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} pokeElemOff c_cc (5) (fromIntegral time :: CCc) {-# LINE 342 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} minInput :: TerminalAttributes -> Int minInput termios = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do c <- peekElemOff (((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p) (6) {-# LINE 347 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return (fromEnum (c :: CCc)) withMinInput :: TerminalAttributes -> Int -> TerminalAttributes withMinInput termios count = unsafePerformIO $ do withNewTermios termios $ \p -> do let c_cc = ((\hsc_ptr -> hsc_ptr `plusPtr` 17)) p {-# LINE 353 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} pokeElemOff c_cc (6) (fromIntegral count :: CCc) {-# LINE 354 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} data BaudRate = B0 | B50 | B75 | B110 | B134 | B150 | B200 | B300 | B600 | B1200 | B1800 | B2400 | B4800 | B9600 | B19200 | B38400 | B57600 | B115200 inputSpeed :: TerminalAttributes -> BaudRate inputSpeed termios = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do w <- c_cfgetispeed p return (word2Baud w) foreign import capi unsafe "termios.h cfgetispeed" c_cfgetispeed :: Ptr CTermios -> IO CSpeed withInputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes withInputSpeed termios br = unsafePerformIO $ do withNewTermios termios $ \p -> c_cfsetispeed p (baud2Word br) foreign import capi unsafe "termios.h cfsetispeed" c_cfsetispeed :: Ptr CTermios -> CSpeed -> IO CInt outputSpeed :: TerminalAttributes -> BaudRate outputSpeed termios = unsafePerformIO $ do withTerminalAttributes termios $ \p -> do w <- c_cfgetospeed p return (word2Baud w) foreign import capi unsafe "termios.h cfgetospeed" c_cfgetospeed :: Ptr CTermios -> IO CSpeed withOutputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes withOutputSpeed termios br = unsafePerformIO $ do withNewTermios termios $ \p -> c_cfsetospeed p (baud2Word br) foreign import capi unsafe "termios.h cfsetospeed" c_cfsetospeed :: Ptr CTermios -> CSpeed -> IO CInt -- | @getTerminalAttributes fd@ calls @tcgetattr@ to obtain -- the @TerminalAttributes@ associated with @Fd@ @fd@. getTerminalAttributes :: Fd -> IO TerminalAttributes getTerminalAttributes (Fd fd) = do fp <- mallocForeignPtrBytes (60) {-# LINE 413 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p -> throwErrnoIfMinus1_ "getTerminalAttributes" (c_tcgetattr fd p) return $ makeTerminalAttributes fp foreign import capi unsafe "termios.h tcgetattr" c_tcgetattr :: CInt -> Ptr CTermios -> IO CInt data TerminalState = Immediately | WhenDrained | WhenFlushed -- | @setTerminalAttributes fd attr ts@ calls @tcsetattr@ to change -- the @TerminalAttributes@ associated with @Fd@ @fd@ to -- @attr@, when the terminal is in the state indicated by @ts@. setTerminalAttributes :: Fd -> TerminalAttributes -> TerminalState -> IO () setTerminalAttributes (Fd fd) termios state = do withTerminalAttributes termios $ \p -> throwErrnoIfMinus1_ "setTerminalAttributes" (c_tcsetattr fd (state2Int state) p) where state2Int :: TerminalState -> CInt state2Int Immediately = (0) {-# LINE 439 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} state2Int WhenDrained = (1) {-# LINE 440 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} state2Int WhenFlushed = (2) {-# LINE 441 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} foreign import capi unsafe "termios.h tcsetattr" c_tcsetattr :: CInt -> CInt -> Ptr CTermios -> IO CInt -- | @sendBreak fd duration@ calls @tcsendbreak@ to transmit a -- continuous stream of zero-valued bits on @Fd@ @fd@ for the -- specified implementation-dependent @duration@. sendBreak :: Fd -> Int -> IO () sendBreak (Fd fd) duration = throwErrnoIfMinus1_ "sendBreak" (c_tcsendbreak fd (fromIntegral duration)) foreign import capi unsafe "termios.h tcsendbreak" c_tcsendbreak :: CInt -> CInt -> IO CInt -- | @drainOutput fd@ calls @tcdrain@ to block until all output -- written to @Fd@ @fd@ has been transmitted. -- -- Throws 'IOError' (\"unsupported operation\") if platform does not -- provide @tcdrain(3)@ (use @#if HAVE_TCDRAIN@ CPP guard to -- detect availability). drainOutput :: Fd -> IO () {-# LINE 463 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} drainOutput (Fd fd) = throwErrnoIfMinus1_ "drainOutput" (c_tcdrain fd) foreign import capi safe "termios.h tcdrain" c_tcdrain :: CInt -> IO CInt {-# LINE 472 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} data QueueSelector = InputQueue -- TCIFLUSH | OutputQueue -- TCOFLUSH | BothQueues -- TCIOFLUSH -- | @discardData fd queues@ calls @tcflush@ to discard -- pending input and\/or output for @Fd@ @fd@, -- as indicated by the @QueueSelector@ @queues@. discardData :: Fd -> QueueSelector -> IO () discardData (Fd fd) queue = throwErrnoIfMinus1_ "discardData" (c_tcflush fd (queue2Int queue)) where queue2Int :: QueueSelector -> CInt queue2Int InputQueue = (0) {-# LINE 487 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} queue2Int OutputQueue = (1) {-# LINE 488 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} queue2Int BothQueues = (2) {-# LINE 489 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} foreign import capi unsafe "termios.h tcflush" c_tcflush :: CInt -> CInt -> IO CInt data FlowAction = SuspendOutput -- ^ TCOOFF | RestartOutput -- ^ TCOON | TransmitStop -- ^ TCIOFF | TransmitStart -- ^ TCION -- | @controlFlow fd action@ calls @tcflow@ to control the -- flow of data on @Fd@ @fd@, as indicated by -- @action@. controlFlow :: Fd -> FlowAction -> IO () controlFlow (Fd fd) action = throwErrnoIfMinus1_ "controlFlow" (c_tcflow fd (action2Int action)) where action2Int :: FlowAction -> CInt action2Int SuspendOutput = (0) {-# LINE 508 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} action2Int RestartOutput = (1) {-# LINE 509 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} action2Int TransmitStop = (2) {-# LINE 510 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} action2Int TransmitStart = (3) {-# LINE 511 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} foreign import capi unsafe "termios.h tcflow" c_tcflow :: CInt -> CInt -> IO CInt -- | @getTerminalProcessGroupID fd@ calls @tcgetpgrp@ to -- obtain the @ProcessGroupID@ of the foreground process group -- associated with the terminal attached to @Fd@ @fd@. getTerminalProcessGroupID :: Fd -> IO ProcessGroupID getTerminalProcessGroupID (Fd fd) = do throwErrnoIfMinus1 "getTerminalProcessGroupID" (c_tcgetpgrp fd) foreign import ccall unsafe "tcgetpgrp" c_tcgetpgrp :: CInt -> IO CPid -- | @setTerminalProcessGroupID fd pgid@ calls @tcsetpgrp@ to -- set the @ProcessGroupID@ of the foreground process group -- associated with the terminal attached to @Fd@ -- @fd@ to @pgid@. setTerminalProcessGroupID :: Fd -> ProcessGroupID -> IO () setTerminalProcessGroupID (Fd fd) pgid = throwErrnoIfMinus1_ "setTerminalProcessGroupID" (c_tcsetpgrp fd pgid) foreign import ccall unsafe "tcsetpgrp" c_tcsetpgrp :: CInt -> CPid -> IO CInt -- ----------------------------------------------------------------------------- -- file descriptor queries -- | @queryTerminal fd@ calls @isatty@ to determine whether or -- not @Fd@ @fd@ is associated with a terminal. queryTerminal :: Fd -> IO Bool queryTerminal (Fd fd) = do r <- c_isatty fd return (r == 1) -- ToDo: the spec says that it can set errno to EBADF if the result is zero foreign import ccall unsafe "isatty" c_isatty :: CInt -> IO CInt -- ----------------------------------------------------------------------------- -- Local utility functions -- Convert Haskell ControlCharacter to Int cc2Word :: ControlCharacter -> Int cc2Word EndOfFile = (4) {-# LINE 557 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word EndOfLine = (11) {-# LINE 558 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Erase = (2) {-# LINE 559 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Interrupt = (0) {-# LINE 560 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Kill = (3) {-# LINE 561 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Quit = (1) {-# LINE 562 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Suspend = (10) {-# LINE 563 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Start = (8) {-# LINE 564 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cc2Word Stop = (9) {-# LINE 565 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} -- Convert Haskell BaudRate to unsigned integral type (Word) baud2Word :: BaudRate -> CSpeed baud2Word B0 = (0) {-# LINE 570 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B50 = (1) {-# LINE 571 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B75 = (2) {-# LINE 572 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B110 = (3) {-# LINE 573 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B134 = (4) {-# LINE 574 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B150 = (5) {-# LINE 575 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B200 = (6) {-# LINE 576 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B300 = (7) {-# LINE 577 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B600 = (8) {-# LINE 578 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B1200 = (9) {-# LINE 579 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B1800 = (10) {-# LINE 580 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B2400 = (11) {-# LINE 581 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B4800 = (12) {-# LINE 582 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B9600 = (13) {-# LINE 583 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B19200 = (14) {-# LINE 584 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B38400 = (15) {-# LINE 585 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 586 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B57600 = (4097) {-# LINE 587 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 590 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 591 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} baud2Word B115200 = (4098) {-# LINE 592 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 595 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} -- And convert a word back to a baud rate -- We really need some cpp macros here. word2Baud :: CSpeed -> BaudRate word2Baud x = if x == (0) then B0 {-# LINE 602 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (1) then B50 {-# LINE 603 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (2) then B75 {-# LINE 604 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (3) then B110 {-# LINE 605 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (4) then B134 {-# LINE 606 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (5) then B150 {-# LINE 607 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (6) then B200 {-# LINE 608 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (7) then B300 {-# LINE 609 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (8) then B600 {-# LINE 610 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (9) then B1200 {-# LINE 611 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (10) then B1800 {-# LINE 612 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (11) then B2400 {-# LINE 613 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (12) then B4800 {-# LINE 614 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (13) then B9600 {-# LINE 615 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (14) then B19200 {-# LINE 616 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (15) then B38400 {-# LINE 617 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 618 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (4097) then B57600 {-# LINE 619 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 620 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 621 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else if x == (4098) then B115200 {-# LINE 622 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} {-# LINE 623 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} else error "unknown baud rate" -- Clear termios i_flag clearInputFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes clearInputFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 630 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 633 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} iflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p2 {-# LINE 634 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p1 (iflag .&. complement flag) {-# LINE 635 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Set termios i_flag setInputFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes setInputFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 642 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 645 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} iflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p2 {-# LINE 646 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) p1 (iflag .|. flag) {-# LINE 647 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Examine termios i_flag testInputFlag :: CTcflag -> TerminalAttributes -> Bool testInputFlag flag termios = unsafePerformIO $ withTerminalAttributes termios $ \p -> do iflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) p {-# LINE 655 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $! ((iflag .&. flag) /= 0) -- Clear termios c_flag clearControlFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes clearControlFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 662 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 665 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p2 {-# LINE 666 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p1 (cflag .&. complement flag) {-# LINE 667 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Set termios c_flag setControlFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes setControlFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 674 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 677 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} cflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p2 {-# LINE 678 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) p1 (cflag .|. flag) {-# LINE 679 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Examine termios c_flag testControlFlag :: CTcflag -> TerminalAttributes -> Bool testControlFlag flag termios = unsafePerformIO $ withTerminalAttributes termios $ \p -> do cflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) p {-# LINE 687 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $! ((cflag .&. flag) /= 0) -- Clear termios l_flag clearLocalFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes clearLocalFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 694 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 697 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} lflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) p2 {-# LINE 698 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) p1 (lflag .&. complement flag) {-# LINE 699 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Set termios l_flag setLocalFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes setLocalFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 706 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 709 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} lflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) p2 {-# LINE 710 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) p1 (lflag .|. flag) {-# LINE 711 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Examine termios l_flag testLocalFlag :: CTcflag -> TerminalAttributes -> Bool testLocalFlag flag termios = unsafePerformIO $ withTerminalAttributes termios $ \p -> do lflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) p {-# LINE 719 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $! ((lflag .&. flag) /= 0) -- Clear termios o_flag clearOutputFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes clearOutputFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 726 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 729 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} oflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p2 {-# LINE 730 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p1 (oflag .&. complement flag) {-# LINE 731 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Set termios o_flag setOutputFlag :: CTcflag -> TerminalAttributes -> TerminalAttributes setOutputFlag flag termios = unsafePerformIO $ do fp <- mallocForeignPtrBytes (60) {-# LINE 738 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 741 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} oflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p2 {-# LINE 742 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) p1 (oflag .|. flag) {-# LINE 743 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $ makeTerminalAttributes fp -- Examine termios o_flag testOutputFlag :: CTcflag -> TerminalAttributes -> Bool testOutputFlag flag termios = unsafePerformIO $ withTerminalAttributes termios $ \p -> do oflag <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) p {-# LINE 751 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} return $! ((oflag .&. flag) /= 0) withNewTermios :: TerminalAttributes -> (Ptr CTermios -> IO a) -> IO TerminalAttributes withNewTermios termios action = do fp1 <- mallocForeignPtrBytes (60) {-# LINE 757 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} withForeignPtr fp1 $ \p1 -> do withTerminalAttributes termios $ \p2 -> do copyBytes p1 p2 (60) {-# LINE 760 "libraries/unix/System/Posix/Terminal/Common.hsc" #-} _ <- action p1 return () return $ makeTerminalAttributes fp1