31 Nlen uint8 |
31 Nlen uint8 |
32 Alen uint8 |
32 Alen uint8 |
33 Slen uint8 |
33 Slen uint8 |
34 Data [244]int8 |
34 Data [244]int8 |
35 raw RawSockaddrDatalink |
35 raw RawSockaddrDatalink |
|
36 } |
|
37 |
|
38 func direntIno(buf []byte) (uint64, bool) { |
|
39 return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino)) |
|
40 } |
|
41 |
|
42 func direntReclen(buf []byte) (uint64, bool) { |
|
43 return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen)) |
|
44 } |
|
45 |
|
46 func direntNamlen(buf []byte) (uint64, bool) { |
|
47 reclen, ok := direntReclen(buf) |
|
48 if !ok { |
|
49 return 0, false |
|
50 } |
|
51 return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true |
36 } |
52 } |
37 |
53 |
38 //sysnb pipe(p *[2]_C_int) (n int, err error) |
54 //sysnb pipe(p *[2]_C_int) (n int, err error) |
39 |
55 |
40 func Pipe(p []int) (err error) { |
56 func Pipe(p []int) (err error) { |
187 a[i] = _Gid_t(v) |
203 a[i] = _Gid_t(v) |
188 } |
204 } |
189 return setgroups(len(a), &a[0]) |
205 return setgroups(len(a), &a[0]) |
190 } |
206 } |
191 |
207 |
|
208 // ReadDirent reads directory entries from fd and writes them into buf. |
192 func ReadDirent(fd int, buf []byte) (n int, err error) { |
209 func ReadDirent(fd int, buf []byte) (n int, err error) { |
193 // Final argument is (basep *uintptr) and the syscall doesn't take nil. |
210 // 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? |
211 // TODO(rsc): Can we use a single global basep for all calls? |
195 return Getdents(fd, buf, new(uintptr)) |
212 return Getdents(fd, buf, new(uintptr)) |
196 } |
213 } |
372 // everyone uses this convention. |
389 // everyone uses this convention. |
373 n := 0 |
390 n := 0 |
374 for n < len(pp.Path) && pp.Path[n] != 0 { |
391 for n < len(pp.Path) && pp.Path[n] != 0 { |
375 n++ |
392 n++ |
376 } |
393 } |
377 bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] |
394 bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] |
378 sa.Name = string(bytes) |
395 sa.Name = string(bytes) |
379 return sa, nil |
396 return sa, nil |
380 |
397 |
381 case AF_INET: |
398 case AF_INET: |
382 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
399 pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) |
534 * Expose the ioctl function |
551 * Expose the ioctl function |
535 */ |
552 */ |
536 |
553 |
537 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
554 //sys ioctl(fd int, req uint, arg uintptr) (err error) |
538 |
555 |
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) { |
556 func IoctlSetTermio(fd int, req uint, value *Termio) (err error) { |
552 return ioctl(fd, req, uintptr(unsafe.Pointer(value))) |
557 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 } |
558 } |
572 |
559 |
573 func IoctlGetTermio(fd int, req uint) (*Termio, error) { |
560 func IoctlGetTermio(fd int, req uint) (*Termio, error) { |
574 var value Termio |
561 var value Termio |
575 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
562 err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) |
581 func Poll(fds []PollFd, timeout int) (n int, err error) { |
568 func Poll(fds []PollFd, timeout int) (n int, err error) { |
582 if len(fds) == 0 { |
569 if len(fds) == 0 { |
583 return poll(nil, 0, timeout) |
570 return poll(nil, 0, timeout) |
584 } |
571 } |
585 return poll(&fds[0], len(fds), timeout) |
572 return poll(&fds[0], len(fds), timeout) |
|
573 } |
|
574 |
|
575 func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { |
|
576 if raceenabled { |
|
577 raceReleaseMerge(unsafe.Pointer(&ioSync)) |
|
578 } |
|
579 return sendfile(outfd, infd, offset, count) |
586 } |
580 } |
587 |
581 |
588 /* |
582 /* |
589 * Exposed directly |
583 * Exposed directly |
590 */ |
584 */ |
653 //sys Readlink(path string, buf []byte) (n int, err error) |
647 //sys Readlink(path string, buf []byte) (n int, err error) |
654 //sys Rename(from string, to string) (err error) |
648 //sys Rename(from string, to string) (err error) |
655 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) |
649 //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) |
656 //sys Rmdir(path string) (err error) |
650 //sys Rmdir(path string) (err error) |
657 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek |
651 //sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek |
658 //sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) |
652 //sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) |
659 //sysnb Setegid(egid int) (err error) |
653 //sysnb Setegid(egid int) (err error) |
660 //sysnb Seteuid(euid int) (err error) |
654 //sysnb Seteuid(euid int) (err error) |
661 //sysnb Setgid(gid int) (err error) |
655 //sysnb Setgid(gid int) (err error) |
662 //sys Sethostname(p []byte) (err error) |
656 //sys Sethostname(p []byte) (err error) |
663 //sysnb Setpgid(pid int, pgid int) (err error) |
657 //sysnb Setpgid(pid int, pgid int) (err error) |