| ... | ... |
@@ -56,6 +56,15 @@ func daemon() error {
|
| 56 | 56 |
} |
| 57 | 57 |
|
| 58 | 58 |
func runCommand(args []string) error {
|
| 59 |
+ var oldState *term.State |
|
| 60 |
+ var err error |
|
| 61 |
+ if term.IsTerminal(int(os.Stdin.Fd())) && os.Getenv("NORAW") == "" {
|
|
| 62 |
+ oldState, err = term.MakeRaw(int(os.Stdin.Fd())) |
|
| 63 |
+ if err != nil {
|
|
| 64 |
+ return err |
|
| 65 |
+ } |
|
| 66 |
+ defer term.Restore(int(os.Stdin.Fd()), oldState) |
|
| 67 |
+ } |
|
| 59 | 68 |
// FIXME: we want to use unix sockets here, but net.UnixConn doesn't expose |
| 60 | 69 |
// CloseWrite(), which we need to cleanly signal that stdin is closed without |
| 61 | 70 |
// closing the connection. |
| ... | ... |
@@ -15,7 +15,8 @@ void MakeRaw(int fd) {
|
| 15 | 15 |
ioctl(fd, TCGETS, &t); |
| 16 | 16 |
|
| 17 | 17 |
t.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); |
| 18 |
- t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN); |
|
| 18 |
+ t.c_oflag &= ~OPOST; |
|
| 19 |
+ t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG); |
|
| 19 | 20 |
t.c_cflag &= ~(CSIZE | PARENB); |
| 20 | 21 |
t.c_cflag |= CS8; |
| 21 | 22 |
|