github.com/gogf/gkafka@v1.0.1-0.20190702070843-033a14468069/third/golang.org/x/sys/unix/syscall_solaris.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Solaris system calls. 6 // This file is compiled as ordinary Go code, 7 // but it is also input to mksyscall, 8 // which parses the //sys lines and generates system call stubs. 9 // Note that sometimes we use a lowercase //sys name and wrap 10 // it in our own nicer implementation, either here or in 11 // syscall_solaris.go or syscall_unix.go. 12 13 package unix 14 15 import ( 16 "syscall" 17 "unsafe" 18 ) 19 20 // Implemented in runtime/syscall_solaris.go. 21 type syscallFunc uintptr 22 23 func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) 24 func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) 25 26 // SockaddrDatalink implements the Sockaddr interface for AF_LINK type sockets. 27 type SockaddrDatalink struct { 28 Family uint16 29 Index uint16 30 Type uint8 31 Nlen uint8 32 Alen uint8 33 Slen uint8 34 Data [244]int8 35 raw RawSockaddrDatalink 36 } 37 38 //sysnb pipe(p *[2]_C_int) (n int, err error) 39 40 func Pipe(p []int) (err error) { 41 if len(p) != 2 { 42 return EINVAL 43 } 44 var pp [2]_C_int 45 n, err := pipe(&pp) 46 if n != 0 { 47 return err 48 } 49 p[0] = int(pp[0]) 50 p[1] = int(pp[1]) 51 return nil 52 } 53 54 func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { 55 if sa.Port < 0 || sa.Port > 0xFFFF { 56 return nil, 0, EINVAL 57 } 58 sa.raw.Family = AF_INET 59 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) 60 p[0] = byte(sa.Port >> 8) 61 p[1] = byte(sa.Port) 62 for i := 0; i < len(sa.Addr); i++ { 63 sa.raw.Addr[i] = sa.Addr[i] 64 } 65 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil 66 } 67 68 func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { 69 if sa.Port < 0 || sa.Port > 0xFFFF { 70 return nil, 0, EINVAL 71 } 72 sa.raw.Family = AF_INET6 73 p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) 74 p[0] = byte(sa.Port >> 8) 75 p[1] = byte(sa.Port) 76 sa.raw.Scope_id = sa.ZoneId 77 for i := 0; i < len(sa.Addr); i++ { 78 sa.raw.Addr[i] = sa.Addr[i] 79 } 80 return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil 81 } 82 83 func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { 84 name := sa.Name 85 n := len(name) 86 if n >= len(sa.raw.Path) { 87 return nil, 0, EINVAL 88 } 89 sa.raw.Family = AF_UNIX 90 for i := 0; i < n; i++ { 91 sa.raw.Path[i] = int8(name[i]) 92 } 93 // length is family (uint16), name, NUL. 94 sl := _Socklen(2) 95 if n > 0 { 96 sl += _Socklen(n) + 1 97 } 98 if sa.raw.Path[0] == '@' { 99 sa.raw.Path[0] = 0 100 // Don't count trailing NUL for abstract address. 101 sl-- 102 } 103 104 return unsafe.Pointer(&sa.raw), sl, nil 105 } 106 107 //sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname 108 109 func Getsockname(fd int) (sa Sockaddr, err error) { 110 var rsa RawSockaddrAny 111 var len _Socklen = SizeofSockaddrAny 112 if err = getsockname(fd, &rsa, &len); err != nil { 113 return 114 } 115 return anyToSockaddr(fd, &rsa) 116 } 117 118 // GetsockoptString returns the string value of the socket option opt for the 119 // socket associated with fd at the given socket level. 120 func GetsockoptString(fd, level, opt int) (string, error) { 121 buf := make([]byte, 256) 122 vallen := _Socklen(len(buf)) 123 err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen) 124 if err != nil { 125 return "", err 126 } 127 return string(buf[:vallen-1]), nil 128 } 129 130 const ImplementsGetwd = true 131 132 //sys Getcwd(buf []byte) (n int, err error) 133 134 func Getwd() (wd string, err error) { 135 var buf [PathMax]byte 136 // Getcwd will return an error if it failed for any reason. 137 _, err = Getcwd(buf[0:]) 138 if err != nil { 139 return "", err 140 } 141 n := clen(buf[:]) 142 if n < 1 { 143 return "", EINVAL 144 } 145 return string(buf[:n]), nil 146 } 147 148 /* 149 * Wrapped 150 */ 151 152 //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) 153 //sysnb setgroups(ngid int, gid *_Gid_t) (err error) 154 155 func Getgroups() (gids []int, err error) { 156 n, err := getgroups(0, nil) 157 // Check for error and sanity check group count. Newer versions of 158 // Solaris allow up to 1024 (NGROUPS_MAX). 159 if n < 0 || n > 1024 { 160 if err != nil { 161 return nil, err 162 } 163 return nil, EINVAL 164 } else if n == 0 { 165 return nil, nil 166 } 167 168 a := make([]_Gid_t, n) 169 n, err = getgroups(n, &a[0]) 170 if n == -1 { 171 return nil, err 172 } 173 gids = make([]int, n) 174 for i, v := range a[0:n] { 175 gids[i] = int(v) 176 } 177 return 178 } 179 180 func Setgroups(gids []int) (err error) { 181 if len(gids) == 0 { 182 return setgroups(0, nil) 183 } 184 185 a := make([]_Gid_t, len(gids)) 186 for i, v := range gids { 187 a[i] = _Gid_t(v) 188 } 189 return setgroups(len(a), &a[0]) 190 } 191 192 func ReadDirent(fd int, buf []byte) (n int, err error) { 193 // Final argument is (basep *uintptr) and the syscall doesn't take nil. 194 // TODO(rsc): Can we use a single global basep for all calls? 195 return Getdents(fd, buf, new(uintptr)) 196 } 197 198 // Wait status is 7 bits at bottom, either 0 (exited), 199 // 0x7F (stopped), or a signal number that caused an exit. 200 // The 0x80 bit is whether there was a core dump. 201 // An extra number (exit code, signal causing a stop) 202 // is in the high bits. 203 204 type WaitStatus uint32 205 206 const ( 207 mask = 0x7F 208 core = 0x80 209 shift = 8 210 211 exited = 0 212 stopped = 0x7F 213 ) 214 215 func (w WaitStatus) Exited() bool { return w&mask == exited } 216 217 func (w WaitStatus) ExitStatus() int { 218 if w&mask != exited { 219 return -1 220 } 221 return int(w >> shift) 222 } 223 224 func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } 225 226 func (w WaitStatus) Signal() syscall.Signal { 227 sig := syscall.Signal(w & mask) 228 if sig == stopped || sig == 0 { 229 return -1 230 } 231 return sig 232 } 233 234 func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } 235 236 func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } 237 238 func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } 239 240 func (w WaitStatus) StopSignal() syscall.Signal { 241 if !w.Stopped() { 242 return -1 243 } 244 return syscall.Signal(w>>shift) & 0xFF 245 } 246 247 func (w WaitStatus) TrapCause() int { return -1 } 248 249 //sys wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error) 250 251 func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) { 252 var status _C_int 253 rpid, err := wait4(int32(pid), &status, options, rusage) 254 wpid := int(rpid) 255 if wpid == -1 { 256 return wpid, err 257 } 258 if wstatus != nil { 259 *wstatus = WaitStatus(status) 260 } 261 return wpid, nil 262 } 263 264 //sys gethostname(buf []byte) (n int, err error) 265 266 func Gethostname() (name string, err error) { 267 var buf [MaxHostNameLen]byte 268 n, err := gethostname(buf[:]) 269 if n != 0 { 270 return "", err 271 } 272 n = clen(buf[:]) 273 if n < 1 { 274 return "", EFAULT 275 } 276 return string(buf[:n]), nil 277 } 278 279 //sys utimes(path string, times *[2]Timeval) (err error) 280 281 func Utimes(path string, tv []Timeval) (err error) { 282 if tv == nil { 283 return utimes(path, nil) 284 } 285 if len(tv) != 2 { 286 return EINVAL 287 } 288 return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) 289 } 290 291 //sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) 292 293 func UtimesNano(path string, ts []Timespec) error { 294 if ts == nil { 295 return utimensat(AT_FDCWD, path, nil, 0) 296 } 297 if len(ts) != 2 { 298 return EINVAL 299 } 300 return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) 301 } 302 303 func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { 304 if ts == nil { 305 return utimensat(dirfd, path, nil, flags) 306 } 307 if len(ts) != 2 { 308 return EINVAL 309 } 310 return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) 311 } 312 313 //sys fcntl(fd int, cmd int, arg int) (val int, err error) 314 315 // FcntlInt performs a fcntl syscall on fd with the provided command and argument. 316 func FcntlInt(fd uintptr, cmd, arg int) (int, error) { 317 valptr, _, errno := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) 318 var err error 319 if errno != 0 { 320 err = errno 321 } 322 return int(valptr), err 323 } 324 325 // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. 326 func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { 327 _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) 328 if e1 != 0 { 329 return e1 330 } 331 return nil 332 } 333 334 //sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) 335 336 func Futimesat(dirfd int, path string, tv []Timeval) error { 337 pathp, err := BytePtrFromString(path) 338 if err != nil { 339 return err 340 } 341 if tv == nil { 342 return futimesat(dirfd, pathp, nil) 343 } 344 if len(tv) != 2 { 345 return EINVAL 346 } 347 return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) 348 } 349 350 // Solaris doesn't have an futimes function because it allows NULL to be 351 // specified as the path for futimesat. However, Go doesn't like 352 // NULL-style string interfaces, so this simple wrapper is provided. 353 func Futimes(fd int, tv []Timeval) error { 354 if tv == nil { 355 return futimesat(fd, nil, nil) 356 } 357 if len(tv) != 2 { 358 return EINVAL 359 } 360 return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) 361 } 362 363 func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) { 364 switch rsa.Addr.Family { 365 case AF_UNIX: 366 pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) 367 sa := new(SockaddrUnix) 368 // Assume path ends at NUL. 369 // This is not technically the Solaris semantics for 370 // abstract Unix domain sockets -- they are supposed 371 // to be uninterpreted fixed-size binary blobs -- but 372 // everyone uses this convention. 373 n := 0 374 for n < len(pp.Path) && pp.Path[n] != 0 { 375 n++ 376 } 377 bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] 378 sa.Name = string(bytes) 379 return sa, nil 380 381 case AF_INET: 382 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) 383 sa := new(SockaddrInet4) 384 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) 385 sa.Port = int(p[0])<<8 + int(p[1]) 386 for i := 0; i < len(sa.Addr); i++ { 387 sa.Addr[i] = pp.Addr[i] 388 } 389 return sa, nil 390 391 case AF_INET6: 392 pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) 393 sa := new(SockaddrInet6) 394 p := (*[2]byte)(unsafe.Pointer(&pp.Port)) 395 sa.Port = int(p[0])<<8 + int(p[1]) 396 sa.ZoneId = pp.Scope_id 397 for i := 0; i < len(sa.Addr); i++ { 398 sa.Addr[i] = pp.Addr[i] 399 } 400 return sa, nil 401 } 402 return nil, EAFNOSUPPORT 403 } 404 405 //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept 406 407 func Accept(fd int) (nfd int, sa Sockaddr, err error) { 408 var rsa RawSockaddrAny 409 var len _Socklen = SizeofSockaddrAny 410 nfd, err = accept(fd, &rsa, &len) 411 if nfd == -1 { 412 return 413 } 414 sa, err = anyToSockaddr(fd, &rsa) 415 if err != nil { 416 Close(nfd) 417 nfd = 0 418 } 419 return 420 } 421 422 //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_recvmsg 423 424 func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { 425 var msg Msghdr 426 var rsa RawSockaddrAny 427 msg.Name = (*byte)(unsafe.Pointer(&rsa)) 428 msg.Namelen = uint32(SizeofSockaddrAny) 429 var iov Iovec 430 if len(p) > 0 { 431 iov.Base = (*int8)(unsafe.Pointer(&p[0])) 432 iov.SetLen(len(p)) 433 } 434 var dummy int8 435 if len(oob) > 0 { 436 // receive at least one normal byte 437 if len(p) == 0 { 438 iov.Base = &dummy 439 iov.SetLen(1) 440 } 441 msg.Accrightslen = int32(len(oob)) 442 } 443 msg.Iov = &iov 444 msg.Iovlen = 1 445 if n, err = recvmsg(fd, &msg, flags); n == -1 { 446 return 447 } 448 oobn = int(msg.Accrightslen) 449 // source address is only specified if the socket is unconnected 450 if rsa.Addr.Family != AF_UNSPEC { 451 from, err = anyToSockaddr(fd, &rsa) 452 } 453 return 454 } 455 456 func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { 457 _, err = SendmsgN(fd, p, oob, to, flags) 458 return 459 } 460 461 //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.__xnet_sendmsg 462 463 func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { 464 var ptr unsafe.Pointer 465 var salen _Socklen 466 if to != nil { 467 ptr, salen, err = to.sockaddr() 468 if err != nil { 469 return 0, err 470 } 471 } 472 var msg Msghdr 473 msg.Name = (*byte)(unsafe.Pointer(ptr)) 474 msg.Namelen = uint32(salen) 475 var iov Iovec 476 if len(p) > 0 { 477 iov.Base = (*int8)(unsafe.Pointer(&p[0])) 478 iov.SetLen(len(p)) 479 } 480 var dummy int8 481 if len(oob) > 0 { 482 // send at least one normal byte 483 if len(p) == 0 { 484 iov.Base = &dummy 485 iov.SetLen(1) 486 } 487 msg.Accrightslen = int32(len(oob)) 488 } 489 msg.Iov = &iov 490 msg.Iovlen = 1 491 if n, err = sendmsg(fd, &msg, flags); err != nil { 492 return 0, err 493 } 494 if len(oob) > 0 && len(p) == 0 { 495 n = 0 496 } 497 return n, nil 498 } 499 500 //sys acct(path *byte) (err error) 501 502 func Acct(path string) (err error) { 503 if len(path) == 0 { 504 // Assume caller wants to disable accounting. 505 return acct(nil) 506 } 507 508 pathp, err := BytePtrFromString(path) 509 if err != nil { 510 return err 511 } 512 return acct(pathp) 513 } 514 515 //sys __makedev(version int, major uint, minor uint) (val uint64) 516 517 func Mkdev(major, minor uint32) uint64 { 518 return __makedev(NEWDEV, uint(major), uint(minor)) 519 } 520 521 //sys __major(version int, dev uint64) (val uint) 522 523 func Major(dev uint64) uint32 { 524 return uint32(__major(NEWDEV, dev)) 525 } 526 527 //sys __minor(version int, dev uint64) (val uint) 528 529 func Minor(dev uint64) uint32 { 530 return uint32(__minor(NEWDEV, dev)) 531 } 532 533 /* 534 * Expose the ioctl function 535 */ 536 537 //sys ioctl(fd int, req uint, arg uintptr) (err error) 538 539 func IoctlSetInt(fd int, req uint, value int) (err error) { 540 return ioctl(fd, req, uintptr(value)) 541 } 542 543 func ioctlSetWinsize(fd int, req uint, value *Winsize) (err error) { 544 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) 545 } 546 547 func ioctlSetTermios(fd int, req uint, value *Termios) (err error) { 548 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) 549 } 550 551 func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { 552 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) 553 } 554 555 func IoctlGetInt(fd int, req uint) (int, error) { 556 var value int 557 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 558 return value, err 559 } 560 561 func IoctlGetWinsize(fd int, req uint) (*Winsize, error) { 562 var value Winsize 563 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 564 return &value, err 565 } 566 567 func IoctlGetTermios(fd int, req uint) (*Termios, error) { 568 var value Termios 569 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 570 return &value, err 571 } 572 573 func IoctlGetTermio(fd int, req uint) (*Termio, error) { 574 var value Termio 575 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) 576 return &value, err 577 } 578 579 //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error) 580 581 func Poll(fds []PollFd, timeout int) (n int, err error) { 582 if len(fds) == 0 { 583 return poll(nil, 0, timeout) 584 } 585 return poll(&fds[0], len(fds), timeout) 586 } 587 588 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { 589 if raceenabled { 590 raceReleaseMerge(unsafe.Pointer(&ioSync)) 591 } 592 return sendfile(outfd, infd, offset, count) 593 } 594 595 /* 596 * Exposed directly 597 */ 598 //sys Access(path string, mode uint32) (err error) 599 //sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) 600 //sys Chdir(path string) (err error) 601 //sys Chmod(path string, mode uint32) (err error) 602 //sys Chown(path string, uid int, gid int) (err error) 603 //sys Chroot(path string) (err error) 604 //sys Close(fd int) (err error) 605 //sys Creat(path string, mode uint32) (fd int, err error) 606 //sys Dup(fd int) (nfd int, err error) 607 //sys Dup2(oldfd int, newfd int) (err error) 608 //sys Exit(code int) 609 //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) 610 //sys Fchdir(fd int) (err error) 611 //sys Fchmod(fd int, mode uint32) (err error) 612 //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) 613 //sys Fchown(fd int, uid int, gid int) (err error) 614 //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) 615 //sys Fdatasync(fd int) (err error) 616 //sys Flock(fd int, how int) (err error) 617 //sys Fpathconf(fd int, name int) (val int, err error) 618 //sys Fstat(fd int, stat *Stat_t) (err error) 619 //sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) 620 //sys Fstatvfs(fd int, vfsstat *Statvfs_t) (err error) 621 //sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) 622 //sysnb Getgid() (gid int) 623 //sysnb Getpid() (pid int) 624 //sysnb Getpgid(pid int) (pgid int, err error) 625 //sysnb Getpgrp() (pgid int, err error) 626 //sys Geteuid() (euid int) 627 //sys Getegid() (egid int) 628 //sys Getppid() (ppid int) 629 //sys Getpriority(which int, who int) (n int, err error) 630 //sysnb Getrlimit(which int, lim *Rlimit) (err error) 631 //sysnb Getrusage(who int, rusage *Rusage) (err error) 632 //sysnb Gettimeofday(tv *Timeval) (err error) 633 //sysnb Getuid() (uid int) 634 //sys Kill(pid int, signum syscall.Signal) (err error) 635 //sys Lchown(path string, uid int, gid int) (err error) 636 //sys Link(path string, link string) (err error) 637 //sys Listen(s int, backlog int) (err error) = libsocket.__xnet_llisten 638 //sys Lstat(path string, stat *Stat_t) (err error) 639 //sys Madvise(b []byte, advice int) (err error) 640 //sys Mkdir(path string, mode uint32) (err error) 641 //sys Mkdirat(dirfd int, path string, mode uint32) (err error) 642 //sys Mkfifo(path string, mode uint32) (err error) 643 //sys Mkfifoat(dirfd int, path string, mode uint32) (err error) 644 //sys Mknod(path string, mode uint32, dev int) (err error) 645 //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) 646 //sys Mlock(b []byte) (err error) 647 //sys Mlockall(flags int) (err error) 648 //sys Mprotect(b []byte, prot int) (err error) 649 //sys Msync(b []byte, flags int) (err error) 650 //sys Munlock(b []byte) (err error) 651 //sys Munlockall() (err error) 652 //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) 653 //sys Open(path string, mode int, perm uint32) (fd int, err error) 654 //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) 655 //sys Pathconf(path string, name int) (val int, err error) 656 //sys Pause() (err error) 657 //sys Pread(fd int, p []byte, offset int64) (n int, err error) 658 //sys Pwrite(fd int, p []byte, offset int64) (n int, err error) 659 //sys read(fd int, p []byte) (n int, err error) 660 //sys Readlink(path string, buf []byte) (n int, err error) 661 //sys Rename(from string, to string) (err error) 662 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) 663 //sys Rmdir(path string) (err error) 664 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek 665 //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) 666 //sysnb Setegid(egid int) (err error) 667 //sysnb Seteuid(euid int) (err error) 668 //sysnb Setgid(gid int) (err error) 669 //sys Sethostname(p []byte) (err error) 670 //sysnb Setpgid(pid int, pgid int) (err error) 671 //sys Setpriority(which int, who int, prio int) (err error) 672 //sysnb Setregid(rgid int, egid int) (err error) 673 //sysnb Setreuid(ruid int, euid int) (err error) 674 //sysnb Setrlimit(which int, lim *Rlimit) (err error) 675 //sysnb Setsid() (pid int, err error) 676 //sysnb Setuid(uid int) (err error) 677 //sys Shutdown(s int, how int) (err error) = libsocket.shutdown 678 //sys Stat(path string, stat *Stat_t) (err error) 679 //sys Statvfs(path string, vfsstat *Statvfs_t) (err error) 680 //sys Symlink(path string, link string) (err error) 681 //sys Sync() (err error) 682 //sysnb Times(tms *Tms) (ticks uintptr, err error) 683 //sys Truncate(path string, length int64) (err error) 684 //sys Fsync(fd int) (err error) 685 //sys Ftruncate(fd int, length int64) (err error) 686 //sys Umask(mask int) (oldmask int) 687 //sysnb Uname(buf *Utsname) (err error) 688 //sys Unmount(target string, flags int) (err error) = libc.umount 689 //sys Unlink(path string) (err error) 690 //sys Unlinkat(dirfd int, path string, flags int) (err error) 691 //sys Ustat(dev int, ubuf *Ustat_t) (err error) 692 //sys Utime(path string, buf *Utimbuf) (err error) 693 //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_bind 694 //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_connect 695 //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) 696 //sys munmap(addr uintptr, length uintptr) (err error) 697 //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = libsendfile.sendfile 698 //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.__xnet_sendto 699 //sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.__xnet_socket 700 //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.__xnet_socketpair 701 //sys write(fd int, p []byte) (n int, err error) 702 //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.__xnet_getsockopt 703 //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername 704 //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt 705 //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom 706 707 func readlen(fd int, buf *byte, nbuf int) (n int, err error) { 708 r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) 709 n = int(r0) 710 if e1 != 0 { 711 err = e1 712 } 713 return 714 } 715 716 func writelen(fd int, buf *byte, nbuf int) (n int, err error) { 717 r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) 718 n = int(r0) 719 if e1 != 0 { 720 err = e1 721 } 722 return 723 } 724 725 var mapper = &mmapper{ 726 active: make(map[*byte][]byte), 727 mmap: mmap, 728 munmap: munmap, 729 } 730 731 func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { 732 return mapper.Mmap(fd, offset, length, prot, flags) 733 } 734 735 func Munmap(b []byte) (err error) { 736 return mapper.Munmap(b) 737 }