Left: | ||
Right: |
OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2009 The Go Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style | |
3 // license that can be found in the LICENSE file. | |
4 | |
5 // This code is a duplicate of syscall/syscall_linux_386.go with small | |
6 // modifications. | |
7 | |
8 package ipv4 | |
9 | |
10 import ( | |
11 "syscall" | |
12 "unsafe" | |
13 ) | |
14 | |
15 // On x86 Linux, all the socket calls go through an extra indirection, | |
16 // I think because the 5-register system call interface can't handle | |
17 // the 6-argument calls like sendto and recvfrom. Instead the | |
18 // arguments to the underlying system call are the number below and a | |
19 // pointer to an array of uintptr. We hide the pointer in the | |
20 // socketcall assembly to avoid allocation on every system call. | |
21 | |
22 const ( | |
23 // See /usr/include/linux/net.h. | |
24 _SETSOCKOPT = 14 | |
25 _GETSOCKOPT = 15 | |
26 ) | |
27 | |
28 var socketcall func(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errn o) | |
29 | |
30 func getsockopt(fd int, level int, name int, v unsafe.Pointer, l *sysSockoptLen) error { | |
iant
2014/05/10 00:02:55
Using a getsockopt function instead of something l
mikio
2014/05/14 13:09:00
i have a plan that improves multicast control and
| |
31 if _, errno := socketcall(_GETSOCKOPT, uintptr(fd), uintptr(level), uint ptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { | |
32 return error(errno) | |
33 } | |
34 return nil | |
35 } | |
36 | |
37 func setsockopt(fd int, level int, name int, v unsafe.Pointer, l uintptr) error { | |
38 if _, errno := socketcall(_SETSOCKOPT, uintptr(fd), uintptr(level), uint ptr(name), uintptr(v), uintptr(l), 0); errno != 0 { | |
39 return error(errno) | |
40 } | |
41 return nil | |
42 } | |
OLD | NEW |