sockopt_unix.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2012 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. // +build darwin freebsd linux netbsd openbsd
  5. package ipv4
  6. import (
  7. "os"
  8. "syscall"
  9. )
  10. func ipv4TOS(fd int) (int, error) {
  11. v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TOS)
  12. if err != nil {
  13. return 0, os.NewSyscallError("getsockopt", err)
  14. }
  15. return v, nil
  16. }
  17. func setIPv4TOS(fd int, v int) error {
  18. err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TOS, v)
  19. if err != nil {
  20. return os.NewSyscallError("setsockopt", err)
  21. }
  22. return nil
  23. }
  24. func ipv4TTL(fd int) (int, error) {
  25. v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TTL)
  26. if err != nil {
  27. return 0, os.NewSyscallError("getsockopt", err)
  28. }
  29. return v, nil
  30. }
  31. func setIPv4TTL(fd int, v int) error {
  32. err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_TTL, v)
  33. if err != nil {
  34. return os.NewSyscallError("setsockopt", err)
  35. }
  36. return nil
  37. }
  38. func ipv4ReceiveTTL(fd int) (bool, error) {
  39. v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTTL)
  40. if err != nil {
  41. return false, os.NewSyscallError("getsockopt", err)
  42. }
  43. return v == 1, nil
  44. }
  45. func setIPv4ReceiveTTL(fd int, v bool) error {
  46. err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_RECVTTL, boolint(v))
  47. if err != nil {
  48. return os.NewSyscallError("setsockopt", err)
  49. }
  50. return nil
  51. }
  52. func ipv4HeaderPrepend(fd int) (bool, error) {
  53. v, err := syscall.GetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_HDRINCL)
  54. if err != nil {
  55. return false, os.NewSyscallError("getsockopt", err)
  56. }
  57. return v == 1, nil
  58. }
  59. func setIPv4HeaderPrepend(fd int, v bool) error {
  60. err := syscall.SetsockoptInt(fd, syscall.IPPROTO_IP, syscall.IP_HDRINCL, boolint(v))
  61. if err != nil {
  62. return os.NewSyscallError("setsockopt", err)
  63. }
  64. return nil
  65. }