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