Page Menu
Home
Musing Studio
Search
Configure Global Search
Log In
Files
F12571093
util_windows.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_windows.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 windows
// 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
(
"os"
"golang.org/x/sys/windows"
)
type
State
struct
{
mode
uint32
}
// IsTerminal returns whether the given file descriptor is a terminal.
func
IsTerminal
(
fd
int
)
bool
{
var
st
uint32
err
:=
windows
.
GetConsoleMode
(
windows
.
Handle
(
fd
),
&
st
)
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
)
{
var
st
uint32
if
err
:=
windows
.
GetConsoleMode
(
windows
.
Handle
(
fd
),
&
st
);
err
!=
nil
{
return
nil
,
err
}
raw
:=
st
&^
(
windows
.
ENABLE_ECHO_INPUT
|
windows
.
ENABLE_PROCESSED_INPUT
|
windows
.
ENABLE_LINE_INPUT
|
windows
.
ENABLE_PROCESSED_OUTPUT
)
if
err
:=
windows
.
SetConsoleMode
(
windows
.
Handle
(
fd
),
raw
);
err
!=
nil
{
return
nil
,
err
}
return
&
State
{
st
},
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
)
{
var
st
uint32
if
err
:=
windows
.
GetConsoleMode
(
windows
.
Handle
(
fd
),
&
st
);
err
!=
nil
{
return
nil
,
err
}
return
&
State
{
st
},
nil
}
// Restore restores the terminal connected to the given file descriptor to a
// previous state.
func
Restore
(
fd
int
,
state
*
State
)
error
{
return
windows
.
SetConsoleMode
(
windows
.
Handle
(
fd
),
state
.
mode
)
}
// GetSize returns the dimensions of the given terminal.
func
GetSize
(
fd
int
)
(
width
,
height
int
,
err
error
)
{
var
info
windows
.
ConsoleScreenBufferInfo
if
err
:=
windows
.
GetConsoleScreenBufferInfo
(
windows
.
Handle
(
fd
),
&
info
);
err
!=
nil
{
return
0
,
0
,
err
}
return
int
(
info
.
Size
.
X
),
int
(
info
.
Size
.
Y
),
nil
}
// 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
)
{
var
st
uint32
if
err
:=
windows
.
GetConsoleMode
(
windows
.
Handle
(
fd
),
&
st
);
err
!=
nil
{
return
nil
,
err
}
old
:=
st
st
&^=
(
windows
.
ENABLE_ECHO_INPUT
)
st
|=
(
windows
.
ENABLE_PROCESSED_INPUT
|
windows
.
ENABLE_LINE_INPUT
|
windows
.
ENABLE_PROCESSED_OUTPUT
)
if
err
:=
windows
.
SetConsoleMode
(
windows
.
Handle
(
fd
),
st
);
err
!=
nil
{
return
nil
,
err
}
defer
windows
.
SetConsoleMode
(
windows
.
Handle
(
fd
),
old
)
var
h
windows
.
Handle
p
,
_
:=
windows
.
GetCurrentProcess
()
if
err
:=
windows
.
DuplicateHandle
(
p
,
windows
.
Handle
(
fd
),
p
,
&
h
,
0
,
false
,
windows
.
DUPLICATE_SAME_ACCESS
);
err
!=
nil
{
return
nil
,
err
}
f
:=
os
.
NewFile
(
uintptr
(
h
),
"stdin"
)
defer
f
.
Close
()
return
readPasswordLine
(
f
)
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 23, 8:27 AM (1 d, 19 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3502326
Attached To
rWCLI writeas-cli
Event Timeline
Log In to Comment