Skip to content

Commit

Permalink
term: fix own implementation
Browse files Browse the repository at this point in the history
Signed-off-by: Nobuhiro MIKI <[email protected]>
  • Loading branch information
bobuhiro11 committed Feb 12, 2021
1 parent a4a2681 commit 08037be
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 22 deletions.
2 changes: 0 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
module github.com/nmi/gokvm

go 1.13

require golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf
4 changes: 0 additions & 4 deletions go.sum

This file was deleted.

1 change: 0 additions & 1 deletion kvm/kvm.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,6 @@ func (r *UserspaceMemoryRegion) SetMemReadonly() {
}

func ioctl(fd, op, arg uintptr) (uintptr, error) {
// fmt.Printf("ioctl called.\n")
res, _, errno := syscall.Syscall(
syscall.SYS_IOCTL, fd, op, arg)

Expand Down
20 changes: 5 additions & 15 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@ package main

import (
"bufio"
"log"
"os"

"github.com/nmi/gokvm/machine"

// change to own library.
"golang.org/x/term"
"github.com/nmi/gokvm/term"
)

func main() {
Expand All @@ -27,17 +24,12 @@ func main() {
}
}()

// fd 0 is stdin
state, err := term.MakeRaw(0)
restoreMode, err := term.SetRawMode()
if err != nil {
log.Fatalln("setting stdin to raw:", err)
panic(err)
}

defer func() {
if err := term.Restore(0, state); err != nil {
log.Println("warning, failed to restore terminal:", err)
}
}()
defer restoreMode()

var before byte = 0

Expand All @@ -46,9 +38,7 @@ func main() {
for {
b, err := in.ReadByte()
if err != nil {
log.Println("stdin:", err)

break
panic(err)
}
m.GetInputChan() <- b

Expand Down
66 changes: 66 additions & 0 deletions term/term.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package term

import (
"syscall"
"unsafe"
)

type termios struct {
Iflag uint32
Oflag uint32
Cflag uint32
Lflag uint32
Line uint8
Cc [19]uint8
Ispeed uint32
Ospeed uint32
}

func read(fd int) (termios, error) {
var t termios

_, _, errno := syscall.Syscall(
syscall.SYS_IOCTL, uintptr(fd), 0x5401,
uintptr(unsafe.Pointer(&t)))

var err error = nil
if errno != 0 {
err = errno
}

return t, err
}

func write(fd int, t termios) error {
_, _, errno := syscall.Syscall(
syscall.SYS_IOCTL, uintptr(fd), 0x5402,
uintptr(unsafe.Pointer(&t)))

var err error = nil
if errno != 0 {
err = errno
}

return err
}

func SetRawMode() (func(), error) {
t, err := read(0)
if err != nil {
return func() {}, err
}

oldTermios := t

t.Iflag &^= 0b10111101011
t.Oflag &^= 1
t.Lflag &^= 0b1000000001001011
t.Cflag &^= 0b01001000 | 0b100000000
t.Cflag |= 48
t.Cc[6] = 1
t.Cc[5] = 0

return func() {
_ = write(0, oldTermios)
}, write(0, t)
}

0 comments on commit 08037be

Please sign in to comment.