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