Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add GetSpeed() #45

Merged
merged 2 commits into from
Sep 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions term_bsdi.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,52 @@ import "golang.org/x/sys/unix"

type attr unix.Termios

func (a *attr) getSpeed() (int, error) {
// We generally only care about ospeed, since that's what would
// be used for padding characters, for example.

switch a.Ospeed {
case syscall.B50:
return 50, nil
case syscall.B75:
return 75, nil
case syscall.B110:
return 110, nil
case syscall.B134:
return 134, nil
case syscall.B150:
return 150, nil
case syscall.B200:
return 200, nil
case syscall.B300:
return 300, nil
case syscall.B600:
return 600, nil
case syscall.B1200:
return 1200, nil
case syscall.B1800:
return 1800, nil
case syscall.B2400:
return 2400, nil
case syscall.B4800:
return 4800, nil
case syscall.B9600:
return 9600, nil
case syscall.B19200:
return 19200, nil
case syscall.B38400:
return 38400, nil
case syscall.B57600:
return 57600, nil
case syscall.B115200:
return 115200, nil
case syscall.B230400:
return 230400, nil
default:
return 0, syscall.EINVAL
}
}

func (a *attr) setSpeed(baud int) error {
var rate int32
switch baud {
Expand Down
46 changes: 46 additions & 0 deletions term_bsdu.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,52 @@ import "golang.org/x/sys/unix"

type attr unix.Termios

func (a *attr) getSpeed() (int, error) {
// We generally only care about ospeed, since that's what would
// be used for padding characters, for example.

switch a.Ospeed {
case syscall.B50:
return 50, nil
case syscall.B75:
return 75, nil
case syscall.B110:
return 110, nil
case syscall.B134:
return 134, nil
case syscall.B150:
return 150, nil
case syscall.B200:
return 200, nil
case syscall.B300:
return 300, nil
case syscall.B600:
return 600, nil
case syscall.B1200:
return 1200, nil
case syscall.B1800:
return 1800, nil
case syscall.B2400:
return 2400, nil
case syscall.B4800:
return 4800, nil
case syscall.B9600:
return 9600, nil
case syscall.B19200:
return 19200, nil
case syscall.B38400:
return 38400, nil
case syscall.B57600:
return 57600, nil
case syscall.B115200:
return 115200, nil
case syscall.B230400:
return 230400, nil
default:
return 0, syscall.EINVAL
}
}

func (a *attr) setSpeed(baud int) error {
var rate uint32
switch baud {
Expand Down
46 changes: 46 additions & 0 deletions term_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,52 @@ import "golang.org/x/sys/unix"

type attr unix.Termios

func (a *attr) getSpeed() (int, error) {
// We generally only care about ospeed, since that's what would
// be used for padding characters, for example.

switch a.Ospeed {
case syscall.B50:
return 50, nil
case syscall.B75:
return 75, nil
case syscall.B110:
return 110, nil
case syscall.B134:
return 134, nil
case syscall.B150:
return 150, nil
case syscall.B200:
return 200, nil
case syscall.B300:
return 300, nil
case syscall.B600:
return 600, nil
case syscall.B1200:
return 1200, nil
case syscall.B1800:
return 1800, nil
case syscall.B2400:
return 2400, nil
case syscall.B4800:
return 4800, nil
case syscall.B9600:
return 9600, nil
case syscall.B19200:
return 19200, nil
case syscall.B38400:
return 38400, nil
case syscall.B57600:
return 57600, nil
case syscall.B115200:
return 115200, nil
case syscall.B230400:
return 230400, nil
default:
return 0, syscall.EINVAL
}
}

func (a *attr) setSpeed(baud int) error {
var rate uint64
switch baud {
Expand Down
105 changes: 105 additions & 0 deletions term_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,111 @@ import "golang.org/x/sys/unix"

type attr unix.Termios

const (
// CBaudMask is the logical of CBAUD and CBAUDEX, except
// that those values were not exposed via the syscall
// package. Many of these values will be redundant, but
// this long definition ensures we are portable if some
// architecture defines different values for them (unlikely).
CBaudMask = syscall.B50 |
syscall.B75 |
syscall.B110 |
syscall.B134 |
syscall.B150 |
syscall.B200 |
syscall.B300 |
syscall.B600 |
syscall.B1200 |
syscall.B1800 |
syscall.B2400 |
syscall.B4800 |
syscall.B9600 |
syscall.B19200 |
syscall.B38400 |
syscall.B57600 |
syscall.B115200 |
syscall.B230400 |
syscall.B460800 |
syscall.B500000 |
syscall.B576000 |
syscall.B921600 |
syscall.B1000000 |
syscall.B1152000 |
syscall.B1500000 |
syscall.B2000000 |
syscall.B2500000 |
syscall.B3000000 |
syscall.B3500000 |
syscall.B4000000
)

func (a *attr) getSpeed() (int, error) {
switch a.Cflag & CBaudMask {
case syscall.B50:
return 50, nil
case syscall.B75:
return 75, nil
case syscall.B110:
return 110, nil
case syscall.B134:
return 134, nil
case syscall.B150:
return 150, nil
case syscall.B200:
return 200, nil
case syscall.B300:
return 300, nil
case syscall.B600:
return 600, nil
case syscall.B1200:
return 1200, nil
case syscall.B1800:
return 1800, nil
case syscall.B2400:
return 2400, nil
case syscall.B4800:
return 4800, nil
case syscall.B9600:
return 9600, nil
case syscall.B19200:
return 19200, nil
case syscall.B38400:
return 38400, nil
case syscall.B57600:
return 57600, nil
case syscall.B115200:
return 115200, nil
case syscall.B230400:
return 230400, nil
case syscall.B460800:
return 460800, nil
case syscall.B500000:
return 500000, nil
case syscall.B576000:
return 576000, nil
case syscall.B921600:
return 921600, nil
case syscall.B1000000:
return 1000000, nil
case syscall.B1152000:
return 1152000, nil
case syscall.B1500000:
return 1500000, nil
case syscall.B2000000:
return 2000000, nil
case syscall.B2500000:
return 2500000, nil
case syscall.B3000000:
return 3000000, nil
case syscall.B3500000:
return 3500000, nil
case syscall.B4000000:
return 4000000, nil
default:
return 0, syscall.EINVAL
}
}

func (a *attr) setSpeed(baud int) error {
var rate uint32
switch baud {
Expand Down
9 changes: 9 additions & 0 deletions term_posix.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,15 @@ func (t *Term) setSpeed(baud int) error {
return termios.Tcsetattr(uintptr(t.fd), termios.TCSANOW, (*unix.Termios)(&a))
}

// GetSpeed gets the current output baud rate.
func (t *Term) GetSpeed() (int, error) {
var a attr
if err := termios.Tcgetattr(uintptr(t.fd), (*syscall.Termios)(&a)); err != nil {
return 0, err
}
return a.getSpeed()
}

func clamp(v, lo, hi int64) int64 {
if v < lo {
return lo
Expand Down
57 changes: 57 additions & 0 deletions term_solaris.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import "C"

import (
"os"
"syscall"
"unsafe"

"github.com/pkg/term/termios"
Expand All @@ -13,6 +14,62 @@ import (

type attr unix.Termios

func (a *attr) getSpeed() (int, error) {
// We generally only care about ospeed, since that's what would
// be used for padding characters, for example.

rate := termios.Cfgetospeed((*syscall.Termios)(a))

switch rate {
case syscall.B50:
return 50, nil
case syscall.B75:
return 75, nil
case syscall.B110:
return 110, nil
case syscall.B134:
return 134, nil
case syscall.B150:
return 150, nil
case syscall.B200:
return 200, nil
case syscall.B300:
return 300, nil
case syscall.B600:
return 600, nil
case syscall.B1200:
return 1200, nil
case syscall.B1800:
return 1800, nil
case syscall.B2400:
return 2400, nil
case syscall.B4800:
return 4800, nil
case syscall.B9600:
return 9600, nil
case syscall.B19200:
return 19200, nil
case syscall.B38400:
return 38400, nil
case syscall.B57600:
return 57600, nil
case syscall.B115200:
return 115200, nil
case syscall.B230400:
return 230400, nil
case syscall.B460800:
return 460800, nil
case syscall.B500000:
return 500000, nil
case syscall.B576000:
return 576000, nil
case syscall.B921600:
return 921600, nil
default:
return 0, syscall.EINVAL
}
}

func (a *attr) setSpeed(baud int) error {
var rate uint32
switch baud {
Expand Down
10 changes: 9 additions & 1 deletion term_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ package term
import (
"testing"

"github.com/pkg/term/termios"
"time"

"github.com/pkg/term/termios"
)

// assert that Term implements the same method set across
Expand All @@ -27,6 +28,7 @@ var _ interface {
SetRTS(v bool) error
SetRaw() error
SetSpeed(baud int) error
GetSpeed() (int, error)
Write(b []byte) (int, error)
} = new(Term)

Expand All @@ -52,6 +54,12 @@ func TestTermSetSpeed(t *testing.T) {
if err := tt.SetSpeed(57600); err != nil {
t.Fatal(err)
}

if spd, err := tt.GetSpeed(); err != nil {
t.Fatal(err)
} else if spd != 57600 {
t.Errorf("speed mismatch %d != 57600", spd)
}
}

func TestTermSetReadTimeout(t *testing.T) {
Expand Down
Loading