Home | History | Annotate | Download | only in syscall
      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 package syscall
      6 
      7 import "unsafe"
      8 
      9 const (
     10 	_SYS_dup       = SYS_DUP2
     11 	_SYS_setgroups = SYS_SETGROUPS32
     12 )
     13 
     14 func setTimespec(sec, nsec int64) Timespec {
     15 	return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
     16 }
     17 
     18 func setTimeval(sec, usec int64) Timeval {
     19 	return Timeval{Sec: int32(sec), Usec: int32(usec)}
     20 }
     21 
     22 func Pipe(p []int) (err error) {
     23 	if len(p) != 2 {
     24 		return EINVAL
     25 	}
     26 	var pp [2]_C_int
     27 	err = pipe2(&pp, 0)
     28 	p[0] = int(pp[0])
     29 	p[1] = int(pp[1])
     30 	return
     31 }
     32 
     33 //sysnb pipe2(p *[2]_C_int, flags int) (err error)
     34 
     35 func Pipe2(p []int, flags int) (err error) {
     36 	if len(p) != 2 {
     37 		return EINVAL
     38 	}
     39 	var pp [2]_C_int
     40 	err = pipe2(&pp, flags)
     41 	p[0] = int(pp[0])
     42 	p[1] = int(pp[1])
     43 	return
     44 }
     45 
     46 // Underlying system call writes to newoffset via pointer.
     47 // Implemented in assembly to avoid allocation.
     48 func seek(fd int, offset int64, whence int) (newoffset int64, err Errno)
     49 
     50 func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
     51 	newoffset, errno := seek(fd, offset, whence)
     52 	if errno != 0 {
     53 		return 0, errno
     54 	}
     55 	return newoffset, nil
     56 }
     57 
     58 //sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
     59 //sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
     60 //sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
     61 //sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
     62 //sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
     63 //sysnb	setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
     64 //sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
     65 //sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
     66 //sysnb	socket(domain int, typ int, proto int) (fd int, err error)
     67 //sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
     68 //sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
     69 //sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
     70 //sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
     71 //sysnb	socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
     72 //sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
     73 //sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
     74 
     75 // 64-bit file system and 32-bit uid calls
     76 // (16-bit uid calls are not always supported in newer kernels)
     77 //sys	Dup2(oldfd int, newfd int) (err error)
     78 //sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
     79 //sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
     80 //sysnb	Getegid() (egid int) = SYS_GETEGID32
     81 //sysnb	Geteuid() (euid int) = SYS_GETEUID32
     82 //sysnb	Getgid() (gid int) = SYS_GETGID32
     83 //sysnb	Getuid() (uid int) = SYS_GETUID32
     84 //sysnb	InotifyInit() (fd int, err error)
     85 //sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
     86 //sys	Listen(s int, n int) (err error)
     87 //sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
     88 //sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
     89 //sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
     90 //sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32
     91 //sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32
     92 //sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
     93 //sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
     94 //sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
     95 //sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
     96 //sys	Shutdown(fd int, how int) (err error)
     97 //sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
     98 //sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
     99 
    100 // Vsyscalls on amd64.
    101 //sysnb	Gettimeofday(tv *Timeval) (err error)
    102 //sysnb	Time(t *Time_t) (tt Time_t, err error)
    103 
    104 //sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
    105 //sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
    106 //sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
    107 //sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
    108 
    109 //sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
    110 
    111 func Fstatfs(fd int, buf *Statfs_t) (err error) {
    112 	_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
    113 	if e != 0 {
    114 		err = e
    115 	}
    116 	return
    117 }
    118 
    119 func Statfs(path string, buf *Statfs_t) (err error) {
    120 	pathp, err := BytePtrFromString(path)
    121 	if err != nil {
    122 		return err
    123 	}
    124 	_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
    125 	if e != 0 {
    126 		err = e
    127 	}
    128 	return
    129 }
    130 
    131 func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
    132 	page := uintptr(offset / 4096)
    133 	if offset != int64(page)*4096 {
    134 		return 0, EINVAL
    135 	}
    136 	return mmap2(addr, length, prot, flags, fd, page)
    137 }
    138 
    139 type rlimit32 struct {
    140 	Cur uint32
    141 	Max uint32
    142 }
    143 
    144 //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
    145 
    146 const rlimInf32 = ^uint32(0)
    147 const rlimInf64 = ^uint64(0)
    148 
    149 func Getrlimit(resource int, rlim *Rlimit) (err error) {
    150 	err = prlimit(0, resource, nil, rlim)
    151 	if err != ENOSYS {
    152 		return err
    153 	}
    154 
    155 	rl := rlimit32{}
    156 	err = getrlimit(resource, &rl)
    157 	if err != nil {
    158 		return
    159 	}
    160 
    161 	if rl.Cur == rlimInf32 {
    162 		rlim.Cur = rlimInf64
    163 	} else {
    164 		rlim.Cur = uint64(rl.Cur)
    165 	}
    166 
    167 	if rl.Max == rlimInf32 {
    168 		rlim.Max = rlimInf64
    169 	} else {
    170 		rlim.Max = uint64(rl.Max)
    171 	}
    172 	return
    173 }
    174 
    175 //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
    176 
    177 func Setrlimit(resource int, rlim *Rlimit) (err error) {
    178 	err = prlimit(0, resource, rlim, nil)
    179 	if err != ENOSYS {
    180 		return err
    181 	}
    182 
    183 	rl := rlimit32{}
    184 	if rlim.Cur == rlimInf64 {
    185 		rl.Cur = rlimInf32
    186 	} else if rlim.Cur < uint64(rlimInf32) {
    187 		rl.Cur = uint32(rlim.Cur)
    188 	} else {
    189 		return EINVAL
    190 	}
    191 	if rlim.Max == rlimInf64 {
    192 		rl.Max = rlimInf32
    193 	} else if rlim.Max < uint64(rlimInf32) {
    194 		rl.Max = uint32(rlim.Max)
    195 	} else {
    196 		return EINVAL
    197 	}
    198 
    199 	return setrlimit(resource, &rl)
    200 }
    201 
    202 func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
    203 
    204 func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
    205 
    206 func (iov *Iovec) SetLen(length int) {
    207 	iov.Len = uint32(length)
    208 }
    209 
    210 func (msghdr *Msghdr) SetControllen(length int) {
    211 	msghdr.Controllen = uint32(length)
    212 }
    213 
    214 func (cmsg *Cmsghdr) SetLen(length int) {
    215 	cmsg.Len = uint32(length)
    216 }
    217 
    218 func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno) {
    219 	panic("not implemented")
    220 }
    221