Revendor virtsock go library, for vsock.Dial

$ gvt delete github.com/rneugeba/virtsock/go
$ gvt fetch --no-recurse https://github.com/rneugeba/virtsock/go

virtsock.git:

$ git log --oneline 74097e05a883e89c70e6a27b342672c7fe6c846b..650ef8224a0c06b4b20e9bee1600dbf677c8176d -- go/
0e2f0a8 vsock: Implement vsock.Dial
712714a vsock: include the errno when C.bind_sockaddr_vm
03725fe go: make errors public

Signed-off-by: Ian Campbell <ian.campbell@docker.com>
This commit is contained in:
Ian Campbell 2016-06-23 12:27:32 +01:00
parent 98174da08f
commit f70ff0aeac
5 changed files with 47 additions and 22 deletions

View File

@ -173,13 +173,13 @@ func (v *hvsockListener) Addr() net.Addr {
*/
var (
errSocketClosed = errors.New("HvSocket has already been closed")
errSocketWriteClosed = errors.New("HvSocket has been closed for write")
errSocketReadClosed = errors.New("HvSocket has been closed for read")
errSocketMsgSize = errors.New("HvSocket message was of wrong size")
errSocketMsgWrite = errors.New("HvSocket writing message")
errSocketNotEnoughData = errors.New("HvSocket not enough data written")
errSocketUnImplemented = errors.New("Function not implemented")
ErrSocketClosed = errors.New("HvSocket has already been closed")
ErrSocketWriteClosed = errors.New("HvSocket has been closed for write")
ErrSocketReadClosed = errors.New("HvSocket has been closed for read")
ErrSocketMsgSize = errors.New("HvSocket message was of wrong size")
ErrSocketMsgWrite = errors.New("HvSocket writing message")
ErrSocketNotEnoughData = errors.New("HvSocket not enough data written")
ErrSocketUnImplemented = errors.New("Function not implemented")
)
type HVsockConn struct {
@ -227,7 +227,7 @@ func (v *HVsockConn) Close() error {
func (v *HVsockConn) CloseRead() error {
if v.readClosed {
return errSocketReadClosed
return ErrSocketReadClosed
}
prDebug("TX: Shutdown Read\n")
@ -244,7 +244,7 @@ func (v *HVsockConn) CloseRead() error {
func (v *HVsockConn) CloseWrite() error {
if v.writeClosed {
return errSocketWriteClosed
return ErrSocketWriteClosed
}
prDebug("TX: Shutdown Write\n")
@ -284,7 +284,7 @@ func (v *HVsockConn) Read(buf []byte) (int, error) {
}
if n != 4 {
return n, errSocketMsgSize
return n, ErrSocketMsgSize
}
msg := int(binary.LittleEndian.Uint32(b))
@ -333,7 +333,7 @@ func (v *HVsockConn) Read(buf []byte) (int, error) {
func (v *HVsockConn) Write(buf []byte) (int, error) {
if v.writeClosed {
return 0, errSocketWriteClosed
return 0, ErrSocketWriteClosed
}
var err error
@ -344,7 +344,7 @@ func (v *HVsockConn) Write(buf []byte) (int, error) {
for toWrite > 0 {
if v.writeClosed {
return 0, errSocketWriteClosed
return 0, ErrSocketWriteClosed
}
// We write batches of MSG + data which need to be
@ -371,7 +371,7 @@ func (v *HVsockConn) Write(buf []byte) (int, error) {
}
if n != thisBatch {
prDebug("Write Error 4\n")
err = errSocketNotEnoughData
err = ErrSocketNotEnoughData
goto ErrOut
}
toWrite -= n
@ -402,7 +402,7 @@ func (v *HVsockConn) sendMsg(msg uint32) error {
return err
}
if n != len(b) {
return errSocketMsgWrite
return ErrSocketMsgWrite
}
return nil
}

View File

@ -1,6 +1,7 @@
// Dummy implementation to compile on Mac OSX
package hvsock
import (
"errors"
"time"

View File

@ -240,7 +240,7 @@ func (v *hvsockConn) closeHandle() {
func (s *hvsockConn) prepareIo() (*ioOperation, error) {
s.wg.Add(1)
if s.closing {
return nil, errSocketClosed
return nil, ErrSocketClosed
}
c := &ioOperation{}
c.ch = make(chan ioResult)
@ -299,7 +299,7 @@ func (v *hvsockConn) asyncIo(c *ioOperation, deadline time.Time, bytes uint32, e
err = r.err
if err == syscall.ERROR_OPERATION_ABORTED {
if v.closing {
err = errSocketClosed
err = ErrSocketClosed
} else if timedout {
err = errTimeout
}

View File

@ -37,11 +37,33 @@ int accept_vm(int fd, struct sockaddr_vm *sa_vm, socklen_t *sa_vm_len) {
import "C"
const (
AF_VSOCK = 40
VSOCK_CID_ANY = 4294967295 /* 2^32-1 */
VSOCK_CID_SELF = 3
AF_VSOCK = 40
VSOCK_CID_ANY = 4294967295 /* 2^32-1 */
VSOCK_CID_HYPERVISOR = 0
VSOCK_CID_HOST = 2
VSOCK_CID_SELF = 3
)
func Dial(cid, port uint) (Conn, error) {
fd, err := syscall.Socket(AF_VSOCK, syscall.SOCK_STREAM, 0)
if err != nil {
return nil, err
}
sa := C.struct_sockaddr_vm{}
sa.svm_family = AF_VSOCK
sa.svm_port = C.uint(port)
sa.svm_cid = C.uint(cid)
if ret, errno := C.connect_sockaddr_vm(C.int(fd), &sa); ret != 0 {
return nil, errors.New(fmt.Sprintf(
"failed bind connect to %08x.%08x, returned %d, errno %d: %s",
sa.svm_cid, sa.svm_port, ret, errno, errno))
}
return newVsockConn(uintptr(fd), port)
}
// Listen returns a net.Listener which can accept connections on the given
// vhan port.
func Listen(port uint) (net.Listener, error) {
@ -55,8 +77,10 @@ func Listen(port uint) (net.Listener, error) {
sa.svm_port = C.uint(port)
sa.svm_cid = VSOCK_CID_ANY
if ret := C.bind_sockaddr_vm(C.int(accept_fd), &sa); ret != 0 {
return nil, errors.New(fmt.Sprintf("failed bind vsock connection to %08x.%08x, returned %d", sa.svm_cid, sa.svm_port, ret))
if ret, errno := C.bind_sockaddr_vm(C.int(accept_fd), &sa); ret != 0 {
return nil, errors.New(fmt.Sprintf(
"failed bind vsock connection to %08x.%08x, returned %d, errno %d: %s",
sa.svm_cid, sa.svm_port, ret, errno, errno))
}
err = syscall.Listen(accept_fd, syscall.SOMAXCONN)

View File

@ -5,7 +5,7 @@
"importpath": "github.com/rneugeba/virtsock/go",
"repository": "https://github.com/rneugeba/virtsock",
"vcs": "git",
"revision": "74097e05a883e89c70e6a27b342672c7fe6c846b",
"revision": "650ef8224a0c06b4b20e9bee1600dbf677c8176d",
"branch": "master",
"path": "/go",
"notests": true