35.6. "termios" --- Controle de tty no estilo POSIX
***************************************************

======================================================================

Este módulo fornece uma interface para as chamadas POSIX para controle
de E/S do tty. Para uma descrição completa dessas chamadas, consulte a
página de manual Unix *termios(3)*. Está disponível apenas para as
versões Unix que tenham suporte ao controle de E/S de tty no estilo
POSIX do *termios* configurado durante a instalação.

Todas as funções neste módulo usam um descritor de arquivo *fd* como
seu primeiro argumento. Pode ser um descritor de arquivo de tipo
inteiro, como retornado por "sys.stdin.fileno()", ou um *objeto
arquivo*, como o próprio "sys.stdin".

Este módulo também define todas as constantes necessárias para
trabalhar com as funções fornecidas aqui; estes têm o mesmo nome de
seus equivalentes em C. Consulte a documentação do sistema para mais
informações sobre o uso dessas interfaces de controle de terminal.

O módulo define as seguintes funções:

termios.tcgetattr(fd)

   Retorna uma lista contendo os atributos tty para o descritor de
   arquivo *fd*, da seguinte forma: "[iflag, oflag, cflag, lflag,
   ispeed, ospeed, cc]" onde *cc* é uma lista dos caracteres especiais
   do tty (cada uma string de comprimento 1, exceto os itens com
   índices "VMIN" e "VTIME", que são números inteiros quando esses
   campos são definidos). A interpretação dos sinalizadores e as
   velocidades, bem como a indexação no vetor *cc*, devem ser feitas
   usando as constantes simbólicas definidas no módulo "termios".

termios.tcsetattr(fd, when, attributes)

   Define os atributos tty para o descritor de arquivo *fd* a partir
   de *attribute*, que é uma lista como a retornada por "tcgetattr()".
   O argumento *when* determina quando os atributos são alterados:
   "TCSANOW" para mudar imediatamente, "TCSADRAIN" para alterar após
   transmitir todas as saídas na fila ou "TCSAFLUSH" para alterar após
   transmitir todas as saídas na fila e descartando todas as entradas
   na fila.

termios.tcsendbreak(fd, duration)

   Envia uma quebra no descritor de arquivo *fd*. Uma duração zero,
   representada por *duration*, envia uma pausa por 0,25 a 0,5
   segundos; *duration* com valor diferente de zero tem um significado
   dependente do sistema.

termios.tcdrain(fd)

   Aguarda até que toda a saída escrita no descritor de arquivo *fd*
   seja transmitida.

termios.tcflush(fd, queue)

   Descarta dados na fila no descritor de arquivo *fd*. O seletor
   *queue* especifica qual fila: "TCIFLUSH" para a fila de entrada,
   "TCOFLUSH" para a fila de saída ou "TCIOFLUSH" para as duas filas.

termios.tcflow(fd, action)

   Suspende ou retoma a entrada ou saída no descritor de arquivo *fd*.
   O argumento *action* pode ser "TCOOFF" para suspender a saída,
   "TCOON" para reiniciar a saída, "TCIOFF" para suspender a entrada
   ou "TCION" para reiniciar a entrada.

Ver também:

  Módulo "tty"
     Funções de conveniência para operações comuns de controle de
     terminal.


35.6.1. Exemplo
===============

Aqui está uma função que solicita uma senha com o eco desativado.
Observe a técnica usando uma chamada separada "tcgetattr()" e uma
instrução "try" ... "finally" para garantir que os atributos tty
antigos sejam restaurados exatamente, aconteça o que acontecer:

   def getpass(prompt="Password: "):
       import termios, sys
       fd = sys.stdin.fileno()
       old = termios.tcgetattr(fd)
       new = termios.tcgetattr(fd)
       new[3] = new[3] & ~termios.ECHO          # lflags
       try:
           termios.tcsetattr(fd, termios.TCSADRAIN, new)
           passwd = input(prompt)
       finally:
           termios.tcsetattr(fd, termios.TCSADRAIN, old)
       return passwd
