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