Merge pull request #73 from ijc25/vsock

vsudd bugfixes
This commit is contained in:
Justin Cormack 2016-04-08 16:05:36 +01:00
commit 9be06ba517

View File

@ -22,8 +22,8 @@ int bind_sockaddr_vm(int fd, const struct sockaddr_vm *sa_vm) {
int connect_sockaddr_vm(int fd, const struct sockaddr_vm *sa_vm) { int connect_sockaddr_vm(int fd, const struct sockaddr_vm *sa_vm) {
return connect(fd, (const struct sockaddr*)sa_vm, sizeof(*sa_vm)); return connect(fd, (const struct sockaddr*)sa_vm, sizeof(*sa_vm));
} }
int accept_vm(int fd) { int accept_vm(int fd, struct sockaddr_vm *sa_vm, socklen_t *sa_vm_len) {
return accept(fd, 0, 0); return accept4(fd, (struct sockaddr *)sa_vm, sa_vm_len, 0);
} }
*/ */
import "C" import "C"
@ -73,7 +73,7 @@ func main() {
sa := C.struct_sockaddr_vm{} sa := C.struct_sockaddr_vm{}
sa.svm_family = AF_VSOCK sa.svm_family = AF_VSOCK
sa.svm_port = C.uint(port) sa.svm_port = C.uint(port)
sa.svm_cid = 3 sa.svm_cid = VSOCK_CID_ANY
if ret := C.bind_sockaddr_vm(C.int(accept_fd), &sa); ret != 0 { if ret := C.bind_sockaddr_vm(C.int(accept_fd), &sa); ret != 0 {
log.Fatal(fmt.Sprintf("failed bind vsock connection to %08x.%08x, returned %d", sa.svm_cid, sa.svm_port, ret)) log.Fatal(fmt.Sprintf("failed bind vsock connection to %08x.%08x, returned %d", sa.svm_cid, sa.svm_port, ret))
@ -89,20 +89,29 @@ func main() {
connid := 0 connid := 0
for { for {
var accept_sa C.struct_sockaddr_vm
var accept_sa_len C.socklen_t
connid++ connid++
fd, err := C.accept_vm(C.int(accept_fd)) accept_sa_len = C.sizeof_struct_sockaddr_vm
fd, err := C.accept_vm(C.int(accept_fd), &accept_sa, &accept_sa_len)
if err != nil { if err != nil {
log.Fatalln("Error accepting connection", err) log.Fatalln("Error accepting connection", err)
} }
go handleOne(connid, int(fd)) go handleOne(connid, int(fd), uint(accept_sa.svm_cid), uint(accept_sa.svm_port))
} }
} }
func handleOne(connid int, fd int) { func handleOne(connid int, fd int, cid, port uint) {
vsock := os.NewFile(uintptr(fd), "vsock connection") vsock := os.NewFile(uintptr(fd), fmt.Sprintf("vsock:%d", fd))
log.Println(connid, "Accepted connection on fd", fd) log.Printf("%d Accepted connection on fd %d from %08x.%08x", connid, fd, cid, port)
defer syscall.Close(fd) defer func() {
log.Println(connid, "Closing vsock", vsock)
if err := vsock.Close() ; err != nil {
log.Println(connid, "Error closing", vsock, ":", err)
}
}()
var docker *net.UnixConn var docker *net.UnixConn
var err error var err error
@ -115,13 +124,18 @@ func handleOne(connid int, fd int) {
} }
time.Sleep(50 * time.Millisecond) time.Sleep(50 * time.Millisecond)
} }
defer docker.Close()
if err != nil { if err != nil {
// If the forwarding program has broken then close and continue // If the forwarding program has broken then close and continue
log.Println(connid, "Failed to connect to Unix domain socket after 10s", sock, err) log.Println(connid, "Failed to connect to Unix domain socket after 10s", sock, err)
return return
} }
defer func() {
log.Println(connid, "Closing docker", docker)
if err := docker.Close() ; err != nil {
log.Println(connid, "Error closing", docker, ":", err)
}
}()
log.Println(connid, "Connected to docker", docker)
w := make(chan int64) w := make(chan int64)
go func() { go func() {