Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
4a1a8596
Commit
4a1a8596
authored
Jan 30, 2012
by
Ian Lance Taylor
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
syscall: Support socket control messages.
From-SVN: r183745
parent
842f302e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
71 additions
and
15 deletions
+71
-15
libgo/Makefile.am
+9
-0
libgo/Makefile.in
+6
-0
libgo/go/syscall/sockcmsg_unix.go
+3
-3
libgo/go/syscall/socket.go
+16
-12
libgo/mksysinfo.sh
+37
-0
No files found.
libgo/Makefile.am
View file @
4a1a8596
...
...
@@ -1593,6 +1593,13 @@ else # !LIBGO_IS_SOLARIS
syscall_uname_file
=
go/syscall/libcall_uname.go
endif
# GNU/Linux specific socket control messages.
if
LIBGO_IS_LINUX
syscall_sockcmsg_file
=
go/syscall/sockcmsg_linux.go
else
syscall_sockcmsg_file
=
endif
# Support for netlink sockets and messages.
if
LIBGO_IS_LINUX
syscall_netlink_file
=
go/syscall/netlink_linux.go
...
...
@@ -1606,8 +1613,10 @@ go_base_syscall_files = \
go/syscall/libcall_support.go
\
go/syscall/libcall_posix.go
\
go/syscall/socket.go
\
go/syscall/sockcmsg_unix.go
\
go/syscall/str.go
\
go/syscall/syscall.go
\
$(syscall_sockcmsg_file)
\
$(syscall_syscall_file)
\
$(syscall_exec_file)
\
$(syscall_exec_os_file)
\
...
...
libgo/Makefile.in
View file @
4a1a8596
...
...
@@ -1923,6 +1923,10 @@ go_unicode_utf8_files = \
# 32-bit Solaris 2/x86 needs _nuname, handled in libcall_solaris_386.go.
@LIBGO_IS_386_TRUE@@LIBGO_IS_SOLARIS_TRUE@
syscall_uname_file
=
@LIBGO_IS_SOLARIS_FALSE@
syscall_uname_file
=
go/syscall/libcall_uname.go
@LIBGO_IS_LINUX_FALSE@
syscall_sockcmsg_file
=
# GNU/Linux specific socket control messages.
@LIBGO_IS_LINUX_TRUE@
syscall_sockcmsg_file
=
go/syscall/sockcmsg_linux.go
@LIBGO_IS_LINUX_FALSE@
syscall_netlink_file
=
# Support for netlink sockets and messages.
...
...
@@ -1933,8 +1937,10 @@ go_base_syscall_files = \
go/syscall/libcall_support.go
\
go/syscall/libcall_posix.go
\
go/syscall/socket.go
\
go/syscall/sockcmsg_unix.go
\
go/syscall/str.go
\
go/syscall/syscall.go
\
$(syscall_sockcmsg_file)
\
$(syscall_syscall_file)
\
$(syscall_exec_file)
\
$(syscall_exec_os_file)
\
...
...
libgo/go/syscall/sockcmsg_unix.go
View file @
4a1a8596
...
...
@@ -14,7 +14,7 @@ import (
// Round the length of a raw sockaddr up to align it propery.
func
cmsgAlignOf
(
salen
int
)
int
{
salign
:=
sizeofPtr
salign
:=
int
(
sizeofPtr
)
// NOTE: It seems like 64-bit Darwin kernel still requires 32-bit
// aligned access to BSD subsystem.
if
darwinAMD64
{
...
...
@@ -39,7 +39,7 @@ func CmsgSpace(datalen int) int {
}
func
cmsgData
(
cmsg
*
Cmsghdr
)
unsafe
.
Pointer
{
return
unsafe
.
Pointer
(
uintptr
(
unsafe
.
Pointer
(
cmsg
))
+
SizeofCmsghdr
)
return
unsafe
.
Pointer
(
uintptr
(
unsafe
.
Pointer
(
cmsg
))
+
uintptr
(
SizeofCmsghdr
)
)
}
type
SocketControlMessage
struct
{
...
...
@@ -72,7 +72,7 @@ func ParseSocketControlMessage(buf []byte) ([]SocketControlMessage, error) {
func
socketControlMessageHeaderAndData
(
buf
[]
byte
)
(
*
Cmsghdr
,
[]
byte
,
error
)
{
h
:=
(
*
Cmsghdr
)(
unsafe
.
Pointer
(
&
buf
[
0
]))
if
h
.
Len
<
SizeofCmsghdr
||
int
(
h
.
Len
)
>
len
(
buf
)
{
if
int
(
h
.
Len
)
<
SizeofCmsghdr
||
int
(
h
.
Len
)
>
len
(
buf
)
{
return
nil
,
nil
,
EINVAL
}
return
h
,
buf
[
cmsgAlignOf
(
SizeofCmsghdr
)
:
],
nil
...
...
libgo/go/syscall/socket.go
View file @
4a1a8596
...
...
@@ -17,12 +17,12 @@ import "unsafe"
var
SocketDisableIPv6
bool
type
Sockaddr
interface
{
sockaddr
()
(
ptr
*
RawSockaddrAny
,
len
Socklen_t
,
err
error
)
// lowercase; only we can define Sockaddrs
sockaddr
()
(
ptr
*
RawSockaddrAny
,
len
Socklen_t
,
err
error
)
// lowercase; only we can define Sockaddrs
}
type
RawSockaddrAny
struct
{
Addr
RawSockaddr
Pad
[
12
]
int8
Pad
[
12
]
int8
}
const
SizeofSockaddrAny
=
0x1c
...
...
@@ -30,7 +30,7 @@ const SizeofSockaddrAny = 0x1c
type
SockaddrInet4
struct
{
Port
int
Addr
[
4
]
byte
raw
RawSockaddrInet4
raw
RawSockaddrInet4
}
func
(
sa
*
SockaddrInet4
)
sockaddr
()
(
*
RawSockaddrAny
,
Socklen_t
,
error
)
{
...
...
@@ -40,7 +40,7 @@ func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
sa
.
raw
.
Family
=
AF_INET
n
:=
sa
.
raw
.
setLen
()
p
:=
(
*
[
2
]
byte
)(
unsafe
.
Pointer
(
&
sa
.
raw
.
Port
))
p
[
0
]
=
byte
(
sa
.
Port
>>
8
)
p
[
0
]
=
byte
(
sa
.
Port
>>
8
)
p
[
1
]
=
byte
(
sa
.
Port
)
for
i
:=
0
;
i
<
len
(
sa
.
Addr
);
i
++
{
sa
.
raw
.
Addr
[
i
]
=
sa
.
Addr
[
i
]
...
...
@@ -49,10 +49,10 @@ func (sa *SockaddrInet4) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
}
type
SockaddrInet6
struct
{
Port
int
Port
int
ZoneId
uint32
Addr
[
16
]
byte
raw
RawSockaddrInet6
Addr
[
16
]
byte
raw
RawSockaddrInet6
}
func
(
sa
*
SockaddrInet6
)
sockaddr
()
(
*
RawSockaddrAny
,
Socklen_t
,
error
)
{
...
...
@@ -62,7 +62,7 @@ func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
sa
.
raw
.
Family
=
AF_INET6
n
:=
sa
.
raw
.
setLen
()
p
:=
(
*
[
2
]
byte
)(
unsafe
.
Pointer
(
&
sa
.
raw
.
Port
))
p
[
0
]
=
byte
(
sa
.
Port
>>
8
)
p
[
0
]
=
byte
(
sa
.
Port
>>
8
)
p
[
1
]
=
byte
(
sa
.
Port
)
sa
.
raw
.
Scope_id
=
sa
.
ZoneId
for
i
:=
0
;
i
<
len
(
sa
.
Addr
);
i
++
{
...
...
@@ -73,7 +73,7 @@ func (sa *SockaddrInet6) sockaddr() (*RawSockaddrAny, Socklen_t, error) {
type
SockaddrUnix
struct
{
Name
string
raw
RawSockaddrUnix
raw
RawSockaddrUnix
}
func
(
sa
*
SockaddrUnix
)
sockaddr
()
(
*
RawSockaddrAny
,
Socklen_t
,
error
)
{
...
...
@@ -268,12 +268,12 @@ func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
}
type
Linger
struct
{
Onoff
int32
;
Linger
int32
;
Onoff
int32
Linger
int32
}
func
SetsockoptLinger
(
fd
,
level
,
opt
int
,
l
*
Linger
)
(
err
error
)
{
return
setsockopt
(
fd
,
level
,
opt
,
(
*
byte
)(
unsafe
.
Pointer
(
l
)),
Socklen_t
(
unsafe
.
Sizeof
(
*
l
)))
;
return
setsockopt
(
fd
,
level
,
opt
,
(
*
byte
)(
unsafe
.
Pointer
(
l
)),
Socklen_t
(
unsafe
.
Sizeof
(
*
l
)))
}
func
SetsockoptIPMreq
(
fd
,
level
,
opt
int
,
mreq
*
IPMreq
)
(
err
error
)
{
...
...
@@ -405,3 +405,7 @@ func (iov *Iovec) SetLen(length int) {
func
(
msghdr
*
Msghdr
)
SetControllen
(
length
int
)
{
msghdr
.
Controllen
=
Msghdr_controllen_t
(
length
)
}
func
(
cmsg
*
Cmsghdr
)
SetLen
(
length
int
)
{
cmsg
.
Len
=
Cmsghdr_len_t
(
length
)
}
libgo/mksysinfo.sh
View file @
4a1a8596
...
...
@@ -483,6 +483,43 @@ echo $msghdr | \
-e
's/msg_flags/Flags/'
\
>>
${
OUT
}
# The MSG_ flags for Msghdr.
grep
'^const _MSG_'
gen-sysinfo.go |
\
sed
-e
's/^\(const \)_\(MSG_[^= ]*\)\(.*\)$/\1\2 = _\2/'
>>
${
OUT
}
# The cmsghdr struct.
cmsghdr
=
`
grep
'^type _cmsghdr '
gen-sysinfo.go
`
if
test
-n
"
$cmsghdr
"
;
then
cmsghdr_len
=
`
echo
$cmsghdr
| sed
-n
-e
's/^.*cmsg_len \([^ ]*\);.*$/\1/p'
`
echo
"type Cmsghdr_len_t
$cmsghdr_len
"
>>
${
OUT
}
echo
"
$cmsghdr
"
|
\
sed
-e
's/_cmsghdr/Cmsghdr/'
\
-e
's/cmsg_len *[a-zA-Z0-9_]*/Len Cmsghdr_len_t/'
\
-e
's/cmsg_level/Level/'
\
-e
's/cmsg_type/Type/'
\
>>
${
OUT
}
# The size of the cmsghdr struct.
echo
'var SizeofCmsghdr = int(unsafe.Sizeof(Cmsghdr{}))'
>>
${
OUT
}
fi
# The SCM_ flags for Cmsghdr.
grep
'^const _SCM_'
gen-sysinfo.go |
\
sed
-e
's/^\(const \)_\(SCM_[^= ]*\)\(.*\)$/\1\2 = _\2/'
>>
${
OUT
}
# The ucred struct.
grep
'^type _ucred '
gen-sysinfo.go |
\
sed
-e
's/_ucred/Ucred/'
\
-e
's/pid/Pid/'
\
-e
's/uid/Uid/'
\
-e
's/gid/Gid/'
\
>>
${
OUT
}
# The size of the ucred struct.
if
grep
'type Ucred '
${
OUT
}
>
/dev/null 2>&1
;
then
echo
'var SizeofUcred = int(unsafe.Sizeof(Ucred{}))'
>>
${
OUT
}
fi
# The ip_mreq struct.
grep
'^type _ip_mreq '
gen-sysinfo.go |
\
sed
-e
's/_ip_mreq/IPMreq/'
\
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment