| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- 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
- }
- }
- }
|