48 lines
960 B
Go
48 lines
960 B
Go
package term
|
|
|
|
import (
|
|
"io"
|
|
"runtime"
|
|
)
|
|
|
|
// readPasswordLine reads from reader until it finds \n or io.EOF.
|
|
// The slice returned does not include the \n.
|
|
// readPasswordLine also ignores any \r it finds.
|
|
// Windows uses \r as end of line. So, on Windows, readPasswordLine
|
|
// reads until it finds \r and ignores any \n it finds during processing.
|
|
func readPasswordLine(reader io.Reader) ([]byte, error) {
|
|
var buf [1]byte
|
|
var ret []byte
|
|
|
|
for {
|
|
n, err := reader.Read(buf[:])
|
|
if n > 0 {
|
|
switch buf[0] {
|
|
case '\b':
|
|
if len(ret) > 0 {
|
|
ret = ret[:len(ret)-1]
|
|
}
|
|
case '\n':
|
|
if runtime.GOOS != "windows" {
|
|
return ret, nil
|
|
}
|
|
// otherwise ignore \n
|
|
case '\r':
|
|
if runtime.GOOS == "windows" {
|
|
return ret, nil
|
|
}
|
|
// otherwise ignore \r
|
|
default:
|
|
ret = append(ret, buf[0])
|
|
}
|
|
continue
|
|
}
|
|
if err != nil {
|
|
if err == io.EOF && len(ret) > 0 {
|
|
return ret, nil
|
|
}
|
|
return ret, err
|
|
}
|
|
}
|
|
}
|