The current code uses
stdin to get and set terminal attributes. Unfortunately this doesn't work when stdin isn't connected to the TTY (e.g. it's a pipe). For example:
some_program | less (in this situation,
less's stdin can't be set to raw mode, but its stdout and TTY can be).
This change allows programs to use a raw terminal even if they're taking stdin through a pipe. If stdout is a pipe then this will still fail, though.