modernc.org/libc@v1.24.1/libc_darwin.go (about)

     1  // Copyright 2020 The Libc 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 libc // import "modernc.org/libc"
     6  
     7  import (
     8  	crand "crypto/rand"
     9  	"encoding/hex"
    10  	"fmt"
    11  	"io"
    12  	"os"
    13  	"os/exec"
    14  	gosignal "os/signal"
    15  	"path/filepath"
    16  	"runtime"
    17  	"strings"
    18  	"syscall"
    19  	gotime "time"
    20  	"unicode"
    21  	"unsafe"
    22  
    23  	guuid "github.com/google/uuid"
    24  	"golang.org/x/sys/unix"
    25  	"modernc.org/libc/errno"
    26  	"modernc.org/libc/fcntl"
    27  	"modernc.org/libc/fts"
    28  	gonetdb "modernc.org/libc/honnef.co/go/netdb"
    29  	"modernc.org/libc/langinfo"
    30  	"modernc.org/libc/limits"
    31  	"modernc.org/libc/netdb"
    32  	"modernc.org/libc/netinet/in"
    33  	"modernc.org/libc/signal"
    34  	"modernc.org/libc/stdio"
    35  	"modernc.org/libc/sys/socket"
    36  	"modernc.org/libc/sys/stat"
    37  	"modernc.org/libc/sys/types"
    38  	"modernc.org/libc/termios"
    39  	"modernc.org/libc/time"
    40  	"modernc.org/libc/unistd"
    41  	"modernc.org/libc/uuid/uuid"
    42  	"modernc.org/libc/wctype"
    43  )
    44  
    45  const (
    46  	maxPathLen = 1024
    47  )
    48  
    49  // var (
    50  // 	in6_addr_any in.In6_addr
    51  // )
    52  
    53  type (
    54  	long  = types.User_long_t
    55  	ulong = types.User_ulong_t
    56  )
    57  
    58  // // Keep these outside of the var block otherwise go generate will miss them.
    59  var X__stderrp = Xstdout
    60  var X__stdinp = Xstdin
    61  var X__stdoutp = Xstdout
    62  
    63  // user@darwin-m1:~/tmp$ cat main.c
    64  //
    65  //	#include <xlocale.h>
    66  //	#include <stdio.h>
    67  //
    68  //	int main() {
    69  //		printf("%i\n", ___mb_cur_max());
    70  //		return 0;
    71  //	}
    72  //
    73  // user@darwin-m1:~/tmp$ gcc main.c && ./a.out
    74  // 1
    75  // user@darwin-m1:~/tmp$
    76  var X__mb_cur_max int32 = 1
    77  
    78  var startTime = gotime.Now() // For clock(3)
    79  
    80  type file uintptr
    81  
    82  func (f file) fd() int32      { return int32((*stdio.FILE)(unsafe.Pointer(f)).F_file) }
    83  func (f file) setFd(fd int32) { (*stdio.FILE)(unsafe.Pointer(f)).F_file = int16(fd) }
    84  
    85  func (f file) err() bool {
    86  	return (*stdio.FILE)(unsafe.Pointer(f)).F_flags&1 != 0
    87  }
    88  
    89  func (f file) setErr() {
    90  	(*stdio.FILE)(unsafe.Pointer(f)).F_flags |= 1
    91  }
    92  
    93  func (f file) close(t *TLS) int32 {
    94  	r := Xclose(t, f.fd())
    95  	Xfree(t, uintptr(f))
    96  	if r < 0 {
    97  		return stdio.EOF
    98  	}
    99  
   100  	return 0
   101  }
   102  
   103  func newFile(t *TLS, fd int32) uintptr {
   104  	p := Xcalloc(t, 1, types.Size_t(unsafe.Sizeof(stdio.FILE{})))
   105  	if p == 0 {
   106  		return 0
   107  	}
   108  
   109  	file(p).setFd(fd)
   110  	return p
   111  }
   112  
   113  func fwrite(fd int32, b []byte) (int, error) {
   114  	if fd == unistd.STDOUT_FILENO {
   115  		return write(b)
   116  	}
   117  
   118  	if dmesgs {
   119  		dmesg("%v: fd %v: %s", origin(1), fd, hex.Dump(b))
   120  	}
   121  	return unix.Write(int(fd), b)
   122  }
   123  
   124  func X__inline_isnand(t *TLS, x float64) int32 { return Xisnan(t, x) }
   125  func X__inline_isnanf(t *TLS, x float32) int32 { return Xisnanf(t, x) }
   126  func X__inline_isnanl(t *TLS, x float64) int32 { return Xisnan(t, x) }
   127  
   128  // int fprintf(FILE *stream, const char *format, ...);
   129  func Xfprintf(t *TLS, stream, format, args uintptr) int32 {
   130  	n, _ := fwrite(int32((*stdio.FILE)(unsafe.Pointer(stream)).F_file), printf(format, args))
   131  	return int32(n)
   132  }
   133  
   134  // int usleep(useconds_t usec);
   135  func Xusleep(t *TLS, usec types.Useconds_t) int32 {
   136  	gotime.Sleep(gotime.Microsecond * gotime.Duration(usec))
   137  	return 0
   138  }
   139  
   140  // int futimes(int fd, const struct timeval tv[2]);
   141  func Xfutimes(t *TLS, fd int32, tv uintptr) int32 {
   142  	var a []unix.Timeval
   143  	if tv != 0 {
   144  		a = make([]unix.Timeval, 2)
   145  		a[0] = *(*unix.Timeval)(unsafe.Pointer(tv))
   146  		a[1] = *(*unix.Timeval)(unsafe.Pointer(tv + unsafe.Sizeof(unix.Timeval{})))
   147  	}
   148  	if err := unix.Futimes(int(fd), a); err != nil {
   149  		if dmesgs {
   150  			dmesg("%v: %v FAIL", origin(1), err)
   151  		}
   152  		t.setErrno(err)
   153  		return -1
   154  	}
   155  
   156  	if dmesgs {
   157  		dmesg("%v: ok", origin(1))
   158  	}
   159  	return 0
   160  }
   161  
   162  // void srandomdev(void);
   163  func Xsrandomdev(t *TLS) {
   164  	panic(todo(""))
   165  }
   166  
   167  // int gethostuuid(uuid_t id, const struct timespec *wait);
   168  func Xgethostuuid(t *TLS, id uintptr, wait uintptr) int32 {
   169  	if _, _, err := unix.Syscall(unix.SYS_GETHOSTUUID, id, wait, 0); err != 0 { // Cannot avoid the syscall here.
   170  		if dmesgs {
   171  			dmesg("%v: %v FAIL", origin(1), err)
   172  		}
   173  		t.setErrno(err)
   174  		return -1
   175  	}
   176  
   177  	if dmesgs {
   178  		dmesg("%v: ok", origin(1))
   179  	}
   180  	return 0
   181  }
   182  
   183  // int flock(int fd, int operation);
   184  func Xflock(t *TLS, fd, operation int32) int32 {
   185  	if err := unix.Flock(int(fd), int(operation)); err != nil {
   186  		if dmesgs {
   187  			dmesg("%v: %v FAIL", origin(1), err)
   188  		}
   189  		t.setErrno(err)
   190  		return -1
   191  	}
   192  
   193  	if dmesgs {
   194  		dmesg("%v: ok", origin(1))
   195  	}
   196  	return 0
   197  }
   198  
   199  // int fsctl(const char *,unsigned long,void*,unsigned int);
   200  func Xfsctl(t *TLS, path uintptr, request ulong, data uintptr, options uint32) int32 {
   201  	panic(todo(""))
   202  	// if _, _, err := unix.Syscall6(unix.SYS_FSCTL, path, uintptr(request), data, uintptr(options), 0, 0); err != 0 {
   203  	// 	t.setErrno(err)
   204  	// 	return -1
   205  	// }
   206  
   207  	// return 0
   208  }
   209  
   210  // int * __error(void);
   211  func X__error(t *TLS) uintptr {
   212  	return t.errnop
   213  }
   214  
   215  // int isspace(int c);
   216  func Xisspace(t *TLS, c int32) int32 {
   217  	return __isspace(t, c)
   218  }
   219  
   220  // void __assert_rtn(const char *, const char *, int, const char *)
   221  func X__assert_rtn(t *TLS, function, file uintptr, line int32, assertion uintptr) {
   222  	panic(todo(""))
   223  	// fmt.Fprintf(os.Stderr, "assertion failure: %s:%d.%s: %s\n", GoString(file), line, GoString(function), GoString(assertion))
   224  	// os.Stderr.Sync()
   225  	// Xexit(t, 1)
   226  }
   227  
   228  // int getrusage(int who, struct rusage *usage);
   229  func Xgetrusage(t *TLS, who int32, usage uintptr) int32 {
   230  	panic(todo(""))
   231  	// if _, _, err := unix.Syscall(unix.SYS_GETRUSAGE, uintptr(who), usage, 0); err != 0 {
   232  	// 	t.setErrno(err)
   233  	// 	return -1
   234  	// }
   235  
   236  	// return 0
   237  }
   238  
   239  // int fgetc(FILE *stream);
   240  func Xfgetc(t *TLS, stream uintptr) int32 {
   241  	fd := int((*stdio.FILE)(unsafe.Pointer(stream)).F_file)
   242  	var buf [1]byte
   243  	if n, _ := unix.Read(fd, buf[:]); n != 0 {
   244  		return int32(buf[0])
   245  	}
   246  
   247  	return stdio.EOF
   248  }
   249  
   250  // int lstat(const char *pathname, struct stat *statbuf);
   251  func Xlstat(t *TLS, pathname, statbuf uintptr) int32 {
   252  	return Xlstat64(t, pathname, statbuf)
   253  }
   254  
   255  // int stat(const char *pathname, struct stat *statbuf);
   256  func Xstat(t *TLS, pathname, statbuf uintptr) int32 {
   257  	return Xstat64(t, pathname, statbuf)
   258  }
   259  
   260  // int chdir(const char *path);
   261  func Xchdir(t *TLS, path uintptr) int32 {
   262  	if err := unix.Chdir(GoString(path)); err != nil {
   263  		if dmesgs {
   264  			dmesg("%v: %q: %v FAIL", origin(1), GoString(path), err)
   265  		}
   266  		t.setErrno(err)
   267  		return -1
   268  	}
   269  
   270  	if dmesgs {
   271  		dmesg("%v: %q: ok", origin(1), GoString(path))
   272  	}
   273  	return 0
   274  }
   275  
   276  var localtime time.Tm
   277  
   278  // struct tm *localtime(const time_t *timep);
   279  func Xlocaltime(_ *TLS, timep uintptr) uintptr {
   280  	loc := getLocalLocation()
   281  	ut := *(*time.Time_t)(unsafe.Pointer(timep))
   282  	t := gotime.Unix(int64(ut), 0).In(loc)
   283  	localtime.Ftm_sec = int32(t.Second())
   284  	localtime.Ftm_min = int32(t.Minute())
   285  	localtime.Ftm_hour = int32(t.Hour())
   286  	localtime.Ftm_mday = int32(t.Day())
   287  	localtime.Ftm_mon = int32(t.Month() - 1)
   288  	localtime.Ftm_year = int32(t.Year() - 1900)
   289  	localtime.Ftm_wday = int32(t.Weekday())
   290  	localtime.Ftm_yday = int32(t.YearDay())
   291  	localtime.Ftm_isdst = Bool32(isTimeDST(t))
   292  	return uintptr(unsafe.Pointer(&localtime))
   293  }
   294  
   295  // struct tm *localtime_r(const time_t *timep, struct tm *result);
   296  func Xlocaltime_r(_ *TLS, timep, result uintptr) uintptr {
   297  	loc := getLocalLocation()
   298  	ut := *(*time_t)(unsafe.Pointer(timep))
   299  	t := gotime.Unix(int64(ut), 0).In(loc)
   300  	(*time.Tm)(unsafe.Pointer(result)).Ftm_sec = int32(t.Second())
   301  	(*time.Tm)(unsafe.Pointer(result)).Ftm_min = int32(t.Minute())
   302  	(*time.Tm)(unsafe.Pointer(result)).Ftm_hour = int32(t.Hour())
   303  	(*time.Tm)(unsafe.Pointer(result)).Ftm_mday = int32(t.Day())
   304  	(*time.Tm)(unsafe.Pointer(result)).Ftm_mon = int32(t.Month() - 1)
   305  	(*time.Tm)(unsafe.Pointer(result)).Ftm_year = int32(t.Year() - 1900)
   306  	(*time.Tm)(unsafe.Pointer(result)).Ftm_wday = int32(t.Weekday())
   307  	(*time.Tm)(unsafe.Pointer(result)).Ftm_yday = int32(t.YearDay())
   308  	(*time.Tm)(unsafe.Pointer(result)).Ftm_isdst = Bool32(isTimeDST(t))
   309  	return result
   310  }
   311  
   312  // int open(const char *pathname, int flags, ...);
   313  func Xopen(t *TLS, pathname uintptr, flags int32, args uintptr) int32 {
   314  	var mode types.Mode_t
   315  	if args != 0 {
   316  		mode = (types.Mode_t)(VaUint32(&args))
   317  	}
   318  	fd, err := unix.Open(GoString(pathname), int(flags), uint32(mode))
   319  	if err != nil {
   320  		if dmesgs {
   321  			dmesg("%v: %q %#x %#o: %v FAIL", origin(1), GoString(pathname), flags, mode, err)
   322  		}
   323  		t.setErrno(err)
   324  		return -1
   325  	}
   326  
   327  	if dmesgs {
   328  		dmesg("%v: %q flags %#x mode %#o: fd %v", origin(1), GoString(pathname), flags, mode, fd)
   329  	}
   330  	return int32(fd)
   331  }
   332  
   333  // off_t lseek(int fd, off_t offset, int whence);
   334  func Xlseek(t *TLS, fd int32, offset types.Off_t, whence int32) types.Off_t {
   335  	return types.Off_t(Xlseek64(t, fd, offset, whence))
   336  }
   337  
   338  func whenceStr(whence int32) string {
   339  	switch whence {
   340  	case fcntl.SEEK_CUR:
   341  		return "SEEK_CUR"
   342  	case fcntl.SEEK_END:
   343  		return "SEEK_END"
   344  	case fcntl.SEEK_SET:
   345  		return "SEEK_SET"
   346  	default:
   347  		return fmt.Sprintf("whence(%d)", whence)
   348  	}
   349  }
   350  
   351  var fsyncStatbuf stat.Stat
   352  
   353  // int fsync(int fd);
   354  func Xfsync(t *TLS, fd int32) int32 {
   355  	if noFsync {
   356  		// Simulate -DSQLITE_NO_SYNC for sqlite3 testfixture, see function full_sync in sqlite3.c
   357  		return Xfstat(t, fd, uintptr(unsafe.Pointer(&fsyncStatbuf)))
   358  	}
   359  
   360  	if err := unix.Fsync(int(fd)); err != nil {
   361  		if dmesgs {
   362  			dmesg("%v: %v: %v FAIL", origin(1), fd, err)
   363  		}
   364  		t.setErrno(err)
   365  		return -1
   366  	}
   367  
   368  	if dmesgs {
   369  		dmesg("%v: %d: ok", origin(1), fd)
   370  	}
   371  	return 0
   372  }
   373  
   374  // long sysconf(int name);
   375  func Xsysconf(t *TLS, name int32) long {
   376  	switch name {
   377  	case unistd.X_SC_PAGESIZE:
   378  		return long(unix.Getpagesize())
   379  	case unistd.X_SC_NPROCESSORS_ONLN:
   380  		return long(runtime.NumCPU())
   381  	}
   382  
   383  	panic(todo(""))
   384  }
   385  
   386  // int close(int fd);
   387  func Xclose(t *TLS, fd int32) int32 {
   388  	if err := unix.Close(int(fd)); err != nil {
   389  		if dmesgs {
   390  			dmesg("%v: %v FAIL", origin(1), err)
   391  		}
   392  		t.setErrno(err)
   393  		return -1
   394  	}
   395  
   396  	if dmesgs {
   397  		dmesg("%v: %d: ok", origin(1), fd)
   398  	}
   399  	return 0
   400  }
   401  
   402  // char *getcwd(char *buf, size_t size);
   403  func Xgetcwd(t *TLS, buf uintptr, size types.Size_t) uintptr {
   404  	if _, err := unix.Getcwd((*RawMem)(unsafe.Pointer(buf))[:size:size]); err != nil {
   405  		if dmesgs {
   406  			dmesg("%v: %v FAIL", origin(1), err)
   407  		}
   408  		t.setErrno(err)
   409  		return 0
   410  	}
   411  
   412  	if dmesgs {
   413  		dmesg("%v: ok", origin(1))
   414  	}
   415  	return buf
   416  }
   417  
   418  // int fstat(int fd, struct stat *statbuf);
   419  func Xfstat(t *TLS, fd int32, statbuf uintptr) int32 {
   420  	return Xfstat64(t, fd, statbuf)
   421  }
   422  
   423  // int ftruncate(int fd, off_t length);
   424  func Xftruncate(t *TLS, fd int32, length types.Off_t) int32 {
   425  	if err := unix.Ftruncate(int(fd), int64(length)); err != nil {
   426  		if dmesgs {
   427  			dmesg("%v: fd %d: %v FAIL", origin(1), fd, err)
   428  		}
   429  		t.setErrno(err)
   430  		return -1
   431  	}
   432  
   433  	if dmesgs {
   434  		dmesg("%v: %d %#x: ok", origin(1), fd, length)
   435  	}
   436  	return 0
   437  }
   438  
   439  // int fcntl(int fd, int cmd, ... /* arg */ );
   440  func Xfcntl(t *TLS, fd, cmd int32, args uintptr) int32 {
   441  	return Xfcntl64(t, fd, cmd, args)
   442  }
   443  
   444  // ssize_t read(int fd, void *buf, size_t count);
   445  func Xread(t *TLS, fd int32, buf uintptr, count types.Size_t) types.Ssize_t {
   446  	var n int
   447  	var err error
   448  	switch {
   449  	case count == 0:
   450  		n, err = unix.Read(int(fd), nil)
   451  	default:
   452  		n, err = unix.Read(int(fd), (*RawMem)(unsafe.Pointer(buf))[:count:count])
   453  		if dmesgs && err == nil {
   454  			dmesg("%v: fd %v, count %#x, n %#x\n%s", origin(1), fd, count, n, hex.Dump((*RawMem)(unsafe.Pointer(buf))[:n:n]))
   455  		}
   456  	}
   457  	if err != nil {
   458  		if dmesgs {
   459  			dmesg("%v: fd %v, %v FAIL", origin(1), fd, err)
   460  		}
   461  		t.setErrno(err)
   462  		return -1
   463  	}
   464  
   465  	if dmesgs {
   466  		dmesg("%v: ok", origin(1))
   467  	}
   468  	return types.Ssize_t(n)
   469  }
   470  
   471  // ssize_t write(int fd, const void *buf, size_t count);
   472  func Xwrite(t *TLS, fd int32, buf uintptr, count types.Size_t) types.Ssize_t {
   473  	var n int
   474  	var err error
   475  	switch {
   476  	case count == 0:
   477  		n, err = unix.Write(int(fd), nil)
   478  	default:
   479  		n, err = unix.Write(int(fd), (*RawMem)(unsafe.Pointer(buf))[:count:count])
   480  		if dmesgs {
   481  			dmesg("%v: fd %v, count %#x\n%s", origin(1), fd, count, hex.Dump((*RawMem)(unsafe.Pointer(buf))[:count:count]))
   482  		}
   483  	}
   484  	if err != nil {
   485  		if dmesgs {
   486  			dmesg("%v: %v FAIL", origin(1), err)
   487  		}
   488  		t.setErrno(err)
   489  		return -1
   490  	}
   491  
   492  	if dmesgs {
   493  		dmesg("%v: ok", origin(1))
   494  	}
   495  	return types.Ssize_t(n)
   496  }
   497  
   498  // int fchmod(int fd, mode_t mode);
   499  func Xfchmod(t *TLS, fd int32, mode types.Mode_t) int32 {
   500  	if err := unix.Fchmod(int(fd), uint32(mode)); err != nil {
   501  		if dmesgs {
   502  			dmesg("%v: %d %#o: %v FAIL", origin(1), fd, mode, err)
   503  		}
   504  		t.setErrno(err)
   505  		return -1
   506  	}
   507  
   508  	if dmesgs {
   509  		dmesg("%v: %d %#o: ok", origin(1), fd, mode)
   510  	}
   511  	return 0
   512  }
   513  
   514  // int fchown(int fd, uid_t owner, gid_t group);
   515  func Xfchown(t *TLS, fd int32, owner types.Uid_t, group types.Gid_t) int32 {
   516  	if _, _, err := unix.Syscall(unix.SYS_FCHOWN, uintptr(fd), uintptr(owner), uintptr(group)); err != 0 {
   517  		t.setErrno(err)
   518  		return -1
   519  	}
   520  
   521  	return 0
   522  }
   523  
   524  // uid_t geteuid(void);
   525  func Xgeteuid(t *TLS) types.Uid_t {
   526  	r := types.Uid_t(unix.Geteuid())
   527  	if dmesgs {
   528  		dmesg("%v: %v", origin(1), r)
   529  	}
   530  	return r
   531  }
   532  
   533  // void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
   534  func Xmmap(t *TLS, addr uintptr, length types.Size_t, prot, flags, fd int32, offset types.Off_t) uintptr {
   535  	// Cannot avoid the syscall here, addr sometimes matter.
   536  	data, _, err := unix.Syscall6(unix.SYS_MMAP, addr, uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset))
   537  	if err != 0 {
   538  		if dmesgs {
   539  			dmesg("%v: %v FAIL", origin(1), err)
   540  		}
   541  		t.setErrno(err)
   542  		return ^uintptr(0) // (void*)-1
   543  	}
   544  
   545  	if dmesgs {
   546  		dmesg("%v: %#x", origin(1), data)
   547  	}
   548  	return data
   549  }
   550  
   551  // int munmap(void *addr, size_t length);
   552  func Xmunmap(t *TLS, addr uintptr, length types.Size_t) int32 {
   553  	if _, _, err := unix.Syscall(unix.SYS_MUNMAP, addr, uintptr(length), 0); err != 0 { // Cannot avoid the syscall here, must pair with mmap.
   554  		if dmesgs {
   555  			dmesg("%v: %v FAIL", origin(1), err)
   556  		}
   557  		t.setErrno(err)
   558  		return -1
   559  	}
   560  
   561  	return 0
   562  }
   563  
   564  // int gettimeofday(struct timeval *tv, struct timezone *tz);
   565  func Xgettimeofday(t *TLS, tv, tz uintptr) int32 {
   566  	if tz != 0 {
   567  		panic(todo(""))
   568  	}
   569  
   570  	var tvs unix.Timeval
   571  	err := unix.Gettimeofday(&tvs)
   572  	if err != nil {
   573  		if dmesgs {
   574  			dmesg("%v: %v FAIL", origin(1), err)
   575  		}
   576  		t.setErrno(err)
   577  		return -1
   578  	}
   579  
   580  	*(*unix.Timeval)(unsafe.Pointer(tv)) = tvs
   581  	return 0
   582  }
   583  
   584  // int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
   585  func Xgetsockopt(t *TLS, sockfd, level, optname int32, optval, optlen uintptr) int32 {
   586  	if _, _, err := unix.Syscall6(unix.SYS_GETSOCKOPT, uintptr(sockfd), uintptr(level), uintptr(optname), optval, optlen, 0); err != 0 {
   587  		t.setErrno(err)
   588  		return -1
   589  	}
   590  
   591  	return 0
   592  }
   593  
   594  // int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
   595  func Xsetsockopt(t *TLS, sockfd, level, optname int32, optval uintptr, optlen socket.Socklen_t) int32 {
   596  	if _, _, err := unix.Syscall6(unix.SYS_SETSOCKOPT, uintptr(sockfd), uintptr(level), uintptr(optname), optval, uintptr(optlen), 0); err != 0 {
   597  		t.setErrno(err)
   598  		return -1
   599  	}
   600  
   601  	return 0
   602  }
   603  
   604  // int ioctl(int fd, unsigned long request, ...);
   605  func Xioctl(t *TLS, fd int32, request ulong, va uintptr) int32 {
   606  	var argp uintptr
   607  	if va != 0 {
   608  		argp = VaUintptr(&va)
   609  	}
   610  	n, _, err := unix.Syscall(unix.SYS_IOCTL, uintptr(fd), uintptr(request), argp)
   611  	if err != 0 {
   612  		t.setErrno(err)
   613  		return -1
   614  	}
   615  
   616  	return int32(n)
   617  }
   618  
   619  // int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
   620  func Xgetsockname(t *TLS, sockfd int32, addr, addrlen uintptr) int32 {
   621  	if _, _, err := unix.Syscall(unix.SYS_GETSOCKNAME, uintptr(sockfd), addr, addrlen); err != 0 { // Cannot avoid the syscall here.
   622  		if dmesgs {
   623  			dmesg("%v: fd %v: %v FAIL", origin(1), sockfd, err)
   624  		}
   625  		t.setErrno(err)
   626  		return -1
   627  	}
   628  
   629  	if dmesgs {
   630  		dmesg("%v: fd %v: ok", origin(1), sockfd)
   631  	}
   632  	return 0
   633  }
   634  
   635  // int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
   636  func Xselect(t *TLS, nfds int32, readfds, writefds, exceptfds, timeout uintptr) int32 {
   637  	n, err := unix.Select(
   638  		int(nfds),
   639  		(*unix.FdSet)(unsafe.Pointer(readfds)),
   640  		(*unix.FdSet)(unsafe.Pointer(writefds)),
   641  		(*unix.FdSet)(unsafe.Pointer(exceptfds)),
   642  		(*unix.Timeval)(unsafe.Pointer(timeout)),
   643  	)
   644  	if err != nil {
   645  		if dmesgs {
   646  			dmesg("%v: %v FAIL", origin(1), err)
   647  		}
   648  		t.setErrno(err)
   649  		return -1
   650  	}
   651  
   652  	if dmesgs {
   653  		dmesg("%v: ok", origin(1))
   654  	}
   655  	return int32(n)
   656  }
   657  
   658  // int mkfifo(const char *pathname, mode_t mode);
   659  func Xmkfifo(t *TLS, pathname uintptr, mode types.Mode_t) int32 {
   660  	if err := unix.Mkfifo(GoString(pathname), uint32(mode)); err != nil {
   661  		t.setErrno(err)
   662  		return -1
   663  	}
   664  
   665  	return 0
   666  }
   667  
   668  // mode_t umask(mode_t mask);
   669  func Xumask(t *TLS, mask types.Mode_t) types.Mode_t {
   670  	return types.Mode_t(unix.Umask(int(mask)))
   671  }
   672  
   673  // // int execvp(const char *file, char *const argv[]);
   674  // func Xexecvp(t *TLS, file, argv uintptr) int32 {
   675  // 	if _, _, err := unix.Syscall(unix.SYS_EXECVE, file, argv, Environ()); err != 0 {
   676  // 		t.setErrno(err)
   677  // 		return -1
   678  // 	}
   679  //
   680  // 	return 0
   681  // }
   682  
   683  // pid_t (pid_t pid, int *wstatus, int options);
   684  func Xwaitpid(t *TLS, pid types.Pid_t, wstatus uintptr, optname int32) types.Pid_t {
   685  	n, err := unix.Wait4(int(pid), (*unix.WaitStatus)(unsafe.Pointer(wstatus)), int(optname), nil)
   686  	if err != nil {
   687  		if dmesgs {
   688  			dmesg("%v: %v FAIL", origin(1), err)
   689  		}
   690  		t.setErrno(err)
   691  		return -1
   692  	}
   693  
   694  	if dmesgs {
   695  		dmesg("%v: ok", origin(1))
   696  	}
   697  	return types.Pid_t(n)
   698  }
   699  
   700  // int uname(struct utsname *buf);
   701  func Xuname(t *TLS, buf uintptr) int32 {
   702  	if err := unix.Uname((*unix.Utsname)(unsafe.Pointer(buf))); err != nil {
   703  		if dmesgs {
   704  			dmesg("%v: %v FAIL", origin(1), err)
   705  		}
   706  		t.setErrno(err)
   707  		return -1
   708  	}
   709  
   710  	if dmesgs {
   711  		dmesg("%v: ok", origin(1))
   712  	}
   713  	return 0
   714  }
   715  
   716  // ssize_t recv(int sockfd, void *buf, size_t len, int flags);
   717  func Xrecv(t *TLS, sockfd int32, buf uintptr, len types.Size_t, flags int32) types.Ssize_t {
   718  	n, _, err := unix.Syscall6(unix.SYS_RECVFROM, uintptr(sockfd), buf, uintptr(len), uintptr(flags), 0, 0)
   719  	if err != 0 {
   720  		t.setErrno(err)
   721  		return -1
   722  	}
   723  
   724  	return types.Ssize_t(n)
   725  }
   726  
   727  // ssize_t send(int sockfd, const void *buf, size_t len, int flags);
   728  func Xsend(t *TLS, sockfd int32, buf uintptr, len types.Size_t, flags int32) types.Ssize_t {
   729  	n, _, err := unix.Syscall6(unix.SYS_SENDTO, uintptr(sockfd), buf, uintptr(len), uintptr(flags), 0, 0)
   730  	if err != 0 {
   731  		t.setErrno(err)
   732  		return -1
   733  	}
   734  
   735  	return types.Ssize_t(n)
   736  }
   737  
   738  // int shutdown(int sockfd, int how);
   739  func Xshutdown(t *TLS, sockfd, how int32) int32 {
   740  	if _, _, err := unix.Syscall(unix.SYS_SHUTDOWN, uintptr(sockfd), uintptr(how), 0); err != 0 {
   741  		t.setErrno(err)
   742  		return -1
   743  	}
   744  
   745  	return 0
   746  }
   747  
   748  // int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
   749  func Xgetpeername(t *TLS, sockfd int32, addr uintptr, addrlen uintptr) int32 {
   750  	if _, _, err := unix.Syscall(unix.SYS_GETPEERNAME, uintptr(sockfd), addr, uintptr(addrlen)); err != 0 {
   751  		t.setErrno(err)
   752  		return -1
   753  	}
   754  
   755  	return 0
   756  }
   757  
   758  // int socket(int domain, int type, int protocol);
   759  func Xsocket(t *TLS, domain, type1, protocol int32) int32 {
   760  	n, _, err := unix.Syscall(unix.SYS_SOCKET, uintptr(domain), uintptr(type1), uintptr(protocol))
   761  	if err != 0 {
   762  		t.setErrno(err)
   763  		return -1
   764  	}
   765  
   766  	return int32(n)
   767  }
   768  
   769  // int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
   770  func Xbind(t *TLS, sockfd int32, addr uintptr, addrlen uint32) int32 {
   771  	n, _, err := unix.Syscall(unix.SYS_BIND, uintptr(sockfd), addr, uintptr(addrlen))
   772  	if err != 0 {
   773  		t.setErrno(err)
   774  		return -1
   775  	}
   776  
   777  	return int32(n)
   778  }
   779  
   780  // int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
   781  func Xconnect(t *TLS, sockfd int32, addr uintptr, addrlen uint32) int32 {
   782  	if _, _, err := unix.Syscall(unix.SYS_CONNECT, uintptr(sockfd), addr, uintptr(addrlen)); err != 0 {
   783  		t.setErrno(err)
   784  		return -1
   785  	}
   786  
   787  	return 0
   788  }
   789  
   790  // int listen(int sockfd, int backlog);
   791  func Xlisten(t *TLS, sockfd, backlog int32) int32 {
   792  	if _, _, err := unix.Syscall(unix.SYS_LISTEN, uintptr(sockfd), uintptr(backlog), 0); err != 0 {
   793  		t.setErrno(err)
   794  		return -1
   795  	}
   796  
   797  	return 0
   798  }
   799  
   800  // int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
   801  func Xaccept(t *TLS, sockfd int32, addr uintptr, addrlen uintptr) int32 {
   802  	panic(todo(""))
   803  	// n, _, err := unix.Syscall6(unix.SYS_ACCEPT4, uintptr(sockfd), addr, uintptr(addrlen), 0, 0, 0)
   804  	// if err != 0 {
   805  	// 	t.setErrno(err)
   806  	// 	return -1
   807  	// }
   808  
   809  	// return int32(n)
   810  }
   811  
   812  // // int getrlimit(int resource, struct rlimit *rlim);
   813  // func Xgetrlimit(t *TLS, resource int32, rlim uintptr) int32 {
   814  // 	return Xgetrlimit64(t, resource, rlim)
   815  // }
   816  //
   817  // // int setrlimit(int resource, const struct rlimit *rlim);
   818  // func Xsetrlimit(t *TLS, resource int32, rlim uintptr) int32 {
   819  // 	return Xsetrlimit64(t, resource, rlim)
   820  // }
   821  //
   822  // // int setrlimit(int resource, const struct rlimit *rlim);
   823  // func Xsetrlimit64(t *TLS, resource int32, rlim uintptr) int32 {
   824  // 	if _, _, err := unix.Syscall(unix.SYS_SETRLIMIT, uintptr(resource), uintptr(rlim), 0); err != 0 {
   825  // 		t.setErrno(err)
   826  // 		return -1
   827  // 	}
   828  //
   829  // 	return 0
   830  // }
   831  
   832  // uid_t getuid(void);
   833  func Xgetuid(t *TLS) types.Uid_t {
   834  	r := types.Uid_t(os.Getuid())
   835  	if dmesgs {
   836  		dmesg("%v: %v", origin(1), r)
   837  	}
   838  	return r
   839  }
   840  
   841  // pid_t getpid(void);
   842  func Xgetpid(t *TLS) int32 {
   843  	r := int32(os.Getpid())
   844  	if dmesgs {
   845  		dmesg("%v: %v", origin(1), r)
   846  	}
   847  	return r
   848  }
   849  
   850  // int system(const char *command);
   851  func Xsystem(t *TLS, command uintptr) int32 {
   852  	s := GoString(command)
   853  	if command == 0 {
   854  		panic(todo(""))
   855  	}
   856  
   857  	cmd := exec.Command("sh", "-c", s)
   858  	cmd.Stdout = os.Stdout
   859  	cmd.Stderr = os.Stderr
   860  	err := cmd.Run()
   861  	if err != nil {
   862  		ps := err.(*exec.ExitError)
   863  		return int32(ps.ExitCode())
   864  	}
   865  
   866  	return 0
   867  }
   868  
   869  // int setvbuf(FILE *stream, char *buf, int mode, size_t size);
   870  func Xsetvbuf(t *TLS, stream, buf uintptr, mode int32, size types.Size_t) int32 {
   871  	return 0 //TODO
   872  }
   873  
   874  // int raise(int sig);
   875  func Xraise(t *TLS, sig int32) int32 {
   876  	panic(todo(""))
   877  }
   878  
   879  // // int backtrace(void **buffer, int size);
   880  // func Xbacktrace(t *TLS, buf uintptr, size int32) int32 {
   881  // 	panic(todo(""))
   882  // }
   883  //
   884  // // void backtrace_symbols_fd(void *const *buffer, int size, int fd);
   885  // func Xbacktrace_symbols_fd(t *TLS, buffer uintptr, size, fd int32) {
   886  // 	panic(todo(""))
   887  // }
   888  
   889  // int fileno(FILE *stream);
   890  func Xfileno(t *TLS, stream uintptr) int32 {
   891  	if stream == 0 {
   892  		if dmesgs {
   893  			dmesg("%v: FAIL", origin(1))
   894  		}
   895  		t.setErrno(errno.EBADF)
   896  		return -1
   897  	}
   898  
   899  	if fd := int32((*stdio.FILE)(unsafe.Pointer(stream)).F_file); fd >= 0 {
   900  		return fd
   901  	}
   902  
   903  	if dmesgs {
   904  		dmesg("%v: FAIL", origin(1))
   905  	}
   906  	t.setErrno(errno.EBADF)
   907  	return -1
   908  }
   909  
   910  func newFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) (r *fts.FTSENT) {
   911  	var statp uintptr
   912  	if stat != nil {
   913  		statp = Xmalloc(t, types.Size_t(unsafe.Sizeof(unix.Stat_t{})))
   914  		if statp == 0 {
   915  			panic("OOM")
   916  		}
   917  
   918  		*(*unix.Stat_t)(unsafe.Pointer(statp)) = *stat
   919  	}
   920  	csp, errx := CString(path)
   921  	if errx != nil {
   922  		panic("OOM")
   923  	}
   924  
   925  	return &fts.FTSENT{
   926  		Ffts_info:    uint16(info),
   927  		Ffts_path:    csp,
   928  		Ffts_pathlen: uint16(len(path)),
   929  		Ffts_statp:   statp,
   930  		Ffts_errno:   int32(err),
   931  	}
   932  }
   933  
   934  func newCFtsent(t *TLS, info int, path string, stat *unix.Stat_t, err syscall.Errno) uintptr {
   935  	p := Xcalloc(t, 1, types.Size_t(unsafe.Sizeof(fts.FTSENT{})))
   936  	if p == 0 {
   937  		panic("OOM")
   938  	}
   939  
   940  	*(*fts.FTSENT)(unsafe.Pointer(p)) = *newFtsent(t, info, path, stat, err)
   941  	return p
   942  }
   943  
   944  func ftsentClose(t *TLS, p uintptr) {
   945  	Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_path)
   946  	Xfree(t, (*fts.FTSENT)(unsafe.Pointer(p)).Ffts_statp)
   947  }
   948  
   949  type ftstream struct {
   950  	s []uintptr
   951  	x int
   952  }
   953  
   954  func (f *ftstream) close(t *TLS) {
   955  	for _, p := range f.s {
   956  		ftsentClose(t, p)
   957  		Xfree(t, p)
   958  	}
   959  	*f = ftstream{}
   960  }
   961  
   962  // FTS *fts_open(char * const *path_argv, int options, int (*compar)(const FTSENT **, const FTSENT **));
   963  func Xfts_open(t *TLS, path_argv uintptr, options int32, compar uintptr) uintptr {
   964  	f := &ftstream{}
   965  
   966  	var walk func(string)
   967  	walk = func(path string) {
   968  		var fi os.FileInfo
   969  		var err error
   970  		switch {
   971  		case options&fts.FTS_LOGICAL != 0:
   972  			fi, err = os.Stat(path)
   973  		case options&fts.FTS_PHYSICAL != 0:
   974  			fi, err = os.Lstat(path)
   975  		default:
   976  			panic(todo(""))
   977  		}
   978  
   979  		if err != nil {
   980  			return
   981  		}
   982  
   983  		var statp *unix.Stat_t
   984  		if options&fts.FTS_NOSTAT == 0 {
   985  			var stat unix.Stat_t
   986  			switch {
   987  			case options&fts.FTS_LOGICAL != 0:
   988  				if err := unix.Stat(path, &stat); err != nil {
   989  					panic(todo(""))
   990  				}
   991  			case options&fts.FTS_PHYSICAL != 0:
   992  				if err := unix.Lstat(path, &stat); err != nil {
   993  					panic(todo(""))
   994  				}
   995  			default:
   996  				panic(todo(""))
   997  			}
   998  
   999  			statp = &stat
  1000  		}
  1001  
  1002  	out:
  1003  		switch {
  1004  		case fi.IsDir():
  1005  			f.s = append(f.s, newCFtsent(t, fts.FTS_D, path, statp, 0))
  1006  			g, err := os.Open(path)
  1007  			switch x := err.(type) {
  1008  			case nil:
  1009  				// ok
  1010  			case *os.PathError:
  1011  				f.s = append(f.s, newCFtsent(t, fts.FTS_DNR, path, statp, errno.EACCES))
  1012  				break out
  1013  			default:
  1014  				panic(todo("%q: %v %T", path, x, x))
  1015  			}
  1016  
  1017  			names, err := g.Readdirnames(-1)
  1018  			g.Close()
  1019  			if err != nil {
  1020  				panic(todo(""))
  1021  			}
  1022  
  1023  			for _, name := range names {
  1024  				walk(path + "/" + name)
  1025  				if f == nil {
  1026  					break out
  1027  				}
  1028  			}
  1029  
  1030  			f.s = append(f.s, newCFtsent(t, fts.FTS_DP, path, statp, 0))
  1031  		default:
  1032  			info := fts.FTS_F
  1033  			if fi.Mode()&os.ModeSymlink != 0 {
  1034  				info = fts.FTS_SL
  1035  			}
  1036  			switch {
  1037  			case statp != nil:
  1038  				f.s = append(f.s, newCFtsent(t, info, path, statp, 0))
  1039  			case options&fts.FTS_NOSTAT != 0:
  1040  				f.s = append(f.s, newCFtsent(t, fts.FTS_NSOK, path, nil, 0))
  1041  			default:
  1042  				panic(todo(""))
  1043  			}
  1044  		}
  1045  	}
  1046  
  1047  	for {
  1048  		p := *(*uintptr)(unsafe.Pointer(path_argv))
  1049  		if p == 0 {
  1050  			if f == nil {
  1051  				return 0
  1052  			}
  1053  
  1054  			if compar != 0 {
  1055  				panic(todo(""))
  1056  			}
  1057  
  1058  			return addObject(f)
  1059  		}
  1060  
  1061  		walk(GoString(p))
  1062  		path_argv += unsafe.Sizeof(uintptr(0))
  1063  	}
  1064  }
  1065  
  1066  // FTSENT *fts_read(FTS *ftsp);
  1067  func Xfts_read(t *TLS, ftsp uintptr) uintptr {
  1068  	f := getObject(ftsp).(*ftstream)
  1069  	if f.x == len(f.s) {
  1070  		if dmesgs {
  1071  			dmesg("%v: FAIL", origin(1))
  1072  		}
  1073  		t.setErrno(0)
  1074  		return 0
  1075  	}
  1076  
  1077  	r := f.s[f.x]
  1078  	if e := (*fts.FTSENT)(unsafe.Pointer(r)).Ffts_errno; e != 0 {
  1079  		if dmesgs {
  1080  			dmesg("%v: FAIL", origin(1))
  1081  		}
  1082  		t.setErrno(e)
  1083  	}
  1084  	f.x++
  1085  	return r
  1086  }
  1087  
  1088  // int fts_close(FTS *ftsp);
  1089  func Xfts_close(t *TLS, ftsp uintptr) int32 {
  1090  	getObject(ftsp).(*ftstream).close(t)
  1091  	removeObject(ftsp)
  1092  	return 0
  1093  }
  1094  
  1095  // void tzset (void);
  1096  func Xtzset(t *TLS) {
  1097  	//TODO
  1098  }
  1099  
  1100  // char *strerror(int errnum);
  1101  func Xstrerror(t *TLS, errnum int32) uintptr {
  1102  	panic(todo(""))
  1103  }
  1104  
  1105  // void *dlopen(const char *filename, int flags);
  1106  func Xdlopen(t *TLS, filename uintptr, flags int32) uintptr {
  1107  	panic(todo(""))
  1108  }
  1109  
  1110  // char *dlerror(void);
  1111  func Xdlerror(t *TLS) uintptr {
  1112  	panic(todo(""))
  1113  }
  1114  
  1115  // int dlclose(void *handle);
  1116  func Xdlclose(t *TLS, handle uintptr) int32 {
  1117  	panic(todo(""))
  1118  }
  1119  
  1120  // void *dlsym(void *handle, const char *symbol);
  1121  func Xdlsym(t *TLS, handle, symbol uintptr) uintptr {
  1122  	panic(todo(""))
  1123  }
  1124  
  1125  // void perror(const char *s);
  1126  func Xperror(t *TLS, s uintptr) {
  1127  	panic(todo(""))
  1128  }
  1129  
  1130  // int pclose(FILE *stream);
  1131  func Xpclose(t *TLS, stream uintptr) int32 {
  1132  	panic(todo(""))
  1133  }
  1134  
  1135  // var gai_strerrorBuf [100]byte
  1136  
  1137  // const char *gai_strerror(int errcode);
  1138  func Xgai_strerror(t *TLS, errcode int32) uintptr {
  1139  	panic(todo(""))
  1140  	// copy(gai_strerrorBuf[:], fmt.Sprintf("gai error %d\x00", errcode))
  1141  	// return uintptr(unsafe.Pointer(&gai_strerrorBuf))
  1142  }
  1143  
  1144  // int tcgetattr(int fd, struct termios *termios_p);
  1145  func Xtcgetattr(t *TLS, fd int32, termios_p uintptr) int32 {
  1146  	panic(todo(""))
  1147  }
  1148  
  1149  // int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
  1150  func Xtcsetattr(t *TLS, fd, optional_actions int32, termios_p uintptr) int32 {
  1151  	panic(todo(""))
  1152  }
  1153  
  1154  // speed_t cfgetospeed(const struct termios *termios_p);
  1155  func Xcfgetospeed(t *TLS, termios_p uintptr) termios.Speed_t {
  1156  	panic(todo(""))
  1157  }
  1158  
  1159  // int cfsetospeed(struct termios *termios_p, speed_t speed);
  1160  // func Xcfsetospeed(t *TLS, termios_p uintptr, speed uint32) int32 {
  1161  func Xcfsetospeed(...interface{}) int32 {
  1162  	panic(todo(""))
  1163  }
  1164  
  1165  // int cfsetispeed(struct termios *termios_p, speed_t speed);
  1166  // func Xcfsetispeed(t *TLS, termios_p uintptr, speed uint32) int32 {
  1167  func Xcfsetispeed(...interface{}) int32 {
  1168  	panic(todo(""))
  1169  }
  1170  
  1171  // pid_t fork(void);
  1172  func Xfork(t *TLS) int32 {
  1173  	if dmesgs {
  1174  		dmesg("%v: FAIL", origin(1))
  1175  	}
  1176  	t.setErrno(errno.ENOSYS)
  1177  	return -1
  1178  }
  1179  
  1180  var emptyStr = [1]byte{}
  1181  
  1182  // char *setlocale(int category, const char *locale);
  1183  func Xsetlocale(t *TLS, category int32, locale uintptr) uintptr {
  1184  	return uintptr(unsafe.Pointer(&emptyStr)) //TODO
  1185  }
  1186  
  1187  // char *nl_langinfo(nl_item item);
  1188  func Xnl_langinfo(t *TLS, item langinfo.Nl_item) uintptr {
  1189  	return uintptr(unsafe.Pointer(&emptyStr)) //TODO
  1190  }
  1191  
  1192  // FILE *popen(const char *command, const char *type);
  1193  func Xpopen(t *TLS, command, type1 uintptr) uintptr {
  1194  	panic(todo(""))
  1195  }
  1196  
  1197  // char *realpath(const char *path, char *resolved_path);
  1198  func Xrealpath(t *TLS, path, resolved_path uintptr) uintptr {
  1199  	s, err := filepath.EvalSymlinks(GoString(path))
  1200  	if err != nil {
  1201  		if os.IsNotExist(err) {
  1202  			if dmesgs {
  1203  				dmesg("%v: %q: %v FAIL", origin(1), GoString(path), err)
  1204  			}
  1205  			t.setErrno(errno.ENOENT)
  1206  			return 0
  1207  		}
  1208  
  1209  		panic(todo("", err))
  1210  	}
  1211  
  1212  	if resolved_path == 0 {
  1213  		panic(todo(""))
  1214  	}
  1215  
  1216  	if len(s) >= limits.PATH_MAX {
  1217  		s = s[:limits.PATH_MAX-1]
  1218  	}
  1219  
  1220  	copy((*RawMem)(unsafe.Pointer(resolved_path))[:len(s):len(s)], s)
  1221  	(*RawMem)(unsafe.Pointer(resolved_path))[len(s)] = 0
  1222  	if dmesgs {
  1223  		dmesg("%v: %q: ok", origin(1), GoString(path))
  1224  	}
  1225  	return resolved_path
  1226  }
  1227  
  1228  // struct tm *gmtime_r(const time_t *timep, struct tm *result);
  1229  func Xgmtime_r(t *TLS, timep, result uintptr) uintptr {
  1230  	panic(todo(""))
  1231  }
  1232  
  1233  // char *inet_ntoa(struct in_addr in);
  1234  func Xinet_ntoa(t *TLS, in1 in.In_addr) uintptr {
  1235  	panic(todo(""))
  1236  }
  1237  
  1238  func X__ccgo_in6addr_anyp(t *TLS) uintptr {
  1239  	panic(todo(""))
  1240  	// return uintptr(unsafe.Pointer(&in6_addr_any))
  1241  }
  1242  
  1243  func Xabort(t *TLS) {
  1244  	if dmesgs {
  1245  		dmesg("%v:", origin(1))
  1246  	}
  1247  	p := Xcalloc(t, 1, types.Size_t(unsafe.Sizeof(signal.Sigaction{})))
  1248  	if p == 0 {
  1249  		panic("OOM")
  1250  	}
  1251  
  1252  	(*signal.Sigaction)(unsafe.Pointer(p)).F__sigaction_u.F__sa_handler = signal.SIG_DFL
  1253  	Xsigaction(t, signal.SIGABRT, p, 0)
  1254  	Xfree(t, p)
  1255  	unix.Kill(unix.Getpid(), syscall.Signal(signal.SIGABRT))
  1256  	panic(todo("unrechable"))
  1257  }
  1258  
  1259  // int fflush(FILE *stream);
  1260  func Xfflush(t *TLS, stream uintptr) int32 {
  1261  	return 0 //TODO
  1262  }
  1263  
  1264  // size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  1265  func Xfread(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t {
  1266  	fd := uintptr(file(stream).fd())
  1267  	count := size * nmemb
  1268  	var n int
  1269  	var err error
  1270  	switch {
  1271  	case count == 0:
  1272  		n, err = unix.Read(int(fd), nil)
  1273  	default:
  1274  		n, err = unix.Read(int(fd), (*RawMem)(unsafe.Pointer(ptr))[:count:count])
  1275  		if dmesgs && err == nil {
  1276  			dmesg("%v: fd %v, n %#x\n%s", origin(1), fd, n, hex.Dump((*RawMem)(unsafe.Pointer(ptr))[:n:n]))
  1277  		}
  1278  	}
  1279  	if err != nil {
  1280  		if dmesgs {
  1281  			dmesg("%v: %v FAIL", origin(1), err)
  1282  		}
  1283  		file(stream).setErr()
  1284  		return types.Size_t(n) / size
  1285  	}
  1286  
  1287  	if dmesgs {
  1288  		dmesg("%v: ok", origin(1))
  1289  	}
  1290  	return types.Size_t(n) / size
  1291  }
  1292  
  1293  // size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  1294  func Xfwrite(t *TLS, ptr uintptr, size, nmemb types.Size_t, stream uintptr) types.Size_t {
  1295  	fd := uintptr(file(stream).fd())
  1296  	count := size * nmemb
  1297  	var n int
  1298  	var err error
  1299  	switch {
  1300  	case count == 0:
  1301  		n, err = unix.Write(int(fd), nil)
  1302  	default:
  1303  		n, err = unix.Write(int(fd), (*RawMem)(unsafe.Pointer(ptr))[:count:count])
  1304  		if dmesgs {
  1305  			dmesg("%v: fd %v, count %#x\n%s", origin(1), fd, count, hex.Dump((*RawMem)(unsafe.Pointer(ptr))[:count:count]))
  1306  		}
  1307  	}
  1308  	if err != nil {
  1309  		if dmesgs {
  1310  			dmesg("%v: %v FAIL", origin(1), err)
  1311  		}
  1312  		file(stream).setErr()
  1313  		return types.Size_t(n) / size
  1314  	}
  1315  
  1316  	if dmesgs {
  1317  		dmesg("%v: ok", origin(1))
  1318  	}
  1319  	return types.Size_t(n) / size
  1320  }
  1321  
  1322  // int fclose(FILE *stream);
  1323  func Xfclose(t *TLS, stream uintptr) int32 {
  1324  	r := file(stream).close(t)
  1325  	if r != 0 {
  1326  		if dmesgs {
  1327  			dmesg("%v: %v FAIL", origin(1), r)
  1328  		}
  1329  		t.setErrno(r)
  1330  		return stdio.EOF
  1331  	}
  1332  
  1333  	if dmesgs {
  1334  		dmesg("%v: ok", origin(1))
  1335  	}
  1336  	return 0
  1337  }
  1338  
  1339  // int fputc(int c, FILE *stream);
  1340  func Xfputc(t *TLS, c int32, stream uintptr) int32 {
  1341  	if _, err := fwrite(file(stream).fd(), []byte{byte(c)}); err != nil {
  1342  		return stdio.EOF
  1343  	}
  1344  
  1345  	return int32(byte(c))
  1346  }
  1347  
  1348  // int fseek(FILE *stream, long offset, int whence);
  1349  func Xfseek(t *TLS, stream uintptr, offset long, whence int32) int32 {
  1350  	if n := Xlseek(t, int32(file(stream).fd()), types.Off_t(offset), whence); n < 0 {
  1351  		if dmesgs {
  1352  			dmesg("%v: fd %v, off %#x, whence %v: %v", origin(1), file(stream).fd(), offset, whenceStr(whence), n)
  1353  		}
  1354  		file(stream).setErr()
  1355  		return -1
  1356  	}
  1357  
  1358  	if dmesgs {
  1359  		dmesg("%v: fd %v, off %#x, whence %v: ok", origin(1), file(stream).fd(), offset, whenceStr(whence))
  1360  	}
  1361  	return 0
  1362  }
  1363  
  1364  // long ftell(FILE *stream);
  1365  func Xftell(t *TLS, stream uintptr) long {
  1366  	n := Xlseek(t, file(stream).fd(), 0, stdio.SEEK_CUR)
  1367  	if n < 0 {
  1368  		file(stream).setErr()
  1369  		return -1
  1370  	}
  1371  
  1372  	if dmesgs {
  1373  		dmesg("%v: fd %v, n %#x: ok %#x", origin(1), file(stream).fd(), n, long(n))
  1374  	}
  1375  	return long(n)
  1376  }
  1377  
  1378  // int ferror(FILE *stream);
  1379  func Xferror(t *TLS, stream uintptr) int32 {
  1380  	return Bool32(file(stream).err())
  1381  }
  1382  
  1383  // int fputs(const char *s, FILE *stream);
  1384  func Xfputs(t *TLS, s, stream uintptr) int32 {
  1385  	panic(todo(""))
  1386  	// if _, _, err := unix.Syscall(unix.SYS_WRITE, uintptr(file(stream).fd()), s, uintptr(Xstrlen(t, s))); err != 0 {
  1387  	// 	return -1
  1388  	// }
  1389  
  1390  	// return 0
  1391  }
  1392  
  1393  var getservbynameStaticResult netdb.Servent
  1394  
  1395  // struct servent *getservbyname(const char *name, const char *proto);
  1396  func Xgetservbyname(t *TLS, name, proto uintptr) uintptr {
  1397  	var protoent *gonetdb.Protoent
  1398  	if proto != 0 {
  1399  		protoent = gonetdb.GetProtoByName(GoString(proto))
  1400  	}
  1401  	servent := gonetdb.GetServByName(GoString(name), protoent)
  1402  	if servent == nil {
  1403  		if dmesgs {
  1404  			dmesg("%q %q: nil (protoent %+v)", GoString(name), GoString(proto), protoent)
  1405  		}
  1406  		return 0
  1407  	}
  1408  
  1409  	Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_name)
  1410  	if v := (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_aliases; v != 0 {
  1411  		for {
  1412  			p := *(*uintptr)(unsafe.Pointer(v))
  1413  			if p == 0 {
  1414  				break
  1415  			}
  1416  
  1417  			Xfree(t, p)
  1418  			v += unsafe.Sizeof(uintptr(0))
  1419  		}
  1420  		Xfree(t, v)
  1421  	}
  1422  	Xfree(t, (*netdb.Servent)(unsafe.Pointer(&getservbynameStaticResult)).Fs_proto)
  1423  	cname, err := CString(servent.Name)
  1424  	if err != nil {
  1425  		getservbynameStaticResult = netdb.Servent{}
  1426  		return 0
  1427  	}
  1428  
  1429  	var protoname uintptr
  1430  	if protoent != nil {
  1431  		if protoname, err = CString(protoent.Name); err != nil {
  1432  			Xfree(t, cname)
  1433  			getservbynameStaticResult = netdb.Servent{}
  1434  			return 0
  1435  		}
  1436  	}
  1437  	var a []uintptr
  1438  	for _, v := range servent.Aliases {
  1439  		cs, err := CString(v)
  1440  		if err != nil {
  1441  			for _, v := range a {
  1442  				Xfree(t, v)
  1443  			}
  1444  			return 0
  1445  		}
  1446  
  1447  		a = append(a, cs)
  1448  	}
  1449  	v := Xcalloc(t, types.Size_t(len(a)+1), types.Size_t(unsafe.Sizeof(uintptr(0))))
  1450  	if v == 0 {
  1451  		Xfree(t, cname)
  1452  		Xfree(t, protoname)
  1453  		for _, v := range a {
  1454  			Xfree(t, v)
  1455  		}
  1456  		getservbynameStaticResult = netdb.Servent{}
  1457  		return 0
  1458  	}
  1459  	for _, p := range a {
  1460  		*(*uintptr)(unsafe.Pointer(v)) = p
  1461  		v += unsafe.Sizeof(uintptr(0))
  1462  	}
  1463  
  1464  	getservbynameStaticResult = netdb.Servent{
  1465  		Fs_name:    cname,
  1466  		Fs_aliases: v,
  1467  		Fs_port:    int32(servent.Port),
  1468  		Fs_proto:   protoname,
  1469  	}
  1470  	return uintptr(unsafe.Pointer(&getservbynameStaticResult))
  1471  }
  1472  
  1473  // //TODO- func Xreaddir64(t *TLS, dir uintptr) uintptr {
  1474  // //TODO- 	return Xreaddir(t, dir)
  1475  // //TODO- }
  1476  //
  1477  // func __syscall(r, _ uintptr, errno syscall.Errno) long {
  1478  // 	if errno != 0 {
  1479  // 		return long(-errno)
  1480  // 	}
  1481  //
  1482  // 	return long(r)
  1483  // }
  1484  
  1485  func fcntlCmdStr(cmd int32) string {
  1486  	switch cmd {
  1487  	case fcntl.F_GETOWN:
  1488  		return "F_GETOWN"
  1489  	case fcntl.F_SETLK:
  1490  		return "F_SETLK"
  1491  	case fcntl.F_GETLK:
  1492  		return "F_GETLK"
  1493  	case fcntl.F_SETFD:
  1494  		return "F_SETFD"
  1495  	case fcntl.F_GETFD:
  1496  		return "F_GETFD"
  1497  	default:
  1498  		return fmt.Sprintf("cmd(%d)", cmd)
  1499  	}
  1500  }
  1501  
  1502  // // struct __float2 { float __sinval; float __cosval; };
  1503  // // struct __double2 { double __sinval; double __cosval; };
  1504  // //
  1505  // // extern struct __float2 __sincosf_stret(float);
  1506  // // extern struct __double2 __sincos_stret(double);
  1507  // // extern struct __float2 __sincospif_stret(float);
  1508  // // extern struct __double2 __sincospi_stret(double);
  1509  //
  1510  // type X__float2 struct{ F__sinval, F__cosval float32 }
  1511  // type X__double2 struct{ F__sinval, F__cosval float32 }
  1512  //
  1513  // func X__sincosf_stret(*TLS, float32) X__float2 {
  1514  // 	panic(todo(""))
  1515  // }
  1516  //
  1517  // func X__sincos_stret(*TLS, float64) X__double2 {
  1518  // 	panic(todo(""))
  1519  // }
  1520  //
  1521  // func X__sincospif_stret(*TLS, float32) X__float2 {
  1522  // 	panic(todo(""))
  1523  // }
  1524  //
  1525  // func X__sincospi_stret(*TLS, float64) X__double2 {
  1526  // 	panic(todo(""))
  1527  // }
  1528  
  1529  // ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
  1530  func Xpwrite(t *TLS, fd int32, buf uintptr, count types.Size_t, offset types.Off_t) types.Ssize_t {
  1531  	var n int
  1532  	var err error
  1533  	switch {
  1534  	case count == 0:
  1535  		n, err = unix.Pwrite(int(fd), nil, int64(offset))
  1536  	default:
  1537  		n, err = unix.Pwrite(int(fd), (*RawMem)(unsafe.Pointer(buf))[:count:count], int64(offset))
  1538  		if dmesgs {
  1539  			dmesg("%v: fd %v, off %#x, count %#x\n%s", origin(1), fd, offset, count, hex.Dump((*RawMem)(unsafe.Pointer(buf))[:count:count]))
  1540  		}
  1541  	}
  1542  	if err != nil {
  1543  		if dmesgs {
  1544  			dmesg("%v: %v FAIL", origin(1), err)
  1545  		}
  1546  		t.setErrno(err)
  1547  		return -1
  1548  	}
  1549  
  1550  	if dmesgs {
  1551  		dmesg("%v: ok", origin(1))
  1552  	}
  1553  	return types.Ssize_t(n)
  1554  }
  1555  
  1556  // char***_NSGetEnviron()
  1557  func X_NSGetEnviron(t *TLS) uintptr {
  1558  	return EnvironP()
  1559  }
  1560  
  1561  // int chflags(const char *path, u_int flags);
  1562  func Xchflags(t *TLS, path uintptr, flags uint32) int32 {
  1563  	if err := unix.Chflags(GoString(path), int(flags)); err != nil {
  1564  		if dmesgs {
  1565  			dmesg("%v: %v FAIL", origin(1), err)
  1566  		}
  1567  		t.setErrno(err)
  1568  		return -1
  1569  	}
  1570  
  1571  	if dmesgs {
  1572  		dmesg("%v: ok", origin(1))
  1573  	}
  1574  	return 0
  1575  }
  1576  
  1577  // int rmdir(const char *pathname);
  1578  func Xrmdir(t *TLS, pathname uintptr) int32 {
  1579  	if err := unix.Rmdir(GoString(pathname)); err != nil {
  1580  		if dmesgs {
  1581  			dmesg("%v: %v FAIL", origin(1), err)
  1582  		}
  1583  		t.setErrno(err)
  1584  		return -1
  1585  	}
  1586  
  1587  	if dmesgs {
  1588  		dmesg("%v: ok", origin(1))
  1589  	}
  1590  	return 0
  1591  }
  1592  
  1593  // uint64_t mach_absolute_time(void);
  1594  func Xmach_absolute_time(t *TLS) uint64 {
  1595  	return uint64(gotime.Now().UnixNano())
  1596  }
  1597  
  1598  // See https://developer.apple.com/library/archive/qa/qa1398/_index.html
  1599  type machTimebaseInfo = struct {
  1600  	Fnumer uint32
  1601  	Fdenom uint32
  1602  } /* mach_time.h:36:1 */
  1603  
  1604  // kern_return_t mach_timebase_info(mach_timebase_info_t info);
  1605  func Xmach_timebase_info(t *TLS, info uintptr) int32 {
  1606  	*(*machTimebaseInfo)(unsafe.Pointer(info)) = machTimebaseInfo{Fnumer: 1, Fdenom: 1}
  1607  	return 0
  1608  }
  1609  
  1610  // int getattrlist(const char* path, struct attrlist * attrList, void * attrBuf, size_t attrBufSize, unsigned long options);
  1611  func Xgetattrlist(t *TLS, path, attrList, attrBuf uintptr, attrBufSize types.Size_t, options uint32) int32 {
  1612  	if _, _, err := unix.Syscall6(unix.SYS_GETATTRLIST, path, attrList, attrBuf, uintptr(attrBufSize), uintptr(options), 0); err != 0 { // Cannot avoid the syscall here.
  1613  		if dmesgs {
  1614  			dmesg("%v: %v FAIL", origin(1), err)
  1615  		}
  1616  		t.setErrno(err)
  1617  		return -1
  1618  	}
  1619  
  1620  	if dmesgs {
  1621  		dmesg("%v: ok", origin(1))
  1622  	}
  1623  	return 0
  1624  }
  1625  
  1626  // int setattrlist(const char* path, struct attrlist * attrList, void * attrBuf, size_t attrBufSize, unsigned long options);
  1627  func Xsetattrlist(t *TLS, path, attrList, attrBuf uintptr, attrBufSize types.Size_t, options uint32) int32 {
  1628  	if _, _, err := unix.Syscall6(unix.SYS_SETATTRLIST, path, attrList, attrBuf, uintptr(attrBufSize), uintptr(options), 0); err != 0 { // Cannot avoid the syscall here.
  1629  		if dmesgs {
  1630  			dmesg("%v: %v FAIL", origin(1), err)
  1631  		}
  1632  		t.setErrno(err)
  1633  		return -1
  1634  	}
  1635  
  1636  	if dmesgs {
  1637  		dmesg("%v: ok", origin(1))
  1638  	}
  1639  	return 0
  1640  }
  1641  
  1642  // int copyfile(const char *from, const char *to, copyfile_state_t state, copyfile_flags_t flags);
  1643  func Xcopyfile(...interface{}) int32 {
  1644  	panic(todo(""))
  1645  }
  1646  
  1647  // int truncate(const char *path, off_t length);
  1648  func Xtruncate(...interface{}) int32 {
  1649  	panic(todo(""))
  1650  }
  1651  
  1652  type darwinDir struct {
  1653  	buf [4096]byte
  1654  	fd  int
  1655  	h   int
  1656  	l   int
  1657  
  1658  	eof bool
  1659  }
  1660  
  1661  // DIR *opendir(const char *name);
  1662  func Xopendir(t *TLS, name uintptr) uintptr {
  1663  	p := Xmalloc(t, uint64(unsafe.Sizeof(darwinDir{})))
  1664  	if p == 0 {
  1665  		panic("OOM")
  1666  	}
  1667  
  1668  	fd := int(Xopen(t, name, fcntl.O_RDONLY|fcntl.O_DIRECTORY|fcntl.O_CLOEXEC, 0))
  1669  	if fd < 0 {
  1670  		if dmesgs {
  1671  			dmesg("%v: FAIL %v", origin(1), (*darwinDir)(unsafe.Pointer(p)).fd)
  1672  		}
  1673  		Xfree(t, p)
  1674  		// trc("==== opendir: %#x", 0)
  1675  		return 0
  1676  	}
  1677  
  1678  	if dmesgs {
  1679  		dmesg("%v: ok", origin(1))
  1680  	}
  1681  	(*darwinDir)(unsafe.Pointer(p)).fd = fd
  1682  	(*darwinDir)(unsafe.Pointer(p)).h = 0
  1683  	(*darwinDir)(unsafe.Pointer(p)).l = 0
  1684  	(*darwinDir)(unsafe.Pointer(p)).eof = false
  1685  	// trc("==== opendir: %#x", p)
  1686  	return p
  1687  }
  1688  
  1689  // struct dirent *readdir(DIR *dirp);
  1690  func Xreaddir(t *TLS, dir uintptr) uintptr {
  1691  	if (*darwinDir)(unsafe.Pointer(dir)).eof {
  1692  		return 0
  1693  	}
  1694  
  1695  	// trc(".... readdir %#x: l %v, h %v", dir, (*darwinDir)(unsafe.Pointer(dir)).l, (*darwinDir)(unsafe.Pointer(dir)).h)
  1696  	if (*darwinDir)(unsafe.Pointer(dir)).l == (*darwinDir)(unsafe.Pointer(dir)).h {
  1697  		n, err := unix.Getdirentries((*darwinDir)(unsafe.Pointer(dir)).fd, (*darwinDir)(unsafe.Pointer(dir)).buf[:], nil)
  1698  		// trc("must read: %v %v", n, err)
  1699  		if n == 0 {
  1700  			if err != nil && err != io.EOF {
  1701  				if dmesgs {
  1702  					dmesg("%v: %v FAIL", origin(1), err)
  1703  				}
  1704  				t.setErrno(err)
  1705  			}
  1706  			(*darwinDir)(unsafe.Pointer(dir)).eof = true
  1707  			return 0
  1708  		}
  1709  
  1710  		(*darwinDir)(unsafe.Pointer(dir)).l = 0
  1711  		(*darwinDir)(unsafe.Pointer(dir)).h = n
  1712  		// trc("new l %v, h %v", (*darwinDir)(unsafe.Pointer(dir)).l, (*darwinDir)(unsafe.Pointer(dir)).h)
  1713  	}
  1714  	de := dir + unsafe.Offsetof(darwinDir{}.buf) + uintptr((*darwinDir)(unsafe.Pointer(dir)).l)
  1715  	// trc("dir %#x de %#x", dir, de)
  1716  	(*darwinDir)(unsafe.Pointer(dir)).l += int((*unix.Dirent)(unsafe.Pointer(de)).Reclen)
  1717  	// trc("final l %v, h %v", (*darwinDir)(unsafe.Pointer(dir)).l, (*darwinDir)(unsafe.Pointer(dir)).h)
  1718  	return de
  1719  }
  1720  
  1721  func Xclosedir(t *TLS, dir uintptr) int32 {
  1722  	// trc("---- closedir: %#x", dir)
  1723  	r := Xclose(t, int32((*darwinDir)(unsafe.Pointer(dir)).fd))
  1724  	Xfree(t, dir)
  1725  	return r
  1726  }
  1727  
  1728  // int pipe(int pipefd[2]);
  1729  func Xpipe(t *TLS, pipefd uintptr) int32 {
  1730  	var a [2]int
  1731  	if err := syscall.Pipe(a[:]); err != nil {
  1732  		if dmesgs {
  1733  			dmesg("%v: %v FAIL", origin(1), err)
  1734  		}
  1735  		t.setErrno(err)
  1736  		return -1
  1737  	}
  1738  
  1739  	*(*[2]int32)(unsafe.Pointer(pipefd)) = [2]int32{int32(a[0]), int32(a[1])}
  1740  	if dmesgs {
  1741  		dmesg("%v: %v ok", origin(1), a)
  1742  	}
  1743  	return 0
  1744  }
  1745  
  1746  // int __isoc99_sscanf(const char *str, const char *format, ...);
  1747  func X__isoc99_sscanf(t *TLS, str, format, va uintptr) int32 {
  1748  	r := scanf(strings.NewReader(GoString(str)), format, va)
  1749  	// if dmesgs {
  1750  	// 	dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r)
  1751  	// }
  1752  	return r
  1753  }
  1754  
  1755  // int sscanf(const char *str, const char *format, ...);
  1756  func Xsscanf(t *TLS, str, format, va uintptr) int32 {
  1757  	r := scanf(strings.NewReader(GoString(str)), format, va)
  1758  	// if dmesgs {
  1759  	// 	dmesg("%v: %q %q: %d", origin(1), GoString(str), GoString(format), r)
  1760  	// }
  1761  	return r
  1762  }
  1763  
  1764  // int posix_fadvise(int fd, off_t offset, off_t len, int advice);
  1765  func Xposix_fadvise(t *TLS, fd int32, offset, len types.Off_t, advice int32) int32 {
  1766  	panic(todo(""))
  1767  }
  1768  
  1769  // clock_t clock(void);
  1770  func Xclock(t *TLS) time.Clock_t {
  1771  	return time.Clock_t(gotime.Since(startTime) * gotime.Duration(time.CLOCKS_PER_SEC) / gotime.Second)
  1772  }
  1773  
  1774  // int iswspace(wint_t wc);
  1775  func Xiswspace(t *TLS, wc wctype.Wint_t) int32 {
  1776  	return Bool32(unicode.IsSpace(rune(wc)))
  1777  }
  1778  
  1779  // int iswalnum(wint_t wc);
  1780  func Xiswalnum(t *TLS, wc wctype.Wint_t) int32 {
  1781  	return Bool32(unicode.IsLetter(rune(wc)) || unicode.IsNumber(rune(wc)))
  1782  }
  1783  
  1784  // void arc4random_buf(void *buf, size_t nbytes);
  1785  func Xarc4random_buf(t *TLS, buf uintptr, buflen size_t) {
  1786  	if _, err := crand.Read((*RawMem)(unsafe.Pointer(buf))[:buflen]); err != nil {
  1787  		panic(todo(""))
  1788  	}
  1789  }
  1790  
  1791  type darwin_mutexattr_t struct {
  1792  	sig int64
  1793  	x   [8]byte
  1794  }
  1795  
  1796  type darwin_mutex_t struct {
  1797  	sig int64
  1798  	x   [65]byte
  1799  }
  1800  
  1801  func X__ccgo_pthreadMutexattrGettype(tls *TLS, a uintptr) int32 {
  1802  	return (int32((*darwin_mutexattr_t)(unsafe.Pointer(a)).x[4] >> 2 & 3))
  1803  }
  1804  
  1805  func X__ccgo_getMutexType(tls *TLS, m uintptr) int32 {
  1806  	return (int32((*darwin_mutex_t)(unsafe.Pointer(m)).x[4] >> 2 & 3))
  1807  }
  1808  
  1809  func X__ccgo_pthreadAttrGetDetachState(tls *TLS, a uintptr) int32 {
  1810  	panic(todo(""))
  1811  }
  1812  
  1813  func Xpthread_attr_getdetachstate(tls *TLS, a uintptr, state uintptr) int32 {
  1814  	panic(todo(""))
  1815  }
  1816  
  1817  func Xpthread_attr_setdetachstate(tls *TLS, a uintptr, state int32) int32 {
  1818  	panic(todo(""))
  1819  }
  1820  
  1821  func Xpthread_mutexattr_destroy(tls *TLS, a uintptr) int32 {
  1822  	return 0
  1823  }
  1824  
  1825  func Xpthread_mutexattr_init(tls *TLS, a uintptr) int32 {
  1826  	*(*darwin_mutexattr_t)(unsafe.Pointer(a)) = darwin_mutexattr_t{}
  1827  	return 0
  1828  }
  1829  
  1830  func Xpthread_mutexattr_settype(tls *TLS, a uintptr, type1 int32) int32 {
  1831  	if uint32(type1) > uint32(2) {
  1832  		return errno.EINVAL
  1833  	}
  1834  	(*darwin_mutexattr_t)(unsafe.Pointer(a)).x[4] = byte(type1 << 2)
  1835  	return 0
  1836  }
  1837  
  1838  // ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
  1839  func Xwritev(t *TLS, fd int32, iov uintptr, iovcnt int32) types.Ssize_t {
  1840  	// if dmesgs {
  1841  	// 	dmesg("%v: fd %v iov %#x iovcnt %v", origin(1), fd, iov, iovcnt)
  1842  	// }
  1843  	r, _, err := unix.Syscall(unix.SYS_WRITEV, uintptr(fd), iov, uintptr(iovcnt))
  1844  	if err != 0 {
  1845  		if dmesgs {
  1846  			dmesg("%v: %v FAIL", origin(1), err)
  1847  		}
  1848  		t.setErrno(err)
  1849  		return -1
  1850  	}
  1851  
  1852  	return types.Ssize_t(r)
  1853  }
  1854  
  1855  // int pause(void);
  1856  func Xpause(t *TLS) int32 {
  1857  	c := make(chan os.Signal)
  1858  	gosignal.Notify(c,
  1859  		syscall.SIGABRT,
  1860  		syscall.SIGALRM,
  1861  		syscall.SIGBUS,
  1862  		syscall.SIGCHLD,
  1863  		syscall.SIGCONT,
  1864  		syscall.SIGFPE,
  1865  		syscall.SIGHUP,
  1866  		syscall.SIGILL,
  1867  		// syscall.SIGINT,
  1868  		syscall.SIGIO,
  1869  		syscall.SIGIOT,
  1870  		syscall.SIGKILL,
  1871  		syscall.SIGPIPE,
  1872  		syscall.SIGPROF,
  1873  		syscall.SIGQUIT,
  1874  		syscall.SIGSEGV,
  1875  		syscall.SIGSTOP,
  1876  		syscall.SIGSYS,
  1877  		syscall.SIGTERM,
  1878  		syscall.SIGTRAP,
  1879  		syscall.SIGTSTP,
  1880  		syscall.SIGTTIN,
  1881  		syscall.SIGTTOU,
  1882  		syscall.SIGURG,
  1883  		syscall.SIGUSR1,
  1884  		syscall.SIGUSR2,
  1885  		syscall.SIGVTALRM,
  1886  		syscall.SIGWINCH,
  1887  		syscall.SIGXCPU,
  1888  		syscall.SIGXFSZ,
  1889  	)
  1890  	switch <-c {
  1891  	case syscall.SIGINT:
  1892  		panic(todo(""))
  1893  	default:
  1894  		t.setErrno(errno.EINTR)
  1895  		return -1
  1896  	}
  1897  }
  1898  
  1899  // #define __DARWIN_FD_SETSIZE     1024
  1900  // #define __DARWIN_NFDBITS        (sizeof(__int32_t) * __DARWIN_NBBY) /* bits per mask */
  1901  // #define __DARWIN_NBBY           8                               /* bits in a byte */
  1902  // #define __DARWIN_howmany(x, y)  ((((x) % (y)) == 0) ? ((x) / (y)) : (((x) / (y)) + 1)) /* # y's == x bits? */
  1903  
  1904  // typedef struct fd_set {
  1905  //         __int32_t       fds_bits[__DARWIN_howmany(__DARWIN_FD_SETSIZE, __DARWIN_NFDBITS)];
  1906  // } fd_set;
  1907  
  1908  // __darwin_fd_set(int _fd, struct fd_set *const _p)
  1909  //
  1910  //	{
  1911  //	        (_p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] |= ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS))));
  1912  //	}
  1913  func X__darwin_fd_set(tls *TLS, _fd int32, _p uintptr) int32 { /* main.c:12:1: */
  1914  	*(*int32)(unsafe.Pointer(_p + uintptr(uint64(_fd)/(uint64(unsafe.Sizeof(int32(0)))*uint64(8)))*4)) |= int32(uint64(uint64(1)) << (uint64(_fd) % (uint64(unsafe.Sizeof(int32(0))) * uint64(8))))
  1915  	return int32(0)
  1916  }
  1917  
  1918  // __darwin_fd_isset(int _fd, const struct fd_set *_p)
  1919  //
  1920  //	{
  1921  //	        return _p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] & ((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS)));
  1922  //	}
  1923  func X__darwin_fd_isset(tls *TLS, _fd int32, _p uintptr) int32 { /* main.c:17:1: */
  1924  	return *(*int32)(unsafe.Pointer(_p + uintptr(uint64(_fd)/(uint64(unsafe.Sizeof(int32(0)))*uint64(8)))*4)) & int32(uint64(uint64(1))<<(uint64(_fd)%(uint64(unsafe.Sizeof(int32(0)))*uint64(8))))
  1925  }
  1926  
  1927  // __darwin_fd_clr(int _fd, struct fd_set *const _p)
  1928  //
  1929  //	{
  1930  //	        (_p->fds_bits[(unsigned long)_fd / __DARWIN_NFDBITS] &= ~((__int32_t)(((unsigned long)1) << ((unsigned long)_fd % __DARWIN_NFDBITS))));
  1931  //	}
  1932  func X__darwin_fd_clr(tls *TLS, _fd int32, _p uintptr) int32 { /* main.c:22:1: */
  1933  	*(*int32)(unsafe.Pointer(_p + uintptr(uint64(_fd)/(uint64(unsafe.Sizeof(int32(0)))*uint64(8)))*4)) &= ^int32(uint64(uint64(1)) << (uint64(_fd) % (uint64(unsafe.Sizeof(int32(0))) * uint64(8))))
  1934  	return int32(0)
  1935  }
  1936  
  1937  // int ungetc(int c, FILE *stream);
  1938  func Xungetc(t *TLS, c int32, stream uintptr) int32 {
  1939  	panic(todo(""))
  1940  }
  1941  
  1942  // int issetugid(void);
  1943  func Xissetugid(t *TLS) int32 {
  1944  	panic(todo(""))
  1945  }
  1946  
  1947  var progname uintptr
  1948  
  1949  // const char *getprogname(void);
  1950  func Xgetprogname(t *TLS) uintptr {
  1951  	if progname != 0 {
  1952  		return progname
  1953  	}
  1954  
  1955  	var err error
  1956  	progname, err = CString(filepath.Base(os.Args[0]))
  1957  	if err != nil {
  1958  		t.setErrno(err)
  1959  		return 0
  1960  	}
  1961  
  1962  	return progname
  1963  }
  1964  
  1965  // void uuid_copy(uuid_t dst, uuid_t src);
  1966  func Xuuid_copy(t *TLS, dst, src uintptr) {
  1967  	*(*uuid.Uuid_t)(unsafe.Pointer(dst)) = *(*uuid.Uuid_t)(unsafe.Pointer(src))
  1968  }
  1969  
  1970  // int uuid_parse( char *in, uuid_t uu);
  1971  func Xuuid_parse(t *TLS, in uintptr, uu uintptr) int32 {
  1972  	r, err := guuid.Parse(GoString(in))
  1973  	if err != nil {
  1974  		return -1
  1975  	}
  1976  
  1977  	copy((*RawMem)(unsafe.Pointer(uu))[:unsafe.Sizeof(uuid.Uuid_t{})], r[:])
  1978  	return 0
  1979  }
  1980  
  1981  // struct __float2 { float __sinval; float __cosval; };
  1982  
  1983  // struct __float2 __sincosf_stret(float);
  1984  func X__sincosf_stret(t *TLS, f float32) struct{ F__sinval, F__cosval float32 } {
  1985  	panic(todo(""))
  1986  }
  1987  
  1988  // struct __double2 { double __sinval; double __cosval; };
  1989  
  1990  // struct __double2 __sincos_stret(double);
  1991  func X__sincos_stret(t *TLS, f float64) struct{ F__sinval, F__cosval float64 } {
  1992  	panic(todo(""))
  1993  }
  1994  
  1995  // struct __float2 __sincospif_stret(float);
  1996  func X__sincospif_stret(t *TLS, f float32) struct{ F__sinval, F__cosval float32 } {
  1997  	panic(todo(""))
  1998  }
  1999  
  2000  // struct _double2 __sincospi_stret(double);
  2001  func X__sincospi_stret(t *TLS, f float64) struct{ F__sinval, F__cosval float64 } {
  2002  	panic(todo(""))
  2003  }
  2004  
  2005  // int	__srget(FILE *);
  2006  func X__srget(t *TLS, f uintptr) int32 {
  2007  	panic(todo(""))
  2008  }
  2009  
  2010  // int	__svfscanf(FILE *, const char *, va_list) __scanflike(2, 0);
  2011  func X__svfscanf(t *TLS, f uintptr, p, q uintptr) int32 {
  2012  	panic(todo(""))
  2013  }
  2014  
  2015  // int	__swbuf(int, FILE *);
  2016  func X__swbuf(t *TLS, i int32, f uintptr) int32 {
  2017  	panic(todo(""))
  2018  }