cubefs
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//go:build 386 && linux
6// +build 386,linux
7
8package unix9
10import (11"unsafe"12)
13
14func setTimespec(sec, nsec int64) Timespec {15return Timespec{Sec: int32(sec), Nsec: int32(nsec)}16}
17
18func setTimeval(sec, usec int64) Timeval {19return Timeval{Sec: int32(sec), Usec: int32(usec)}20}
21
22// 64-bit file system and 32-bit uid calls
23// (386 default is 32-bit file system and 16-bit uid).
24//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
25//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64
26//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
27//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
28//sys Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) = SYS_FSTATAT64
29//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
30//sysnb Getegid() (egid int) = SYS_GETEGID32
31//sysnb Geteuid() (euid int) = SYS_GETEUID32
32//sysnb Getgid() (gid int) = SYS_GETGID32
33//sysnb Getuid() (uid int) = SYS_GETUID32
34//sys Ioperm(from int, num int, on int) (err error)
35//sys Iopl(level int) (err error)
36//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
37//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
38//sys pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
39//sys pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
40//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
41//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
42//sys setfsgid(gid int) (prev int, err error) = SYS_SETFSGID32
43//sys setfsuid(uid int) (prev int, err error) = SYS_SETFSUID32
44//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
45//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
46//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
47//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
48//sys Ustat(dev int, ubuf *Ustat_t) (err error)
49//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
50//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
51//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
52
53//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
54//sys Pause() (err error)
55
56func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {57page := uintptr(offset / 4096)58if offset != int64(page)*4096 {59return 0, EINVAL60}61return mmap2(addr, length, prot, flags, fd, page)62}
63
64type rlimit32 struct {65Cur uint3266Max uint3267}
68
69//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
70
71const rlimInf32 = ^uint32(0)72const rlimInf64 = ^uint64(0)73
74func Getrlimit(resource int, rlim *Rlimit) (err error) {75err = Prlimit(0, resource, nil, rlim)76if err != ENOSYS {77return err78}79
80rl := rlimit32{}81err = getrlimit(resource, &rl)82if err != nil {83return84}85
86if rl.Cur == rlimInf32 {87rlim.Cur = rlimInf6488} else {89rlim.Cur = uint64(rl.Cur)90}91
92if rl.Max == rlimInf32 {93rlim.Max = rlimInf6494} else {95rlim.Max = uint64(rl.Max)96}97return98}
99
100func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {101newoffset, errno := seek(fd, offset, whence)102if errno != 0 {103return 0, errno104}105return newoffset, nil106}
107
108//sys futimesat(dirfd int, path string, times *[2]Timeval) (err error)
109//sysnb Gettimeofday(tv *Timeval) (err error)
110//sysnb Time(t *Time_t) (tt Time_t, err error)
111//sys Utime(path string, buf *Utimbuf) (err error)
112//sys utimes(path string, times *[2]Timeval) (err error)
113
114// On x86 Linux, all the socket calls go through an extra indirection,
115// I think because the 5-register system call interface can't handle
116// the 6-argument calls like sendto and recvfrom. Instead the
117// arguments to the underlying system call are the number below
118// and a pointer to an array of uintptr. We hide the pointer in the
119// socketcall assembly to avoid allocation on every system call.
120
121const (122// see linux/net.h123_SOCKET = 1124_BIND = 2125_CONNECT = 3126_LISTEN = 4127_ACCEPT = 5128_GETSOCKNAME = 6129_GETPEERNAME = 7130_SOCKETPAIR = 8131_SEND = 9132_RECV = 10133_SENDTO = 11134_RECVFROM = 12135_SHUTDOWN = 13136_SETSOCKOPT = 14137_GETSOCKOPT = 15138_SENDMSG = 16139_RECVMSG = 17140_ACCEPT4 = 18141_RECVMMSG = 19142_SENDMMSG = 20143)
144
145func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {146fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)147if e != 0 {148err = e149}150return151}
152
153func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {154_, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)155if e != 0 {156err = e157}158return159}
160
161func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {162_, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)163if e != 0 {164err = e165}166return167}
168
169func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {170_, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)171if e != 0 {172err = e173}174return175}
176
177func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {178_, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)179if e != 0 {180err = e181}182return183}
184
185func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {186_, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)187if e != 0 {188err = e189}190return191}
192
193func socket(domain int, typ int, proto int) (fd int, err error) {194fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)195if e != 0 {196err = e197}198return199}
200
201func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {202_, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)203if e != 0 {204err = e205}206return207}
208
209func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {210_, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)211if e != 0 {212err = e213}214return215}
216
217func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {218var base uintptr219if len(p) > 0 {220base = uintptr(unsafe.Pointer(&p[0]))221}222n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))223if e != 0 {224err = e225}226return227}
228
229func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {230var base uintptr231if len(p) > 0 {232base = uintptr(unsafe.Pointer(&p[0]))233}234_, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))235if e != 0 {236err = e237}238return239}
240
241func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {242n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)243if e != 0 {244err = e245}246return247}
248
249func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {250n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)251if e != 0 {252err = e253}254return255}
256
257func Listen(s int, n int) (err error) {258_, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)259if e != 0 {260err = e261}262return263}
264
265func Shutdown(s, how int) (err error) {266_, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)267if e != 0 {268err = e269}270return271}
272
273func Fstatfs(fd int, buf *Statfs_t) (err error) {274_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))275if e != 0 {276err = e277}278return279}
280
281func Statfs(path string, buf *Statfs_t) (err error) {282pathp, err := BytePtrFromString(path)283if err != nil {284return err285}286_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))287if e != 0 {288err = e289}290return291}
292
293func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }294
295func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) }296
297func (iov *Iovec) SetLen(length int) {298iov.Len = uint32(length)299}
300
301func (msghdr *Msghdr) SetControllen(length int) {302msghdr.Controllen = uint32(length)303}
304
305func (msghdr *Msghdr) SetIovlen(length int) {306msghdr.Iovlen = uint32(length)307}
308
309func (cmsg *Cmsghdr) SetLen(length int) {310cmsg.Len = uint32(length)311}
312
313func (rsa *RawSockaddrNFCLLCP) SetServiceNameLen(length int) {314rsa.Service_name_len = uint32(length)315}
316