github.com/llvm-mirror/llgo@v0.0.0-20190322182713-bf6f0a60fce1/third_party/gofrontend/libgo/go/syscall/libcall_posix.go (about) 1 // Copyright 2011 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 // POSIX library calls. 6 // This file is compiled as ordinary Go code, 7 // but it is also input to mksyscall, 8 // which parses the //sys lines and generates library call stubs. 9 // Note that sometimes we use a lowercase //sys name and 10 // wrap it in our own nicer implementation. 11 12 package syscall 13 14 import "unsafe" 15 16 /* 17 * Wrapped 18 */ 19 20 //sysnb pipe(p *[2]_C_int) (err error) 21 //pipe(p *[2]_C_int) _C_int 22 func Pipe(p []int) (err error) { 23 if len(p) != 2 { 24 return EINVAL 25 } 26 var pp [2]_C_int 27 err = pipe(&pp) 28 p[0] = int(pp[0]) 29 p[1] = int(pp[1]) 30 return 31 } 32 33 //sys utimes(path string, times *[2]Timeval) (err error) 34 //utimes(path *byte, times *[2]Timeval) _C_int 35 func Utimes(path string, tv []Timeval) (err error) { 36 if len(tv) != 2 { 37 return EINVAL 38 } 39 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) 40 } 41 42 //sys getcwd(buf *byte, size Size_t) (err error) 43 //getcwd(buf *byte, size Size_t) *byte 44 45 const ImplementsGetwd = true 46 47 func Getwd() (ret string, err error) { 48 for len := Size_t(4096); ; len *= 2 { 49 b := make([]byte, len) 50 err := getcwd(&b[0], len) 51 if err == nil { 52 i := 0 53 for b[i] != 0 { 54 i++ 55 } 56 return string(b[0:i]), nil 57 } 58 if err != ERANGE { 59 return "", err 60 } 61 } 62 } 63 64 func Getcwd(buf []byte) (n int, err error) { 65 err = getcwd(&buf[0], Size_t(len(buf))) 66 if err == nil { 67 i := 0 68 for buf[i] != 0 { 69 i++ 70 } 71 n = i + 1 72 } 73 return 74 } 75 76 //sysnb getgroups(size int, list *Gid_t) (nn int, err error) 77 //getgroups(size _C_int, list *Gid_t) _C_int 78 79 func Getgroups() (gids []int, err error) { 80 n, err := getgroups(0, nil) 81 if err != nil { 82 return nil, err 83 } 84 if n == 0 { 85 return nil, nil 86 } 87 88 // Sanity check group count. Max is 1<<16 on GNU/Linux. 89 if n < 0 || n > 1<<20 { 90 return nil, EINVAL 91 } 92 93 a := make([]Gid_t, n) 94 n, err = getgroups(n, &a[0]) 95 if err != nil { 96 return nil, err 97 } 98 gids = make([]int, n) 99 for i, v := range a[0:n] { 100 gids[i] = int(v) 101 } 102 return 103 } 104 105 //sysnb setgroups(n int, list *Gid_t) (err error) 106 //setgroups(n Size_t, list *Gid_t) _C_int 107 108 func Setgroups(gids []int) (err error) { 109 if len(gids) == 0 { 110 return setgroups(0, nil) 111 } 112 113 a := make([]Gid_t, len(gids)) 114 for i, v := range gids { 115 a[i] = Gid_t(v) 116 } 117 return setgroups(len(a), &a[0]) 118 } 119 120 type WaitStatus uint32 121 122 // The WaitStatus methods are implemented in C, to pick up the macros 123 // #defines in <sys/wait.h>. 124 125 func (w WaitStatus) Exited() bool 126 func (w WaitStatus) Signaled() bool 127 func (w WaitStatus) Stopped() bool 128 func (w WaitStatus) Continued() bool 129 func (w WaitStatus) CoreDump() bool 130 func (w WaitStatus) ExitStatus() int 131 func (w WaitStatus) Signal() Signal 132 func (w WaitStatus) StopSignal() Signal 133 func (w WaitStatus) TrapCause() int 134 135 //sys Mkfifo(path string, mode uint32) (err error) 136 //mkfifo(path *byte, mode Mode_t) _C_int 137 138 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) 139 //select(nfd _C_int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) _C_int 140 141 const nfdbits = int(unsafe.Sizeof(fds_bits_type(0)) * 8) 142 143 type FdSet struct { 144 Bits [(FD_SETSIZE + nfdbits - 1) / nfdbits]fds_bits_type 145 } 146 147 func FDSet(fd int, set *FdSet) { 148 set.Bits[fd/nfdbits] |= (1 << (uint)(fd%nfdbits)) 149 } 150 151 func FDClr(fd int, set *FdSet) { 152 set.Bits[fd/nfdbits] &^= (1 << (uint)(fd%nfdbits)) 153 } 154 155 func FDIsSet(fd int, set *FdSet) bool { 156 if set.Bits[fd/nfdbits]&(1<<(uint)(fd%nfdbits)) != 0 { 157 return true 158 } else { 159 return false 160 } 161 } 162 163 func FDZero(set *FdSet) { 164 for i := range set.Bits { 165 set.Bits[i] = 0 166 } 167 } 168 169 //sys Access(path string, mode uint32) (err error) 170 //access(path *byte, mode _C_int) _C_int 171 172 //sys Chdir(path string) (err error) 173 //chdir(path *byte) _C_int 174 175 //sys Chmod(path string, mode uint32) (err error) 176 //chmod(path *byte, mode Mode_t) _C_int 177 178 //sys Chown(path string, uid int, gid int) (err error) 179 //chown(path *byte, uid Uid_t, gid Gid_t) _C_int 180 181 //sys Chroot(path string) (err error) 182 //chroot(path *byte) _C_int 183 184 //sys Close(fd int) (err error) 185 //close(fd _C_int) _C_int 186 187 //sys Creat(path string, mode uint32) (fd int, err error) 188 //creat(path *byte, mode Mode_t) _C_int 189 190 //sysnb Dup(oldfd int) (fd int, err error) 191 //dup(oldfd _C_int) _C_int 192 193 //sysnb Dup2(oldfd int, newfd int) (err error) 194 //dup2(oldfd _C_int, newfd _C_int) _C_int 195 196 //sys Exit(code int) 197 //exit(code _C_int) 198 199 //sys Fchdir(fd int) (err error) 200 //fchdir(fd _C_int) _C_int 201 202 //sys Fchmod(fd int, mode uint32) (err error) 203 //fchmod(fd _C_int, mode Mode_t) _C_int 204 205 //sys Fchown(fd int, uid int, gid int) (err error) 206 //fchown(fd _C_int, uid Uid_t, gid Gid_t) _C_int 207 208 //sys fcntl(fd int, cmd int, arg int) (val int, err error) 209 //__go_fcntl(fd _C_int, cmd _C_int, arg _C_int) _C_int 210 211 //sys FcntlFlock(fd uintptr, cmd int, lk *Flock_t) (err error) 212 //__go_fcntl_flock(fd _C_int, cmd _C_int, arg *Flock_t) _C_int 213 214 //sys Fdatasync(fd int) (err error) 215 //fdatasync(fd _C_int) _C_int 216 217 //sys Fsync(fd int) (err error) 218 //fsync(fd _C_int) _C_int 219 220 //sysnb Getegid() (egid int) 221 //getegid() Gid_t 222 223 //sysnb Geteuid() (euid int) 224 //geteuid() Uid_t 225 226 //sysnb Getgid() (gid int) 227 //getgid() Gid_t 228 229 //sysnb Getpagesize() (pagesize int) 230 //getpagesize() _C_int 231 232 //sysnb Getpgid(pid int) (pgid int, err error) 233 //getpgid(pid Pid_t) Pid_t 234 235 //sysnb Getpgrp() (pid int) 236 //getpgrp() Pid_t 237 238 //sysnb Getpid() (pid int) 239 //getpid() Pid_t 240 241 //sysnb Getppid() (ppid int) 242 //getppid() Pid_t 243 244 //sys Getpriority(which int, who int) (prio int, err error) 245 //getpriority(which _C_int, who _C_int) _C_int 246 247 //sysnb Getrusage(who int, rusage *Rusage) (err error) 248 //getrusage(who _C_int, rusage *Rusage) _C_int 249 250 //sysnb gettimeofday(tv *Timeval, tz *byte) (err error) 251 //gettimeofday(tv *Timeval, tz *byte) _C_int 252 func Gettimeofday(tv *Timeval) (err error) { 253 return gettimeofday(tv, nil) 254 } 255 256 //sysnb Getuid() (uid int) 257 //getuid() Uid_t 258 259 //sysnb Kill(pid int, sig Signal) (err error) 260 //kill(pid Pid_t, sig _C_int) _C_int 261 262 //sys Lchown(path string, uid int, gid int) (err error) 263 //lchown(path *byte, uid Uid_t, gid Gid_t) _C_int 264 265 //sys Link(oldpath string, newpath string) (err error) 266 //link(oldpath *byte, newpath *byte) _C_int 267 268 //sys Mkdir(path string, mode uint32) (err error) 269 //mkdir(path *byte, mode Mode_t) _C_int 270 271 //sys Mknod(path string, mode uint32, dev int) (err error) 272 //mknod(path *byte, mode Mode_t, dev _dev_t) _C_int 273 274 //sys Mount(source string, target string, fstype string, flags uintptr, data string) (err error) 275 //mount(source *byte, target *byte, fstype *byte, flags _C_long, data *byte) _C_int 276 277 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 278 //nanosleep(time *Timespec, leftover *Timespec) _C_int 279 280 //sys Pause() (err error) 281 //pause() _C_int 282 283 //sys read(fd int, p []byte) (n int, err error) 284 //read(fd _C_int, buf *byte, count Size_t) Ssize_t 285 286 //sys readlen(fd int, p *byte, np int) (n int, err error) 287 //read(fd _C_int, buf *byte, count Size_t) Ssize_t 288 289 //sys Readlink(path string, buf []byte) (n int, err error) 290 //readlink(path *byte, buf *byte, bufsiz Size_t) Ssize_t 291 292 //sys Rename(oldpath string, newpath string) (err error) 293 //rename(oldpath *byte, newpath *byte) _C_int 294 295 //sys Rmdir(path string) (err error) 296 //rmdir(path *byte) _C_int 297 298 //sys Setdomainname(p []byte) (err error) 299 //setdomainname(name *byte, len Size_t) _C_int 300 301 //sys Sethostname(p []byte) (err error) 302 //sethostname(name *byte, len Size_t) _C_int 303 304 //sysnb Setgid(gid int) (err error) 305 //setgid(gid Gid_t) _C_int 306 307 //sysnb Setregid(rgid int, egid int) (err error) 308 //setregid(rgid Gid_t, egid Gid_t) _C_int 309 310 //sysnb Setpgid(pid int, pgid int) (err error) 311 //setpgid(pid Pid_t, pgid Pid_t) _C_int 312 313 //sys Setpriority(which int, who int, prio int) (err error) 314 //setpriority(which _C_int, who _C_int, prio _C_int) _C_int 315 316 //sysnb Setreuid(ruid int, euid int) (err error) 317 //setreuid(ruid Uid_t, euid Uid_t) _C_int 318 319 //sysnb Setsid() (pid int, err error) 320 //setsid() Pid_t 321 322 //sysnb settimeofday(tv *Timeval, tz *byte) (err error) 323 //settimeofday(tv *Timeval, tz *byte) _C_int 324 325 func Settimeofday(tv *Timeval) (err error) { 326 return settimeofday(tv, nil) 327 } 328 329 //sysnb Setuid(uid int) (err error) 330 //setuid(uid Uid_t) _C_int 331 332 //sys Symlink(oldpath string, newpath string) (err error) 333 //symlink(oldpath *byte, newpath *byte) _C_int 334 335 //sys Sync() 336 //sync() 337 338 //sysnb Time(t *Time_t) (tt Time_t, err error) 339 //time(t *Time_t) Time_t 340 341 //sysnb Times(tms *Tms) (ticks uintptr, err error) 342 //times(tms *Tms) _clock_t 343 344 //sysnb Umask(mask int) (oldmask int) 345 //umask(mask Mode_t) Mode_t 346 347 //sys Unlink(path string) (err error) 348 //unlink(path *byte) _C_int 349 350 //sys Utime(path string, buf *Utimbuf) (err error) 351 //utime(path *byte, buf *Utimbuf) _C_int 352 353 //sys write(fd int, p []byte) (n int, err error) 354 //write(fd _C_int, buf *byte, count Size_t) Ssize_t 355 356 //sys writelen(fd int, p *byte, np int) (n int, err error) 357 //write(fd _C_int, buf *byte, count Size_t) Ssize_t 358 359 //sys munmap(addr uintptr, length uintptr) (err error) 360 //munmap(addr *byte, length Size_t) _C_int 361 362 //sys Madvise(b []byte, advice int) (err error) 363 //madvise(addr *byte, len Size_t, advice _C_int) _C_int 364 365 //sys Mprotect(b []byte, prot int) (err error) 366 //mprotect(addr *byte, len Size_t, prot _C_int) _C_int 367 368 //sys Mlock(b []byte) (err error) 369 //mlock(addr *byte, len Size_t) _C_int 370 371 //sys Munlock(b []byte) (err error) 372 //munlock(addr *byte, len Size_t) _C_int 373 374 //sys Mlockall(flags int) (err error) 375 //mlockall(flags _C_int) _C_int 376 377 //sys Munlockall() (err error) 378 //munlockall() _C_int 379 380 func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } 381 382 func NsecToTimespec(nsec int64) (ts Timespec) { 383 ts.Sec = Timespec_sec_t(nsec / 1e9) 384 ts.Nsec = Timespec_nsec_t(nsec % 1e9) 385 return 386 } 387 388 func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } 389 390 func NsecToTimeval(nsec int64) (tv Timeval) { 391 nsec += 999 // round up to microsecond 392 tv.Sec = Timeval_sec_t(nsec / 1e9) 393 tv.Usec = Timeval_usec_t(nsec % 1e9 / 1e3) 394 return 395 } 396 397 //sysnb Tcgetattr(fd int, p *Termios) (err error) 398 //tcgetattr(fd _C_int, p *Termios) _C_int 399 400 //sys Tcsetattr(fd int, actions int, p *Termios) (err error) 401 //tcsetattr(fd _C_int, actions _C_int, p *Termios) _C_int