]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: add SendmsgN for BSD variants, Linux and Solaris
authorMikio Hara <mikioh.mikioh@gmail.com>
Sat, 29 Mar 2014 00:28:40 +0000 (09:28 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Sat, 29 Mar 2014 00:28:40 +0000 (09:28 +0900)
SendmsgN is an alternate version Sendmsg that also returns
the number of bytes transferred, instead of just the error.

Update #7645

LGTM=aram, iant
R=iant, aram, bradfitz
CC=golang-codereviews
https://golang.org/cl/81210043

21 files changed:
src/pkg/syscall/syscall_bsd.go
src/pkg/syscall/syscall_linux.go
src/pkg/syscall/syscall_linux_386.go
src/pkg/syscall/syscall_linux_amd64.go
src/pkg/syscall/syscall_linux_arm.go
src/pkg/syscall/syscall_solaris.go
src/pkg/syscall/zsyscall_darwin_386.go
src/pkg/syscall/zsyscall_darwin_amd64.go
src/pkg/syscall/zsyscall_dragonfly_386.go
src/pkg/syscall/zsyscall_dragonfly_amd64.go
src/pkg/syscall/zsyscall_freebsd_386.go
src/pkg/syscall/zsyscall_freebsd_amd64.go
src/pkg/syscall/zsyscall_freebsd_arm.go
src/pkg/syscall/zsyscall_linux_amd64.go
src/pkg/syscall/zsyscall_linux_arm.go
src/pkg/syscall/zsyscall_netbsd_386.go
src/pkg/syscall/zsyscall_netbsd_amd64.go
src/pkg/syscall/zsyscall_netbsd_arm.go
src/pkg/syscall/zsyscall_openbsd_386.go
src/pkg/syscall/zsyscall_openbsd_amd64.go
src/pkg/syscall/zsyscall_solaris_amd64.go

index 05cd1eec665880755fc859c2c296512580760145..b042841a5bcd496800199acb57f0065d352a2afb 100644 (file)
@@ -389,15 +389,20 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
        return
 }
 
-//sys  sendmsg(s int, msg *Msghdr, flags int) (err error)
+//sys  sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 
 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
+       _, err = SendmsgN(fd, p, oob, to, flags)
+       return
+}
+
+func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
        var ptr unsafe.Pointer
        var salen _Socklen
        if to != nil {
                ptr, salen, err = to.sockaddr()
                if err != nil {
-                       return
+                       return 0, err
                }
        }
        var msg Msghdr
@@ -420,10 +425,13 @@ func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
        }
        msg.Iov = &iov
        msg.Iovlen = 1
-       if err = sendmsg(fd, &msg, flags); err != nil {
-               return
+       if n, err = sendmsg(fd, &msg, flags); err != nil {
+               return 0, err
        }
-       return
+       if len(oob) > 0 && len(p) == 0 {
+               n = 0
+       }
+       return n, nil
 }
 
 //sys  kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)
index 704c4ffa6cc6f20025f1792cc9b46971eeeee46f..fa0d7ea3c789dd50678929722306bdebc8518958 100644 (file)
@@ -527,13 +527,18 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
 }
 
 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
+       _, err = SendmsgN(fd, p, oob, to, flags)
+       return
+}
+
+func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
        var ptr unsafe.Pointer
        var salen _Socklen
        if to != nil {
                var err error
                ptr, salen, err = to.sockaddr()
                if err != nil {
-                       return err
+                       return 0, err
                }
        }
        var msg Msghdr
@@ -556,10 +561,13 @@ func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
        }
        msg.Iov = &iov
        msg.Iovlen = 1
-       if err = sendmsg(fd, &msg, flags); err != nil {
-               return
+       if n, err = sendmsg(fd, &msg, flags); err != nil {
+               return 0, err
        }
-       return
+       if len(oob) > 0 && len(p) == 0 {
+               n = 0
+       }
+       return n, nil
 }
 
 // BindToDevice binds the socket associated with fd to device.
index 9279d58c802d68e249902501ee14da3a987a1fab..e8943944d5d57b75639a4b3e4cad9fffe85cbf70 100644 (file)
@@ -284,8 +284,8 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
        return
 }
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
        if e != 0 {
                err = e
        }
index 55595909d78af24b60c4895454180a61d9ede7c4..9e8663d014a510298583e9532ec9bce0d474f43a 100644 (file)
@@ -53,7 +53,7 @@ package syscall
 //sys  recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 //sys  sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 //sys  recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//sys  sendmsg(s int, msg *Msghdr, flags int) (err error)
