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 }