Page Menu
Home
Musing Studio
Search
Configure Global Search
Log In
Files
F12143323
util.go
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
util.go
View Options
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd
// Package terminal provides support functions for dealing with terminals, as
// commonly found on UNIX systems.
//
// Putting a terminal into raw mode is the most common requirement:
//
// oldState, err := terminal.MakeRaw(0)
// if err != nil {
// panic(err)
// }
// defer terminal.Restore(0, oldState)
package
terminal
// import "golang.org/x/crypto/ssh/terminal"
import
(
"golang.org/x/sys/unix"
)
// State contains the state of a terminal.
type
State
struct
{
termios
unix
.
Termios
}
// IsTerminal returns whether the given file descriptor is a terminal.
func
IsTerminal
(
fd
int
)
bool
{
_
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
return
err
==
nil
}
// MakeRaw put the terminal connected to the given file descriptor into raw
// mode and returns the previous state of the terminal so that it can be
// restored.
func
MakeRaw
(
fd
int
)
(
*
State
,
error
)
{
termios
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
if
err
!=
nil
{
return
nil
,
err
}
oldState
:=
State
{
termios
:
*
termios
}
// This attempts to replicate the behaviour documented for cfmakeraw in
// the termios(3) manpage.
termios
.
Iflag
&^=
unix
.
IGNBRK
|
unix
.
BRKINT
|
unix
.
PARMRK
|
unix
.
ISTRIP
|
unix
.
INLCR
|
unix
.
IGNCR
|
unix
.
ICRNL
|
unix
.
IXON
termios
.
Oflag
&^=
unix
.
OPOST
termios
.
Lflag
&^=
unix
.
ECHO
|
unix
.
ECHONL
|
unix
.
ICANON
|
unix
.
ISIG
|
unix
.
IEXTEN
termios
.
Cflag
&^=
unix
.
CSIZE
|
unix
.
PARENB
termios
.
Cflag
|=
unix
.
CS8
termios
.
Cc
[
unix
.
VMIN
]
=
1
termios
.
Cc
[
unix
.
VTIME
]
=
0
if
err
:=
unix
.
IoctlSetTermios
(
fd
,
ioctlWriteTermios
,
termios
);
err
!=
nil
{
return
nil
,
err
}
return
&
oldState
,
nil
}
// GetState returns the current state of a terminal which may be useful to
// restore the terminal after a signal.
func
GetState
(
fd
int
)
(
*
State
,
error
)
{
termios
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
if
err
!=
nil
{
return
nil
,
err
}
return
&
State
{
termios
:
*
termios
},
nil
}
// Restore restores the terminal connected to the given file descriptor to a
// previous state.
func
Restore
(
fd
int
,
state
*
State
)
error
{
return
unix
.
IoctlSetTermios
(
fd
,
ioctlWriteTermios
,
&
state
.
termios
)
}
// GetSize returns the dimensions of the given terminal.
func
GetSize
(
fd
int
)
(
width
,
height
int
,
err
error
)
{
ws
,
err
:=
unix
.
IoctlGetWinsize
(
fd
,
unix
.
TIOCGWINSZ
)
if
err
!=
nil
{
return
-
1
,
-
1
,
err
}
return
int
(
ws
.
Col
),
int
(
ws
.
Row
),
nil
}
// passwordReader is an io.Reader that reads from a specific file descriptor.
type
passwordReader
int
func
(
r
passwordReader
)
Read
(
buf
[]
byte
)
(
int
,
error
)
{
return
unix
.
Read
(
int
(
r
),
buf
)
}
// ReadPassword reads a line of input from a terminal without local echo. This
// is commonly used for inputting passwords and other sensitive data. The slice
// returned does not include the \n.
func
ReadPassword
(
fd
int
)
([]
byte
,
error
)
{
termios
,
err
:=
unix
.
IoctlGetTermios
(
fd
,
ioctlReadTermios
)
if
err
!=
nil
{
return
nil
,
err
}
newState
:=
*
termios
newState
.
Lflag
&^=
unix
.
ECHO
newState
.
Lflag
|=
unix
.
ICANON
|
unix
.
ISIG
newState
.
Iflag
|=
unix
.
ICRNL
if
err
:=
unix
.
IoctlSetTermios
(
fd
,
ioctlWriteTermios
,
&
newState
);
err
!=
nil
{
return
nil
,
err
}
defer
unix
.
IoctlSetTermios
(
fd
,
ioctlWriteTermios
,
termios
)
return
readPasswordLine
(
passwordReader
(
fd
))
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 10, 7:19 AM (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3441216
Attached To
rWCLI writeas-cli
Event Timeline
Log In to Comment