1// Copyright 2015 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4// +build windows
5
6package minterm
7
8import (
9	"io"
10	"os"
11
12	"github.com/keybase/client/go/logger"
13	"github.com/keybase/go-crypto/ssh/terminal"
14)
15
16// terminal takes io.ReadWriter, so for windows we mash
17// stdin and stdout back together with this.
18type WindowsReadWriter struct {
19	r io.Reader
20	w io.Writer
21}
22
23func (rw WindowsReadWriter) Read(p []byte) (n int, err error) {
24	return rw.r.Read(p)
25}
26
27func (rw WindowsReadWriter) Write(p []byte) (n int, err error) {
28	return rw.w.Write(p)
29}
30
31func (m *MinTerm) open() error {
32	// Must be O_RDWR, or we can't mask the password as the user types it.
33	fin, err := os.OpenFile("CONIN$", os.O_RDWR, 0)
34	if err != nil {
35		return err
36	}
37	// Must be O_RDWR, or else GetSize below breaks.
38	fout, err := os.OpenFile("CONOUT$", os.O_RDWR, 0)
39	if err != nil {
40		return err
41	}
42
43	m.termIn = fin
44	m.termOut = fout
45	m.closeTermOut = true // since it's a different file...
46	fdout := int(fout.Fd())
47	w, h, err := terminal.GetSize(fdout)
48	if err != nil {
49		return err
50	}
51	m.width, m.height = w, h
52	return nil
53}
54
55// Use a Windows output writer to eat control codes that look ugly on legacy terminals.
56// As a bonus, we can do color prompts this way.
57func (m *MinTerm) getReadWriter() io.ReadWriter {
58	return WindowsReadWriter{r: m.termIn, w: logger.OutputWriterFromFile(m.termOut)}
59}
60