+//sys  sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 //sys  mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 
 func Getpagesize() int { return 4096 }
index 1e1ddba8300727f35ff18d56bebe6f86da7e830c..68c796b448ec8c7d12fd8b104d8651266d38faa8 100644 (file)
@@ -42,7 +42,7 @@ func Seek(fd int, offset int64, whence int) (newoffset int64, err error)
 //sys  sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 //sysnb        socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
 //sys  recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
-//sys  sendmsg(s int, msg *Msghdr, flags int) (err error)
+//sys  sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 
 // 64-bit file system and 32-bit uid calls
 // (16-bit uid calls are not always supported in newer kernels)
index 947874ee1f4b4ad51812dd306dd7e92849b45893..bf7ffd7ede65e055f6739720cbbb2f638e3fba93 100644 (file)
@@ -380,14 +380,19 @@ func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from
        return
 }
 
-//sys  sendmsg(s int, msg *Msghdr, flags int) (err error) = libsocket.sendmsg
 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
+       _, err = SendmsgN(fd, p, oob, to, flags)
+       return
+}
+
+//sys  sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.sendmsg
+func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
        var ptr unsafe.Pointer
        var salen _Socklen
        if to != nil {
                ptr, salen, err = to.sockaddr()
                if err != nil {
-                       return err
+                       return 0, err
                }
        }
        var msg Msghdr
@@ -409,7 +414,13 @@ func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
        }
        msg.Iov = &iov
        msg.Iovlen = 1
-       return sendmsg(fd, &msg, flags)
+       if n, err = sendmsg(fd, &msg, flags); err != nil {
+               return 0, err
+       }
+       if len(oob) > 0 && len(p) == 0 {
+               n = 0
+       }
+       return n, nil
 }
 
 /*
index 63bc5221a9825a0f294034c968ed24ef2f5f5606..76988c8a1a14cfbb51d022a1ef534f0a80c847a6 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 33103ff2e9b289fe95fe5f579668cef2425a96f6..8224f5b7b4de530f0113b0c36bba7a54096f7fd2 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 96d03d45348fc8eb3aa57e4c7b55554d0dbfe65a..08668cff16063eba0534785a5fdae7846af9d5da 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 89148abb46134ce154ae46d6cebf52a5e8574002..cceda4572e400cdafe9e1e56519a28803d608b5a 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index bb6bc599f5553f096a5000054729dc646f9d64c1..3c247a283aa22b101abed284c62a98d560a228bd 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 2cbad10e7d1a65fa3fc806cdb8ff26a5c038ab87..f23381bab1b35073e1f935009349dae9695f1ff5 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index f4f6358540ae4bdf267de9f973d3c77ea99332c0..481b832cfee8687e42736465b8e5d536b0f4abe4 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 0b392ea192d3a02aa91aadbd6f5c873ef46b02c8..c65448e21f6ef80d0cc2abf8593fe5c80cad79e6 100644 (file)
@@ -1909,8 +1909,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index eb8819645cd071437f72975c4236febd31b65c1e..a970ce6dc3f3e2c3bd912b6bf779831d120de31f 100644 (file)
@@ -1529,8 +1529,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 10423b95bcaefc3fe1383d6523abb455eedad055..281208f4114a4435ff9a532b25949370c67adba0 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index c605013d5d52b12140f67f30d284a17f0e1b9a58..ed9a87df6c1e09ce7f23dbc7866de3538d15bce7 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index f8ce2110f2d44d00004fc22715857f23105178ec..c5c9a9f2c6e3929664580eda0cb1f72e210b5468 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index cc8b367cd1e9525cf10b3f72caa38e499f9c1289..5082ad3279882bda61505958bf0b95fc6efa2f2b 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 2d0eb7271a0b52f4111fb5cd0fe8312a24cb2b67..79a697192666470dbf74e5e1701db82d9e1c9369 100644 (file)
@@ -185,8 +185,9 @@ func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags))
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }
index 7a0b71eeef192bee2d1fecf91f52f30f22c668e1..8847cad0125d200469852258c8c4def4e0de074b 100644 (file)
@@ -126,8 +126,9 @@ func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {
        return
 }
 
-func sendmsg(s int, msg *Msghdr, flags int) (err error) {
-       _, _, e1 := sysvicall6(procsendmsg.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
+func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
+       r0, _, e1 := sysvicall6(procsendmsg.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
+       n = int(r0)
        if e1 != 0 {
                err = e1
        }