From 152558831e919803fd60169bceaa301518f47627 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 13 Nov 2016 23:44:13 +0100 Subject: [PATCH] Moved Pipe{} into own sub-package It may be moved into a separate project at some point, who knows... --- pipe_unix.go | 53 ------------------------------- serial_unix.go | 8 +++-- unixutils/pipe.go | 80 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 56 deletions(-) delete mode 100644 pipe_unix.go create mode 100644 unixutils/pipe.go diff --git a/pipe_unix.go b/pipe_unix.go deleted file mode 100644 index 066f258..0000000 --- a/pipe_unix.go +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright 2014-2016 Cristian Maglie. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. -// - -// +build linux darwin freebsd - -package serial // import "go.bug.st/serial.v1" - -import "syscall" - -// pipe is a small wrapper around unix-pipe syscall functions -type pipe struct { - rd int - wr int -} - -func newPipe() (*pipe, error) { - fds := []int{0, 0} - if err := syscall.Pipe(fds); err != nil { - return nil, err - } - return &pipe{rd: fds[0], wr: fds[1]}, nil -} - -func (p *pipe) ReadFD() int { - return p.rd -} - -func (p *pipe) WriteFD() int { - return p.wr -} - -func (p *pipe) Write(data []byte) (int, error) { - return syscall.Write(p.wr, data) -} - -func (p *pipe) Read(data []byte) (int, error) { - return syscall.Read(p.rd, data) -} - -func (p *pipe) Close() error { - err1 := syscall.Close(p.rd) - err2 := syscall.Close(p.wr) - if err1 != nil { - return err1 - } - if err2 != nil { - return err2 - } - return nil -} diff --git a/serial_unix.go b/serial_unix.go index 84488b5..a4ca1ee 100644 --- a/serial_unix.go +++ b/serial_unix.go @@ -16,6 +16,8 @@ import ( "syscall" "unsafe" + "go.bug.st/serial.v1/unixutils" + "github.com/creack/goselect" ) @@ -23,7 +25,7 @@ type unixPort struct { handle int closeLock sync.RWMutex - closeSignal *pipe + closeSignal *unixutils.Pipe } func (port *unixPort) Close() error { @@ -137,8 +139,8 @@ func nativeOpen(portName string, mode *Mode) (*unixPort, error) { port.acquireExclusiveAccess() // This pipe is used as a signal to cancel blocking Read or Write - pipe, err := newPipe() - if err != nil { + pipe := &unixutils.Pipe{} + if err := pipe.Open(); err != nil { port.Close() return nil, &PortError{code: InvalidSerialPort, causedBy: err} } diff --git a/unixutils/pipe.go b/unixutils/pipe.go new file mode 100644 index 0000000..567c739 --- /dev/null +++ b/unixutils/pipe.go @@ -0,0 +1,80 @@ +// +// Copyright 2014-2016 Cristian Maglie. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +// + +// +build linux darwin freebsd + +package unixutils // import "go.bug.st/serial.v1/unixutils" + +import "syscall" +import "fmt" + +// Pipe represents a unix-pipe +type Pipe struct { + opened bool + rd int + wr int +} + +// Open creates a new pipe +func (p *Pipe) Open() error { + fds := []int{0, 0} + if err := syscall.Pipe(fds); err != nil { + return err + } + p.rd = fds[0] + p.wr = fds[1] + p.opened = true + return nil +} + +// ReadFD returns the file handle for the read side of the pipe. +func (p *Pipe) ReadFD() int { + if !p.opened { + return -1 + } + return p.rd +} + +// WriteFD returns the flie handle for the write side of the pipe. +func (p *Pipe) WriteFD() int { + if !p.opened { + return -1 + } + return p.wr +} + +// Write to the pipe the content of data. Returns the numbre of bytes written. +func (p *Pipe) Write(data []byte) (int, error) { + if !p.opened { + return 0, fmt.Errorf("Pipe not opened") + } + return syscall.Write(p.wr, data) +} + +// Read from the pipe into the data array. Returns the number of bytes read. +func (p *Pipe) Read(data []byte) (int, error) { + if !p.opened { + return 0, fmt.Errorf("Pipe not opened") + } + return syscall.Read(p.rd, data) +} + +// Close the pipe +func (p *Pipe) Close() error { + if !p.opened { + return fmt.Errorf("Pipe not opened") + } + err1 := syscall.Close(p.rd) + err2 := syscall.Close(p.wr) + p.opened = false + if err1 != nil { + return err1 + } + if err2 != nil { + return err2 + } + return nil +}